Skip to content

chore(source-control): document plugin as sole worktree-convention SSOT (#401)#1021

Merged
kyle-sexton merged 6 commits into
mainfrom
chore/401-retire-ghq-layout-doc
Jul 25, 2026
Merged

chore(source-control): document plugin as sole worktree-convention SSOT (#401)#1021
kyle-sexton merged 6 commits into
mainfrom
chore/401-retire-ghq-layout-doc

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Plugin-side deliverable for #401. The retired external prose doc
~/.claude/docs/ghq-layout-sibling-pr-worktrees.md (dotfiles/chezmoi repo) prescribed a stale
sibling-at-ghq-level worktree layout and carried the babysit worktree-exemption policy. This PR
closes the SSOT gap named in the issue: it states, in the plugin itself, that the plugin — not any
external prose doc — is the canonical, sole source for both worktree conventions.

Nothing was actually missing or migrated. Verification (below) confirms the babysit exemption
policy is already fully captured and machine-enforced in the plugin, and that the "Codex-home
root" the issue flags is a per-user babysit_worktree_root config value, not plugin content —
migrating that literal path into a user/machine/org-agnostic plugin would be wrong. This PR
clarifies canonical ownership; it does not restate the retired prose (point-don't-copy).

Fix

  • plugins/source-control/skills/babysit-prs/reference/worktrees.md — added a statement that this
    file is the canonical, sole source for the ephemeral babysit-worktree exemption, with the
    load-bearing rationale a future maintainer could otherwise undo: rooting these worktrees outside
    every repository's discoverable tree (plugin data dir by default) keeps ephemeral scratch out of
    repository enumeration such as ghq list; repointing babysit_worktree_root back under a
    discoverable tree reintroduces that pollution.
  • plugins/source-control/skills/worktree/SKILL.md — added one sentence stating this skill owns
    the parallel-session external-root convention going forward (the discoverable replacement),
    explicitly scoped to the external-root replacement, not the abandoned sibling layout.

Verification

  • Babysit exemption fully captured + machine-enforced. reference/worktrees.md Policy already
    documents lease-scoped cleanup and "never request global open-PR cleanup" (lines 12-31), and the
    operational runbook step 8 in SKILL.md (line 433) says "Never globally prune open-PR
    worktrees." scripts/prune_babysit_worktrees.py lines 189-194 machine-enforce it: --lease-token
    requires --pr, and --prune-open-clean requires both --pr and --lease-token — so no
    global open-PR prune path exists.
  • Codex-home root is a config value, not plugin content. babysit_worktree_root (userConfig in
    .claude-plugin/plugin.json) defaults to the worktrees/ subdir of the plugin data dir. The
    babysit skill already migrated its root off CODEX_HOME to ${CLAUDE_PLUGIN_DATA} (CHANGELOG
    line 735). Live grep: CODEX_HOME|\.codex|\.agents across the whole babysit skill → zero
    matches
    .
  • No dangling pointer to the retired doc. Live grep for ghq-layout|sibling-pr-worktree and
    .claude/docs worktree pointers across the plugin → no plugin reference (the only ghq list
    hits are unrelated repo-hygiene tree-batch features).
  • markdownlint-cli2 on all three edited markdown files (root .markdownlint-cli2.jsonc) →
    0 error(s).
  • Commit signed (SSH, ED25519), pushed via explicit refspec.
  • Out of scope, intentionally deferred (epic feat(source-control): machine-agnostic worktree setup skill (detect -> decide -> install) #398, not this issue): the setup skill emitting a
    per-tool worktree-root map + exemptions as output. Not missed — deferred.

Closes #401

Related

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

…OT (#401)

Close the SSOT gap left by the retired external ghq-layout-sibling-pr-worktrees
prose doc. The babysit worktree-exemption policy (lease-scoped cleanup, never a
global open-PR prune) is already fully captured and machine-enforced by
prune_babysit_worktrees.py, and the skill migrated its root off CODEX_HOME to
${CLAUDE_PLUGIN_DATA}; the Codex-home root was a per-user babysit_worktree_root
config value, not plugin content to migrate.

- babysit-prs/reference/worktrees.md: state the plugin is the canonical, sole
  source for the ephemeral babysit-worktree exemption; add the discoverable-tree
  rationale (rooting outside repos keeps scratch out of ghq list).
- worktree/SKILL.md: state the skill owns the parallel-session external-root
  convention going forward.

Version bump 0.17.0 -> 0.17.1 with matching CHANGELOG entry.
@kyle-sexton kyle-sexton added do-not-merge Hard merge gate: do not merge while applied. automated Opened by automation. labels Jul 22, 2026
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 47s —— View job


PR Review

  • Gather context and understand the request
  • Read changed files
  • Review for correctness, security, and alignment with project guidelines
  • Post review findings

This is a clean, well-scoped documentation-only PR. Four files changed; no logic is touched. Here's my full assessment:


What the PR does

Declares SSOT ownership inside the plugin, closing the gap left by the retired external ghq-layout-sibling-pr-worktrees.md doc:

  1. babysit-prs/reference/worktrees.md lines 12–16 — adds a paragraph declaring this file as the canonical source for the babysit ephemeral-worktree exemption, with the discoverable-tree rationale.
  2. worktree/SKILL.md line 23 — adds one sentence declaring this skill as the canonical owner of the parallel-session external-root convention.
  3. plugin.json — version bump 0.17.0 → 0.17.1.
  4. CHANGELOG.md — matching [0.17.1] entry.

Correctness

No issues. Both added blocks accurately describe the existing machine-enforced policy (confirmed by the PR's own verification against prune_babysit_worktrees.py lines 189–194). The content is purely declarative — it states what is already true, not what should be true.

Placement in each file is logical:

  • In worktrees.md the SSOT declaration follows the opening "what worktrees are" paragraph and precedes ## Policy, where a maintainer reading top-to-bottom encounters it before the policy details.
  • In SKILL.md it's appended to the "Why this exists" paragraph, which is the right home for an ownership statement.

Version bump is appropriate. 0.17.0 → 0.17.1 for documentation-only additions is correct semver (patch). The CHANGELOG format (no dates, Keep-a-Changelog sections) matches the existing convention throughout the file.


Security

No concerns. This is entirely inert text — no code execution, no credential handling, no trust delegation, no external URLs, no data egress paths introduced. The plugin-form safety checklist passes unchanged.


Alignment with CLAUDE.md guidelines

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig ✓ (no change to config surface)
Plugin-form-safe (no ../ reach-outs)
Explicit semver version set ✓ (0.17.1)
No PII / secrets
Point-don't-copy (no restating of retired prose) ✓ — SSOT declared, not duplicated

Minor observation (no action required)

SKILL.md line 23 contains an unqualified #400 reference: "...and re-triggered the #400 double-load bug." The CHANGELOG's 0.17.0 entry qualifies external issue refs with the upstream repo (upstream anthropics/claude-code #29599 / #23565), but #400 is an internal issue in this same repo, so the bare reference is unambiguous for maintainers. A consumer reading the installed SKILL.md in isolation won't be able to follow the link, but since this is "Why this exists" prose rather than an actionable step, it causes no operational problem.


Summary

The PR does exactly what it says, adds no risk, and is correctly scoped. The do-not-merge hold (pending resolution of the version-bump collision with PR #853) is appropriate and correctly noted.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 57s —— View job


Security Review

  • Read changed files via git diff and gh pr diff
  • Review plugin.json version bump
  • Review CHANGELOG.md additions
  • Review worktrees.md SSOT statement
  • Review SKILL.md ownership statement
  • Report security findings

No security issues found.

This PR is entirely documentation and version metadata. All four changed files were audited:

File Change Security surface
plugins/source-control/.claude-plugin/plugin.json 0.17.00.17.1 version bump None — no schema changes, no new config keys, no permission changes
plugins/source-control/CHANGELOG.md New [0.17.1] entry None — static prose
plugins/source-control/skills/babysit-prs/reference/worktrees.md +6 lines of SSOT declaration prose None — no executable content, no templated paths, no new instructions to run commands
plugins/source-control/skills/worktree/SKILL.md +2 lines of ownership statement None — reiterates the existing worktree_root placement convention already enforced in the skill; does not introduce new shell execution paths

No injection surfaces, no secrets or credential handling, no GitHub Actions workflow changes, no permission widening, no new external dependencies, and no supply-chain risk in scope.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

🔒 merge-drive lane claiming this PR for on-branch fix work this cycle (amendment-round: 16, worker tier). Will fix clear branch-owned CI/bot findings, defer non-DEFER-FORBIDDEN items with reply+resolve, push, then re-check the merge gate.

Resolve source-control CHANGELOG conflict by composing both sides: keep #1055's
self-describing team-convention-file entry as [0.17.1] (shipped to main), and move
the worktree-convention SSOT entry to a new [0.17.2] heading. Re-bump plugin.json
0.17.1 -> 0.17.2 (one increment past main's current value).
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 48s —— View job


PR Review

  • Gather context and read changed files
  • Review for correctness, security, and CLAUDE.md alignment
  • Post findings

This is a documentation-only PR that closes an SSOT gap. All four changed files were read and audited against the diff.


What changed

File Change
plugin.json Version bump 0.17.1 → 0.17.2
CHANGELOG.md New [0.17.2] entry
babysit-prs/reference/worktrees.md +6 lines declaring this file as canonical SSOT for the babysit ephemeral-worktree exemption
worktree/SKILL.md +2 lines declaring this skill as canonical owner of the parallel-session external-root convention

Correctness

No issues with the content. Both added blocks accurately describe the existing machine-enforced policy, placement in each file is logical (declaration precedes the policy details in worktrees.md; ownership statement is within the "Why this exists" paragraph in SKILL.md).

One discrepancy to note — PR body is stale. The PR description says "This PR bumps 0.17.0 → 0.17.1 with a matching CHANGELOG entry", but the actual diff is 0.17.1 → 0.17.2, and the CHANGELOG entry is [0.17.2]. The code is internally consistent and correct (plugin.json and CHANGELOG.md both say 0.17.2). The PR body reflects the original plan before the version-bump collision with #853 was resolved via the merge commit 6c7a3d5. Not a blocking issue, but worth updating before merge to avoid future confusion reading the PR history.


do-not-merge label

The stated reason for the hold was: "open PR #853 also bumps plugin.json + CHANGELOG.md (a version-bump collision). Whichever merges second must re-bump."

That re-bump has happened — 6c7a3d5 merges origin/main into the branch and the version was corrected to 0.17.2. The collision is resolved. The do-not-merge label should be evaluated for removal now that the branch is synchronized with main and the version is correct.


Security

No concerns. Entirely inert documentation — no code execution, no credential handling, no permission changes, no external URLs, no data egress paths, no workflow modifications.


CLAUDE.md alignment

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig (no change to config surface)
Plugin-form-safe (no ../ reach-outs)
Explicit semver version set ✓ (0.17.2)
No PII / secrets
Point-don't-copy (no restating of retired prose)

Summary

The code changes are clean and correct. Two items to address before merge:

  1. PR body — update the version reference from 0.17.0 → 0.17.1 to 0.17.1 → 0.17.2 to reflect the actual change.
  2. do-not-merge label — if docs: document shell test-helper duplication and exit-code divergence as deliberate #853 has merged and the collision is fully resolved, this label can be lifted.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 44s —— View job


Security Review

  • Fetch PR diff
  • Read changed files
  • Audit for security issues
  • Post findings

No security issues found.

This PR is a pure documentation and version-metadata change. The four changed files were audited against the full vulnerability checklist:

File Change Security verdict
plugin.json Version 0.17.1 → 0.17.2 No schema changes, no new config keys, no permission surface modified
CHANGELOG.md New [0.17.2] entry Static prose only
babysit-prs/reference/worktrees.md +6 lines of SSOT declaration No executable content, no templated shell paths, no new instructions to invoke commands
worktree/SKILL.md +2 lines of ownership statement Path pattern <root>/<owner>-<repo>-<slug> is descriptive prose, not an executed template; no injection surface

Checklist — all items clear:

  • No GitHub Actions workflow files modified (.github/workflows/ untouched)
  • No pull_request_target / workflow_run patterns introduced
  • No run: blocks using the github context (no script injection risk)
  • No permission widening in any workflow or plugin manifest
  • No new external dependencies or action pins (no supply-chain risk)
  • No secrets, credentials, or PII in any added content
  • No new userConfig keys that could leak sensitive values
  • No ../ path reach-outs or ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No remote MCP server registrations or data-egress paths
  • No new external URLs

Third freshness merge. Resolve source-control plugin.json + CHANGELOG conflicts by
composing both sides: keep #1029's [0.18.0] required-sections-scaffold entry, move
the worktree-convention SSOT entry to a new [0.18.1] heading, re-bump plugin.json
0.18.0 -> 0.18.1 (one increment past main's current value).
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 33s —— View job


PR Review

  • Gather context and understand the request
  • Read changed files and diff
  • Review for correctness, security, and CLAUDE.md alignment
  • Post review findings

What changed (this synchronize)

The branch has been kept current with main via merge commits since prior reviews. The current diff is 0.18.0 → 0.18.1 — two minor-version bumps ahead of where the earlier reviews saw it (0.17.x). All four files are the same in content except the version numbers have advanced accordingly.

File Change
plugin.json L4 Version bump 0.18.0 → 0.18.1
CHANGELOG.md L6-L18 New [0.18.1] entry
babysit-prs/reference/worktrees.md L12-L16 +6 lines: SSOT declaration for the babysit ephemeral-worktree exemption
worktree/SKILL.md L23-L24 +2 lines: canonical ownership statement for the parallel-session external-root convention

Correctness

No issues. All added content accurately describes the existing, machine-enforced state of the plugin.

Version consistency: plugin.json and CHANGELOG.md both say 0.18.1. ✓

worktrees.md placement and content: The SSOT declaration (lines 12-16) lands between the intro paragraph and ## Policy, which is the correct position — a reader encounters the ownership statement before the policy details. The rationale (plugin data dir keeps worktrees outside discoverable trees like ghq list) is accurate and non-trivially useful: it explains why the default root placement is deliberate, giving a future maintainer the information needed to avoid undoing it.

SKILL.md placement and content: The ownership statement (line 23) is appended to the "Why this exists" paragraph — the correct home. The #400 bare issue reference is unambiguous in-repo but opaque to a consumer reading the installed SKILL.md. Same minor observation as prior reviews: not an operational problem since this is "Why this exists" prose, not an actionable step. No action required.

CHANGELOG format: [0.18.1] with ### Changed section and a bullet correctly matches the Keep-a-Changelog convention used throughout. ✓

PR body is stale. The description says "This PR bumps 0.17.1 → 0.17.2" — it's now two full minor versions behind the actual diff (0.18.0 → 0.18.1) because of subsequent merges from main. The code itself is internally consistent; the PR body is just a history artifact. Worth updating before merge to avoid confusion in the commit log.


Security

No concerns. All four changed files contain only inert documentation and version metadata:

  • No executable content, shell expansions, or templated paths added
  • No new userConfig keys or permission surface
  • No external URLs introduced
  • No ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No GitHub Actions workflow modifications
  • No PII or credentials

CLAUDE.md alignment

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig — no change to config surface
Plugin-form-safe — no ../ reach-outs
Explicit semver version set (0.18.1)
No PII / secrets
Point-don't-copy — SSOT declared, retired prose not restated

Summary

Clean, correct, documentation-only PR. Two items before merge:

  1. PR body — update the version reference from 0.17.1 → 0.17.2 to 0.18.0 → 0.18.1 to match the actual diff.
  2. do-not-merge label — re-evaluate: if no other open PRs are still bumping plugin.json/CHANGELOG.md for source-control, the version collision that prompted the hold is resolved on this branch.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 25s —— View job


Security Review

  • Gather context and understand the request
  • Fetch PR diff and read changed files
  • Hunt for vulnerabilities (injection, auth, secrets, GH Actions patterns)
  • Report findings

No security issues found.

All four changed files were audited against the full vulnerability checklist. This PR is entirely documentation and version metadata.

File Change Security assessment
plugin.json 0.18.0 → 0.18.1 version bump No new userConfig keys, no permission surface, no schema changes
CHANGELOG.md New [0.18.1] entry Static prose, no executable content
babysit-prs/reference/worktrees.md L12–16 +6 lines SSOT declaration No executable content, no templated paths, no instructions to run commands; ghq list cited as a descriptive example of enumeration tools, not an executed command
worktree/SKILL.md L23 +2 lines ownership statement <root>/<owner>-<repo>-<slug> is descriptive notation (angle-bracket placeholders) in prose, not an executed template; no new !-prefixed shell blocks added; no injection surface

Full checklist — all items clear:

  • No .github/workflows/ files modified
  • No pull_request_target / workflow_run patterns introduced
  • No run: blocks using the github context (no script injection risk)
  • No permission widening in any workflow or plugin manifest
  • No new external dependencies or action pins (no supply-chain risk)
  • No secrets, credentials, or PII in any added content
  • No new userConfig keys that could leak sensitive values
  • No ../ path reach-outs or ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No remote MCP server registrations or data-egress paths introduced
  • No new external URLs

Fourth freshness merge (post usage-limit pause). Resolve source-control plugin.json +
CHANGELOG conflicts by composing both sides: keep #1032's [0.19.0] setup/pr-body entries,
move the worktree-convention SSOT entry to a new [0.19.1] heading, re-bump plugin.json
0.19.0 -> 0.19.1 (one increment past main's current value).
@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude encountered an error after 1s —— View job


I'll analyze this and get back to you.

@claude

claude Bot commented Jul 22, 2026

Copy link
Copy Markdown

Claude encountered an error after 0s —— View job


I'll analyze this and get back to you.

@kyle-sexton kyle-sexton added needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this. and removed do-not-merge Hard merge gate: do not merge while applied. labels Jul 23, 2026
…layout-doc

# Conflicts:
#	plugins/source-control/.claude-plugin/plugin.json
#	plugins/source-control/CHANGELOG.md
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 18s —— View job


PR Review

  • Gather context and understand the request
  • Read changed files and diff
  • Review for correctness, security, and CLAUDE.md alignment
  • Post findings

This is a documentation-only PR that has been through multiple version-bump collision cycles; the content itself has not changed between review rounds. All four files were read against the current diff.

What changed

File Change
plugin.json L4 Version bump 0.26.2 → 0.26.3
CHANGELOG.md L6-L17 New [0.26.3] entry
babysit-prs/reference/worktrees.md L12-L16 +6 lines: SSOT declaration for the babysit ephemeral-worktree exemption
worktree/SKILL.md L23 +2 lines: canonical ownership statement for the parallel-session external-root convention

Correctness

No issues. Both added blocks accurately describe the existing, machine-enforced policy.

worktrees.md: The SSOT declaration lands at lines 12-16, between the intro paragraph and ## Policy — the correct position for a maintainer reading top-to-bottom. The ghq list rationale (why the default babysit_worktree_root lives outside every repository's discoverable tree) is accurate and non-trivially useful to a future maintainer.

SKILL.md: The ownership statement at line 23 is appended to the "Why this exists" paragraph — the correct home for a convention ownership statement.

Version consistency: plugin.json and CHANGELOG.md both say 0.26.3. ✓

CHANGELOG format: [0.26.3] with a ### Changed section and a bolded bullet matches the Keep-a-Changelog convention used throughout the file. ✓

PR body is stale. The description says "bumps 0.19.0 → 0.19.1" — the actual diff is 0.26.2 → 0.26.3, seven minor versions later. This has been flagged in every prior review cycle; the drift has widened with each sync. Not a blocker for merge, but worth updating before the squash lands so the commit message is accurate.


Security

No concerns. All four files are entirely inert documentation and version metadata:

  • No executable content, shell expansions, or templated paths added
  • No new userConfig keys or permission surface
  • No external URLs introduced
  • No ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No GitHub Actions workflow modifications
  • No PII or credentials

CLAUDE.md alignment

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig — no change to config surface
Plugin-form-safe — no ../ reach-outs
Explicit semver version set (0.26.3)
No PII / secrets
Point-don't-copy — SSOT declared, retired prose not restated

Minor observation (no action required)

SKILL.md L23 contains a bare #400 reference. Unambiguous for in-repo maintainers; opaque to consumers reading the installed skill file in isolation. Since this is "Why this exists" prose rather than an actionable step, it causes no operational problem.


Summary

Clean and correct. Two items before merge:

  1. PR body — update the version reference from 0.19.0 → 0.19.1 to the actual 0.26.2 → 0.26.3.
  2. needs-human label — human sign-off required per the label; no code or logic changes to assess here, so the review should be brief.

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 9s —— View job


Security Review

  • Gather context and understand the request
  • Fetch PR diff and read changed files
  • Hunt for security vulnerabilities
  • Report findings

No security issues found.

This PR is entirely documentation and version metadata. All four changed files were audited against the full vulnerability checklist.

File Change Security assessment
plugin.json L4 0.26.2 → 0.26.3 version bump No new userConfig keys, no permission surface, no schema changes
CHANGELOG.md L6–18 New [0.26.3] entry Static prose only
babysit-prs/reference/worktrees.md L12–16 +6 lines of SSOT declaration No executable content, no templated paths, no new shell invocations; ghq list is cited as a descriptive example of enumeration tools, not an executed command
worktree/SKILL.md L23 +2 lines of ownership statement <root>/<owner>-<repo>-<slug> is angle-bracket placeholder notation in prose, not an executed template; no new !-prefixed pre-computed blocks; no injection surface

Checklist — all items clear:

  • No .github/workflows/ files modified
  • No pull_request_target / workflow_run patterns introduced
  • No run: blocks using the github context (no script injection risk)
  • No permission widening in any workflow or plugin manifest
  • No new external dependencies or action pins (no supply-chain risk)
  • No secrets, credentials, or PII in any added content
  • No new userConfig keys that could expose sensitive values
  • No ../ path reach-outs or ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No remote MCP server registrations or data-egress paths introduced
  • No new external URLs

@kyle-sexton
kyle-sexton marked this pull request as ready for review July 25, 2026 15:26
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 51s —— View job


Security Review

  • Gather context and understand the request
  • Fetch PR diff and read changed files
  • Hunt for vulnerabilities (injection, auth, secrets, GH Actions patterns)
  • Report security findings

No security issues found.

All four changed files were audited against the full vulnerability checklist. This PR is entirely documentation and version metadata.

File Change Security assessment
plugin.json L4 0.26.2 → 0.26.3 version bump No new userConfig keys, no permission surface, no schema changes
CHANGELOG.md L6–18 New [0.26.3] entry Static prose only
babysit-prs/reference/worktrees.md L12–16 +6 lines SSOT declaration No executable content, no templated paths, no new shell invocations; ghq list is cited as a descriptive example of repository enumeration, not an executed command
worktree/SKILL.md L23–24 +2 lines ownership statement <root>/<owner>-<repo>-<slug> is angle-bracket placeholder notation in prose, not an executed template; no new !-prefixed pre-computed blocks added; the existing pre-computed blocks (lines 12–15) are unchanged and run only read-only git introspection commands

Checklist — all items clear:

  • No .github/workflows/ files modified
  • No pull_request_target / workflow_run patterns introduced
  • No run: blocks using the github context (no script injection risk)
  • No permission widening in any workflow or plugin manifest
  • No new external dependencies or action pins (no supply-chain risk)
  • No secrets, credentials, or PII in any added content
  • No new userConfig keys that could expose sensitive values
  • No ../ path reach-outs or ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No remote MCP server registrations or data-egress paths introduced
  • No new external URLs

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 1s —— View job


PR Review

  • Gather context and understand the request
  • Read changed files and diff
  • Review for correctness, security, and CLAUDE.md alignment
  • Post findings

This is a documentation-only PR closing an SSOT gap for worktree conventions. All four changed files were read against the full diff.

What changed

File Change
plugin.json L4 Version bump 0.26.2 → 0.26.3
CHANGELOG.md L6–17 New [0.26.3] entry
babysit-prs/reference/worktrees.md L12–16 +6 lines: SSOT declaration for the babysit ephemeral-worktree exemption
worktree/SKILL.md L23 +2 lines: canonical ownership statement for the parallel-session external-root convention

Correctness

No issues.

worktrees.md L12–16: The SSOT declaration lands between the intro paragraph and ## Policy — correct position for a top-to-bottom reader. The ghq list rationale is accurate and useful to a future maintainer considering repointing babysit_worktree_root.

SKILL.md L23: Ownership statement is appended to "Why this exists" — the correct home. The #400 bare issue reference is unambiguous in-repo (the double-load bug is in-repo issue #400); opaque to a consumer reading the installed skill in isolation, but this is "Why this exists" prose and not actionable, so it causes no operational problem.

Version consistency: plugin.json and CHANGELOG.md both say 0.26.3. ✓

CHANGELOG format: [0.26.3] with ### Changed and a bolded bullet matches the Keep-a-Changelog convention used throughout the file. ✓

PR body is stale: The description still references 0.19.0 → 0.19.1; the actual diff is 0.26.2 → 0.26.3. The code itself is internally consistent and correct — this is a history artifact from the version-bump collision cycles. Not a blocker, but worth a quick edit before the squash so the commit message is accurate.


Security

No concerns. All four files are entirely inert documentation and version metadata:

  • No executable content, shell expansions, or templated paths added
  • No new userConfig keys or permission surface changes
  • No external URLs introduced
  • No ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No GitHub Actions workflow modifications
  • No PII or credentials

CLAUDE.md alignment

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig — no change to config surface
Plugin-form-safe — no ../ reach-outs
Explicit semver version set (0.26.3)
No PII / secrets
Point-don't-copy — SSOT declared, retired prose not restated

Summary

Clean, correct, and appropriately scoped. Two items before merge:

  1. PR body — update the version reference from 0.19.0 → 0.19.1 to the actual 0.26.2 → 0.26.3 so the squash commit message is accurate.
  2. needs-human label — human sign-off required per the label. No code or logic changes here; the review should be brief.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a8783bb714

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/source-control/skills/worktree/SKILL.md Outdated
…ing invariant

The canonical-convention sentence promised worktrees never land under a
repository-discovery root, but creation only rejects paths inside an
existing repository. State the enforced invariant (nesting) as enforced
and the discovery-root placement as convention the operator chooses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017P1vVA8iViUTfQWjA9tgZG
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 57s —— View job


PR Review

  • Gather context and read changed files
  • Review the latest commit against the Codex P2 finding
  • Post findings

This review covers the full diff (0.26.2 → 0.26.3) with emphasis on commit c4a942a, which was pushed to address the Codex P2 review finding since the last review cycle.

What changed

File Change
plugin.json L4 Version bump 0.26.2 → 0.26.3
CHANGELOG.md L6–17 New [0.26.3] entry
babysit-prs/reference/worktrees.md L12–16 +6 lines: SSOT declaration for the babysit ephemeral-worktree exemption
worktree/SKILL.md L23 Canonical ownership sentence rewritten to narrow claim to enforced invariant

Codex P2 finding — addressed correctly

The Codex reviewer flagged that the previous SKILL.md sentence overclaimed: it said worktrees "never as siblings inside a repository's discoverable tree," which a reader could interpret as promising discovery-root placement is prevented, when worktree-create.sh only rejects paths inside an existing repository.

Commit c4a942a fixes this precisely. The new sentence at line 23:

  • States the enforced invariant as enforced: "never nested inside any repository's tree — that nesting invariant is what creation enforces"
  • Explicitly qualifies discovery-root avoidance as convention: "Keeping worktree_root clear of repository-discovery roots... is convention, not machine-checked"
  • Preserves the rationale so operators understand the risk: "a discovery-root placement would pollute repository enumeration the same way the sibling layout did — choose the root accordingly"

This is an accurate, appropriately scoped fix. The claim now matches what the code actually enforces.

Correctness

No issues.

worktrees.md L12–16: SSOT declaration is accurate — babysit worktree cleanup is fully machine-enforced by prune_babysit_worktrees.py lines 189–194 (the --prune-open-clean flag requires both --pr and --lease-token). The plugin-data-dir rationale is correct.

SKILL.md L23: Ownership sentence now accurately separates enforced invariants from convention guidance. The #400 bare issue reference remains opaque to consumers reading the installed skill in isolation, but this is "Why this exists" prose, not an actionable step — no operational impact.

Version consistency: plugin.json and CHANGELOG.md both say 0.26.3. ✓

CHANGELOG format: [0.26.3] with ### Changed and a bolded bullet matches the Keep-a-Changelog convention used throughout the file. ✓

Security

No concerns. All four changed files remain entirely inert documentation and version metadata. No executable content, no new permission surface, no external URLs, no PII, no workflow modifications.

CLAUDE.md alignment

Criterion Status
Repo-agnostic (no hardcoded paths/names)
Configurable via userConfig — no change to config surface
Plugin-form-safe — no ../ reach-outs
Explicit semver version set (0.26.3)
No PII / secrets
Point-don't-copy — SSOT declared, retired prose not restated

Minor note (no action required)

The PR body still references 0.19.0 → 0.19.1; the actual diff is 0.26.2 → 0.26.3. Worth a quick edit before the squash so the commit message is accurate, but not a blocker.

Summary

The Codex P2 finding is addressed correctly and completely. The PR is clean, correct, and appropriately scoped. The needs-human label indicates human sign-off is required — no code or logic changes here, only documentation and a version bump.

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 12s —— View job


Security Review

  • Gather context and understand the request
  • Fetch PR diff and read changed files
  • Hunt for security vulnerabilities
  • Report findings

No security issues found.

All four changed files were audited against the full vulnerability checklist. This PR is entirely documentation and version metadata. The latest commit (c4a942a) narrows a previously imprecise claim about enforcement scope — an improvement, not a regression.

Diff summary

File Change Security assessment
plugin.json L4 0.26.2 → 0.26.3 version bump No new userConfig keys, no permission surface, no schema changes
CHANGELOG.md L6–18 New [0.26.3] entry Static prose only
babysit-prs/reference/worktrees.md L12–17 +6 lines SSOT declaration No executable content, no templated paths, no new shell invocations; ghq list is cited as a descriptive example of repository enumeration, not an executed command
worktree/SKILL.md L23 +2 lines ownership statement (latest commit narrows prior claim) Angle-bracket placeholder notation in prose (<root>/<owner>-<repo>-<slug>); no new !-prefixed pre-computed blocks; no injection surface; the narrowing of "never land under a discovery root" → "convention, not machine-checked" is an accuracy improvement, not a weakening of security

Checklist — all items clear

  • No .github/workflows/ files modified
  • No pull_request_target / workflow_run patterns introduced
  • No run: blocks using the github context (no script injection risk)
  • No permission widening in any workflow or plugin manifest
  • No new external dependencies or action pins (no supply-chain risk)
  • No secrets, credentials, or PII in any added content
  • No new userConfig keys that could expose sensitive values
  • No ../ path reach-outs or ${CLAUDE_PLUGIN_ROOT} / ${CLAUDE_PLUGIN_DATA} misuse
  • No remote MCP server registrations or data-egress paths introduced
  • No new external URLs

Note on Codex P2 finding

The Codex review flagged that worktree-create.sh does not machine-enforce discovery-root placement. That is a pre-existing gap in the codebase — it is not introduced by this PR. The latest commit (c4a942a) explicitly discloses the gap ("creation rejects only paths inside an existing repository, and a discovery-root placement would pollute repository enumeration... — choose the root accordingly"), which is the correct documentation approach for an unenforceable convention. No new exploit surface is introduced.

@kyle-sexton
kyle-sexton merged commit 61aebff into main Jul 25, 2026
26 checks passed
@kyle-sexton
kyle-sexton deleted the chore/401-retire-ghq-layout-doc branch July 25, 2026 16:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Opened by automation. needs-human Human-in-the-loop required; autonomous sessions must not resolve items carrying this.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(source-control): retire stale ghq-layout-sibling-pr-worktrees doc; plugin owns worktree convention

1 participant