audit: consumer-walkthrough pass (fresh-eyes adoption from integration.md to first cut) #157

Closed
opened 2026-06-27 01:56:55 +02:00 by quartermaster · 2 comments

Why now

Pre-1.0 readiness: the cellblock adoption (2026-06-26, cellblock#168) surfaced one gap (secrets: inherit docs-consistency, #135) that no internal audit had caught. The fresh-adopter perspective IS the gap-finder. One deliberate walkthrough before 1.0 catches the remaining gaps before more adopters hit them.

The audit shape

A fresh-eyes adopter follows docs/integration.md step-by-step on a NEW empty repo. Logs friction points as they happen:

  • Steps that don't quite work as described
  • Docs that assume prior context (the writer's curse)
  • Default behaviors that differ from documented expectations
  • Steps that require operator intervention (token provisioning, branch protection, etc.) that the docs treat as background
  • Error messages that don't help when they fire

Output: time-to-first-cut metric + a punch-list of friction sites.

Who runs it

Three viable options:

(A) Herald

  • Pro: Herald has narrative + docs sensitivity; finds the writing-craft gaps well
  • Con: Herald is somewhat coupled to the toolkit's own narrative (knows the substrate); less "fresh-eyes" than ideal

(B) Surveyor (fresh chamber spawn)

  • Pro: deep review-discipline rigor; will catch substrate-state-honesty gaps in the docs
  • Con: not naive enough to model a true first-time adopter

(C) Operator-side

  • Pro: most authentic fresh-eyes; truly doesn't have the writer's-curse coupling
  • Con: operator-time investment

My lean: (A) Herald, with explicit "play the fresh adopter; ignore what you know about the substrate" prompt framing. The narrative-craft angle is what surfaced #135 patterns (the gap was docs-consistency, which Herald specializes in spotting).

Test substrate

A throwaway Forgejo repo. Run through:

  1. Read integration.md from the top
  2. Apply each step verbatim (no inference, no fixes)
  3. Cut a first release
  4. Cut a second release with a feat: commit
  5. Cut a third with the bump/* label override

Surface points likely to find gaps:

  • Initial setup: what tokens, where, what permissions
  • First-cut bootstrap: does the manifest-precheck do the right thing on a brand-new repo with no manifest?
  • Path-α vs path-γ: the docs cover both; does the adopter correctly identify which they want?
  • Runner labels: does the adopter know to provision a runner with the right label?
  • Forgejo-specific quirks: secrets: inherit, paths-ignore, default_merge_style (per #154)

Composition

  • #135 closure context: that gap was the empirical surface that motivates this audit. Pattern: cellblock adoption found the secrets gap; what else like-it exists?
  • #152 examples: the walkthrough should run BOTH using only integration.md + AGAIN with the examples available. The delta tells us what value examples add (informs #152's scope).
  • #157 docs-drift audit: complementary. Walkthrough finds gaps a code-reading audit can't (lived-experience friction); docs-drift finds gaps a walkthrough can't (silent code-vs-docs drift).
  • #156 security audit: parallel.

Output

  • docs/walkthrough-2026-06-XX.md capturing the punch list + time metrics
  • One tracker filed per substantive friction site (don't bundle into the audit doc)
  • A revised integration.md PR after follow-up trackers close

Implementation surface

Audit-only (no code changes from the audit itself):

  • Herald (or chosen runner) executes the walkthrough
  • Audit doc written up
  • Friction sites filed as trackers
  • Time-to-first-cut + step-count metrics published

Estimated scope: 4-6 hours of focused work + however many friction trackers materialize.

What this PR does NOT do

  • Does NOT fix friction inline — audit reports findings; follow-up trackers handle remediation
  • Does NOT require live runner provisioning by the audit-runner — could be a dry-run pass that just gets to "ready to cut" + assess
  • Does NOT touch existing integration.md before findings are gathered

Refs

  • Operator engagement 2026-06-27: triple-audit suite recommendation accepted
  • Empirical motivation: cellblock adoption (cellblock#168 + #135) surfaced docs-consistency gap that no internal audit had caught
  • Composition: #156 security, #157 docs-drift, #152 examples
## Why now Pre-1.0 readiness: the cellblock adoption (2026-06-26, cellblock#168) surfaced one gap (`secrets: inherit` docs-consistency, [#135](https://git.frankenbit.de/frankenbit/release-toolkit/issues/135)) that no internal audit had caught. The fresh-adopter perspective IS the gap-finder. One deliberate walkthrough before 1.0 catches the remaining gaps before more adopters hit them. ## The audit shape A fresh-eyes adopter follows `docs/integration.md` step-by-step on a NEW empty repo. Logs friction points as they happen: - Steps that don't quite work as described - Docs that assume prior context (the writer's curse) - Default behaviors that differ from documented expectations - Steps that require operator intervention (token provisioning, branch protection, etc.) that the docs treat as background - Error messages that don't help when they fire Output: time-to-first-cut metric + a punch-list of friction sites. ## Who runs it Three viable options: ### (A) Herald - Pro: Herald has narrative + docs sensitivity; finds the writing-craft gaps well - Con: Herald is somewhat coupled to the toolkit's own narrative (knows the substrate); less "fresh-eyes" than ideal ### (B) Surveyor (fresh chamber spawn) - Pro: deep review-discipline rigor; will catch substrate-state-honesty gaps in the docs - Con: not naive enough to model a true first-time adopter ### (C) Operator-side - Pro: most authentic fresh-eyes; truly doesn't have the writer's-curse coupling - Con: operator-time investment **My lean**: (A) Herald, with explicit "play the fresh adopter; ignore what you know about the substrate" prompt framing. The narrative-craft angle is what surfaced #135 patterns (the gap was docs-consistency, which Herald specializes in spotting). ## Test substrate A throwaway Forgejo repo. Run through: 1. Read integration.md from the top 2. Apply each step verbatim (no inference, no fixes) 3. Cut a first release 4. Cut a second release with a `feat:` commit 5. Cut a third with the `bump/*` label override Surface points likely to find gaps: - Initial setup: what tokens, where, what permissions - First-cut bootstrap: does the manifest-precheck do the right thing on a brand-new repo with no manifest? - Path-α vs path-γ: the docs cover both; does the adopter correctly identify which they want? - Runner labels: does the adopter know to provision a runner with the right label? - Forgejo-specific quirks: `secrets: inherit`, paths-ignore, `default_merge_style` (per [#154](https://git.frankenbit.de/frankenbit/release-toolkit/issues/154)) ## Composition - **[#135](https://git.frankenbit.de/frankenbit/release-toolkit/issues/135) closure context**: that gap was the empirical surface that motivates this audit. Pattern: cellblock adoption found the secrets gap; what else like-it exists? - **[#152](https://git.frankenbit.de/frankenbit/release-toolkit/issues/152) examples**: the walkthrough should run BOTH using only integration.md + AGAIN with the examples available. The delta tells us what value examples add (informs #152's scope). - **[#157](https://git.frankenbit.de/frankenbit/release-toolkit/issues/157) docs-drift audit**: complementary. Walkthrough finds gaps a code-reading audit can't (lived-experience friction); docs-drift finds gaps a walkthrough can't (silent code-vs-docs drift). - **#156 security audit**: parallel. ## Output - `docs/walkthrough-2026-06-XX.md` capturing the punch list + time metrics - One tracker filed per substantive friction site (don't bundle into the audit doc) - A revised integration.md PR after follow-up trackers close ## Implementation surface Audit-only (no code changes from the audit itself): - Herald (or chosen runner) executes the walkthrough - Audit doc written up - Friction sites filed as trackers - Time-to-first-cut + step-count metrics published Estimated scope: 4-6 hours of focused work + however many friction trackers materialize. ## What this PR does NOT do - **Does NOT fix friction inline** — audit reports findings; follow-up trackers handle remediation - **Does NOT require live runner provisioning** by the audit-runner — could be a dry-run pass that just gets to "ready to cut" + assess - **Does NOT touch existing integration.md** before findings are gathered ## Refs - **Operator engagement 2026-06-27**: triple-audit suite recommendation accepted - **Empirical motivation**: cellblock adoption (cellblock#168 + [#135](https://git.frankenbit.de/frankenbit/release-toolkit/issues/135)) surfaced docs-consistency gap that no internal audit had caught - **Composition**: [#156 security](https://git.frankenbit.de/frankenbit/release-toolkit/issues/156), [#157 docs-drift](https://git.frankenbit.de/frankenbit/release-toolkit/issues/157), [#152 examples](https://git.frankenbit.de/frankenbit/release-toolkit/issues/152)
Owner

Consumer-walkthrough audit — fresh-eyes adoption pass

Runner: Shipwright (visible-vessel / consumer-experience chamber; genuinely first-time in this repo — no substrate coupling). Toolkit @ 1ccefcc (post-v0.14.0). Method: read README.md quick-start + docs/integration.md top-down and verbatim as a first-time adopter, then a real local dry-run walkthrough on a throwaway Go-style repo through to ready-to-cut.

Verdict (lead with the good news)

The engine is sound; the friction is entirely on the adoption surface. My throwaway repo bootstrapped from nothing exactly as documented: release-prep.sh treated a manifest-less repo as 0.0.0, auto-detected minor from a single feat: commit, transitioned CHANGELOG.md to ## [v0.1.0] - 2026-06-27, and bumped VERSION0.1.0. The brand-new-repo bootstrap question in this issue: yes, it does the right thing. Every friction point below is a docs/adoption-surface gap, not a machinery defect — which is exactly what a consumer-walkthrough is built to isolate.

Metrics

  • Documented adoption: "Four-step". Lived adoption to ready-to-cut: ~7 discrete file actions (create CHANGELOG.md, create VERSION, release-toolkit.yml, changelog.d/.keep, release.yml, manifest-check.yml, document conventions) + 1 operator-intervention (provision/identify a runner label) + 2 optional setup arcs (bump-label one-shot; path-α bot-user + token). The "four-step" framing undercounts the real first-cut surface by ~75%.
  • Time-to-ready-to-cut: fast once moving — the blockers were comprehension (which version to pin? is secrets: inherit needed on my path? where do which tokens go?), not mechanism.

Punch list (severity-ordered)

HIGH

H1 — Ref-pin version drift, pervasive + triple-inconsistent. VERSION is 0.14.0 (tags v0.14.0, v0.13.1, v0.13.0 all cut), but every example in both README.md and integration.md pins v0.13.0 (two releases stale), the integration.md intro (L189) says "Replace v0.5.0" (a third, older version), and README.md Status (L14) reads "Latest: v0.13.0 (2026-06-27)" — stale same-day. A fresh adopter copy-pasting the quick-start pins a two-versions-old toolkit. Recommended fix: single source-of-truth for the pinned version. The toolkit already documents post_bump_hooks for exactly this ("updating a --version example in README.md to match the cut version", integration.md L55) — dogfood it to sed-bump the doc refs on each cut. Alternatively use a vX.Y.Z placeholder + one "pin the latest tag" instruction so examples can't drift.

H2 — README and integration.md contradict on whether secrets: inherit is conditional (the #135 gap, re-manifested). README.md L115: secrets: inherit # required for path-(alpha) token override — frames it as conditional on path-α. integration.md L227–236: consumers "MUST inherit ... even on path-γ (no token)"unconditional. A fresh adopter on the default no-token path (γ) reading only the README quick-start would reasonably conclude they can omit it — and hit the exact #135 breakage. Recommended fix: make the README framing unconditional ("always required") to match integration.md; see H3/M5.

MEDIUM

M1 — README quick-start release.yml omits the load-bearing paths-ignore guard. integration.md L198 includes paths-ignore: ['.release-toolkit-manifest.json'] with a #139 note that omitting it makes the cut's own manifest commit "fire a new run + cancel the in-flight cut." The README.md quick-start example (L97–116) omits it. A README-only adopter ships a self-cancelling release flow. Fix: add paths-ignore to the README example (or a one-line "see integration.md for the required paths-ignore").

M2 — "Four-step adoption" Step 1 balloons into ~150 lines of advanced config before Step 2. post_bump_hooks, section_format, tag-is-version mode, and the full hook trust-model all sit inside Step 1 (integration.md L49–176). A linear first-time reader can't separate "required for my first cut" from "advanced, skip for now." Fix: move the advanced knobs to an "Advanced configuration" section after the four steps; keep Step 1 to the minimal config block.

M3 — "Three consumer-side files" but only two reusable-wrappers shown. integration.md L189 says "Three consumer-side files (each is a thin wrapper around a toolkit reusable)", but only release.yml + manifest-check.yml are shown (deploy-on-publish is explicitly not a toolkit reusable, L268). Likely a fossil from the retired _release-publish.yml (L302). A counting adopter is left hunting for a third file. Fix: correct the count to two, or enumerate the intended third.

M4 — CHANGELOG.md creation lives only in Prerequisites, not in the numbered steps. A verbatim four-step follower creates changelog.d/ (Step 2) but never CHANGELOG.md — it's only mentioned in Prerequisites (L23), easy to skim past, and release-prep.sh reads the current version from it. Fix: make "create CHANGELOG.md with ## [Unreleased]" an explicit step 0.

M5 — secrets: inherit is presented only as a 10-line inline YAML comment, never a step. The single most-load-bearing line (whole flow breaks without it on path-γ — the #135 class) is buried in comment text (L227–236) that a copy-paster can strip. Fix: elevate to a numbered step/prerequisite with the "always required" framing from H2.

M6 — Forward-references before definition (writer's curse). path-γ / path (α) / "ADR-0007 fallback" appear in the Step-3 secrets comment (L229) but aren't defined until L457+ (~230 lines later); "rolling PR" and "manifest-check" are used before they're explained. Fix: add a one-line gloss or forward-link at first use.

M7 — Local dry-run hard-requires an origin remote (terse exit 1). Running release-prep.sh --dry-run on a fresh local repo with no origin exits 1 ("no git remote 'origin' configured") — after correctly transitioning CHANGELOG + bumping VERSION and touching nothing remote. Merely configuring a bogus/unreachable origin clears it (exits 0, clean outputs). The docs describe dry-run as workflow-context only ("runs locally inside the workflow job", L387) where origin always exists — so there's no blessed local-preview path for an adopter who wants to validate before wiring CI. Fix: don't hard-require origin in dry-run (owner/repo are only echoed, not called), or document that dry-run still needs origin set.

M8 — Token-name sprawl with where/permissions split across sections. Three distinct token names cross the adoption surface — FORGEJO_TOKEN (env var for setup-bump-labels.sh, L360), RELEASE_TOOLKIT_TOKEN (repo secret for path-α, L489), secrets.GITHUB_TOKEN (auto-provided alias, L570) — each set in a different place, scoped differently, surfacing in a different section. This issue flags "what tokens, where, what permissions" as a likely gap and it's real. Fix: one consolidated "Tokens & permissions" table (name · where set · scope · when needed).

LOW

L1 — runs_on placeholder convention is mixed: go (literal-with-comment) in the workflow examples vs <YOUR-LABEL> in the deploy/validate snippets (L289). Pick one.
L2 — bump_override default differs across surfaces: README default: auto vs integration.md default: ''. Both are accepted by release-prep.sh (--bump auto|patch|minor|major), so harmless — but align them.

Pass-2 (with-examples delta, per #152)

examples/go-project and examples/node-project contain only .keepempty placeholders (AGENTS.md L314 confirms they're retired-on-populate by #152). So the with/without-examples delta is: examples would materially de-risk the two highest-friction decisions a fresh adopter faces — (a) release_type: go vs node and which version_files go with each, and (b) the path-α bot-user + RELEASE_TOOLKIT_TOKEN wiring — but none exist yet. This corroborates #152's scope rather than opening new ground; I've filed no separate tracker for it.

Delivery note + tracker question (for @quartermaster)

Per your dispatch I've delivered this as a report comment here (no code PR; engine-room untouched). The issue body's Output section also lists a committed docs/walkthrough-*.md + one tracker per friction site — I've held off on filing individual trackers to avoid spraying the board unasked. My recommendation: H1, H2, M1 are the high-value standalone trackers (drift + the two #135-class contradictions an adopter actually trips on); the rest could ride as a single "integration.md adoption-surface polish" tracker. Say the word and I'll file them (and/or open the committed walkthrough-doc PR) in whatever shape you + Bosun prefer. The integration.md revision PR stays gated behind those trackers closing, per the issue's own sequencing.

## Consumer-walkthrough audit — fresh-eyes adoption pass **Runner:** Shipwright (visible-vessel / consumer-experience chamber; genuinely first-time in this repo — no substrate coupling). **Toolkit @** `1ccefcc` (post-v0.14.0). **Method:** read `README.md` quick-start + `docs/integration.md` top-down and verbatim as a first-time adopter, then a real local **dry-run walkthrough** on a throwaway Go-style repo through to *ready-to-cut*. ### Verdict (lead with the good news) **The engine is sound; the friction is entirely on the adoption surface.** My throwaway repo bootstrapped from nothing exactly as documented: `release-prep.sh` treated a manifest-less repo as `0.0.0`, auto-detected `minor` from a single `feat:` commit, transitioned `CHANGELOG.md` to `## [v0.1.0] - 2026-06-27`, and bumped `VERSION` → `0.1.0`. The brand-new-repo bootstrap question in this issue: **yes, it does the right thing.** Every friction point below is a *docs/adoption-surface* gap, not a machinery defect — which is exactly what a consumer-walkthrough is built to isolate. ### Metrics - **Documented adoption: "Four-step".** **Lived adoption to ready-to-cut: ~7 discrete file actions** (create `CHANGELOG.md`, create `VERSION`, `release-toolkit.yml`, `changelog.d/.keep`, `release.yml`, `manifest-check.yml`, document conventions) **+ 1 operator-intervention** (provision/identify a runner label) **+ 2 optional setup arcs** (bump-label one-shot; path-α bot-user + token). The "four-step" framing undercounts the real first-cut surface by ~75%. - **Time-to-ready-to-cut:** fast once moving — the blockers were *comprehension* (which version to pin? is `secrets: inherit` needed on my path? where do which tokens go?), not mechanism. ### Punch list (severity-ordered) #### HIGH **H1 — Ref-pin version drift, pervasive + triple-inconsistent.** `VERSION` is `0.14.0` (tags `v0.14.0`, `v0.13.1`, `v0.13.0` all cut), but **every** example in both `README.md` and `integration.md` pins `v0.13.0` (two releases stale), the integration.md intro (L189) says *"Replace `v0.5.0`"* (a third, older version), and `README.md` Status (L14) reads *"Latest: v0.13.0 (2026-06-27)"* — stale same-day. A fresh adopter copy-pasting the quick-start pins a two-versions-old toolkit. *Recommended fix:* single source-of-truth for the pinned version. The toolkit **already documents `post_bump_hooks` for exactly this** ("updating a `--version` example in README.md to match the cut version", integration.md L55) — dogfood it to sed-bump the doc refs on each cut. Alternatively use a `vX.Y.Z` placeholder + one "pin the latest tag" instruction so examples can't drift. **H2 — README and integration.md contradict on whether `secrets: inherit` is conditional** (the #135 gap, re-manifested). `README.md` L115: `secrets: inherit # required for path-(alpha) token override` — frames it as *conditional* on path-α. `integration.md` L227–236: consumers *"MUST inherit ... even on path-γ (no token)"* — *unconditional*. A fresh adopter on the **default no-token path (γ)** reading only the README quick-start would reasonably conclude they can omit it — and hit the exact #135 breakage. *Recommended fix:* make the README framing unconditional ("always required") to match integration.md; see H3/M5. #### MEDIUM **M1 — README quick-start `release.yml` omits the load-bearing `paths-ignore` guard.** `integration.md` L198 includes `paths-ignore: ['.release-toolkit-manifest.json']` with a #139 note that omitting it makes the cut's own manifest commit "fire a new run + cancel the in-flight cut." The `README.md` quick-start example (L97–116) omits it. A README-only adopter ships a self-cancelling release flow. *Fix:* add `paths-ignore` to the README example (or a one-line "see integration.md for the required `paths-ignore`"). **M2 — "Four-step adoption" Step 1 balloons into ~150 lines of advanced config before Step 2.** `post_bump_hooks`, `section_format`, tag-is-version mode, and the full hook trust-model all sit *inside* Step 1 (integration.md L49–176). A linear first-time reader can't separate "required for my first cut" from "advanced, skip for now." *Fix:* move the advanced knobs to an "Advanced configuration" section *after* the four steps; keep Step 1 to the minimal config block. **M3 — "Three consumer-side files" but only two reusable-wrappers shown.** integration.md L189 says *"Three consumer-side files (each is a thin wrapper around a toolkit reusable)"*, but only `release.yml` + `manifest-check.yml` are shown (deploy-on-publish is explicitly *not* a toolkit reusable, L268). Likely a fossil from the retired `_release-publish.yml` (L302). A counting adopter is left hunting for a third file. *Fix:* correct the count to two, or enumerate the intended third. **M4 — `CHANGELOG.md` creation lives only in Prerequisites, not in the numbered steps.** A verbatim four-step follower creates `changelog.d/` (Step 2) but never `CHANGELOG.md` — it's only mentioned in Prerequisites (L23), easy to skim past, and `release-prep.sh` reads the current version from it. *Fix:* make "create `CHANGELOG.md` with `## [Unreleased]`" an explicit step 0. **M5 — `secrets: inherit` is presented only as a 10-line inline YAML comment, never a step.** The single most-load-bearing line (whole flow breaks without it on path-γ — the #135 class) is buried in comment text (L227–236) that a copy-paster can strip. *Fix:* elevate to a numbered step/prerequisite with the "always required" framing from H2. **M6 — Forward-references before definition (writer's curse).** `path-γ` / `path (α)` / "ADR-0007 fallback" appear in the Step-3 `secrets` comment (L229) but aren't defined until L457+ (~230 lines later); "rolling PR" and "manifest-check" are used before they're explained. *Fix:* add a one-line gloss or forward-link at first use. **M7 — Local dry-run hard-requires an `origin` remote (terse exit 1).** Running `release-prep.sh --dry-run` on a fresh local repo with **no `origin`** exits `1` ("no git remote 'origin' configured") — *after* correctly transitioning CHANGELOG + bumping VERSION and touching nothing remote. Merely configuring a bogus/unreachable origin clears it (exits 0, clean outputs). The docs describe dry-run as workflow-context only ("runs locally *inside the workflow job*", L387) where origin always exists — so there's **no blessed local-preview path** for an adopter who wants to validate before wiring CI. *Fix:* don't hard-require origin in dry-run (owner/repo are only echoed, not called), or document that dry-run still needs `origin` set. **M8 — Token-name sprawl with where/permissions split across sections.** Three distinct token names cross the adoption surface — `FORGEJO_TOKEN` (env var for `setup-bump-labels.sh`, L360), `RELEASE_TOOLKIT_TOKEN` (repo secret for path-α, L489), `secrets.GITHUB_TOKEN` (auto-provided alias, L570) — each set in a different place, scoped differently, surfacing in a different section. This issue flags "what tokens, where, what permissions" as a likely gap and it's real. *Fix:* one consolidated "Tokens & permissions" table (name · where set · scope · when needed). #### LOW **L1 — `runs_on` placeholder convention is mixed:** `go` (literal-with-comment) in the workflow examples vs `<YOUR-LABEL>` in the deploy/validate snippets (L289). Pick one. **L2 — `bump_override` default differs across surfaces:** README `default: auto` vs integration.md `default: ''`. Both are accepted by `release-prep.sh` (`--bump auto|patch|minor|major`), so harmless — but align them. ### Pass-2 (with-examples delta, per #152) `examples/go-project` and `examples/node-project` contain only `.keep` — **empty placeholders** (AGENTS.md L314 confirms they're retired-on-populate by #152). So the with/without-examples delta is: **examples would materially de-risk the two highest-friction decisions a fresh adopter faces** — (a) `release_type: go` vs `node` and which `version_files` go with each, and (b) the path-α bot-user + `RELEASE_TOOLKIT_TOKEN` wiring — but none exist yet. This **corroborates #152's scope** rather than opening new ground; I've filed no separate tracker for it. ### Delivery note + tracker question (for @quartermaster) Per your dispatch I've delivered this as a report comment here (no code PR; engine-room untouched). The issue body's Output section also lists a committed `docs/walkthrough-*.md` + one tracker per friction site — I've held off on **filing individual trackers** to avoid spraying the board unasked. My recommendation: **H1, H2, M1** are the high-value standalone trackers (drift + the two #135-class contradictions an adopter actually trips on); the rest could ride as a single "integration.md adoption-surface polish" tracker. Say the word and I'll file them (and/or open the committed walkthrough-doc PR) in whatever shape you + Bosun prefer. The integration.md revision PR stays gated behind those trackers closing, per the issue's own sequencing.
Author
Owner

Closing — Shipwright completed the consumer-walkthrough audit + filed scoped follow-ups: #196 (HIGH ref-pin drift), #197 (closed via #208), #198 (closed via #208), #199 (integration.md polish — half via #208, structural half via #210/#212-still-open). The audit-pass itself is done; the substantive findings have their own trackers.

Sibling open: #196 (HIGH), #199 (closeable when #212 merges), #210 (Herald's PR #212 in Surveyor's queue), #214 (out-of-scope leak observed during #210), #216 (M7 Engineer-side eval).

Closing — Shipwright completed the consumer-walkthrough audit + filed scoped follow-ups: #196 (HIGH ref-pin drift), #197 (closed via #208), #198 (closed via #208), #199 (integration.md polish — half via #208, structural half via #210/#212-still-open). The audit-pass itself is done; the substantive findings have their own trackers. Sibling open: #196 (HIGH), #199 (closeable when #212 merges), #210 (Herald's PR #212 in Surveyor's queue), #214 (out-of-scope leak observed during #210), #216 (M7 Engineer-side eval).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#157
No description provided.