Skip to content

State per-platform signing, and give search results the brand and prose they quote - #32

Merged
yujiezhang-ops merged 3 commits into
mainfrom
feat/signed-macos-and-seo
Aug 18, 2026
Merged

yujiezhang-ops merged 3 commits into
mainfrom
feat/signed-macos-and-seo

Conversation

@yujiezhang-ops

Copy link
Copy Markdown
Collaborator

Three changes that were developed and verified together on one tree. Each commit is a self-contained logical change and green by construction; the head commit carries the full gate results below.

1. DeepSeek Harness mark (3bdb3f0)

Bundles lobe-icons' deepseek.svg (MIT) for the dsh planned-agent entry, with its rights record and digest like every other mark, and adds it to the dark-scheme inversion set and the e2e mark inventory.

2. Search results: brand and prose (3eaaa57)

Google indexes the home page with no usable summary, and Bing quotes demo-console fragments as the snippet (开始激活演示 0.6.2 · 未签名技术…, from a ~5-day-old crawl). The head tags were fine — the body was the problem: ~85% of the home page's visible text was the activation demo's interface labels, and the description described a flow without naming anything it operates on.

  • data-nosnippet on the demo console — it is a replica of the product UI, not prose about it. Still crawled and indexed; just not quotable as the page's summary. Snippet-eligible text drops from 3,144 to 1,458 chars, all of it real prose. (The attribute is Google-only; Bing is carried by the description and hero changes.)
  • Descriptions now name what a query would: the agents (Claude Code, Codex, OpenCode), the protocols (OpenAI / Anthropic-compatible), and where keys live.
  • The hero drops the channel/version note — the signing status was the loudest claim on every crawl, and /downloads/ + /security/ state it in full. The footer's raw channel slug becomes a link to /security/.
  • A brand lockup leads the hero; JSON-LD becomes an @graph whose Organization carries the 1024px logo (the property search engines read for the brand image beside a result — neither og:image nor the favicon is consulted for it), plus an apple-touch-icon.
  • Chrome CTA: 下载预览版下载 BootAgent. A button on every page had made "preview" the loudest word about the product.

After merge, both engines need a recrawl: Search Console and Bing Webmaster Tools each have a request-indexing action; Bing also honours IndexNow.

3. Per-platform signing copy (e281cae)

v0.7.0's macOS artifacts are signed and notarised (upstream BootAgent#199 moved signing into the release workflow), so the blanket "unsigned technical preview" is now wrong for macOS while still right for Windows. Verified against the published artifacts before any copy changed:

codesign -dv  → Developer ID Application: steve li (F2VC757B28),
                hardened runtime, Notarization Ticket=stapled   (both DMGs)
spctl -t exec → accepted, source=Notarized Developer ID
stapler       → ticket valid
PE parse      → Windows installers: no Authenticode certificate table
  • release-channel.ts models signing per target (notarized / signed / unsigned / not-applicable), driven by a hand-verified version floor whose evidence lives in a comment next to the constant. The feed records nothing about signing, so the floor is the only claim; Stable still requires the explicit tag marker.
  • The download page states signing per platform, and drops the "原生构建 + cleanroom 通过" row — it was rendered unconditionally while the channel reports cleanroom as not-recorded, exactly the kind of unearned badge this repo's release-channel module exists to prevent.
  • The security page names the Team ID and the spctl command a reader can run, and prints the channel id from the channel object rather than a hardcoded literal.
  • The quickstart's four-step Gatekeeper bypass comes down, honouring its own sunset clause ("签名与公证完成后,上面四步都不再需要,届时这份指南也会撤下"). The #macos-gatekeeper anchor stays for inbound links; readers on v0.6.x are told to upgrade rather than taught an allowance for an unsigned build. The screenshots, their rights records and the NOTICE paragraph go with it.
  • Help (install / upgrade / troubleshooting, both locales), llms.txt (also fixes the stale "No release has been published yet") and the changelog say the same thing in their registers.

Test plan

  • pnpm test — 98 passed (9 files). Down from 103 on main by design: −8 digest tests for the four removed screenshots, +3 new signing-floor tests (notarized ≥ 0.7.0, unsigned < 0.7.0, numeric-not-lexicographic version compare).
  • pnpm run buildastro check 0 errors, 51 pages validated.
  • pnpm run test:e2e with GITHUB_TOKEN216 passed, 18 skipped, matching main's healthy baseline. (Unauthenticated runs skip 15 download-page tests silently — run with a token.)
  • Built HTML inspected: per-platform signing values in the download grid, technical-preview + Team ID + spctl command on /security/, zero guide-steps remnants, JSON-LD @graph with Organization logo.
  • Signing verified by hand on both v0.7.0 DMGs and both Windows installers, as above.

🤖 Generated with Claude Code

yujiezhang-ops and others added 3 commits August 18, 2026 11:22
The dsh entry joins planned-agents.json as a coming-soon agent, so the
catalog shows it before the vendored agents.lock.json ships it. The mark
is lobe-icons' deepseek.svg (MIT), recorded in asset-rights.json with its
digest like every other bundled glyph, mapped in AgentMark and added to
the dark-scheme inversion set — it is a currentColor drawing like the
rest. The dark-scheme e2e list names it so a missing file fails loudly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Search engines were returning the home page with no usable summary
(Google) or with demo-console fragments as the snippet (Bing: "开始激活
演示 0.6.2 · 未签名技术…"). The head was fine — the body was the problem:
~85% of the page's visible text was the activation demo's interface
labels, and the description described a flow without naming anything it
operates on.

- data-nosnippet on the demo console: it is a replica of the product UI,
  not prose about it. Still crawled, still indexed, still read aloud —
  just not quotable as the page's summary. (Google-only attribute; Bing
  is carried by the two changes below.)
- Descriptions now name what a query would: the agents, the protocols,
  and where keys live.
- The hero drops the channel/version note. The signing status was the
  loudest thing said about the product on every crawl, and it belongs to
  /downloads/ and /security/, which state it in full. The footer's raw
  channel slug becomes a link to /security/.
- A brand lockup (44px mark + name) leads the hero; JSON-LD becomes an
  @graph whose Organization carries the 1024px logo — the property
  search engines actually read for the brand image. An apple-touch-icon
  keeps iOS from screenshotting the page instead.
- The chrome CTA reads 下载 BootAgent rather than 下载预览版.

The narrow visual baseline is regenerated: the lockup changes the page
height, which shifts the console onto a different fractional pixel
offset (1px separator row + re-anti-aliased text, content identical).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v0.7.0's macOS artifacts are Developer ID-signed and Apple-notarised
(upstream BootAgent#199 moved signing into the release workflow), so the
blanket "unsigned technical preview" is now wrong for macOS while still
right for Windows. Verified by hand against both published DMGs before
any copy changed:

  codesign -dv  -> Developer ID Application (Team ID F2VC757B28),
                   hardened runtime, notarization ticket stapled
  spctl -t exec -> accepted, source=Notarized Developer ID
  PE parse      -> the Windows installers carry no Authenticode
                   certificate table

The channel model records that divergence instead of one flag: each
target carries a signing state (notarized / signed / unsigned /
not-applicable), driven by a version floor whose evidence is documented
where the constant lives. The channel id drops "-unsigned" and the feed
still records nothing about signing, so the floor is the only claim —
under-claiming stays the default for Stable.

Copy follows the model. The download page states signing per platform
and loses the "原生构建 + cleanroom 通过" row, which was rendered
unconditionally while the feed reports cleanroom as not-recorded. The
security page names the Team ID and the spctl command a reader can run,
and prints the channel id from the channel rather than a literal. The
quickstart's four-step Gatekeeper bypass comes down, honouring its own
sunset clause ("届时这份指南也会撤下") — the anchor stays for inbound
links, and readers on v0.6.x are told to upgrade rather than taught an
allowance for an unsigned build. The four screenshots, their rights
records and the NOTICE paragraph go with it. Help, llms.txt and the
changelog say the same thing in their own registers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@yujiezhang-ops
yujiezhang-ops merged commit 61f593e into main Aug 18, 2026
1 check passed
yujiezhang-ops added a commit that referenced this pull request Aug 18, 2026
The two P2s: the download page's signing notice was a constant while the
signing row beside it reads per-target state, so a pre-0.7.0 feed (a
rollback, or a RELEASE_REPOSITORY fork shipping unsigned builds) would
have shown the two contradicting each other — the notice now branches on
the same signing state. NOTICE's claim that nothing on the site
references bootagent-logo.png became false when JSON-LD started naming
it as the Organization logo; it now says so.

The rest are statements this branch made stale in passing: the en
security description promised a verification command that only renders
conditionally; four comments and two docs still described the removed
Gatekeeper screenshots or the pre-dsh empty planned list; llms.txt's
translation list was missing /en/help/; and the en site description
dropped the backup claim the Chinese one makes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@yujiezhang-ops

Copy link
Copy Markdown
Collaborator Author

Adversarial review (fresh-context pass over origin/main...HEAD)

P0: none. P1: none. The signing model's version comparison, the removed-field sweep, anchors, e2e string assertions, the dark-scheme mark inventory, JSON-LD structure and zh/en parity all checked clean. Findings below, with disposition; everything marked fixed landed in 7a27596 and the gates re-ran green (vitest 98, build 51 pages, affected e2e).

P2 — fixed

  1. DownloadSelector.astro — the signing notice was a constant beside a per-target signing row. A pre-0.7.0 feed (rollback, or a RELEASE_REPOSITORY fork shipping unsigned builds) would have rendered "signed and notarised" next to "签名状态:未签名". The notice now branches on the same signing state the row reads. The en security-page description similarly promised "how to verify the release signature" while the command block is conditional; it now says "where each platform stands on signing".
  2. NOTICE — made false by this branch. It still said nothing on the site references bootagent-logo.png directly, while the new JSON-LD names it as the Organization logo on every page. Corrected.

P3 — fixed

  1. e2e/site.spec.ts comment claiming planned-agents.json "is legitimately empty today" (stale since the dsh commit).
  2. asset-rights.test.ts comment citing the NOTICE paragraph this branch removed.
  3. docs/verification-checklist.md describing the now-empty guide manifest as recording screenshot contents.
  4. docs/rename-to-bootagent.md still listing "retake the Gatekeeper screenshots" as pending — resolved differently (guide came down with v0.7.0's signed builds).
  5. global.css hero-stagger comment describing delays that no longer match the values.
  6. llms.txt translation list missing /en/help/ (pre-existing, one line, file already touched here).
  7. en site.description dropped the backup claim the Chinese one makes ("自动备份") — now "backs up existing config before writing anything".

P3 — noted, deliberately not fixed here

  • Same-package copy contradiction (pre-existing): /security/ says the same build ships via "官网、GitHub Release、网盘、企业云盘" while /downloads/ says artifacts ship through GitHub Releases only. This branch increases /security/'s exposure (the footer now links it), so worth its own focused change.
  • sameAs and Organization url in JSON-LD hardcode the canonical repo and ignore BASE_PATH respectively — only wrong for forks or non-root deploys, neither of which this site does today.
  • og:image dimensions are constants for the default image (verified 1215×690); the comment already flags the debt if a page ever passes its own image.
  • Planned targets get a computed signing even with no asset; if a future ≥0.7.0 release shipped without macOS artifacts, /security/ would still describe macOS as notarised. Speculative today (v0.7.0 ships all platforms).

Verified clean (highlights)

  • versionAtLeast: numeric per-segment ("0.10.0" > "0.7.0"), missing segments zero-filled, v stripped at the sole call site; all four new floor tests bind.
  • Zero survivors of unsigned/technical-preview-unsigned/未签名技术预览版 outside Windows-current, v0.6.x-historical, conditional-fallback and fixture contexts.
  • #macos-gatekeeper resolves in both locales via <base> (zh) and localePath (en); no dead references to the four deleted screenshots; the empty guide manifest is still guarded bidirectionally by asset-rights.test.ts.
  • Every exact-match e2e string exists verbatim in the corresponding source.

🤖 Generated with Claude Code

@yujiezhang-ops

Copy link
Copy Markdown
Collaborator Author

Two updates since the review comment above:

7a27596 applies the review findings — both P2s (the download notice now branches on the same per-target signing state as the signing row; NOTICE's logo sentence corrected) and the seven fixable P3s. Gates re-ran green.

a2e2dc5 adds a zero-decision download path, modelled on ccswitch.io/zh/download's lead: one primary button above the platform picker carrying the detected target's file, restating version · target · size · signing beside it, following the picker's selection, hiding when a target has no artifact. Plus a "past versions → GitHub Releases" line. Deliberately not copied from the reference: truncated checksums (the full digest is this site's claim), a brew line (no formula exists), and hero download buttons on the home page (its one-activation-entry rule is e2e-guarded by design).

Full gates on the final tree: vitest 98 passed, build 51 pages validated, e2e 216 passed / 18 skipped (baseline-identical), verified interactively in the browser across light/dark and mobile.

🤖 Generated with Claude Code

@yujiezhang-ops

Copy link
Copy Markdown
Collaborator Author

Note: this merged while two follow-up commits were in flight (the review fixes and the zero-decision download button). They continue in #33, cherry-picked onto the squash — applied clean, full gates green there. 🤖

yujiezhang-ops added a commit that referenced this pull request Aug 18, 2026
)

* fix: apply review findings from PR #32's adversarial pass

The two P2s: the download page's signing notice was a constant while the
signing row beside it reads per-target state, so a pre-0.7.0 feed (a
rollback, or a RELEASE_REPOSITORY fork shipping unsigned builds) would
have shown the two contradicting each other — the notice now branches on
the same signing state. NOTICE's claim that nothing on the site
references bootagent-logo.png became false when JSON-LD started naming
it as the Organization logo; it now says so.

The rest are statements this branch made stale in passing: the en
security description promised a verification command that only renders
conditionally; four comments and two docs still described the removed
Gatekeeper screenshots or the pre-dsh empty planned list; llms.txt's
translation list was missing /en/help/; and the en site description
dropped the backup claim the Chinese one makes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: put a zero-decision download button above the platform picker

Modelled on how ccswitch.io/zh/download leads: the detected platform's
file as one prominent button, with everything needed to click it —
version, target, size, signing state — restated beside it, so the common
case never has to parse a six-way radio group first. The picker and the
per-target panels stay directly below for everyone else; the primary
block follows the picker's selection, and hides for a target with no
artifact rather than keep offering the previous target's file under the
new target's name.

Deliberately not adopted from the reference: truncated checksums (the
full digest a reader can compare character-by-character is this site's
claim), a brew line (no formula exists to point at), and a download
button in the home hero (the home page presents one activation entry by
decision, and its e2e test guards exactly that). A "past versions" line
now points at GitHub Releases from the download page itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant