Repository navigation
Release Candidate 2026-08-28 16:01:40 +0900 - #100
github-actions[bot] wants to merge 130 commits into
Conversation
From-scratch (no CMS) handbook on a single Astro SSR Worker over Cloudflare D1. - Auth: hand-written Google OAuth (AES-GCM session cookie, state-nonce CSRF, verified_email); DEV_LOGIN shim for local testing without Google. - ACL: middleware resolves role+groups from D1 per request (no identity bleed); one readableWhere predicate gates content; fail-closed; restricted hidden. - Sidebar shows the full handbook structure (collapsible, persisted); internal pages show a sign-in prompt; content stays access-controlled. - Editor at /admin (editor-role only): create/edit, draft/publish, live preview, double-submit CSRF, slug auto-generated from title, save confirmation banner. - Single VitePress-style design with light/dark toggle, nav bar, sidebar + on-this-page, OSBR logo. - D1 schema + migrate-doc seed from doc/*.md (generic personas, no real emails). Verified locally: pnpm check / lint / test (26) / build / guard; reader-ACL matrix, editor RBAC, CSRF, stored-XSS all confirmed against local D1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Sidebar: collapse sections by default, auto-expand current page's section; anon sees only public pages, logged-in users see all with "no access" badges - Right-side "On this page" TOC: collapsible h3 groups under each h2 - On-page pencil edit button for editors - In-content [[TOC]] now builds a nested list so h3 sub-items indent structurally; widen sanitize schema to keep class on ul/ol/li Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- "Back without saving" link returns to the admin page list - Delete button (own form, editor + CSRF gated) with a JS confirm; deletePage() removes the page and its group grants atomically - /admin/delete redirects to /admin?deleted=1 with a confirmation banner Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tions - Move Back (left) and Delete (right) into a top bar above the form - Wrap page metadata in a collapsible "Page settings" <details> (open by default) - Right-align Save draft / Publish at the bottom Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Style the editor-page <h1> (it was unstyled outside .prose); edit page heading now reads "Edit: <title>" - Replace the native confirm() with a styled <dialog>: "Delete this page? Are you sure… This cannot be undone." with Cancel / Delete actions Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Wrap the markdown body + live preview grid in a collapsible <details> with one summary title, replacing the two separate per-pane titles. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Drop the leadership group, the leader@/editor-leader@ personas, and their group membership from the seed generator - security-policy is now 'internal' instead of restricted-to-leadership - Regenerate seed (10 pages: 2 public, 8 internal; 0 groups), update POC.md The restricted/group-gated visibility level remains supported by the schema and ACL; it's just unused by the default seed now. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pins the primary actions while editing so they're reachable without scrolling whether the sections are collapsed or expanded. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Back now uses history.back() to return to wherever the editor was opened from (the page or the list), falling back to /admin for direct loads. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Group pages under collapsible <details> per section with a count badge (drops the now-redundant Section column) - Style the admin-page <h1> (was unstyled outside .prose) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Move the create action onto the heading row as a primary button (the conventional spot), replacing the easy-to-miss text link. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- table-layout:fixed with shared column widths so every section's columns line up; right-align Visibility/Status/Actions - Add a Delete action per row that opens the same confirm modal as the editor and posts to /admin/delete (CSRF token now issued on the list page) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switch from localStorage to sessionStorage and detect reloads via the Performance Navigation API: a refresh resets to the default (only the active page's section open); normal navigation restores opened sections. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Previously two button systems (homepage/.btn pill vs editor/modal padding buttons) rendered at different heights and fonts. Now every button shares one base; Publish is primary (brand), Save draft secondary (alt). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Returns to the previous page (history.back), falling back to the handbook home for direct loads. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- searchPages() in db/pages.ts: case-insensitive LIKE on title/body, ANDed
with the existing readableWhere(visitor) ACL so results never leak a page
the caller can't read; title matches rank above body matches; LIKE
wildcards escaped
- GET /api/search returns { results } JSON, fails closed (503 + empty) on
DB error, sets Cache-Control private/no-store + Vary: Cookie
- Navbar search box with debounced fetch; results rendered via
createElement/textContent (no innerHTML on API data); plain-text snippets
- 6 new tests covering ACL (incl. draft visibility), ranking, empty query,
and bind ordering
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Clearer for non-technical staff. Renames src/pages/admin -> edit-pages and updates every reference (navbar Editor link, reader edit pencil, New page, Edit/Delete links, save/delete/preview form actions + redirects, Back link). No redirect from the old /admin (clean break; nothing external links to it). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Edit route keys on the page slug: /edit-pages/edit/<slug> (was numeric id). Adds getEditablePageBySlug(); Edit links, the reader edit pencil, and the save redirect all use the slug. - Rename the create route to /edit-pages/create (clearer than /new); heading now "Create page". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The native <datalist> popup is browser-rendered and can't be themed, so it looked out of place. Swap it for a custom dropdown styled to match the dark UI; still lets you pick an existing section or type a new one (free text). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Remove dead getPageVisibility() (never wired up) from db/pages.ts - Remove orphaned .pane-title CSS (panes lost their titles when the Content section became collapsible) - Style .nav-edit (the navbar "Editor" link had markup but no CSS) - Replace the "Back to handbook" inline style with an .admin-back class Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Visible label + help text only; the form field name and route slug are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both editor sections (Page settings, Content) now start collapsed. Open-state is remembered per tab (sessionStorage): a reload resets to collapsed, but navigating back restores whatever you had open — same model as the sidebar. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The identical history.back()/same-origin-referrer handler lived in both the editor and the Pages list. Move it to lib/ui/backLink.ts (wireBackLink). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The sessionStorage reload-reset / navigation-restore logic for <details> sections was duplicated (inline) in the sidebar and the editor. Move it to CollapsePersistence.astro, which renders the inline script (define:vars, so no flash) parameterised by selector + storageKey. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Introduce src/content.config.ts (glob collection, fail-closed schema: missing visibility -> restricted, missing status -> draft) and generate src/content/pages/<slug>.md for all 10 pages via scripts/seed-content.mjs. Additive — nothing reads the collection yet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- lib/content/acl.ts: pure canRead() predicate (mirror of readableWhere, fail-closed) + search + snippet helpers — unit-testable without Astro - lib/content/pages.ts: getPageBySlug/getNavPages/getSidebarPages/ listAllPages/getEditablePageBySlug/searchPages over the collection - Visitor gains groupKeys (stable keys for the git ACL); groupIds kept until db/pages.ts is removed. Middleware resolves both via a groups JOIN. Not yet wired — readers still use db/pages.ts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Point the reader page, search API, sitemap, sidebar, and access.ts at lib/content/pages (git-backed) instead of lib/db/pages (D1). ACL verified live from frontmatter: anon sees only public, reader +internal, search + sitemap gated correctly. Editor pages still use D1 (Phase 3). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
sn0wm1ku
left a comment
There was a problem hiding this comment.
Release review of the sole payload, #99 (infra/ — CloudFront reverse proxy for the handbook Worker), judged against the OSBR engineering handbook (code-review.md §3-2 priority order; style-guide-terraform.md; infra-planning-policy.md; security-policy.md / application-security.md). LGTM — no blocking findings; safe to release.
Correctness (KISS/DRY/YAGNI)
- Managed CloudFront policies are used everywhere they fit; the only owned policy is the HSTS response-headers policy the origin genuinely lacks. No speculative modules or wrappers (
style-guide-terraform.md§7). - The viewer-request function does only its two irreducible jobs (Origin rewrite, post-cutover canonical redirect), and the 18 unit tests load the exact file Terraform uploads — tested code is shipped code.
Security
- No secret in the tree:
origin_secretissensitive, no default, fed viaTF_VAR_;backend.hcland*.tfvarsare gitignored (style-guide-terraform.md§6). - Remote S3 state with
use_lockfile = true; no local state committed (§5). - Cache design prevents cross-reader leakage: all-cookies cache key on the default behaviour,
CachingDisabledon/api/*,CachingOptimizedonly on content-hashed/_astro/*. - Origin rewrite preserves the CSRF property (only the one legitimate public origin is translated; cross-site
Originpasses through and is still rejected) and theLocationsanitisation is tested against CRLF, fragment truncation and parameter smuggling. - HSTS added with
override = false; TLS 1.2+ on both viewer and origin legs;X-Origin-Verifyanti-bypass header cannot be forged from outside.
Style-guide conformance
- Conventional file split, alphabetical
variables.tf/outputs.tf, every variable typed and described (§3);required_versionset and provider pinned~> 6.0with the lock file committed (§4); snake_case names without type repetition (§2);fmt -check/validatepass per the evidence (§1). - One Tool Owns Each Resource is respected and cited: Terraform owns AWS only, never the Worker (§8).
Release safety. enable_dns_cutover defaults to false, there is no CI apply path, and both scripts are guarded (plan → saved tfplan → apply-what-was-read). Merging main → release ships inert IaC plus documentation; nothing changes for readers.
Open items — documented deferrals, not blockers (recorded in the PR body and infra/README.md, as the handbook requires for deviations): Worker-side X-Origin-Verify check (other repository), OAUTH_ORIGIN on the Worker at cutover, DNS cutover deliberately not armed, CI with OIDC pending the IAM role (acceptance criterion of #98 — keep #98's tracking open until it lands), WAF and access logging deferred. First-apply evidence (console/curl) should be attached at apply time as the PR body promises.
🤖 auto-posted by sn0wm1ku/ghDuty · co-authored by Claude (claude-opus-4-8)
POC (#68): git-backed handbook on Astro + Cloudflare — GitHub auth, review workflow, no CMS/DB
sn0wm1ku
left a comment
There was a problem hiding this comment.
Re-review after the RC regenerated (my 08-25 review was auto-dismissed when #72 merged into main). Judged per code-review.md §3-2 and the matching style guides. LGTM — approve; safe to release.
Payload #99 (infra/ — CloudFront reverse proxy). Byte-identical to what I release-reviewed on 08-25: the delta since that review touches zero infra/ files. That LGTM stands in full (secrets handling per style-guide-terraform.md §6, remote locked state §5, managed policies §7, enable_dns_cutover=false, no CI apply path).
Payload #72 (Astro + Cloudflare Workers handbook app). Already carried my standing APPROVED review on its own PR (2026-08-24), and no commit postdates that approval (last commit 2026-08-21, merged 2026-08-27). The delta on this RC is exactly that approved payload — 107 commits, 147 files, all under app/, doc/ frontmatter, POC.md, workflows — with no conflict-resolution drift against infra/.
Release safety of the merge itself. deploy-worker.yml triggers on pushes to i68-handbook-poc and main only — a merge to release fires no deploy, and the workflow is inert regardless until CLOUDFLARE_API_TOKEN exists. run-tests.yml targets the app on its own branches. Merging this RC changes nothing running.
Open items from the 08-25 review remain documented deferrals, not blockers (Worker-side X-Origin-Verify, OAUTH_ORIGIN at cutover, DNS cutover unarmed, OIDC CI pending #98, WAF/logging deferred).
🤖 auto-posted by sn0wm1ku/ghDuty · co-authored by Claude (claude-opus-4-8)
…blocking the plan The Worker now checks X-Origin-Verify (lib/auth/originLock.ts) and refuses requests that bypassed the distribution, closing the gap infra/README.md listed first under "Still open": the *.workers.dev host served the same gated content while skipping the WAF, HSTS, and the Origin rewrite the editor needs. Engaged by setting ORIGIN_VERIFY_SECRET, not by deploying — unset means off. That default is deliberate: the distribution must be verified end-to-end before DNS moves, against a Worker nothing fronts yet, and rollback should be `wrangler secret delete` rather than a redeploy. Verified in workerd both ways: secret set → 403 without the header (incl. /api/*), 200 with it; secret unset → served as before. infra/main.tf: the UseOriginCacheControlHeaders-QueryStrings policy is one of the two managed cache policies AWS ships WITHOUT the "Managed-" prefix, so the data source could not resolve and the distribution never planned. Verified against list-cache-policies; the policy does key the cache on every cookie, as the README claims. astro.config.mjs's comment still said a proxy MUST forward the viewer's Host; that was measured to be impossible on 2026-08-21, and the real mechanism is the Origin rewrite — corrected in place. Also folds in the post-#72 retirement of POC-branch targeting (GITHUB_BRANCH pin, deploy-worker branch list) and the environment-ribbon removal, and adds the "engage the origin lock" cutover step to POC.md ahead of the DNS swap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FPmEmA9oyVyVt8vp3EVCF4
Worker side of the CloudFront origin lock; fix the cache policy name blocking the plan
sn0wm1ku
left a comment
There was a problem hiding this comment.
Re-review after the RC regenerated a second time (my 10:09 review was auto-dismissed when #101 merged into main at 10:56). Judged per code-review.md §3-2 (correctness → security → readability) and the matching style guides. LGTM — approve; safe to release.
Delta since the dismissed review: exactly #101, with no drift. fc89368..b8a4fd1 is two commits — #101's single commit 2ea53b8 and its merge. The merge commit's tree (610e5799…) is byte-identical to 2ea53b8's tree, so the merge into main resolved nothing and re-wrote nothing: what sits on this RC is precisely what I reviewed.
Payload #101 (Worker-side X-Origin-Verify origin lock; cache-policy name fix). Carries my standing APPROVED review on its own PR (2026-08-27 10:55:18, against 2ea53b8), and no commit postdates that approval (2ea53b8 committed 10:41:08; merged 10:56:37). The full handbook-cited review is on #101: infra/main.tf cache-policy name verified against AWS's own managed-policy documentation; the off-until-ORIGIN_VERIFY_SECRET-is-set default recorded as an application-security.md §3-16 relaxation with scope, duration and rollback (wrangler secret delete) stated in the PR body and POC.md step 6; no secret in the diff. That LGTM stands in full.
Payloads #72 and #99. Untouched by the delta except where #101 deliberately edits them (infra/main.tf name fix, astro.config.mjs comment correction, ribbon removal, POC-branch retirement) — all reviewed under #101. My 08-25 and 10:09 LGTMs on those payloads stand.
Release safety of the merge itself. deploy-worker.yml at the RC head triggers on push to main only (the POC branch was retired in #101), paths app/** and doc/** — a merge to release fires no deploy, and the workflow stays inert until CLOUDFLARE_API_TOKEN exists. The origin lock is inert until the Worker secret is set by hand. Merging this RC changes nothing running.
Open items remain documented deferrals, not blockers: OAUTH_ORIGIN at cutover, DNS cutover unarmed (enable_dns_cutover=false), OIDC CI pending #98, WAF/logging deferred. The Worker-side X-Origin-Verify item from my 08-25 list is now closed by #101.
🤖 auto-posted by sn0wm1ku/ghDuty · co-authored by Claude (claude-opus-4-8)
Modify start-pull-request.yml to pass label values through env instead of inline interpolation
doc/ pages now carry a schema-validated frontmatter block, so a plain markdown file dropped in fails the Astro content collection and never reaches the Worker. Documents the exact frontmatter contract, slug/parent/ sort/visibility rules, what a body may contain (no raw HTML), the add/rename/delete recipes, the gates, and the split between the live Worker deploy and the still-running GitHub Pages pipeline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FgJHpbomqG9v26obEFEonp
sn0wm1ku
left a comment
There was a problem hiding this comment.
Re-review after the RC regenerated a third time (my 08-27 11:09 review was auto-dismissed when #97 merged into main at 2026-08-28 03:38 UTC). Judged per code-review.md §3-2 (correctness → security → readability) and the matching handbook standards. LGTM — approve; safe to release.
Delta since the dismissed review: exactly #97, with no drift. b8a4fd1..fe6a391 is five commits — #97's three content commits (5ba6ba8, 6aa8b23, 8841740, all 2026-08-24), the base-merge de47e60 (08-28 03:37) and the merge fe6a391 (08-28 03:38). The only file that changes on the RC is .github/workflows/start-pull-request.yml (+9/−8). Its blob at the RC head is 6be7c6f, byte-identical to the blob at 8841740 — so the base-merge into the branch and the merge into main rewrote nothing in the payload.
Payload #97 (start-pull-request.yml — untrusted values reach the shell via env, not ${{ }} interpolation). Carries my standing APPROVED review on its own PR (2026-08-24 10:13:12 UTC), and no content commit postdates that approval (last content commit 8841740 at 08:47:50; the only later commit is the base-merge, which the blob comparison above shows touched nothing). Re-verified against the file at the RC head: every ${{ }} removed from run: script text now arrives as a real environment variable at its point of use — LABELS / ASSIGNEES / NEW_BRANCH_NAME written to $GITHUB_ENV by earlier steps, REPO / ISSUE_NUM / ISSUE_TITLE / DEFAULT_BRANCH in the job-level env: block — and no ${{ }} remains inside any run: block. A shell variable's value is not re-scanned for $() / backticks, so a metacharacter-bearing label name can no longer execute in a job holding contents / issues / pull-requests / id-token: write. That is the shape application-security.md §3-10 requires (untrusted input MUST NOT be passed to a shell as script text; §3-9 parameterise at the sink). Minimal and matching #95 exactly (code-review.md §3-2 KISS/YAGNI).
Payloads #72, #99 and #101. Untouched by the delta — zero files under app/, infra/, doc/ or POC.md change between b8a4fd1 and fe6a391. My 08-25, 08-27 10:09 and 08-27 11:09 LGTMs on those payloads stand in full.
Release safety of the merge itself. start-pull-request.yml triggers on issues: assigned, and GitHub runs issue-event workflows from the default branch's copy — a merge to release neither fires it nor changes which copy runs. deploy-worker.yml at the RC head triggers on push to main only and stays inert until CLOUDFLARE_API_TOKEN exists. Merging this RC changes nothing running.
Advisory, not gating (code-review.md §3-3), pre-existing and outside the delta: actions/checkout@v4 in this workflow is tag-pinned; supply-chain-risk.md says third-party actions SHOULD be pinned to a full commit SHA. Belongs in its own issue, not on this RC.
Open items remain documented deferrals, not blockers: OAUTH_ORIGIN at cutover, DNS cutover unarmed (enable_dns_cutover=false), OIDC CI pending #98, WAF/logging deferred.
🤖 auto-posted by sn0wm1ku/ghDuty · co-authored by Claude (claude-opus-4-8)
Repo root is reserved for monorepo settings and the README. .github/ already holds the repo's process documents (issue/PR templates, release config), and neither the Astro build nor VitePress reads it, so the guide cannot become a published page by accident. The CLAUDE.md pointer carries discovery, so the path is free to move. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FgJHpbomqG9v26obEFEonp
It is an instruction file for AI agents, not human repo documentation and not a GitHub operations file, so it belongs with the agent config rather than at the root, under .github/ or under docs/. Discovery is the CLAUDE.md pointer, so the path is free. This is the first tracked file under .claude/, so the machine-local scratch Claude Code writes beside it is now ignored explicitly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FgJHpbomqG9v26obEFEonp
POC.md records the live chain as Route 53 -> CloudFront -> Cloudflare Worker; the guide said DNS points at the Worker directly, which would mislead anyone debugging response headers. Flagged by the ghDuty review on PR #105 and verified against POC.md before changing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FgJHpbomqG9v26obEFEonp
The Route 53 -> CloudFront -> Worker line in POC.md describes www.osbrjp.com, offered there as the pattern to copy. It is not a statement about handbook.osbrjp.com, and citing it as one was wrong. Measured instead: the hostname resolves to CloudFront addresses and the response carries both CloudFront and Cloudflare headers. POC.md still records the pre-cutover CNAME to osbrjp.github.io, so the guide now warns readers off it.
The README still pointed readers at https://osbrjp.github.io/handbook/ and described the repository as a VitePress project. Verified before changing: handbook.osbrjp.com answers 200 with both CloudFront and Cloudflare headers, and infra/README.md records the CloudFront distribution reverse-proxying to the Worker. Adds what each top-level directory is, the app dev commands and commit gates from app/package.json, and a pointer to the content guide. The legacy VitePress quick start stays, demoted and labelled.
Editing the handbook is done in the browser at handbook.osbrjp.com, where submitting a page opens a pull request for it. The content guide is for agents editing doc/*.md files directly, so pointing human contributors at it was wrong.
The add-a-page recipe told agents to register the page in doc/.vitepress/config.mts. That sidebar belongs to the legacy VitePress build that ships to GitHub Pages, which the Astro app never reads and which is no longer what readers get, so the instruction sent agents to maintain a file that does not affect the live site. The live sidebar is generated from frontmatter by Sidebar.astro. Also documents the on-this-page outline, which was missing entirely: [...slug].astro builds it via extractHeadings, which collects h2 and h3 only, so anything deeper never appears. And the leading H1 is now explained by the on-disk format the editor writes rather than by VitePress rendering.
VitePress was woven through the guide -- the index.md exclusion, the H1 convention, the add-a-page recipe, the gates and the production section all explained themselves partly through it. It is the old GitHub Pages version and the app never reads it, so leading with it taught the wrong model. Sections 1-6 are now about the app only. Everything legacy is collected in a short section 7 that says what it is, that its build is still a CI check, and that you should leave it alone.
Add the content guide for AI agents, and update README for production
sn0wm1ku
left a comment
There was a problem hiding this comment.
Re-review after the RC regenerated a fourth time (my 08-28 04:10 review was auto-dismissed when #105 merged into main at 2026-08-28 07:01 UTC). Judged per code-review.md §3-2 (correctness → security → readability) and §3-3 (concrete, cited findings), plus repository-documentation-standards.md §4-2 (one fact, one place). LGTM — approve; safe to release.
Delta since the dismissed review: exactly #105, with no drift. fe6a391..0682f9a is eleven commits — #105's ten content commits (babc0fd … 00765c7, all 2026-08-28 03:57–04:49 UTC) and the merge 0682f9a (07:01:23). The merge commit's tree (a566882d) is byte-identical to 00765c7's tree, so the merge into main resolved nothing and re-wrote nothing: what sits on this RC is precisely the payload I reviewed on #105.
Payload #105 (.claude/CONTENT-GUIDE.md new; README.md, CLAUDE.md, .gitignore). Carries my standing APPROVED review on its own PR (2026-08-28 05:10:49 UTC, against 00765c7 — the same head that merged), and no commit postdates that approval (last content commit 00765c7 at 04:49:09; merged 07:01:24). That review verified every factual claim in the guide and README against main source (content.config.ts loader, serialize.ts H1 round-trip, markdown.ts heading extraction and raw-HTML drop, Sidebar.astro generation, auth/github.ts no-allow-list, every package.json script named). Re-checked at the RC head: the four changed files are documentation and ignore rules only — no code, no workflow, no doc/, app/ or infra/ file; no secrets, tokens, account ids or personal addresses in the diff (application-security.md §3-2 security lens); .gitignore gains only scratch paths under .claude/ and no broader rule shadows the tracked guide. That LGTM stands in full.
Payloads #72, #97, #99 and #101. Untouched by the delta — zero files under app/, infra/, doc/, .github/ or POC.md change between fe6a391 and 0682f9a. My 08-25, 08-27 10:09, 08-27 11:09 and 08-28 04:10 LGTMs on those payloads stand.
Release safety of the merge itself. release.yml fires on push to release and republishes the legacy VitePress site to GitHub Pages; this delta touches no doc/ file, so that build's artefact is identical to what the previous RC head would have produced. The live site is the Worker, and deploy-worker.yml at the RC head triggers on push to main only (paths app/**, doc/**) — a merge to release fires no Worker deploy, and the workflow stays inert until CLOUDFLARE_API_TOKEN exists. start-pull-request.yml runs from the default branch's copy regardless. Merging this RC changes nothing readers get.
Advisory, not gating (code-review.md §3-3), carried over from the #105 review: POC.md still records the pre-cutover DNS statement while the guide and README now state the measured CloudFront → Worker path — two disagreeing facts in one repository (repository-documentation-standards.md §4-2). #105's body names it as its own follow-up; belongs in its own issue, not on this RC. Same for the tag-pinned actions/checkout noted on the previous RC review (supply-chain-risk.md).
Open items remain documented deferrals, not blockers: OAUTH_ORIGIN at cutover, DNS cutover unarmed (enable_dns_cutover=false), OIDC CI pending #98, WAF/logging deferred.
🤖 auto-posted by sn0wm1ku/ghDuty · co-authored by Claude (claude-opus-4-8)
Uh oh!
There was an error while loading. Please reload this page.