Skip to content

Replace the onboarding-branch entry with the sequence that avoids cleanup - #506

Merged
ptr727 merged 1 commit into
developfrom
feature/standup-branch-bootstrap
Aug 1, 2026
Merged

Replace the onboarding-branch entry with the sequence that avoids cleanup#506
ptr727 merged 1 commit into
developfrom
feature/standup-branch-bootstrap

Conversation

@ptr727

@ptr727 ptr727 commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Replaces the onboarding-branch entry added in #504 with the sequence Pieter proposed after watching Blog hit the problem.

What changed and why

The #504 entry said the initial commits belong on a feature branch and reach develop by squash. That is correct, but it still treats main and develop as branches an agent might commit onto and then have to clean up. Blog tried to squash its standup work back onto the main and develop it had already committed to, and was blocked, which is the ruleset doing its job.

The proposed sequence removes the problem rather than managing it:

  1. Create main, carrying nothing.
  2. Create develop from main, carrying nothing.
  3. Create the first feature branch from develop and do the whole standup there.
  4. Add the repo to GitHub and apply the repo config while still on that branch.
  5. Open a normal pull request to develop when the repo is ready.

Nothing ever has to be cleaned off main or develop, because nothing ever reached them without review.

Two details the write-up would otherwise get wrong

A git branch cannot exist without a commit. "Carrying nothing" therefore means exactly one signed empty root commit (git commit --allow-empty), not a literally empty ref. Section 0's signing window applies to that commit like any other, so it has to be signed before it is made.

Squashing afterwards is not an escape hatch. non_fast_forward is set on both develop payloads, so once history reaches develop it cannot be rewritten without disabling the ruleset. That is why Blog was blocked rather than merely inconvenienced.

The gap this fills

STANDUP.md says nothing about how main and develop come into being. Section 0 covers signing before the first commit, section 0A covers the human-gated prerequisites, and section 2 covers carrying the baseline files, but the branch bootstrap between them is undocumented. An agent with no instruction commits onto whichever branch it finds itself on.

Worth noting the protection is uneven, which the entry records:

Payload Rules Direct commit to develop
repo-config/develop.json (release) adds pull_request, required_linear_history, required_status_checks, copilot_code_review blocked
repo-config/operational/develop.json deletion, non_fast_forward, required_signatures only succeeds

On an operational repo the ruleset alone would not stop a direct commit, so only the instruction stands between it and an unfixable history. That is the argument for documenting the sequence rather than relying on the gate.

Correction, after this PR was opened: Blog is release, not operational. I had classified it wrongly, and Pieter corrected it. The test is where the config lives, since operational is for config that sits on the actual server, and Blog builds and pushes releases out instead. So Blog's own develop is PR-gated and the ruleset does block it. That strengthens the entry rather than weakening it: the uneven-protection point stands for every genuinely operational repo, and the bootstrap sequence is what keeps main and develop clean in both models.

The reason it matters on a public repo: the exploratory standup history is where PII, secrets and noise commits accumulate, and squashing a feature branch is the one chance to leave them out.

Verification

prose_lint TODO.md  (dash, semicolon, charset, charset-unknown, dupword, spelling, sentence-split)   clean
prose_lint . --check charset --check dupword --check spelling                                        clean
markdownlint-cli2 (docker)    0 issues
cspell (docker)               0 issues

cspell rejected "unreviewed" on the first pass. Rephrased rather than adding a word to cspell.json, since one entry's worth of dictionary growth is not worth a phrasing that had an ordinary alternative.

Backlog only. The STANDUP.md change itself is the work this entry describes, not this PR.

🤖 Generated with Claude Code

…anup

The previous entry said the initial commits belong on a feature branch and
reach develop by squash. Correct, but it still leaves main and develop as
things an agent might commit onto and then have to clean up. Blog tried
exactly that and was blocked, which is the ruleset working.

The better sequence removes the problem instead of managing it. Create main
carrying nothing, create develop from main carrying nothing, create the first
feature branch from develop and do the whole standup there, add the repo to
GitHub and apply the repo config from that branch, then open a normal pull
request to develop when ready.

Two details the write-up needs and would otherwise get wrong. A git branch
cannot exist without a commit, so "carrying nothing" means one signed empty
root commit, and section 0's signing window applies to it. And squashing
afterwards is not an escape, because non_fast_forward is set on both develop
payloads, so the history cannot be rewritten without disabling the ruleset.

STANDUP.md currently says nothing about how main and develop come into being,
which is the gap that lets an agent commit onto whichever branch it finds.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings August 1, 2026 15:04

Copilot AI 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 TODO backlog entry that tracks the planned STANDUP.md onboarding guidance, replacing the prior “initial commits on a feature branch then squash to develop” write-up with a more explicit branch-bootstrap sequence that avoids ever needing to clean up main/develop.

Changes:

  • Replaces the existing STANDUP.md-documentation backlog item with an explicit “bootstrap main/develop then do standup on first feature branch” sequence.
  • Adds the key constraint that “carrying nothing” still requires a (signed) empty root commit, and notes that non_fast_forward prevents later history rewrites on develop.
  • Records the operational vs release ruleset difference (repo-config/develop.json vs repo-config/operational/develop.json) as motivation for documenting the safer sequence.

@ptr727
ptr727 merged commit 69dcf16 into develop Aug 1, 2026
7 checks passed
@ptr727
ptr727 deleted the feature/standup-branch-bootstrap branch August 1, 2026 15:35
ptr727 added a commit that referenced this pull request Aug 1, 2026
… the carried-file corrections to main (#517)

Promotes twelve commits to `main`. Three of them change **carried**
files, so downstream repos read the stale text until this lands, which
is what makes the promotion the delivery step rather than bookkeeping.

## What this delivers to the fleet

**Carried-file corrections**, picked up by every repo on its next
re-vendor:

| PR | File | Correction |
| --- | --- | --- |
| #514 | `.github/copilot-instructions.md` | Described the pre-split
`AGENTS.md`, wrong in both halves. `GOVERNANCE.md` holds the rule
sections and the two `intent` ones; `AGENTS.md` carries two verbatim
sections and none repo-specific |
| #514 | `CODESTYLE.md` | Said MD033 flags HTML elements while the
config allows `details` and `summary`; also gains the `HISTORY.md`
mirror rule, moved from a hub-only spec file so a repo can read the rule
it is graded against |
| #514 | `WORKFLOW.md` | D2.2 "skipped on smoke" read as the job rather
than the validation, and a review acting on it proposed a change that
would have coupled the release to smoke |
| #503 | `.editorconfig`, `.gitattributes` | 36 comment findings in the
files a new repo copies first |
| #501 (earlier) | `repo-config/configure.sh` | Already on `main` |

**Spec and requirement changes**:

- **#507** makes `OPERATIONS.md` `appliesTo: "*"`, keyed to the need
rather than to `workflowModel`. Measured: 3 of 21 repos carry it, so
**17 will report a new `LETTER file:` finding**. Intended, and a headed
stub satisfies it.
- **#512** declares `.github/workflows/merge-bot-pull-request.yml` at
`interface` fidelity, closing a graded contract (`WORKFLOW.md` D8.1)
that no spec required. 15 of 21 already carry it, so this ratifies a de
facto standard; the other **6 report a new `DRIFT`**, and those six have
Dependabot pull requests piling up with nothing to merge them.
- **#505** stops the audit flagging the hub against itself and drops a
premise that was false since this repo went public.
- **#511** fixes the README shape across repository visibility.
- **#515** puts audit-report authorship with the hub and names the base
branch, after a downstream conformance PR targeted `main` and I merged
it without checking.
- **#513** forward-ports that PR's content, restoring the forward-only
invariant.

**Backlog and reports**: #504, #506, #510, #516 record the README shape
rework, the branch-bootstrap step, the declared-description design, and
why the audit is on demand.

## Fleet consequence, stated before it lands

Two owed follow-ups this promotion creates or carries:

1. **Re-vendor `repo-config/configure.sh`**, already owed from #501,
since it is `verbatim` with `appliesTo: "*"` and every repo holding a
copy is byte-mismatched.
2. **The next fleet audit reads noisier**, by 17 `OPERATIONS.md` letters
and 6 merge-bot drifts. Both are new requirements rather than repo
regressions.

## Verification

Run on `develop` at `e4c76bc`:

```
python3 scripts/test_prose_lint.py     144 tests, OK
python3 scripts/test_repo_gate.py       23 tests, OK
python3 scripts/test_pr_review.py       27 tests, OK
python3 spec/audit.py --selftest        SELFTEST PASS
python3 scripts/repo_gate.py            eol 0, sha-pin 0
python3 spec/validate.py                OK, 21 cataloged
prose_lint --check charset --check dupword --check spelling    clean
editorconfig-checker (docker, canonical)                       clean
```

Every one of the twelve was merged green with a Copilot review covering
its head SHA.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to 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