Scrub template attributions from carried prose (#357 item 1) - #360
Merged
Conversation
The name-and-link leak was fixed in #359; this is the softer half a downstream agent caught, which that check cannot see: carried prose that attributes a rule to "the template" ("the template ships README + HISTORY as the default", "the template implements it as the literal main"). Naming no repo, it still exposes a coordinator the reader cannot reach and reads as someone else's rule rather than this repo's. Eleven attributions across AGENTS.md, CODESTYLE.md, and WORKFLOW.md now state the rule directly - "README + HISTORY are the default", "it is implemented as the literal main", "the constraint is only that the output be input-deterministic". Behavior is unchanged; only the framing moves from reported to owned. The single remaining occurrence is the rule that bans the practice, which cannot be stated without referring to the concept; it names no repo and gives no location. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates carried governance documentation to remove “template”-attributed framing (“the template does X”) and restate rules as owned, repo-agnostic guidance (item 1 of #357), without changing any underlying workflow or policy behavior.
Changes:
- Rephrases workflow-contract prose to avoid “template byte-for-byte” comparisons and similar template attribution.
- Updates code style documentation to state defaults directly (spelling CI scope; Python profile description) rather than attributing them to the template.
- Adjusts AGENTS guidance to express requirements directly (ruleset import, codegen determinism, App-token
client-idguidance).
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| AGENTS.md | Rewords a few governance bullets to remove template-attributed phrasing and state rules directly. |
| CODESTYLE.md | Reframes spelling CI scope and Python profile description as defaults, not template-provided behavior. |
| WORKFLOW.md | Reframes workflow correctness and defaults as contract-owned behavior rather than template-implementation behavior. |
The first pass matched "the template"/"template's" and so missed "this template" - two more instances in AGENTS.md and CODESTYLE.md. Re-swept with a broader pattern covering this/the/a/its/our; the only remaining occurrence is the rule that bans the practice, which cannot be stated without naming the concept. Fixing the class rather than the flagged instance, per the rule this repo added in #356: a reviewer samples, it does not enumerate. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
AGENTS.md:41
- This sentence still uses the "this template ..." framing ("this template uses rulesets only"), which seems to be the kind of carried attribution this PR is trying to remove. Consider rephrasing it as an owned rule (e.g., branch protection uses rulesets only) to match the rest of the scrubbed prose.
- **Configuring branch protection on a fleet repo: don't hand-build the rules.** Reconstructing the rules by hand is error-prone and has gone wrong on past ports. First delete **all** legacy classic branch-protection rules and any stray rulesets (rulesets are the *only* mechanism used), then create **exactly two rulesets named `develop` and `main`** by importing the committed `repo-config/*.json` ruleset payloads via `gh api -X POST .../rulesets` (`gh ruleset` is read-only). The names are load-bearing - this file and the workflows reference them. Operational repos import [`operational/develop.json`](./repo-config/operational/develop.json) as their `develop` ruleset (the `main` ruleset is shared); [`configure.sh`](./repo-config/configure.sh) selects the right develop payload from the registry `workflowModel` automatically. The full export/import procedure and the regen snippet live in the hub-only `docs/repo-config-carry.md`. **Brownfield repos** (pre-existing history) need an extra step: `Require signed commits` rejects legacy unsigned commits and the admin bypass does not cover `git push --force`, so re-signing requires temporarily disabling the ruleset - the maintainer-only brownfield migration procedure is in that same hub doc.
WORKFLOW.md called the release workflow model "the release template", the same attribution class this PR removes; it now says "the release model", matching the workflow-model terminology the document already uses. The remaining matches are different meanings, not attributions: Serilog structured message templates in CODESTYLE.md, and the reports/_template.md filename in AUDIT.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ptr727
added a commit
that referenced
this pull request
Jul 19, 2026
Adopts **item 2** of #357, in the sections the owner chose. Item 1 is #360. ## Comments: no header summary blocks > **No class-, type-, or file-header summary comment blocks.** A type or file gets a comment only for a specific non-obvious point, kept terse. Placed in `AGENTS.md` "Comments", which already bans design narrative, rule citations, and verbosity creep - a header summary is the same failure at file scope: it restates the declaration below it and goes stale as the file grows. **One carve-out added:** a licence or provenance header that a tool or policy requires is not a summary, so it is unaffected. That was the only real objection to a blanket ban. ## Character Set: no clause-joining semicolons > **No semicolon joining two independent clauses in agent-authored prose** - documentation, comments, commit messages, and PR descriptions. Placed beside the ASCII/em-dash rules, as the same class of house-style constraint on agent prose habits. **Written to the proposal's actual scope.** It says "as sentence separators", which is narrower than all semicolons, so the rule bans the clause-joining use and explicitly preserves two legitimate ones: a semicolon separating items in a list that already contains commas, and a statement terminator in code. ## On sweeping existing prose I measured before writing the rule, because a rule the hub immediately violates is the trap this repo hit with `set -Eeuo` (#338/#350): ```text AGENTS.md 79 WORKFLOW.md 80 CODESTYLE.md 33 AUDIT.md 22 copilot-instructions 16 README.md 9 STANDUP.md 5 repo-config/README 4 TOTAL 248 prose lines containing a semicolon ``` Not all are clause-joining - many are list separators the rule preserves - but a full sweep would still be a sprawling rewrite of dense governance prose with real risk of changing meaning in text that is load-bearing. So the rule states that **existing prose is corrected as each file is next edited, not swept**. That matches how the fleet already handles propagation debt, and it is honest about the hub's current state rather than pretending compliance. Flagging plainly: this changes my own output style going forward, and the 248 lines are a known, deliberate residue rather than an oversight. `spec/validate.py`, markdownlint, editorconfig-checker: clean. CRLF preserved. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Addresses item 1 of #357. Item 2 (the two prose/comment style proposals) is deliberately not in this PR - it is a house-style decision I am putting to the owner separately.
The gap this closes
#359 fixed the hard leak: a carried file naming or linking the private template, which 404s for that repo's readers. It also mechanized a check for it.
A downstream agent caught the soft half, which that check cannot see because it greps for the repo name: carried prose that attributes a rule to "the template".
No repo is named, so nothing 404s - but it still exposes a coordinator the reader cannot reach, and it frames the repo's own rule as someone else's. Genuinely good catch; the durable fix belongs here, as the filer said, or it returns on every reconvergence.
What changed
Eleven attributions across
AGENTS.md,CODESTYLE.md, andWORKFLOW.mdnow state the rule directly:client-id: ..."client-id: ..."main"main"repo-config/*.jsonruleset payloads"Behavior is unchanged throughout; only the framing moves from reported to owned.
One occurrence remains by necessity: the rule that bans the practice (
AGENTS.md"This includes the template repo itself"). It cannot be stated without referring to the concept, and it names no repo and gives no location.Two later passes caught what the first regex missed - "this template" (AGENTS.md, CODESTYLE.md) and "the
releasetemplate" (WORKFLOW.md). Remaining matches for the word are different meanings, not attributions: Serilog structured message templates, and thereports/_template.mdfilename.Note on the mechanical check
spec/audit.pygreps for the repo name, so it catches the hard leak but not this class - phrasing is a judgment call and a keyword sweep for "the template" would false-positive on legitimate uses (this PR's own rule statement, for one). Flagging that limitation rather than pretending the check covers it.spec/validate.py, markdownlint, editorconfig-checker: clean. CRLF preserved.🤖 Generated with Claude Code