Skip to content

[self-audit] The repo's own validation anchor is structurally unrunnable in a headless dispatch, so template changes can never merge autonomously #109

Description

@dmccoystephenson

Gap found during Phase 9 self-audit (cycle that produced PR #108)

Filed here rather than on dmccoystephenson/create-dev-loop-dev-loop, which does not resolve — see #87.

What was observed

This repository's external anchor, per CLAUDE.md's "Testing changes" section, is a manual run of /create-dev-loop against a real target repository, followed by inspection of the generated skill. That anchor is not merely unavailable in a headless Gardener dispatch — it is structurally unrunnable there, for two independent reasons:

  1. The dispatch sandbox is scoped to this repository's own checkout, so no second repository is reachable to generate a skill against, and directory creation inside the allowed root can also be blocked — a constraint create-dev-loop.md:333 already documents, which rules out cloning a fixture locally as a workaround.
  2. Step 6 of the procedure creates a GitHub repository. That is an outward-facing, hard-to-reverse action that an unattended run should not take on its own.

The consequence compounds rather than being a one-off inconvenience: every autonomous cycle that touches create-dev-loop.md is permanently UNVERIFIED and therefore permanently unmergeable. Since create-dev-loop.md is also on the generated skill's do-not-auto-merge list, template work is the one category of work on this repo that a headless loop can never finish. PR #108 is the concrete instance — a three-line change, CI green, that must nonetheless be handed to a human.

What the existing coverage does and does not reach

CI is not a substitute. During PR #108's self-review the stash-and-revalidate step was performed rather than assumed: with the fix reverted to origin/main, scripts/check_docs.py still reported Doc consistency check passed. The defect did not surface, and this is expected — check_docs.py verifies placeholder/substitution-table parity, README-to-Step parity, and relative-link resolution. Step 2's file list is none of those. Green CI on a template change is evidence of no doc-drift regression and nothing more.

Issue #44 (closed) added generic UNVERIFIED handling to the template, which is what made PR #108 degrade honestly instead of claiming a green anchor. This issue is the complementary repo-specific gap: the honest degradation is working as designed, and the design leaves this repository with no runnable behavioral surface at all.

Directions worth considering

Offered as options rather than a recommendation; the trade-offs here belong to the maintainer.

  • A dry-run or fixture mode for /create-dev-loop that generates into a scratch path within the current tree and skips Steps 5–7, making generation observable without registering a command or creating a repository. This is the narrowest change that would make the anchor runnable headlessly.
  • A checked-in fixture repository skeleton (a few directories and convention files, no git remote) that generation can target in-tree, paired with assertions that the output contains no unresolved {{placeholders}} and carries correct header comments.
  • Extending scripts/check_docs.py toward the template's behavioral claims, accepting that it can only ever reach the mechanically checkable subset.
  • Explicitly deciding that template changes are human-validated by policy, and recording that in CLAUDE.md so the loop stops treating the resulting hand-off as a gap. This is a legitimate resolution and would close this issue as answered rather than fixed.

Self-audit rubric result for the cycle

  • Identity drift: PASS — placeholder parity, Step count, and escaping conventions all held; docs moved together with the change.
  • Instruction clarity: PASS — no step required reinterpretation. The Phase 4 UNVERIFIED gate and the do-not-auto-merge list both fired exactly as written.
  • Edge case coverage: PASS — the sandbox blocked rm even inside the allowed working directory, which create-dev-loop.md:268 already anticipates and prescribes a working alternative for.
  • Phase friction: PASS — Phases 5 through 8 collapsed to near-zero work because the merge gate was decided by Phase 4's anchor result.
  • Drift candidates: no signal this cycle.
  • External-signal quality: FAIL — the subject of this issue.

This issue body was drafted during a Gardener session (https://github.com/Stephenson-Software/gardener).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions