fix: use the organization avatar in both homepage headers - #30
Conversation
waterbro-8
left a comment
There was a problem hiding this comment.
Approving review from @waterbro-8 — requested by @PeterGuy326 on the ByteFolk group at 2026-09-08 14:32 (local) for a fresh CODEOWNER sign-off on this head, with the explicit note that #29's approval does not carry over.
I am neither the author nor the pusher of 7d81cf4c44913db0342107f2e75aa250403fa38d (author = committer = PeterGuy326, and it is the only commit on the branch), so this approval is independent under require_last_push_approval. .github/CODEOWNERS at this head is * @PeterGuy326 @Bindy-lbb @waterbro-8, so this is one of the two tickets that can satisfy the code-owner requirement.
Everything below was measured against this exact head (git-commit tree 2e7ca2cf343147a9ba4cab8e146c6acf5ad75a54, base 99c967a04b152294fd2e9b927439fcbf37e59a86 = live main tip) through the GitHub API and the Windows network stack today. I re-ran an equivalent of the published Reproduce block rather than reading it, and then made the measurements that block does not make. Since the body discloses that Codex assisted with implementation and validation, and R2 asks for "a fresh independent CODEOWNER approval": this review is human and the numbers below are mine, not carried over from the ledger.
AC-by-AC result — all PASS
R2 REQ-004 / AC-004 — PASS. GET /orgs/bytefolk right now returns avatar_url = https://avatars.githubusercontent.com/u/309981672?v=4, and that string appears verbatim exactly once in each document (org id 309981672 matches login=bytefolk). Localized alt text: ByteFolk organization avatar (EN) / ByteFolk 组织头像 (ZH) — the only two alt= values in each file. width="72" height="72" present once per file, unchanged from base. "No alternate black/white SVG is selected by theme" holds at the token level: <picture>, <source, prefers-color-scheme, symbol.svg, symbol-reversed.svg, raw.githubusercontent.com all go 1,1,1,1,1,2 → 0 in both files. "Reuse the original avatar without recropping or recoloring it" — the markup references the endpoint directly, so nothing in this diff resamples or tints it.
R2 inherited REQ-001–003 / AC-001–003 — PASS, and the preservation claim is exact, not approximate. Both files split on the first </p> into a changed header and an identical remainder: 5,562 bytes EN and 5,254 bytes ZH match base byte-for-byte. Stronger than the split test: at line level the whole diff is 1 added line and 4 removed lines per file (94→97 EN, 83→86 ZH lines) and no other line in either document differs, so "all product links unchanged" is proven rather than asserted. pulls/30/files = 2 files, +1/−4 each. The added line has no trailing whitespace, no tab, no CR.
R2 REQ-005 / AC-005 (rendering) — PASS, verified at the renderer. POST /markdown in gfm mode with context=bytefolk/.github returns for both languages <img src="https://avatars.githubusercontent.com/u/309981672?v=4" alt="…" width="72" height="72" style="max-width: 100%; height: auto; max-height: 72px;; aspect-ratio: 72 / 72; background-color: var(--bgColor-muted); border-radius: 6px" class="js-gh-image-fallback">, wrapped in GitHub's own <a target="_blank" rel="noopener noreferrer nofollow" href="…>. Zero symbol and zero raw.githubusercontent occurrences in either rendered document. The 72×72 survives sanitization (GitHub adds max-height: 72px + aspect-ratio: 72 / 72 itself).
R2 REQ-005 / AC-005 (availability) — PASS, and I ruled out a CDN artifact. The avatar serves 200, image/png, Content-Length: 19167, Cache-Control: max-age=300, etag: "b586f374764609e046d9bf48951470698bdac45c4ab66d5965db4b09305849c2". Three fetches — including one with a cache-busting query — returned the same 19,167 bytes and the same sha256 6349d8954e1c5894d3c91e26fddba98411117c98964821d9798d76a43308bb0d. Decoded: 460×460, 16-bit RGB, no PLTE, no tRNS, non-interlaced → opaque, extrema 10..255.
R2 REQ-005 / AC-005 (checks) — PASS on the artifact, with the same caveat R2 itself states. The Governance check-run on this exact head is completed/success, attempt 1 (run 34194838409, job 101960204253), and it is the only check this repository defines for the PR. The author's table records governance / brand assets / whitespace as PASS locally on macOS arm64 + Ruby 2.6.10 — that part is their E1, mine is E2 from CI, because this machine has no ruby. Consistent with R2's "a green asset validator is not evidence that external URLs or README image choices were checked": scripts/validate-brand-assets.rb has 0 matches for README (so it cannot see the homepage at all) and scripts/validate-governance.rb:329 is next if destination.match?(/\A[A-Za-z][A-Za-z0-9+.-]*:/), which skips every scheme-carrying URL — both documents contain only absolute URLs, so CI validates 0 of the links and 0 of the two image sources in these files. The avatar and header assertions above are therefore the only evidence that exists for those claims, and this comment is where they are recorded.
The one material finding — it is not in this diff, and R2 puts it out of scope
The PR's premise is true and I quantified it: the published header and the live organization avatar really do disagree. But the side that deviates is the live avatar, not the SVG.
brand/bytefolk/avatar-1024.png at this head has git blob 82e530bc6a10615e5bd08c7b24d2e6828ff3dd74 and sha256 08a2ebb326503dee75344ddd95b3007d0266ead1564fc9194ad8c6d8f0232dd9 — identical to the value recorded in #18's readback, identical at #18's own merge commit 18c398f7d05601559b764a13e3e81d70283b083d, and identical at this PR's base and head, so this change touches neither it nor anything under brand/. Measured, that tracked asset is 1024×1024, 8-bit RGB, opaque, 100.0 % achromatic (max channel spread 0), extrema 20..255, white background 74.8 %, rgb(20,20,20) mark 22.2 % — i.e. exactly the "black symbol on an opaque white square" that brand/bytefolk/README.md:3 calls the approved one-color horned B and that scripts/validate-brand-assets.rb:151 defends as "avatar must remain grayscale".
The currently served organization avatar is a different drawing: 460×460 with background rgb(20,20,20) at 71.3 % of sampled pixels, plus rgb(22,119,255) 13.6 % and rgb(114,46,209) 5.5 %, white 5.4 % — 22.9 % of samples are non-achromatic, max channel spread 240. Normalising both to a common grid and comparing the mark masks against the tracked asset resized 1024→460:
- per-channel MAE = 177.5 / 255 — versus the
0.664 / 255recorded in #18's AC-007 readback; - 88.4 % of pixels differ at all, max single-channel error 242;
- mask IoU 0.394 on the raw canvas, 0.434 after bounding-box normalisation.
So the live org avatar is no longer the approved asset, and #18 is still open (documentation, status:ready, priority:p0, unassigned) with REQ-003 / AC-006 / AC-007 being precisely "an organization owner uploads the exact tracked PNG through GitHub Organization Settings" plus a readback that the served pixels match it. GET /orgs/bytefolk now reports updated_at = 2026-09-07T01:22:40Z, i.e. after that readback was posted at 2026-09-01T16:55:06Z; that field also moves for unrelated org edits, so it dates nothing on its own — the pixel comparison above is the evidence, and it is the kind that does not need a timestamp to be conclusive.
Consequences, stated so nobody has to re-derive them:
- This is not a defect in
7d81cf4and I am not asking for changes on account of it. R2 explicitly lists "No avatar upload or redesign" among its non-goals, so a header PR cannot and should not fix it. The diff does exactly what the governing decision asked. - Merging it makes the org homepage inherit a mark that this repository's own brand guidance prohibits —
brand/bytefolk/README.md:30-32forbids "background frames, eyes, … extra colors" and forbids rearranging the horns-and-B geometry, and:17-18says the full-body mascot "must not replace the symbol in organization avatars". The served image has two white dots that read as eyes and two extra colors. - The body's own risk note understates this: "later avatar updates and CDN caching may affect its appearance" describes a future risk; as of today the update has already happened. Worth one sentence in the body, not a code change.
- The public record that needs correcting is #18, whose readback comment now asserts a false pixel match. That is the author's edit to make (or a new readback comment superseding it) — I have not touched it.
?v=4is not an avatar-version counter: I sampled 7 organizations (github,nodejs,microsoft,python,kubernetes,denoland,bytefolk) and every one returns?v=4. So pinning this URL means the homepage follows the org avatar silently and with no diff signal — good for R2's intent ("reuse the current avatar"), but it also means nobody will get a PR when the avatar changes again. If the org wants the header pinned to this specific approved asset rather than to "whatever GitHub shows", the only way to express that in a header is a tracked file underbrand/, which is what the base was doing.
My recommendation is sequencing, not revision: re-run #18's AC-006 upload (owner action, outside this repository) either before or immediately after merging this, and correct #18's readback. If the org instead decides the colored mark is now canonical, that is a brand-kit change with a decision attached to it, and #28/#18 are where it belongs.
Secondary observation — what the change gives up (authorized, recorded, not blocking)
The base render proves the removed markup was genuinely theme-adaptive, not decorative: GitHub's sanitizer preserved <picture> and <source media="(prefers-color-scheme: dark)" …> and wrapped the block in its own <themed-picture data-catalyst-inline="true"> (2 themed-picture markers in the base output, 0 at head). So #30 removes a working light/dark mechanism rather than a broken one — which is exactly what R2's sentence "No alternate black/white SVG is selected by theme" decides, so this is a documented trade-off and not drift. The practical detail that follows from it: the org avatar's own canvas is near-black (rgb(20,20,20)), so on a light GitHub theme the header is a dark square; GitHub's injected background-color: var(--bgColor-muted) sits behind an opaque image and will not soften that. I did not view the rendered page in a browser (see below), so this is read off the sanitizer output and the PNG's measured background, not off a screenshot.
Nit — one line, optional
Refs #28 lands on a body that is still R1 and states as a non-goal "No avatar replacement …" with REQ-004/AC-004 reading "keep the approved symbol geometry unchanged; support light/dark GitHub rendering". The PR does link R2 explicitly in its own Tracking record, so a reader coming from here is pointed at the right revision — the stale text only bites someone who opens #28 directly. Since #28 is open and unlabelled, a one-line pointer in its body ("AC-004 superseded by R2, see #issuecomment-5580081338") would close it. Author's call; I have not edited someone else's issue.
What I did not verify, stated plainly
- I did not run the two ruby scripts — no ruby interpreter on this machine. Their passage is the author's local E1 plus CI's E2 (
Governance, success, attempt 1, this head). I read their assertions instead, which is how the:329andREADME-absence facts above were obtained. - I could not "inspect a GitHub preview before publication" (an R2 verification step) — no browser here.
POST /markdownwithcontext=bytefolk/.githubis the closest machine-verifiable substitute and it is what I used; whether that step was performed by a human is the owner's attestation, not mine. - The avatar fetch went through the Windows network stack, because
avatars.githubusercontent.comandraw.githubusercontent.comare both unreachable from this WSL instance (TCP-filtered), whilegithub.com,api.github.com,codeload.github.comandobjects.githubusercontent.comare reachable. So "the oldraw.githubusercontent.comURLs were unreachable" is a property of my shell, not a finding about the base — I did not score that either way, and the author'scurl … -w '%{http_code}'step is a legitimate E1 from their environment. - I did not determine when or by whom the organization avatar was last uploaded.
GET /orgs/bytefolkexposes no avatar timestamp and there is no readable audit endpoint for it;updated_atis not specific to the avatar. What I established is the present pixel mismatch, which is sufficient for the recommendation and does not depend on the date. - I did not judge translation quality of
ByteFolk 组织头像beyond "it is Chinese, names the organization, and differs from the English string as the rest of the file does". - Branch state is clean:
compare/main...7d81cf4c4491=ahead 1 / behind 0,mergeable=true,maintip still99c967a04b15…. Somergeable_state=blockedhere was the missing approval and nothing else — no conflict, no staleness, no failing check. Before this reviewpulls/30/reviewswas empty andrequested_reviewerswas[Bindy-lbb, waterbro-8].#30is the only open PR in this repository.
Verdict: approving. Every R2 criterion passes on the exact head. The finding about the live organization avatar is material to the page, is explicitly out of scope for this diff by R2's own non-goals, and belongs on #18 — where I would like it recorded before this merges, so the org page does not silently ship a mark its own brand kit rejects.
Merge ledger — approved header correction
The Governance command checks local Markdown links; it skips scheme-bearing URLs. The brand validator checks tracked brand assets, not homepage image usage. Neither result is presented as an external-link or live-avatar-identity check. The concrete current-avatar drift was recorded in #18 before merge. Owner upload and its new readback remain separate work there; no issue is closed by this ledger. |
## Tracking record Refs #37, R1. Follow-up to #28/#29/#30: RoleWeave v0.1.2 was published on 2026-09-12, but the merged homepage still offers the v0.1.1 installers. The owner authorized this version refresh before sharing the organization page with the company group. ## Summary Both profile READMEs (English and Simplified Chinese) now point the explicit RoleWeave download buttons and release-notes link at the published v0.1.2 assets, and the installer note states v0.1.2. The signing limitation text, Qoder CLI host requirement, and every other byte of the merged homepage are unchanged. No avatar, brand asset, copy rewrite, organization settings, permissions, CI, or other file changes. ## Acceptance criteria | Acceptance criterion | Status | Implementation / evidence | | --- | --- | --- | | #37 REQ-001 / AC-001: both languages link the real public v0.1.2 assets and notes page; no v0.1.1 download reference remains | PASS | Diff replaces all six `0.1.1` occurrences per file; `grep -c "0\.1\.1"` returns 0 on both files at head; all three v0.1.2 URLs return HTTP 200 (checked anonymously with curl) | | #37 REQ-002 / AC-002: installer note states v0.1.2 and keeps the accurate constraints | PASS | Note now reads "The current v0.1.2 installers…" / "当前 v0.1.2 安装包…"; platform scope, unsigned status, and Qoder CLI 1.1.x requirement unchanged and consistent with the v0.1.2 release notes | | #37 REQ-003 / AC-003: governance, brand, and whitespace checks pass; both documents render; languages agree | PASS locally (see ledger); required remote CI must pass on the candidate head | ## Validation ledger | Command or check | Expected | Actual | Evidence | | --- | --- | --- | --- | | `ruby scripts/validate-governance.rb` (clean checkout of head, UTF-8 locale) | exit 0 | exit 0 | "Validated 5 issue forms, issue template config, 7 required files, and local Markdown links." | | `ruby scripts/validate-brand-assets.rb` | exit 0 | exit 0 | "Validated 5 ByteFolk SVGs and one opaque 1024x1024 RGB avatar." | | `git diff --check 0aaff62…HEAD` | no whitespace errors | clean | no output | | `git diff --stat 0aaff62…HEAD` | only the two profile files | 2 files, 4 insertions(+), 4 deletions(-) | `profile/README.md`, `profile/README.zh-CN.md` | | Anonymous HTTP HEAD on the three v0.1.2 URLs | 200 each | 200 each | dmg, exe, and release tag pages | | GitHub Actions `Governance` on the PR head | pass | pending | required remote check | ## Tests and coverage - Tests added or changed: none; documentation-only change. The repository's executable checks (governance, brand, whitespace) cover it and were run locally at head. - Coverage before / after, when measured: not applicable; no runtime code. - Intentionally uncovered behavior and reason: none. ## Change classification - [ ] User-visible behavior - [ ] Internal refactor or maintenance - [x] Documentation only - [ ] Build, CI, dependency, or repository configuration - [ ] Breaking change - [ ] Security-sensitive change ## Risk and rollback - Risk level and affected components: minimal; two profile documents, four lines each. - Compatibility, migration, privacy, performance, or operational impact: none; no runtime, data, or settings change. - Rollback procedure: focused revert PR of the two profile files, or restore the v0.1.1 strings. ## Breaking or security notes None. ## Author checklist - [x] A maintainer confirmed that the linked issue or tracking record was ready before implementation began, or the automation was pre-authorized under `GOVERNANCE.md`. - [x] This branch was created from an up-to-date default branch and contains no unrelated changes. - [x] I ran the repository's applicable tests, lint, type checks, builds, coverage, and security checks. - [x] I added a regression test for a bug fix, or explained why one is impractical. - [x] I updated relevant documentation and changelog files. - [x] I reviewed the diff for secrets, personal data, generated artifacts, and dependency risk. - [x] The PR is ready for CI and review by someone other than the sole author. - [x] All reported results are reproducible. ## Reviewer notes - The change is a pure version-string refresh; verify with `git diff origin/main...HEAD` that only the two RoleWeave sections differ. - Independent check worth reproducing: `grep -rn "0\.1\.1" profile/` returns nothing at head, and the three v0.1.2 URLs resolve anonymously. - Required CI and a fresh CODEOWNER approval from a non-author reviewer are merge gates; squash merge after conversations are resolved.
Tracking record
Refs #28, consumed revision R2. Header-only follow-up to merged #29; the owner authorized correcting the avatar and merging after checks and independent approval. Do not reuse #29's approval for this new head.
Summary
The published homepage uses theme-specific black/white SVGs, which differ from the current organization avatar. Both English and Simplified Chinese profile headers now reference the public avatar returned by
GET /orgs/bytefolk, preserving its original appearance and the existing 72-by-72 display size. Only two image blocks change; the rest of the merged homepage is byte-for-byte unchanged.No organization avatar upload, settings, brand assets, product copy, dependency, runtime, CI, permissions, or other branch changes.
Acceptance criteria and validation ledger
99c967a04b152294fd2e9b927439fcbf37e59a86Reproduce
Environment: macOS arm64, Ruby 2.6.10, gh 2.89.0, Git, curl, public GitHub network access.
ghuses its existing configured authentication; do not copy credentials into commands or output. Run from a checkout of this PR. These checks do not mutate repository files.Expected and observed: all commands exit 0 after the fix. Before the change, the header equality check fails on the English document, reproducing the mismatch. The brand validator checks existing assets, not README image usage; the separate header, HTTP and GFM checks cover those claims. Other product links are unchanged, not revalidated by this avatar patch.
Tests and coverage
Risk and rollback
Low documentation-only risk. The image is deliberately served from the same public GitHub avatar endpoint as the organization; later avatar updates and CDN caching may affect its appearance. The owner subsequently selected the Open Herd icon without its wordmark; that exact icon has now been uploaded through organization settings. R2 decision and fresh #18 readback supersede the earlier mistaken black B restoration and record the changed public derivative without claiming source/derivative pixel equality. Canonical export-asset alignment is tracked separately in #18. Meaningful alt text remains available if the image cannot load. No cropping, recoloring, or alternate theme image. Revert this focused commit through a PR to restore the prior header. No migration or cleanup is needed.
Breaking or security notes
None. Only the public organization avatar URL is newly referenced. No credentials, private repository data, or screenshots are included. Existing branch protection and required review are unchanged. Codex assisted with implementation and validation; the submitter remains accountable.