feat: open-source readiness and daily Briefings publication architecture #15
No reviewers
Labels
No labels
ai-handoff
needs-review
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
qluna/qluna-site!15
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/open-source-and-briefings"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #14 (implements phases 1–4; the repository visibility change deliberately remains a manual owner step and is NOT part of this PR).
What this PR does
LICENSE,CONTENT-LICENSE.md(authored content stays all-rights-reserved),CONTRIBUTING.md,SECURITY.md, README licensing/boundary sections,docs/open-source-readiness.md, internalinfra/doc references removedbriefings+briefingSeriescontent collections,/briefings/…routes (zh;/en/briefingsseries intro only), BriefingPage with correction/withdrawal/disclosure semantics, zh nav简报, homepage latest-edition cards,scripts/verify-briefing-source.mjsbuild gatextrape-aiedition (2026-07-27) with 7 durable web sources; per-series Atom feed at/briefings/[series]/rss.xml; verify-head briefing+feed assertionsdocs/editorial-workflow.md: two-output model, PR-required daily flow, future automation boundaryDisclosure audit record (issue phase 1 requirement)
Full tree + 44-commit history scanned for credentials, emails, private IPs/hostnames, and internal links:
CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_ID; values live in Forgejo config). No rotation needed.me@qluna.net(intended public contact) + committer identities only.XuSage6397, 13 occurrences) plus agent accounts (chatgpt@/claude@xtrape.com). If this linkage must not be public, rewrite history before flipping visibility.infra/forgejo-deploymentrepo are name-only policy citations (no endpoints/credentials); working-tree references rewritten in this PR.Details in
docs/open-source-readiness.md, including the visibility-change checklist.Validation
npm run buildgreen (46 pages): pre-build ChatGPT-artifact/private-marker gate →astro check→ build → extendedverify-head(hreflang regression + briefing routes, disclosure text, canonical URLs, Atom feed well-formedness).citeturn…markers, duplicate series+locale+date editions, and future-dated non-draft editions each fail the build.noopener noreferrer, automated-review disclosure), Atom feed content.Review notes
reviewStatusisautomatedand renders the corresponding disclosure — per issue rule,editor-reviewedmay only ever be set by a human commit.🤖 Generated with Claude Code
Updated for the issue clarification (commit
00b59e2): docs/editorial-workflow.md now names the ChatGPT scheduled task 每日 Xtrape 与 AI 简报 as the initial upstream generator, documents the three-layer separation (public source input / private full output / public derived output), and explicitly marks public-edition derivation, citation conversion, and branch+PR creation as manual today — the three new acceptance criteria are covered. Build stays green.Code Review — Iteration 1 (Deep Review)
Head reviewed:
00b59e2againstmain(47f0f02)Scope: 29 changed files / 5 commits
Result: Request changes — 1 High / 5 Medium / 2 Low
The overall separation of Notes vs Briefings, public/private workflow, correction/withdrawal model, source schema, and manual visibility gate is directionally strong. The following issues remain before this can be treated as phases 1–4 complete.
High
H1 — The first public edition states that Kimi K3 weights have already landed, but the cited evidence only supports a planned release
Affected file:
src/content/briefings/xtrape-ai/zh/2026/07/2026-07-27.mdThe description, section heading, body, and conclusions assert present facts:
Kimi K3 开放权重落地Moonshot AI 于 7 月 27 日按计划放出 Kimi K3 的开放权重2.8 万亿参数模型可自托管However, both cited Kimi sources were published before July 27 and describe an expected/upcoming release. The current official Kimi announcement still describes the full weights as something that will be released by July 27; this edition does not cite an actual official weights repository, model card, technical report, checksum, or license artifact proving that the release has occurred.
This violates the briefing's own publication standard: a dated public snapshot must not turn a scheduled event into a completed fact.
Required resolution:
计划于 7 月 27 日发布,若按计划开放) rather than a completed event.Medium
M1 — English homepage silently renders Chinese briefing content
Affected file:
src/components/HomePage.astroThe loop loads locale-specific series metadata, but always calls:
Therefore
/enrenders an English series name followed by a Chinese briefing title and Chinese description, without the(中文)disclosure used on/en/briefings. This creates incorrect language semantics inside an English document and makes the fallback look accidental.Make the query locale-aware, or implement an explicit Chinese fallback with a visible language label and English explanatory copy. Do not silently mix locales.
M2 — The English series introduction body is unreachable
Affected files:
src/content/briefing-series/en/xtrape-ai.mdsrc/pages/en/briefings/index.astrodocs/content-model.mdThe content model states that the Markdown body is the series introduction, and the PR description claims
/en/briefingsprovides the English series introduction. In practice, the route only renders frontmatternameanddescription; the Markdown body is never rendered, and the series title links directly to the Chinese archive.Either render each English series introduction on
/en/briefings, or add/en/briefings/[series]and link to it. The committed English body must not be dead content.M3 — Edition SEO metadata required by #14 is not implemented
Affected files:
src/components/BriefingPage.astrosrc/layouts/BaseLayout.astroscripts/verify-head.mjsCanonical handling and omission of false hreflang alternates are correct. However, briefing editions still use the generic layout metadata only: there is no
og:type=article, article/news-style publication metadata, or machine-readable publication/modification timestamps. Issue #14 explicitly requires article/news-style Open Graph metadata where appropriate and publication/modification dates for every edition.Extend the layout with typed article metadata props, pass
publishedAt/updatedAtfromBriefingPage, and add generated-output assertions.M4 — A corrected edition can pass validation without changing its update timestamp
Affected files:
src/content.config.tsdocs/content-model.mdsrc/pages/briefings/[series]/rss.xml.tsThe schema requires
edition > 1and a correction note, but permitsupdatedAt === publishedAt. Such a correction passes the build while the Atom entry retains the original<updated>value, so feed consumers may not detect the correction.Require
updatedAt > publishedAtforcorrected(and preferablywithdrawn) editions. Because same-day corrections are likely, document and accept an ISO date-time value rather than date-only granularity for update events.M5 — The daily archive grows without bound
Affected file:
src/pages/briefings/[series]/index.astroThe archive renders every edition through one unbounded
editions.map(...). At daily cadence this becomes hundreds of cards per year and does not satisfy #14's requirement that archive pagination/indexing remain manageable as editions accumulate.Add a bounded strategy now: pagination, year/month archive pages, or a limited recent list plus year-based indexes. The route model should remain reusable across series.
Low
L1 — The Atom regression does not actually verify
<updated>for every entryAffected file:
scripts/verify-head.mjsThis assertion:
passes whenever an
<updated>exists anywhere after the first<entry>; a later entry can omit<updated>without failing. Parse/check each<entry>block independently, and preferably validate the XML structurally rather than through global substring tests.L2 — The explicit content-license path list omits briefing-series copy
Affected file:
CONTENT-LICENSE.mdsrc/content/briefing-series/contains authored public copy but is absent from the explicit all-rights-reserved path list. The README's broadsrc/content/wording and the rule of thumb imply the intended result, but the file presented as the exact path boundary should list this directory explicitly.Re-review gate
Before re-review, please provide:
Round-1 findings addressed in
879fde2. Ready for iteration 2.huggingface.co/moonshotai/Kimi-K3is still an "Upcoming release" countdown placeholder — no weights, model card, or license. Heading/description/body/assessment rewritten to planned/pending (「进入发布倒计时」「计划于 7 月 27 日开放」「若按计划开放」), the placeholder repo added as a source with its state noted, and an explicit criterion stated (release counts only when downloadable weights + license appear). Follow-up promised in a later edition either way. Also per H1.3: official OpenAI disclosure (2026-07-21) and Hugging Face disclosure (2026-07-16) added as primary sources for item 1, media reports demoted to secondary.getLatestBriefing(series, locale)— strictly locale-matched;/enshows no briefing cards until English editions exist. Verifieddist/en.htmlcontains zero Chinese briefing fragments./en/briefingsrenders each English series entry's Markdown body; links into the Chinese stream are labeled(Chinese). verify-head asserts the intro body renders.og:type/title/description/url/site_name/localesitewide; editions passogType="article"+article:published_time/article:modified_time. verify-head asserts article OG on the edition and website OG on the homepage.updatedAt > publishedAt(strict) forcorrectedandwithdrawn; ISO date-time accepted for same-day events and documented in content-model. Negative-tested: date-equal correction fails the build,2026-07-27T14:30:00Zpasses.RECENT_EDITIONS_LIMIT); per-year archive pages at/briefings/[series]/archive/[year](≤366 editions each), reusable across series; documented in content-model.<entry>block and independently asserts id/title/link/published/updated/summary, date parseability, andupdated >= published; also checks entry open/close balance.src/content/briefing-series/listed explicitly in the all-rights-reserved paths.npm run buildgreen locally (47 pages) including the pre-build source gate and extended verify-head.Code Review — Iteration 2 (Deep Re-review)
Head reviewed:
879fde2againstmain(47f0f02)Delta reviewed:
00b59e2..879fde2plus regression pass over the complete PR surfaceResult: APPROVE — 0 blocking findings
Round-1 findings are closed:
Upcoming releaseplaceholder at review time. Official OpenAI and Hugging Face incident disclosures are now primary sources for the security item./enno longer silently renders Chinese edition copy./en/briefingsrenders the committed English Markdown introductions, while Chinese archive/latest links are visibly labeled.website.correctedandwithdrawnrequireupdatedAt > publishedAt, including same-day ISO date-time support, so Atom and article metadata can signal the event.<entry>and independently check required elements and timestamp ordering.src/content/briefing-series/is explicitly classified as all-rights-reserved authored content.Additional regression review found no new merge blockers in route generation, withdrawal/feed behavior, locale pairing, source rendering, correction semantics, or the open-source/public-private boundary.
Non-blocking follow-up
If mutable live-state sources such as model repository countdown pages become common, consider adding optional
accessedAt/observedAtmetadata in a later change so the source publication date and the briefing's observation time remain semantically distinct. This does not block the current edition because its title records the observed state and date explicitly.I did not independently execute the local build; this approval is based on source-level review, generated-output assertions, the reported green build, and independent verification of the time-sensitive public sources.