feat: open-source qluna-site and add daily Briefings publication architecture #14
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#14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Summary
Open-source
qluna/qluna-siteand extend qluna.net with a dedicated, durable publication structure for daily briefings, starting with Xtrape 与 AI 每日简报.This issue combines the two changes because opening the repository makes all committed site content and history public, while daily briefings introduce a high-frequency, source-heavy content stream with different semantics from the existing revisable
Notesmodel. The public/private boundary, licensing, content model, source representation, and publishing workflow must therefore be designed together.Current state
mainto Cloudflare Worker static assets.Notesare revisable long-form intellectual records with maturity states such asevolvingandstable.cite...are not portable website references.Goals
qluna-sitesafe and intentional to expose as a public repository.Briefingsas a distinct time-indexed content type.main.Non-goals
Notesinto daily posts.Phase 1 — Open-source readiness
1. Repository disclosure audit
Audit the current tree and Git history before changing repository visibility.
Check at minimum:
.env*, workflow files, deployment configuration, examples, issue references, comments, and documentation;If sensitive history exists, rotate affected credentials first and rewrite/sanitize history before making the repository public.
Add an explicit record of the audit outcome to the PR description or a repository document. Do not infer safety merely because current workflow secrets are stored outside the repository.
2. Licensing boundary
The repository contains both software and original authored content. Add an explicit dual-licensing model before opening it.
Proposed default, subject to owner confirmation:
Required outputs:
LICENSEfor code;CONTENT-LICENSE.mdor equivalent explaining the content boundary;Do not place all authored content under the code license by accident.
3. Public repository metadata and governance
Update or add as appropriate:
CONTRIBUTING.md;SECURITY.mdwith a private vulnerability-reporting path;CODE_OF_CONDUCT.mdonly if public contribution is intended;Clarify that:
4. Public/private boundary
Document which material must never be committed to the public repository, including:
The repository may contain only the reviewed public edition of each briefing.
Phase 2 — Add
Briefingsas a distinct content type5. Information architecture
Add a top-level
Briefings / 简报section without redefining qluna.net as a chronological blog.Recommended public routes:
Semantics:
/briefings/lists available briefing series;/briefings/xtrape-ai/is the series landing page and archive;Reserve the route and model for future series without hard-coding all behavior to
xtrape-ai.6. Source layout
Use a scalable source layout, for example:
The exact path may vary, but it must support:
Chinese is the initial required locale. English may initially provide only a series introduction or later weekly digest; missing daily translations must not break the build.
7. Briefing schema
Add a separate Astro content collection rather than overloading
notes.Minimum proposed metadata:
Recommended status values:
draftpublishedcorrectedwithdrawnRecommended review status values:
automatededitor-reviewedValidation requirements:
publishedAtagree;updatedAtis not earlier thanpublishedAt;editor-reviewedmust be explicitly set by a human-authored change, not inferred by automation.8. Citation and source rendering
Replace ChatGPT internal references with normal website references.
The rendered edition should provide:
rel="noopener noreferrer"and sensible external-link behavior;Do not reproduce large portions of source articles. Briefings should summarize and analyze while linking to originals.
9. Edition structure
Use a consistent editorial structure while allowing sections to be omitted when not meaningful:
Avoid low-value repetition, generic AI news lists, and unsupported claims about Xtrape plans.
10. Public disclosure text
Render a visible disclosure based on
aiAssistedandreviewStatus.For
automated:For
editor-reviewed:Do not use the reviewed wording unless a human has actually reviewed that edition.
11. Corrections and historical integrity
A briefing is a dated snapshot, not an endlessly evolving Note.
Define correction rules:
updatedAtand incrementeditionfor material corrections;correctedwhen facts or material interpretations changed;withdrawnrather than silently deleting an edition that should no longer be relied upon;Phase 3 — Pages, navigation, feeds, and SEO
12. Required implementation surface
Expected changes include, but are not limited to:
Use the existing content-first rule: editable public copy belongs in Markdown/config content, while Astro components own behavior.
13. Navigation and homepage
简报entry to Chinese navigation if it fits the existing mobile-first header constraint.14. RSS/Atom
Add at least one machine-readable feed:
The feed should include:
Design feed generation so additional series can reuse it.
15. SEO and structured metadata
For each edition:
Phase 4 — Daily publication workflow
16. Two-output model
The daily process must produce two logically separate outputs.
Private full edition
Delivered privately and allowed to contain:
This output must not be committed to
qluna-site.Public qluna.net edition
May contain only:
Replace the current instruction:
with the public-safe form:
17. Initial publishing mode: PR required
Implement or document this first-stage flow:
Requirements:
maininitially;18. Future automation boundary
Do not create a separate service solely to publish the first briefing.
Keep publication logic inside the existing repository/workflow while it serves only qluna.net. Reconsider a dedicated
qluna-briefingor Xtrape Service when the same pipeline supports multiple destinations such as:Document that future service boundary without implementing premature infrastructure.
Quality and security checks
Extend build or verification scripts to cover at least:
cite,turn...search,turn...news,sandbox:/, or other ChatGPT-internal artifacts in public Markdown;Automated privacy-marker checks are defense in depth only; they do not replace human review.
Documentation updates
Update the project documentation to state clearly:
Acceptance criteria
briefingsexists as a separate validated Astro content collection./briefings/, series archive, and dated edition routes render correctly.xtrape-aiChinese edition builds using durable source metadata.Implementation sequencing
Use separate commits, or separate PRs if the change becomes too large:
The visibility change must be the last step, not the first.
Source: chatgpt
Implementation up as PR #15 (phases 1–4 in four sequenced commits). The repository visibility change is intentionally excluded — see the visibility-change checklist and the one open audit finding (committer identities in history) in docs/open-source-readiness.md; both need an owner decision after the PR merges.
Clarification — current briefing source and staged publishing boundary
The initial implementation must treat the existing ChatGPT scheduled task “每日 Xtrape 与 AI 简报” as the current upstream briefing generator.
Current factual/source input
The briefing is assembled from public web sources, prioritizing:
These are the factual sources of the briefing. Before publication on qluna.net, ChatGPT-specific citation markers must be converted into durable website source metadata with normal public URLs.
Current generation flow
For the first iteration, the actual upstream flow is:
The private full edition may contain user-specific, repository-specific, unreleased roadmap, competitive, and internal-priority analysis. It must never be committed to the public
qluna-siterepository.The public edition must be derived from the private full edition and limited to verified public developments, public Xtrape concepts, public project directions, durable source metadata, and an accurate AI/review disclosure.
Not yet implemented
At the time of this issue, the ChatGPT scheduled task only generates and returns the private briefing in the ChatGPT conversation. It does not yet:
Those steps are implementation work covered by this issue; the issue must not imply that an automated publication pipeline already exists.
Future boundary
Do not introduce a dedicated service in the first iteration. Keep qluna-site as the publication target and use PR-based review.
Reconsider a separate
qluna-briefingrepository or Xtrape Service only when the same generation pipeline must serve multiple destinations or products, such as qluna.net, Telegram, email, RSS/Atom, multiple briefing series, or multiple languages.Acceptance-criteria addition
Workflow update — current upstream and automated PR behavior
The current upstream for the public briefing is explicitly the existing ChatGPT scheduled task “每日 Xtrape 与 AI 简报”. It is not a separate crawler, Forgejo workflow, or Xtrape Service at this stage.
The scheduled task has now been updated to use a two-output workflow:
Operational rules now applied to the scheduled task:
mainalready contains the Briefings collection, paths, schema, and validators defined by this issue.main.mainand must never auto-merge.A dedicated
qluna-briefingor Xtrape Service remains a future boundary only after the pipeline is reused across multiple destinations, series, or languages.PR #15 merged after a 2-round review (iteration 1: 1 High / 5 Medium / 2 Low, all closed; iteration 2: APPROVED, 0 blocking) and is live on qluna.net (/briefings, /briefings/xtrape-ai/2026-07-27, per-series Atom feed, /en/briefings all verified 200).
Recorded follow-ups from this issue, still open:
accessedAt/observedAtsource metadata to distinguish source publication date from observation time.Acceptance Review — Iteration 3 (Deep Review)
Implementation reviewed: merged PR #15 (
879fde2, merged tomainasffd962b)Result: Not approved for closure — 2 repository-configuration gates remain
The code/content implementation for phases 1–4 is approved: the Briefings content model, source validation, correction/withdrawal semantics, locale behavior, article metadata, bounded yearly archives, Atom feed, licensing boundary, public/private workflow, and first public edition all passed the prior two deep-review rounds. PR #15 is merged without remaining code findings.
However, Issue #14 is broader than PR #15: it explicitly includes opening
qluna-siteas a public repository and enforcing PR-based publication governance. The current repository configuration does not yet satisfy those goals.High — Repository is still private
Forgejo currently reports
qluna/qluna-siteasprivate: true.This is consistent with PR #15 deliberately leaving the visibility change as a manual owner step, but it means Issue #14's open-source objective is not yet complete. Before changing visibility:
XuSage6397and agent commit identities;git log -pdisclosure spot-check;High —
mainis not protectedForgejo currently reports the
mainbranch asprotected: false.That contradicts the merged editorial workflow's stated invariant that every generated edition enters through a reviewed PR and that merging to
mainis the human publication decision. Documentation and build checks cannot enforce this boundary while direct pushes remain permitted.Configure branch protection for
mainbefore closing the issue. At minimum:Closure gate
Issue #14 is ready for final approval and closure once both repository-level operations are complete:
mainbranch protection is enabled and verified;No additional code change is requested in the merged implementation.
Acceptance gate 1 (branch protection) is now closed:
mainprotection rule created matching the org-wide policy used on other repos (enable_push: false,required_approvals: 1,block_on_rejected_reviews: true,dismiss_stale_approvals: true). Forgejo now reportsmainasprotected: true.mainis rejected by the pre-receive hook; branch deletion and force-push are blocked by the same rule. The Cloudflare deploy workflow is unaffected (it triggers on the push event produced by an approved PR merge, as it did for PR #15).Gate 2 (visibility change) remains with the owner by design: decide on the committer-identity linkage (
XuSage6397+ agent accounts), rewrite history first if unacceptable, run the finalgit log -pdisclosure spot-check from docs/open-source-readiness.md, then flip the repository to public. I will not perform the visibility change.Acceptance Review — Iteration 4 (Deep Review)
Result: Not approved for closure — 1 High remains.
The implementation in PR #15 remains approved and merged. The Round-3 branch-governance blocker has now been addressed: Forgejo reports
mainas a protected branch.Resolved since Iteration 3
mainis now protected, restoring the repository-level enforcement boundary required by the documented PR-first publication workflow.main; the Briefings content model, routes, feed, SEO metadata, bounded archive, public/private editorial boundary, licensing, and validation gates remain accepted from the earlier deep reviews.High — Repository visibility has not yet been changed to public
Forgejo repository metadata still reports
qluna/qluna-siteasprivate: true.This issue is explicitly an open-source initiative, and the merged readiness document also treats the visibility flip as a deliberate final owner action after:
XuSage6397/agent author identities may be publicly linked;git log -psensitive-material spot-check.Until that decision and visibility change are completed, the implementation is open-source ready, but the repository is not yet actually open source/public. Therefore Issue #14 should remain open and cannot receive a full acceptance approval or be closed yet.
Final acceptance gate
private: false.After those steps, no further code changes are currently required for Issue #14 closure.
Note: this is an Issue, not a Pull Request, so Forgejo has no formal APPROVE review state here; this comment records the acceptance decision.
Owner decisions recorded (2026-07-27, via direct owner instruction):
XuSage6397GitHub-noreply identity (×26) and the agent role accounts (chatgpt@xtrape.com×116,claude@xtrape.com×26,claude@qluna.net×2) may be publicly associated with this repository. No history rewrite.Final
git log -pdisclosure re-check completed over the full history including all PR #15 commits and the merge:me@qluna.netand role/agent addresses;infra/forgejo-deploymentappears name-only in the audit narrative, as previously assessed.All gates of the visibility-change checklist are therefore satisfied. Remaining action: the owner flips the repository to public in Forgejo settings (Settings → Danger Zone / visibility). After the flip, verification is
private: falsevia the API, then this issue can be closed.Acceptance Review — Iteration 5 (Deep Review)
Result: not approved for closure — 1 High remains.
Re-verified current repository governance and completion state:
mainis now protected — the previous PR-only governance blocker is resolved.private: true.High — The issue's open-source objective is still not complete
Issue #14 is explicitly scoped to open-source
qluna-site, not only prepare it for a future visibility change. The repository has not yet been made public, so the final acceptance gate remains unmet.Required final owner action:
docs/open-source-readiness.md;private: falseand anonymous access works.Once that state is observable, this issue can be accepted and closed without further code changes. I am leaving #14 open.
Acceptance Review — Iteration 6 (Deep Review)
Result: not approved for closure — 1 High remains.
Re-verified the repository-level gates after iteration 5:
mainremains protected and still points toffd962b0055376f2ed1ff91284520d35e5130976— the PR-only publication governance remains in place.qluna/qluna-siteasprivate: true.High — The repository has still not been made public
Issue #14 is explicitly an open-source task, not only an open-source-readiness task. The code, licensing, disclosure audit, Briefings architecture, and branch governance are ready, but the final acceptance criterion is not satisfied while anonymous users cannot access the repository.
Required final owner action:
private: falseand anonymous repository access succeeds.No further code change is requested. Once the visibility flip is complete, this issue can be accepted and closed without another implementation PR.
Visibility change executed by the owner and verified (2026-07-27):
private: false;git clone(no credentials) succeeds; HEAD =ffd962b(the PR #15 merge);mainbranch protection remains active (protected: true).Note: the
qlunaorganization itself remainsvisibility: private, which hides only the org profile page — it does not affect anonymous access to this public repository (verified above). Making the org profile public is optional and left to the owner.All acceptance gates from iterations 3–6 are now closed: code merged and live, branch protection enforced, identity decision recorded, final disclosure re-check clean, repository public and anonymously accessible. #14 should now be ready for final acceptance and closure.