Retire the Carried Copy of the Configure Script - #90
Conversation
The hub hosts repo-config/configure.sh and no repository carries it, per the Hub-Hosted Tooling rule and the retire disposition in the hub's spec/divergences.json. A carried copy is current only until the next fix to it, and this one was already a past revision. The deletion is one edit and the sweep around it is four more, which is what the hub's RESYNC.md section 4 requires of any removal. repo-config/README.md now describes the script as hub-hosted and names the invocation with this repository as its argument, rather than describing a local file. AUDIT.md's runnable check says it runs from a hub checkout, so the path in it resolves where it is typed. TODO.md no longer lists the script among the files that must not be edited, since there is no local copy to protect. Four mentions stay and are correct. GOVERNANCE.md carries two in verbatim sections that name it as the hub's, which this repository may not edit and does not need to. Two in TODO.md are history about a past re-vendor and a statement about what the check reports, neither of which asserts a local file. The committed audit report keeps its own, being a point-in-time record replaced by a new run rather than edited. One unrelated correction in the same file, since leaving a known-false claim in a file being edited is worse than the edit: repo-config/README.md described the ruleset payloads as carrying bypass_actors. No payload declares one, the field is deliberately unmanaged, and the hub corrected the same sentence in its own copy. It reads as intent fidelity, so nothing mechanical would have reported it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR removes the repository-carried repo-config/configure.sh in favor of the hub-hosted script, and updates the local documentation to reflect that configure.sh is run from a hub checkout (while this repo continues to carry the ruleset/settings payloads it is audited against).
Changes:
- Delete the carried
repo-config/configure.sh(retired in favor of the hub-hosted copy). - Update
AUDIT.mdandrepo-config/README.mdto document runningrepo-config/configure.shfrom a hub checkout and explicitly naming the target repo. - Update
TODO.mdto remove the retired script from the “do not edit carried files” list and explain the retirement.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| TODO.md | Removes repo-config/configure.sh from the “do not edit” list and documents the retirement rationale. |
| repo-config/README.md | Rewords guidance to clarify configure.sh is hub-hosted and how to invoke it for this repo; clarifies bypass_actors is unmanaged. |
| repo-config/configure.sh | Deletes the carried script from this repository. |
| AUDIT.md | Adds an explicit note that the repo-config/configure.sh check ... command is run from a hub checkout. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Uh oh!
There was an error while loading. Please reload this page.
The payload bullet said the self-audit diffs the live rulesets, and this repo's own AUDIT.md says the opposite one file away: the check asserts rule presence, merge methods and required checks rather than diffing bytes, which is what keeps a ruleset GitHub has normalized from reading as drift. Two carried documents describing one behavior two ways is worse than either wording alone. The hub's copy says diffs and is right to, because the hub's own AUDIT.md section 6 runs a normalized diff. This repo's audit runs the configure check instead, so the wording diverges deliberately. That is what intent fidelity is for: the file is judged by meaning and describes the repository carrying it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (2)
repo-config/README.md:7
- The README describes running the hub-hosted script as
configure.sh ..., but from a hub checkout the script lives atrepo-config/configure.sh(it won’t run unless the caller happens to have it on PATH / is in the script directory). Using the explicit path here (and in the later Repo Settings paragraph) keeps the documented commands runnable from the hub repo root, matching AUDIT.md.
- `configure.sh`: **hosted in the hub and run from a hub checkout, not carried here**, per the Hub-Hosted Tooling rule in `GOVERNANCE.md`. The payloads above are what this repo is audited against and stay with it. The script holds nothing per-repo and is one copy for the fleet, so a carried copy would only be current until the next fix to it. Name the target repository explicitly, since the command defaults to whichever repository the shell is sitting in. Two modes over the GitHub API. `configure.sh apply ptr727/Blog release` creates-or-updates the settings, the Dependabot security features, and the rulesets idempotently. `configure.sh check ptr727/Blog release` is the read-only inverse and exits non-zero on any drift, with the assertions driven by the committed payloads rather than a byte diff, so a GitHub-normalized stored ruleset does not false-positive.
repo-config/README.md:5
- This bullet explains the audit is assertion-based (not a byte diff), but then says “nothing diffs it” for
bypass_actors. Using “asserts” here keeps the terminology consistent and avoids implying there’s still a diff-based check in this repo.
- `main.json` plus one `develop` variant: the branch rulesets as the managed part of the writable API subset (`name`, `target`, `enforcement`, `conditions`, `rules`). The `develop` payload is `develop.json` (`release` repos) or `operational/develop.json` (`operational` repos). These are the canonical expected payloads that the self-audit (`AUDIT.md`) validates the live rulesets against, by asserting rule presence, merge methods and required checks rather than diffing bytes, so a ruleset GitHub has normalized does not read as drift. `bypass_actors` is writable and deliberately unmanaged, so no payload declares one and nothing diffs it: who may bypass a ruleset is a human decision taken in the UI, which the configure script preserves on `apply` and reports without asserting on `check`.
The rewritten bullet gave the commands as `configure.sh apply ...` and `configure.sh check ...`. From a hub checkout root the script sits at repo-config/configure.sh, so neither runs unless the caller is already in that directory or has it on PATH. AUDIT.md gives the same command with its path, so the two carried documents disagreed on the one thing a reader would copy. That is the defect this pull request exists to fix, introduced while fixing it. A documented command that fails is the expensive shape, which is why the hub's sweep rule names it separately from a dead link. Every invocation now carries its path. Prose that names the check rather than presenting it as a command is left alone, in AUDIT.md and TODO.md, since the point is that a command a reader copies has to work rather than that the string never appears bare. One terminology slip with it: the bullet establishes that the audit asserts rather than diffing, then said nothing diffs bypass_actors. It says nothing asserts it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ptr727
commented
Aug 10, 2026
Both suppressed findings addressed in 31b8d2e, and the first one lands squarely on this pull request's own subject. The invocations were not runnable. You are right. From a hub checkout root the script is at Worth saying plainly: this pull request exists to fix non-runnable commands left behind by a deletion, and I introduced one while doing it. The hub's sweep rule singles out the runnable-command shape precisely because a documented command fails where a dead link merely disappoints, and I wrote a failing one into the fix. Every invocation now carries its path, in the bullet and in the Repo Settings paragraph you also flagged. I left the bare form where prose names the check rather than presenting it as a command, at The terminology slip is also right. The bullet establishes that the audit asserts rather than diffing bytes and then said "nothing diffs it" of Gates after the change: |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.
Suppressed comments (1)
repo-config/README.md:26
- This paragraph uses
repo-config/configure.sh apply/checkwithout the required repo/model arguments, which contradicts the earlier guidance to name the target repo explicitly and could lead to running the hub script against the current repo (e.g., the hub checkout) by accident. Use the fully-qualified invocation (or placeholders) here too so the backticked commands are safe to copy/paste.
The fleet-standard general settings live in [`settings.json`][settings-json] and are applied idempotently by `repo-config/configure.sh apply` alongside the rulesets (`gh api PATCH /repos/{owner}/{repo}`). The two settings that depend on per-repo state, `has_discussions` (visibility) and `default_branch` (main-must-exist), are computed by the script, not stored in the file. `repo-config/configure.sh apply` also enables Dependabot vulnerability alerts and automated security updates, fleet policy applied via the API rather than a `settings.json` key. `repo-config/configure.sh check` validates all of these and exits non-zero on drift.
The Repo Settings paragraph called the script with a path but no arguments, as `repo-config/configure.sh apply`. The bullet three paragraphs above says the command defaults to whichever repository the shell is sitting in, and the script is run from a hub checkout, so a reader copying that line while sitting in the hub would have applied configuration to the hub rather than to this repository. That is a mis-targeted write rather than a documentation nit, and it is an apply rather than a check, so it writes by default. Every invocation in the file now names the repository and the model, and the argument-less forms are gone. This is the second correction to the same commands in this pull request. The first added the path so they would run at all, and adding the path is what made the missing arguments dangerous rather than merely incomplete: before it, the line did not run, and after it, it ran against the wrong target. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ptr727
commented
Aug 10, 2026
Fixed in 2a42120, and this one is a safety finding rather than a style one, so thank you for flagging it as sharply as you did. The hazard, stated plainly. The Repo Settings paragraph invoked Every invocation in the file now names the repository and the model: Worth recording how this got worse before it got better. This is the second correction to the same commands in this pull request. The previous round added the path so they would run at all. Adding the path is exactly what turned the missing arguments from harmless into dangerous: before it, the line did not execute; after it, it executed against the wrong target. A half-fix to a command can be worse than the broken original, and I would not have predicted that ordering. Gates after the change: |
Uh oh!
There was an error while loading. Please reload this page.
Step 2 of the resync, per the hub's
RESYNC.mdsection 3. Follows #89, which carried the instruction set this step is judged against.The deletion
The hub hosts
repo-config/configure.shand no repository carries it, perGOVERNANCE.md"Hub-Hosted Tooling" and aretiredisposition in the hub'sspec/divergences.json. That disposition is what authorizes the removal: an untriaged hit could be this repo's own content at a shared path, and deleting that would destroy work the hub never owned.A carried copy is current only until the next fix to it, and this one was already a past revision.
The sweep is four more edits, and that is the point
The hub's
RESYNC.mdsection 4 counts the inbound sweep as part of the deletion, because the removal is one edit and finishing the job usually takes several more.repo-config/README.mdAUDIT.mdrepo-config/configure.sh check ptr727/Blog releaseTODO.mdA dead link disappoints; a documented command fails. That is why the
AUDIT.mdline mattered most.Four mentions stay, deliberately
GOVERNANCE.mdcarries two inside verbatim sections that name it as the hub's. This repo may not edit those and does not need to: Re-vendor the Carried Rule Sections From the Current Hub #89 re-vendored them from the hub revision that corrected the wording.TODO.mdkeeps two that are about the path rather than uses of it, one recording a past re-vendor and one stating whatconfigure.sh checkreports. Both stay true.reports/Blog/audit.mdkeeps its own. A committed audit report is a point-in-time record replaced wholesale by a new run rather than edited, per the hub'sAUDIT.mdsection 8.One unrelated correction in a file already being edited
repo-config/README.mddescribed the ruleset payloads as carryingbypass_actors. No payload declares one, the field is deliberately unmanaged, and the hub corrected the same sentence in its own copy. That file isintentfidelity, so it is presence-checked only and nothing mechanical would ever have reported this — it is exactly the class the hub'sRESYNC.mdsection 5 warns a resync cannot detect. Leaving a known-false claim in a file being edited is worse than the edit.Verification
prose_lint --diff HEAD,repo_gate --check eol,markdownlint-cli2on all three changed docs,editorconfig-checker: all clean. No workflow or config file referenced the script.Still to come
host-tools.json, then the README structure work.🤖 Generated with Claude Code