Name the prerequisites the agent cannot supply, and assert the remote - #491
Conversation
A repo stood up against this file reached 24 signed commits, the full carried instruction set, the baseline files, a working build and a proven gate, with no GitHub repository in existence. Steps 0 through 3 all completed. Step 4 was never reachable, and the maintainer found it by asking rather than by anything in the procedure reporting it. Nothing here created the repository, said who creates it, or said a remote is required from a given point on. Step 0 implies a local git init and step 4 presumes a remote, with nothing in between. The inputs that can only come from a human were never listed either, so each one blocked at the step that needed it instead of being handed over at the start. Step 0A lists them: the repository with its owner, name and visibility, the App installed rather than only created, the App secret values in both stores, and the publish credentials and environments the mechanisms declare. Creating a repository is an outward-facing write, so it needs per-session permission and the agent asks rather than assuming. Two statements carry the rest of the failure. A repo with no remote is not partially stood up, it is not started, and local progress is not evidence of onboarding progress, because AUDIT.md reads a live repo and is unavailable exactly while the condition holds. And a blocking prerequisite is escalated when it is found, because a task list renders it identically to a pending task, which is how this one survived a whole session. Step 4 now asserts the remote before it runs anything. An absent repository otherwise surfaces as a resolution error from whatever configure.sh calls first, which reads as a permissions or naming problem. The step also states why it follows step 3. A ruleset requiring a check name no run has reported leaves the first pull request waiting on a status nothing produces, and an operational repo promotes by pull request too, so it is not only a release-repo concern. Raised from the Blog standup (#490). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Updates the repository standup procedure (STANDUP.md) to explicitly surface maintainer-only prerequisites up front and to fail fast when the target GitHub repository/remote prerequisites are missing, addressing the onboarding stall described in #490.
Changes:
- Adds a new step 0A listing onboarding inputs the agent cannot supply (repo creation, app installation, secrets/publish credentials), and instructs escalation when a prerequisite is blocking.
- Updates step 4 to assert the target GitHub repository exists before running
repo-config/configure.sh, and explains why the ordering follows workflow standup.
Uh oh!
There was an error while loading. Please reload this page.
The step claimed to assert the remote while running only gh repo view, which proves the repository exists on GitHub and says nothing about whether this checkout can reach it. Those are two prerequisites, and the standup that prompted the step was missing both. git remote get-url origin now runs alongside it, and the prose says the two fail independently. A checkout with no origin has nothing to push to even where the repository exists, and that is the exact state a local-only standup reaches with every step reporting success. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
STANDUP.md:99
- In a POSIX shell,
<is input redirection, so copy/pastinggh repo view <owner>/<repo> ...will fail. Use a placeholder format that is safe to paste (e.g.,OWNER/REPO).
gh repo view <owner>/<repo> --json nameWithOwner,visibility
STANDUP.md:95
- The checks here confirm (1) an
originremote exists and (2) the target repository exists on GitHub, but they do not verify thatoriginactually points to that repo. Consider adjusting the wording to avoid implying a stronger assertion than the commands perform.
**Assert that the repository exists and that this checkout points at it**, since this is the first step needing either and every step before it passes without both:
Two defects in the same block. The placeholder was <owner>/<repo>, and in a POSIX shell < is input redirection, so the line fails on paste. The rest of this file already writes it [owner/repo], and a shell block takes the bare OWNER/REPO form that survives a copy. The wording also still overclaimed. Reading a remote and resolving a repository proves each exists and proves nothing about whether the first points at the second, so the step now says the agent compares the two outputs and names that as the third thing being checked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ptr727
commented
Aug 1, 2026
Answering the two suppressed findings from round 2, since neither reaches a thread. Both accepted, fixed in 1. 2. The wording still overclaimed, one round after the first correction. Also correct. Reading a remote proves a remote exists, resolving a repository proves the repository exists, and neither proves the first points at the second. The step now says the agent compares the two outputs and names that comparison as the third thing being checked, rather than implying the commands do it. Worth recording that this is the second round on the same sentence. The first correction added the local half after |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.
Suppressed comments (2)
STANDUP.md:99
- The placeholder
OWNER/REPOin the example command is inconsistent with the rest of this document’s placeholder style (e.g.,reports/<repo>/...) and can be read as a literal. Using the same<owner>/<repo>convention makes it clearer that the value must be substituted.
gh repo view OWNER/REPO --json nameWithOwner,visibility
STANDUP.md:102
- This paragraph says “Any of the three” even though only two commands are listed above, and the three distinct conditions being checked (missing
origin, missing repo, or mismatch) aren’t explicitly named. Reword to avoid the dangling reference and make the checked conditions explicit.
Each command answers half the question, and the agent compares the two outputs to confirm they name the same repository, which neither command checks on its own. A checkout with no `origin` has nothing to push to even where the repository exists, and it is the state a local-only standup reaches with every step reporting success. An absent repository instead surfaces as a resolution error against whatever `configure.sh` calls first, which reads as a permissions or naming problem rather than as the missing prerequisite it is. Any of the three turns a confusing stall into a specific one, and any of them is step 0A's escalation rather than something to work around.
Two findings on the same block, and the first pair reads as a contradiction worth resolving rather than picking a side. One round asked for a pasteable placeholder because an unquoted < is input redirection, and the next asked for the document's <owner>/<repo> convention. Quoting satisfies both: the line pastes and runs, and the placeholder still reads as one. The prose also said "any of the three" while listing two commands, so the three conditions are now named. A missing origin, a missing repository, and the two disagreeing are separate failures, and the third is the one neither command reports, so the step says to compare the outputs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ptr727
commented
Aug 1, 2026
Answering the two suppressed findings from round 3. Both accepted, fixed in 1. Placeholder style. This one contradicts the round-2 finding on the same line, which asked for a pasteable placeholder precisely because an unquoted $ echo gh repo view "<owner>/<repo>" --json nameWithOwnergh repo view <owner>/<repo> --json nameWithOwner
$ echo gh repo view <owner>/<repo> --json nameWithOwnerbash: line 1: owner: No such file or directoryThe document's convention is kept and the command survives a paste. The prose says why the quotes are there, so the next editor does not helpfully remove them. 2. "Any of the three" with two commands listed. Correct, and the dangling reference hid the more useful content. The three conditions are now named as separate bullets: no |
Uh oh!
There was an error while loading. Please reload this page.
…to main (#498) Promotes eight commits from `develop`. Every one traces to a defect found in use rather than to a planned change, and five came from downstream agents reporting what the procedure did not cover. ## What lands | Commit | Change | | --- | --- | | `a0f6f24` (#487) | `docs/content-import.md`, the three capture-pass findings from the Blog migration: an export is not a media capture, a sitemap is not the URL contract, and an HTTP fetch is not the original | | `8bdfa22` (#494) | The write-guard scopes by **owner** rather than exact origin, with `GH_WRITE_GUARD_ALLOW` for a different owner. Four target-flag spellings that silently bypassed rule 3 are closed | | `981d92f` (#492) | The purpose is restated as agent enablement, in `README.md`, `HISTORY.md` and `AGENTS.md` | | `275705b` (#493) | `TODO.md` becomes the fleet backlog destination, and `spec/readme-structure.md` stops mandating the construction `GOVERNANCE.md` bans | | `b6ab6db` (#491) | `STANDUP.md` step 0A names the maintainer-only prerequisites, and step 4 asserts the remote | | `89e3868` (#488) | The `version.json` floor is chosen at standup rather than inherited | | `eed2e00` (#495) | `README.md` gains "What It Achieves", the objectives and the fidelity ladder | | `f6dc5e6` (#497) | `CODESTYLE.md` stops claiming CI runs the same checks as the clean-compile | ## Provenance Five of the eight answer issues filed by downstream agents: #456 (Blog intake), #489 and #490 (the Blog carry), and #496 (Financial-Modeling). That loop is the one "What It Achieves" now describes, and this promotion is it closing. ## Divergence, checked rather than assumed `main...develop` reports `8 ahead, 102 behind, diverged`. **The 102 are topology, not content.** They are 79 promotion merge commits, which are main-only by construction because a promotion is a two-parent merge, plus 23 `Update codegen files` bot commits from this repo's pre-2.0 life as a .NET sample template. `git diff --name-status origin/develop origin/main` returns exactly the 12 files these 8 commits touch, so there is **no main-only content** to reconcile. ## Verification on the merged `develop` Every gate re-run after the last merge, not inherited from the individual PRs: - `prose_lint.py . --check charset --check dupword --check spelling` clean tree-wide. - `repo_gate.py` clean (`eol`, `sha-pin`). - `spec/validate.py` clean, 21 cataloged repos classify. - `gh-write-guard.py --selftest` passes, including the nine new repository-scope cases. - `python3 -m unittest discover -s scripts`, 180 tests pass. - The `README.md` objectives list verified as one continuous list of 8 bullets with the fidelity table nested, since an unindented table split it in review. ## Merge mechanics This is a promotion, so it merges as a **merge commit** with two parents, never a squash. Its head **is** `develop`, so `--delete-branch` must not be used. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Closes the gap reported in #490, found by standing Blog up against
STANDUP.md.What happened
Blog reached 24 signed commits, the full carried instruction set, the baseline files, a working build, a proven URL gate, and a site serving locally. The GitHub repository did not exist. Steps 0 through 3 all completed, step 4 was never reachable, and the maintainer found it by asking rather than by anything in the procedure reporting it.
Verified against the tree rather than taken on report:
STANDUP.mdcontains no occurrence ofgh repo,remote, ororigin, and names the maintainer exactly three times, none of them for an onboarding input.Why the procedure allowed it
Step 0 implies a local
git initand step 4 presumes a remote, with nothing in between creating the repository or saying who does. The inputs that can only come from a human were never enumerated, so each blocked at the step that needed it instead of being handed over at the start. And every local step passes with no remote at all, so the procedure reported progress the whole way.What lands
Step 0A lists what only the maintainer can supply, as a checklist to hand over before step 1:
repo-config/README.mdalready states the distinction)spec/secrets.jsonCreating a repository is an outward-facing write, so it sits behind the per-session permission
GOVERNANCE.md"Repository Boundaries and Write Safety" requires, and the agent asks rather than assuming.Two statements carry the rest of the failure:
AUDIT.mdreads a live repo, so the one instrument that would catch this is unavailable exactly while it holds.Step 4 asserts the remote before running anything, with
gh repo view <owner>/<repo>. An absent repository otherwise surfaces as a resolution error from whateverconfigure.shcalls first, which reads as a permissions or naming problem rather than the missing prerequisite it is.Step 4 also states why it follows step 3. A ruleset requiring a check name no run has ever reported leaves the first pull request waiting on a status nothing produces, and an operational repo promotes by pull request too, so this is not only a release-repo concern.
One deviation from the issue's suggestion
#490 says the check-name fact "is currently in
repo-config/README.mdrather than in the step that needs it". It is in both: step 4 already ended with it. So this adds the ordering consequence rather than restating the fact, since duplicating a rule into a second location is its own defect.Verification
python3 scripts/prose_lint.py . --check charset --check dupword --check spellingclean tree-wide, and the warn set clean onSTANDUP.md. Both invocations match the CI steps invalidate-task.ymlrather than the narrower ad-hoc default.🤖 Generated with Claude Code