Skip to content

Scrub template attributions from carried prose (#357 item 1) - #360

Merged
ptr727 merged 3 commits into
developfrom
scrub-template-attributions
Jul 19, 2026
Merged

Scrub template attributions from carried prose (#357 item 1)#360
ptr727 merged 3 commits into
developfrom
scrub-template-attributions

Conversation

@ptr727

@ptr727 ptr727 commented Jul 19, 2026

Copy link
Copy Markdown
Owner

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".

"A repo owner may widen their own CI file list, but the template ships README + HISTORY as the default"
"Guarantees say 'default branch' portably; the template implements it as the literal main"

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, and WORKFLOW.md now state the rule directly:

before after
"the template ships README + HISTORY as the default" "README + HISTORY are the default"
"the template's default Python profile" "the default Python profile"
"the template uses client-id: ..." "use client-id: ..."
"the template implements it as the literal main" "it is implemented as the literal main"
"the template constrains only that the output be input-deterministic" "the constraint is only that the output be input-deterministic"
"not when it matches the template byte for byte" "not when it matches a reference implementation byte for byte"
"the template ships the tracker but not this consumer wiring" "the tracker ships without this consumer wiring"
"by exporting the template's two rulesets" "by importing the committed repo-config/*.json ruleset payloads"
"Because the template has no such leaf" "Because no such leaf ships"

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 release template" (WORKFLOW.md). Remaining matches for the word are different meanings, not attributions: Serilog structured message templates, and the reports/_template.md filename.

Note on the mechanical check

spec/audit.py greps 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

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>
Copilot AI review requested due to automatic review settings July 19, 2026 00:27

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

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-id guidance).

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.

Comment thread AGENTS.md Outdated
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>

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

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.

Copilot AI review requested due to automatic review settings July 19, 2026 03:16

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

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment thread WORKFLOW.md Outdated
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>
Copilot AI review requested due to automatic review settings July 19, 2026 03:23
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>

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

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

@ptr727
ptr727 merged commit 8f13782 into develop Jul 19, 2026
7 checks passed
@ptr727
ptr727 deleted the scrub-template-attributions branch July 19, 2026 03:26
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