Skip to content

Name the prerequisites the agent cannot supply, and assert the remote - #491

Merged
ptr727 merged 4 commits into
developfrom
feature/standup-prerequisites
Aug 1, 2026
Merged

Name the prerequisites the agent cannot supply, and assert the remote#491
ptr727 merged 4 commits into
developfrom
feature/standup-prerequisites

Conversation

@ptr727

Copy link
Copy Markdown
Owner

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.md contains no occurrence of gh repo, remote, or origin, 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 init and 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:

  • the repository, with owner, name, and visibility
  • the GitHub App installed on it, not merely created (repo-config/README.md already states the distinction)
  • the App secret values, in the Actions and Dependabot stores both
  • every publish credential and environment the repo's mechanisms declare in spec/secrets.json

Creating 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:

  • A repo with no remote is not partially stood up. It is not started. Local progress is not evidence of onboarding progress, and AUDIT.md reads a live repo, so the one instrument that would catch this is unavailable exactly while it holds.
  • A blocking prerequisite is escalated when it is found, not carried. In a task list it renders identically to a pending task, which is how this one survived an entire session while work continued around it.

Step 4 asserts the remote before running anything, with gh repo view <owner>/<repo>. An absent repository otherwise surfaces as a resolution error from whatever configure.sh calls 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.md rather 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 spelling clean tree-wide, and the warn set clean on STANDUP.md. Both invocations match the CI steps in validate-task.yml rather than the narrower ad-hoc default.
  • markdownlint-cli2 and editorconfig-checker clean.
  • CRLF-only by byte scan, 24 insertions and 1 modified line.

🤖 Generated with Claude Code

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>
CopilotAI review requested due to automatic review settings August 1, 2026 03:36

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

Comment threadSTANDUP.md Outdated
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>
CopilotAI review requested due to automatic review settings August 1, 2026 03:39

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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/pasting gh 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 origin remote exists and (2) the target repository exists on GitHub, but they do not verify that origin actually 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>
CopilotAI review requested due to automatic review settings August 1, 2026 03:44
@ptr727

Copy link
Copy Markdown
OwnerAuthor

Answering the two suppressed findings from round 2, since neither reaches a thread. Both accepted, fixed in 427cfb27b8c4fe556926692eda36f8feadf85997.

1. <owner>/<repo> is not pasteable. Correct, and it is the worse kind of doc bug because the reader is being told to run the line. In a POSIX shell < is input redirection, so the command fails on paste with an error about a file rather than about the repository. The rest of this file already writes it [owner/repo], so the block was also inconsistent with its own document. It is now the bare OWNER/REPO form, which survives a copy and reads unambiguously as a placeholder.

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 gh repo view alone was called an assertion of the remote, and the heading then absorbed a claim the new command still did not support. A heading that summarizes two commands is where an overclaim hides, because the commands underneath look like evidence for it.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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/REPO in 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

Copy link
Copy Markdown
OwnerAuthor

Answering the two suppressed findings from round 3. Both accepted, fixed in ac79eb6026f1efbab0624f4a7faaf8717ece2ab6.

1. Placeholder style. This one contradicts the round-2 finding on the same line, which asked for a pasteable placeholder precisely because an unquoted < is input redirection. Rather than pick a side, the line now quotes it, which satisfies both:

$ 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 directory

The 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 origin, no repository, and the two disagreeing. The third is the one neither command reports, which is what the previous round's correction was about, so it now appears as a condition to check rather than as a clause inside a paragraph.

CopilotAI review requested due to automatic review settings August 1, 2026 03:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.

@ptr727
ptr727 merged commit b6ab6db into developAug 1, 2026
7 checks passed
@ptr727
ptr727 deleted the feature/standup-prerequisites branch August 1, 2026 04:52
ptr727 added a commit that referenced this pull request Aug 1, 2026
…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)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@ptr727