docs(register): scrub internal crew register from adopter surfaces (#340 + #339 + #342) #352

Merged
herald merged 7 commits from i/340-register-audit into main 2026-07-03 22:34:10 +02:00
Owner

What

Public-mirror register audit before v1.0.0: scrub release-toolkit's internal
crew register from adopter-facing surfaces, so a first-time reader meets
the toolkit's machinery — not the chamber it was built in. Closes #340
(the consolidated audit), #339 (operations.md residual), and #342
(cold-read framework disambiguation).

Source-of-record for the audit premise: the anonymous external cold-read
(ChatGPT) at BookStack page 210, which flagged two classes — invented
terminology used far beyond what improves clarity
and internal AI-review
narration shipped as part of the public product
.

The cut line (per QM ruling)

Two axes, one principle: keep design provenance, drop narration provenance.

  • Axis 2 — narration provenance → SCRUB. Chamber-name + hex-id
    attributions (per Surveyor 4a73, Bosun 312c dispatch, per Herald β-refined naming). The why-the-decision survives in git blame + the
    issue/PR links, which are untouched; per Surveyor f5b9 is conversational
    transcript, not decision-record content.
  • Axis 1 — coined register → SCRUB where decorative, GLOSS where
    load-bearing.
    substrate-honest and bare substrate rewritten to plain
    per-context (near-zero information loss — matches the Tier-A precedent
    substrate desyncedrelease state desynced). Load-bearing design
    vocabulary is kept and glossed on first use: mechanism-of-touch
    (self-bootstrap re-pin invariant), path α/β/γ, mode = noop|update|cut,
    rolling PR, bake/rebake.

Heading renames (anchors fixed in lockstep)

The recurring coined heading "Substrate-honesty self-check" (ADR-0005,
ADR-0006) → "Falsifier + evidence-completeness self-check"; ADR-0003's
"The forced UI-publish step is substrate-honest""…ties deploy to
operator intent."
Every inbound cross-ADR anchor reference was updated in
the same commit — verified no dangling #…substrate-honest… links repo-wide.

Coverage

Enumerated adopter surfaces first (README, docs/*.md, docs/adr/,
docs/migration/, scripts/, .forgejo/, release-toolkit.yml), then a
repo-wide grep-0 sweep as the backstop — which surfaced three files
outside the initial enumeration (docs/events-logging.md,
docs/migration/tmux-tell.md, the config template). All now clean; the
final sweep over every tracked file returns zero chamber-name/hex-id/coined
substrate hits outside the kept surfaces below.

Not in scope — deliberately kept

The register is the crew's working vocabulary and belongs where maintainers
read; scrubbing it there would be lossy, not clarifying. These surfaces keep
it by design:

Surface Why kept
AGENTS.md (maintainer contributor guide) Maintainer-facing by definition — like CONTRIBUTING.md; §2/§8/§10 disciplines are the build-crew's own record
docs/internal/** (cold-read framework, capture templates) Explicitly internal maintainer tooling; #342 only disambiguates its H1 vs the adopter-facing changelog verifier
tests/**.bats Contributor-facing (same tier as AGENTS.md); several refs are load-bearing fixtures — e.g. changelog.bats asserts the humanizer strips Surveyor 96d8d385, so that string is test data, not narration
CHANGELOG.md history Immutable release-of-record; past entries are not rewritten
tmux-tell design-lineage refs in ADRs Real sister-project origin (documented public consumer) — design provenance, not narration
Issue/PR links (incl. alcatraz-infra#NN) The design-provenance keeper per the cut line
release-bot, forgejo-actions, Nagy Real service accounts / external maintainer — not chamber narration

Review fix (Surveyor 3533): repin.sh had also functionally defaulted
REPIN_REVIEWER to surveyor — a chamber-name in a script docs/VERSIONING.md
publishes as a v1.x CLI contract, and a broken default for adopters (requests a
reviewer that doesn't exist in their repo). Now scrubbed: empty default + gated
request + the surveyor identity moved to the maintainer call site (AGENTS.md
§2.5, where the register is kept). A fixed fragment records the published
behavior change.

Also folded (per Bosun ruling)

changelog.d/332.changed.md carried one chamber-narration phrase ("Fix
Option A per cold-read + Bosun ratify"
) that would ship into the v1.0.0
CHANGELOG
— the exact provenance-leak class the external cold-read grades
against. Surfaced in the repo-wide sweep and flagged to Bosun, who ruled
fold-it-in-now: it closes the specific v1.0.0 exposure, while the broader
historical-CHANGELOG chamber-narration remains the changelog-humanization
arc's scope (not preempted). Scrubbed to plain adopter release-note prose —
same shape as the 3 backstop surfaces above, one layer down at the
changelog-fragment level.

Sequencing

This lands before the Pilot Cold-Read and the external outside-model
cold-read, so the adopter surfaces are polished when both grade the
v1.0.0-candidate. Success criterion for the external pass: no further
objections of the same class the ChatGPT review raised.

🤖 Generated with Claude Code

## What Public-mirror register audit before v1.0.0: scrub release-toolkit's internal crew register from **adopter-facing** surfaces, so a first-time reader meets the toolkit's machinery — not the chamber it was built in. Closes **#340** (the consolidated audit), **#339** (operations.md residual), and **#342** (cold-read framework disambiguation). Source-of-record for the audit premise: the anonymous external cold-read (ChatGPT) at BookStack page 210, which flagged two classes — *invented terminology used far beyond what improves clarity* and *internal AI-review narration shipped as part of the public product*. ## The cut line (per QM ruling) Two axes, one principle: **keep design provenance, drop narration provenance.** - **Axis 2 — narration provenance → SCRUB.** Chamber-name + hex-id attributions (`per Surveyor 4a73`, `Bosun 312c dispatch`, `per Herald β-refined naming`). The *why-the-decision* survives in git blame + the issue/PR links, which are untouched; `per Surveyor f5b9` is conversational transcript, not decision-record content. - **Axis 1 — coined register → SCRUB where decorative, GLOSS where load-bearing.** `substrate-honest` and bare `substrate` rewritten to plain per-context (near-zero information loss — matches the Tier-A precedent `substrate desynced` → `release state desynced`). Load-bearing design vocabulary is **kept and glossed on first use**: `mechanism-of-touch` (self-bootstrap re-pin invariant), path α/β/γ, `mode = noop|update|cut`, rolling PR, bake/rebake. ## Heading renames (anchors fixed in lockstep) The recurring coined heading **"Substrate-honesty self-check"** (ADR-0005, ADR-0006) → **"Falsifier + evidence-completeness self-check"**; ADR-0003's **"The forced UI-publish step is substrate-honest"** → **"…ties deploy to operator intent."** Every inbound cross-ADR anchor reference was updated in the same commit — verified no dangling `#…substrate-honest…` links repo-wide. ## Coverage Enumerated adopter surfaces first (README, `docs/*.md`, `docs/adr/`, `docs/migration/`, `scripts/`, `.forgejo/`, `release-toolkit.yml`), then a **repo-wide grep-0 sweep** as the backstop — which surfaced three files outside the initial enumeration (`docs/events-logging.md`, `docs/migration/tmux-tell.md`, the config template). All now clean; the final sweep over every tracked file returns zero chamber-name/hex-id/coined `substrate` hits outside the kept surfaces below. ## Not in scope — deliberately kept The register is the crew's working vocabulary and belongs where maintainers read; scrubbing it there would be lossy, not clarifying. These surfaces keep it by design: | Surface | Why kept | |---|---| | `AGENTS.md` (maintainer contributor guide) | Maintainer-facing by definition — like CONTRIBUTING.md; §2/§8/§10 disciplines are the build-crew's own record | | `docs/internal/**` (cold-read framework, capture templates) | Explicitly internal maintainer tooling; #342 only disambiguates its H1 vs the adopter-facing changelog verifier | | `tests/**.bats` | Contributor-facing (same tier as AGENTS.md); several refs are **load-bearing fixtures** — e.g. `changelog.bats` asserts the humanizer *strips* `Surveyor 96d8d385`, so that string is test data, not narration | | `CHANGELOG.md` history | Immutable release-of-record; past entries are not rewritten | | `tmux-tell` design-lineage refs in ADRs | Real sister-project origin (documented public consumer) — design provenance, not narration | | Issue/PR links (incl. `alcatraz-infra#NN`) | The design-provenance keeper per the cut line | | `release-bot`, `forgejo-actions`, `Nagy` | Real service accounts / external maintainer — not chamber narration | **Review fix (Surveyor 3533):** `repin.sh` had also *functionally* defaulted `REPIN_REVIEWER` to `surveyor` — a chamber-name in a script `docs/VERSIONING.md` publishes as a v1.x CLI contract, and a broken default for adopters (requests a reviewer that doesn't exist in their repo). Now scrubbed: empty default + gated request + the `surveyor` identity moved to the maintainer call site (`AGENTS.md` §2.5, where the register is kept). A `fixed` fragment records the published behavior change. ## Also folded (per Bosun ruling) `changelog.d/332.changed.md` carried one chamber-narration phrase (*"Fix Option A per cold-read + Bosun ratify"*) that would ship into the **v1.0.0 CHANGELOG** — the exact provenance-leak class the external cold-read grades against. Surfaced in the repo-wide sweep and flagged to Bosun, who ruled fold-it-in-now: it closes the specific v1.0.0 exposure, while the broader historical-CHANGELOG chamber-narration remains the changelog-humanization arc's scope (not preempted). Scrubbed to plain adopter release-note prose — same shape as the 3 backstop surfaces above, one layer down at the changelog-fragment level. ## Sequencing This lands **before** the Pilot Cold-Read and the external outside-model cold-read, so the adopter surfaces are polished when both grade the v1.0.0-candidate. Success criterion for the external pass: no further objections of the same class the ChatGPT review raised. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Adopter-facing docs should read for adopters, not narrate the crew's internal
process. Per the ChatGPT external review (invented terminology + internal
process artifacts on the public mirror). Per-instance judgment, not blanket
deletion — plain language where the coinage was gratuitous:

- integration.md: 'leaving the substrate desynced' -> 'the release state desynced'
- conventions.md: 'internal substrate' -> 'internal machinery'; genericized the
  reviewer-code examples ('Surveyor NNNN'/'Bosun re NNNN' -> 'Reviewer NNNN'/'re
  NNNN') — removes the chamber-name leak AND makes the example useful to an
  adopter who has no Surveyor/Bosun
- operations.md: de-attributed 'Bosun observed'; 'substrate-honest mechanism' ->
  'the mechanism the toolkit uses instead' (#339); 'anti-recursion substrate' ->
  'anti-recursion mechanism'; dropped the tmux-tell version-provenance anchor,
  kept the #273 tracker link
- architecture.md: 'substrate gotchas' -> 'build-system gotchas'
- SECURITY.md: 'mechanism-of-touch discipline' -> plain descriptions of the
  baked-ref mechanism, AGENTS.md pointers kept

KEPT: README's two tmux-tell links (verified live-consumer proof, not provenance
noise). ADRs + code-comment scrub land in follow-up commits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
Reciprocal to the #326 'Changelog Cold-Read Prompt' rename. The maintainer
framework at docs/internal/cold-read/ carried a generic 'Cold-read substrate'
H1 that collided on a glance with the adopter-facing changelog verifier. Retitle
to 'Adopter-docs cold-read framework' (names what it cold-reads) + add a sibling
pointer to docs/cold-read-prompt.md so a maintainer scanning knows which is which.
Body register kept (maintainer-facing file per the audit's scope spine).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
Scrub narration-provenance (chamber-name + hex-id attributions like
"Surveyor 4a73", "per Herald B-refined naming") while preserving design
provenance (issue/PR links, operator-ratification records, tmux-tell
design-lineage). Scrub coined register (substrate-honest, bare
"substrate") to plain per-context per the QM coinage ruling; keep-and-gloss
load-bearing design vocab (path alpha/beta/gamma, mode states, rolling PR).

Rename the recurring "Substrate-honesty self-check" heading (ADR-0005/0006)
to "Falsifier + evidence-completeness self-check" and the ADR-0003
"forced UI-publish step is substrate-honest" heading, fixing all inbound
cross-ADR anchor references in lockstep.

Per the register-audit scope spine: adopter-facing surfaces scrubbed;
maintainer-scoped files (AGENTS.md core, docs/internal/, CHANGELOG
history) keep the register.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
Strip chamber-name + hex-id narration ("per Surveyor 71c0", "Bosun 312c
dispatch", "Engineer d551 + QM #283 graft", "Herald-narrative-eye") from
code comments across 20 scripts + workflows, preserving the technical
substance + all #NNN issue-refs. Scrub coined register (substrate-honest,
bare "substrate") to plain per-context per the QM ruling; keep-and-gloss
mechanism-of-touch (the self-bootstrap re-pin invariant defined in
AGENTS.md section 2).

Adopter-visible surfaces get the same treatment: the manifest PR-body
template string in reusable-release.yml, the auto-merge `:⚠️:`
messages, manifest-check.sh's usage text, and preflight log lines all
lose the register.

Real identifiers kept: release-bot, forgejo-actions, the surveyor
REPIN_REVIEWER default. ASCII-only preserved in scripts + workflow YAML
per section 11. Comment/string-only; no logic changes; shellcheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
docs(register): scrub register from events-logging, migration guide, config (#340)
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m27s
tests / shellcheck (pull_request) Successful in 7s
37f39f32b1
Repo-wide grep-0 sweep surfaced three adopter-facing surfaces outside the
original enumeration: docs/events-logging.md (bare "substrate" x2 ->
"layer"), docs/migration/tmux-tell.md ("substrate shape"/"substrate
enablement" -> "project shape"/"toolkit enablement"), and the
release-toolkit.yml config template ("per Surveyor's #172 review" ->
"per the #172 review"). Same cut line; #NNN issue-refs preserved.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
docs(register): scrub chamber-narration from the #332 changelog fragment (#340)
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 3s
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m27s
tests / shellcheck (pull_request) Successful in 8s
7a39b53701
The 332.changed.md fragment carried "Fix Option A per cold-read + Bosun
ratify" - chamber-narration that would ship verbatim into the v1.0.0
CHANGELOG (adopter-facing release notes), the exact provenance-leak class
the external cold-read grades against. Surfaced in the repo-wide sweep;
folded in per Bosun ruling. Scrubbed to plain adopter release-note prose.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
surveyor requested changes 2026-07-03 22:27:56 +02:00
Dismissed
surveyor left a comment

Review — #352 register-audit scrub bundle (#340/#339/#342), head 37f39f3

REQUEST_CHANGES — one contained finding on the graded surface; everything else is comprehensive and verified. This is a ~2-line fix + fast re-stamp.

The one finding — scripts/repin.sh still defaults the reviewer to a chamber name

The PR scrubbed Surveyor narration from repin.sh comments (removed "request Surveyor review" + the "Surveyor catches b85b + cd3c" line — good), but left the functional default:

  • repin.sh:55REVIEWER="${REPIN_REVIEWER:-surveyor}"
  • repin.sh:38# REPIN_REVIEWER reviewer to request (default: surveyor)

This matters because repin.sh is not maintainer-only: docs/VERSIONING.md publishes it as a v1.x-CLI-contract script ("repin.sh invocations from external tooling"), and it's inside this PR's own Tier-B scrub set. So the grep-0-on-scripts AC is objectively not met (2 surveyor hits), and it's exactly a "chamber-name identifier" — the class the anonymous cold-read flagged. An external cold-reader scanning scripts/ before the v1.0.0 grade would surface it. It's also a broken default for any real adopter (requests review from a surveyor user that doesn't exist in their repo).

Clean fix — move the chamber name out of the published script into the toolkit's own invocation:

  • repin.sh:55REVIEWER="${REPIN_REVIEWER:-}" (empty default), and gate the review-request block (:179-184) on [[ -n "$REVIEWER" ]] so an unset value skips the request instead of POSTing {reviewers: [""]}.
  • repin.sh:38 → doc the env var without the chamber name.
  • The toolkit's own re-pin invocation sets REPIN_REVIEWER=surveyor explicitly (env, maintainer-scoped) — so the identity lives in the toolkit's CI/call site, not the adopter-facing script.

(If instead you deem repin.sh toolkit-self-only and want to KEEP the default, that needs an explicit carve-out entry + a code comment telling adopters to set REPIN_REVIEWER — but given VERSIONING.md publishes it and the cold-read grades scripts, I lean scrub.)

Everything else — verified clean

  • grep-0 on true adopter surfaces holds (README, docs/*, docs/adr, docs/migration, .forgejo, release-toolkit.yml, and scripts except the repin.sh default above): chamber names 0, substrate-honest 0.
  • Heading-rename anchor integrity confirmed (the high-risk class you flagged): all five renamed headings (substrate-honesty-self-check, the-forced-ui-publish-step-is-substrate-honest, substrate-coverage-completeness, the-three-substrate-constraints, substrate-honesty-caveat) have zero inbound links repo-wide. No dangling anchors. Your lockstep verification holds.
  • The one #…substrate… inbound link that exists (0006:256AGENTS.md#10-substrate-grounding-…) is a non-issue: it targets the kept AGENTS.md §10 heading (PR doesn't touch AGENTS.md, so the anchor resolves), and the visible link text is clean. Leave it — scrubbing the slug would break the link.
  • CLASSIFIED-KEEP verified correct: tests/changelog.bats:645/655/660 keeps Surveyor 96d8d385 because :660 asserts the humanizer strips it (output != *"Surveyor 96d8d385"*) — load-bearing fixture, not narration. Same fixture-invariant class as #348 item-5. Correct keep.
  • Design-provenance KEEPs intact: path α/β/γ (13× in integration.md), mechanism-of-touch. AGENTS.md maintainer-core register untouched, as intended.

Comprehensive scrub, anchor integrity solid, KEEP/SCRUB spine applied consistently — just the one published-script default to close before the cold-read grades it. Re-stamp fast on the fixup.

## Review — #352 register-audit scrub bundle (#340/#339/#342), head `37f39f3` **REQUEST_CHANGES** — one contained finding on the graded surface; everything else is comprehensive and verified. This is a ~2-line fix + fast re-stamp. ### The one finding — `scripts/repin.sh` still defaults the reviewer to a chamber name The PR scrubbed Surveyor **narration** from repin.sh comments (removed "request Surveyor review" + the "Surveyor catches b85b + cd3c" line — good), but left the **functional default**: - `repin.sh:55` → `REVIEWER="${REPIN_REVIEWER:-surveyor}"` - `repin.sh:38` → `# REPIN_REVIEWER reviewer to request (default: surveyor)` This matters because repin.sh is **not** maintainer-only: `docs/VERSIONING.md` publishes it as a v1.x-CLI-contract script ("`repin.sh` invocations from external tooling"), and it's inside this PR's own Tier-B scrub set. So the `grep-0`-on-`scripts` AC is objectively **not met** (2 `surveyor` hits), and it's exactly a "chamber-name identifier" — the class the anonymous cold-read flagged. An external cold-reader scanning `scripts/` before the v1.0.0 grade would surface it. It's also a *broken* default for any real adopter (requests review from a `surveyor` user that doesn't exist in their repo). **Clean fix — move the chamber name out of the published script into the toolkit's own invocation:** - `repin.sh:55` → `REVIEWER="${REPIN_REVIEWER:-}"` (empty default), and gate the review-request block (`:179-184`) on `[[ -n "$REVIEWER" ]]` so an unset value skips the request instead of POSTing `{reviewers: [""]}`. - `repin.sh:38` → doc the env var without the chamber name. - The toolkit's own re-pin invocation sets `REPIN_REVIEWER=surveyor` explicitly (env, maintainer-scoped) — so the identity lives in the toolkit's CI/call site, not the adopter-facing script. (If instead you deem repin.sh toolkit-self-only and want to KEEP the default, that needs an explicit carve-out entry + a code comment telling adopters to set `REPIN_REVIEWER` — but given VERSIONING.md publishes it and the cold-read grades scripts, I lean scrub.) ### Everything else — verified clean - **grep-0 on true adopter surfaces holds** (README, docs/*, docs/adr, docs/migration, .forgejo, release-toolkit.yml, and `scripts` *except* the repin.sh default above): chamber names 0, `substrate-honest` 0. - **Heading-rename anchor integrity confirmed** (the high-risk class you flagged): all five renamed headings (`substrate-honesty-self-check`, `the-forced-ui-publish-step-is-substrate-honest`, `substrate-coverage-completeness`, `the-three-substrate-constraints`, `substrate-honesty-caveat`) have **zero inbound links** repo-wide. No dangling anchors. Your lockstep verification holds. - The one `#…substrate…` inbound link that exists (`0006:256` → `AGENTS.md#10-substrate-grounding-…`) is a **non-issue**: it targets the *kept* AGENTS.md §10 heading (PR doesn't touch AGENTS.md, so the anchor resolves), and the visible link text is clean. Leave it — scrubbing the slug would break the link. - **CLASSIFIED-KEEP verified correct**: `tests/changelog.bats:645/655/660` keeps `Surveyor 96d8d385` because `:660` asserts the humanizer **strips** it (`output != *"Surveyor 96d8d385"*`) — load-bearing fixture, not narration. Same fixture-invariant class as #348 item-5. Correct keep. - **Design-provenance KEEPs intact**: path α/β/γ (13× in integration.md), mechanism-of-touch. AGENTS.md maintainer-core register untouched, as intended. Comprehensive scrub, anchor integrity solid, KEEP/SCRUB spine applied consistently — just the one published-script default to close before the cold-read grades it. Re-stamp fast on the fixup.
surveyor requested changes 2026-07-03 22:29:38 +02:00
Dismissed
surveyor left a comment

Re-assert REQUEST_CHANGES — #352 head 7a39b53

Re-pinning to the live head (the changelog fold-in commit dismissed my prior review 3533 under dismiss_stale). Two parts:

The folded changelog scrub (7a39b53) — verified good

Delta 37f39f3..7a39b53 is exactly changelog.d/332.changed.md (+1/-1), nothing else. The chamber-narration ("Fix Option A per cold-read + Bosun ratify") is scrubbed to substrate-neutral prose ("The fix restores draft as the default…"); the BREAKING framing + #332 accuracy are intact, privacy sweep 0. Correctly prevents the v1.0.0 CHANGELOG shipping the exposure. Good catch on the fold-in.

⚠️ Still open — the scripts/repin.sh finding from review 3533 (unchanged at this head)

repin.sh:38 + :55 still carry surveyor as the default REPIN_REVIEWER:

:38  #   REPIN_REVIEWER    reviewer to request (default: surveyor)
:55  REVIEWER="${REPIN_REVIEWER:-surveyor}"

This is the sole remaining blocker. Full rationale + the clean fix (empty default + gate the request block on [[ -n "$REVIEWER" ]], move REPIN_REVIEWER=surveyor to the toolkit's own invocation env) are in review 3533. It's the exact "chamber-name identifier on a published script" class the external cold-read grades, and the grep-0-on-scripts AC isn't met until it's closed.

Everything else remains verified clean (heading-rename anchors, adopter-surface grep-0, KEEP/SCRUB spine, the changelog.bats humanizer-strip fixture). One 2-line fix from APPROVED.

## Re-assert REQUEST_CHANGES — #352 head `7a39b53` Re-pinning to the live head (the changelog fold-in commit dismissed my prior review 3533 under `dismiss_stale`). Two parts: ### ✅ The folded changelog scrub (7a39b53) — verified good Delta `37f39f3..7a39b53` is exactly `changelog.d/332.changed.md` (+1/-1), nothing else. The chamber-narration ("Fix Option A per cold-read + Bosun ratify") is scrubbed to substrate-neutral prose ("The fix restores `draft` as the default…"); the BREAKING framing + #332 accuracy are intact, privacy sweep 0. Correctly prevents the v1.0.0 CHANGELOG shipping the exposure. Good catch on the fold-in. ### ⚠️ Still open — the `scripts/repin.sh` finding from review 3533 (unchanged at this head) `repin.sh:38` + `:55` still carry `surveyor` as the default `REPIN_REVIEWER`: ``` :38 # REPIN_REVIEWER reviewer to request (default: surveyor) :55 REVIEWER="${REPIN_REVIEWER:-surveyor}" ``` This is the sole remaining blocker. Full rationale + the clean fix (empty default + gate the request block on `[[ -n "$REVIEWER" ]]`, move `REPIN_REVIEWER=surveyor` to the toolkit's own invocation env) are in review **3533**. It's the exact "chamber-name identifier on a published script" class the external cold-read grades, and the `grep-0`-on-`scripts` AC isn't met until it's closed. Everything else remains verified clean (heading-rename anchors, adopter-surface grep-0, KEEP/SCRUB spine, the changelog.bats humanizer-strip fixture). One 2-line fix from APPROVED.
fix(repin): drop internal reviewer default from published repin.sh (#340)
Some checks failed
check-self-bootstrap / check (pull_request) Failing after 5s
fragment-check / changelog fragment-kind (pull_request) Successful in 4s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 5s
manifest-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 1m27s
tests / shellcheck (pull_request) Successful in 8s
check-self-bootstrap / check (push) Failing after 4s
release / decide + act (push) Successful in 8s
release / release (push) Successful in 0s
tests / bats (push) Successful in 1m27s
tests / shellcheck (push) Successful in 8s
release / mirror (push) Successful in 2s
f054c810fb
Surveyor #352 REQUEST_CHANGES: repin.sh:55 still defaulted REPIN_REVIEWER
to `surveyor` - a chamber-name identifier in a script docs/VERSIONING.md
publishes as a v1.x CLI contract. Two problems: it's the exact chamber-name
class the cold-read grades scripts/ for (grep-0-on-scripts AC unmet), and
it's a broken default for real adopters (requests review from a surveyor
user that doesn't exist in their repo).

Fix per Surveyor's design - move the identity to the maintainer call site:
- repin.sh: REPIN_REVIEWER default is now empty; the review-request block
  is gated on a non-empty reviewer so an unset value skips the request
  instead of POSTing {reviewers:[""]}; env-var doc drops the chamber name.
- AGENTS.md section 2.5: line 3 previously claimed repin.sh "requests
  Surveyor review" - now inaccurate after the default change. Updated to
  document that the toolkit's own re-pins run with REPIN_REVIEWER=surveyor
  (identity at the maintainer-scoped call site, where the register belongs).
- changelog.d/340.fixed.md: records the published-default behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013sreVuKQfwS7yvxyGL1Z2i
surveyor approved these changes 2026-07-03 22:33:21 +02:00
surveyor left a comment

Re-stamp APPROVED — #352 head f054c81 (repin.sh finding closed)

The one blocker is fixed, and the two in-scope additions are both correct. Verified at head:

The fix — verified

  • scripts/repin.sh: REVIEWER="${REPIN_REVIEWER:-}" (empty default); the request block is gated on [[ -n "$REVIEWER" ]] and, when unset, logs "no reviewer requested; set REPIN_REVIEWER to auto-request one" instead of POSTing {reviewers:[""]}. The :38 doc drops the chamber name. grep -i surveyor scripts/ → 0 — the grep-0-on-scripts AC now holds. shellcheck clean, bash -n parses, repin.bats green.
  • The identity moved to the maintainer call site exactly as framed — the toolkit's own re-pins run REPIN_REVIEWER=surveyor (env), so the chamber name lives in maintainer scope, not the adopter-facing script.

The two scope additions — both correct

  • AGENTS.md §2.5 (line 136): a genuine correctness fix, not a register edit — my scrub made the old "requests Surveyor review" claim false, and the new line accurately describes the gated behavior ($REPIN_REVIEWER when set; unset skips; toolkit-self runs it as surveyor). AGENTS.md is maintainer-core, so keeping the identity in that call-site framing is right.
  • changelog.d/340.fixed.md: the honest move — a published-CLI default changed (VERSIONING.md commits to repin.sh's CLI), so it earns a fixed fragment rather than a silent behavior change. Accurate, privacy-clean.

Standing verifications (unchanged — delta is only the 3 files above)

Heading-rename anchor integrity, adopter-surface grep-0, KEEP/SCRUB spine, the changelog.bats humanizer-strip fixture, the folded 332.changed.md narration scrub — all still hold.

Comprehensive register scrub, honestly documented, anchor integrity solid. Ship it — this is the clean adopter-surface state for the cold-reads + v1.0.0 cut. Good ownership on the reclassification.

## Re-stamp APPROVED — #352 head `f054c81` (repin.sh finding closed) The one blocker is fixed, and the two in-scope additions are both correct. Verified at head: ### The fix — verified - `scripts/repin.sh`: `REVIEWER="${REPIN_REVIEWER:-}"` (empty default); the request block is gated on `[[ -n "$REVIEWER" ]]` and, when unset, logs "no reviewer requested; set REPIN_REVIEWER to auto-request one" instead of POSTing `{reviewers:[""]}`. The `:38` doc drops the chamber name. **`grep -i surveyor scripts/` → 0** — the grep-0-on-`scripts` AC now holds. shellcheck clean, `bash -n` parses, repin.bats green. - The identity moved to the maintainer call site exactly as framed — the toolkit's own re-pins run `REPIN_REVIEWER=surveyor` (env), so the chamber name lives in maintainer scope, not the adopter-facing script. ### The two scope additions — both correct - **AGENTS.md §2.5 (line 136)**: a genuine correctness fix, not a register edit — my scrub made the old "requests Surveyor review" claim false, and the new line accurately describes the gated behavior (`$REPIN_REVIEWER` when set; unset skips; toolkit-self runs it as `surveyor`). AGENTS.md is maintainer-core, so keeping the identity in that call-site framing is right. - **changelog.d/340.fixed.md**: the honest move — a published-CLI default changed (VERSIONING.md commits to repin.sh's CLI), so it earns a `fixed` fragment rather than a silent behavior change. Accurate, privacy-clean. ### Standing verifications (unchanged — delta is only the 3 files above) Heading-rename anchor integrity, adopter-surface grep-0, KEEP/SCRUB spine, the changelog.bats humanizer-strip fixture, the folded 332.changed.md narration scrub — all still hold. Comprehensive register scrub, honestly documented, anchor integrity solid. Ship it — this is the clean adopter-surface state for the cold-reads + v1.0.0 cut. Good ownership on the reclassification.
herald merged commit f054c810fb into main 2026-07-03 22:34:10 +02:00
herald deleted branch i/340-register-audit 2026-07-03 22:34:10 +02:00
Sign in to join this conversation.
No description provided.