- New flow: pipeline → report candidates → user selects Hugo articles → generate public digest → publish Hugo → user selects IMA articles → IMA deposition
- digest-brief.json is now the sole data source (concise, less token consumption)
- Removed 来源 line from public-digest-example.md to match SKILL hard rule
- Public digest no longer auto-generated with all keep items
description:Orchestrate the end-to-end daily digest workflow around the reader project. Use when the user wants to run the AI daily digest flow, generate a daily report from reader payloads, publish the digest to Hugo, report the digest back in chat, select valuable articles, and then summarize only the selected articles into IMA knowledge notes. Triggers include requests like '跑今天日报', '生成日报', '汇报今天内容', '把选中的文章沉淀', '更新 Hugo', or any request to operate the reader → digest → selection → knowledge-base flow.
description:Orchestrate the end-to-end daily digest workflow around the reader project. Use when the user wants to run the AI daily digest flow, report candidates for review, let the user decide which articles go into the Hugo daily digest, then generate and publish the public digest, and optionally summarize selected articles into IMA knowledge notes. Triggers include requests like '跑今天日报', '生成日报', '汇报今天内容', '把选中的文章沉淀', '更新 Hugo', or any request to operate the reader → report → user-selection → Hugo → knowledge-base flow.
---
# Reader Digest Flow
@@ -13,16 +13,19 @@ Run the reader-based daily digest as a fixed SOP. Treat this skill as the orches
- **Daily digest production runs should default to a random article count between 5 and 10 unless the user explicitly specifies a count.**
- Prefer MCP workflow operations over direct long-lived CLI execution. Treat CLI as debug / fallback, not the default production path.
- **Main FreshRSS production runs should default to the async MCP job path**: `start_freshrss_pipeline_job` → `get_freshrss_pipeline_job_status` → `get_freshrss_pipeline_job_result`. Use the synchronous `run_freshrss_openclaw_pipeline` only for debug / light validation / fallback.
- **If the main pipeline job fails, do not immediately abandon the run.** First inspect the linked run through `get_run_status` and `inspect_resume_plan`; when the plan returns `recommended_action=resume`, continue through `start_resume_job` → `get_resume_job_status` → `get_resume_job_result`.
- **Operational note from validation:** before the main pipeline async job existed, a debug/test run could still complete successfully inside reader even when the synchronous MCP wrapper returned timeout. For historical/debug cases, continue from real run truth using MCP status/result query tools rather than treating the whole flow as failed.
- For reader run observation and result reading, prefer MCP tools such as status / payload / report queries instead of having OpenClaw or this skill hand-build reader output paths.
- **When reader status APIs return reconciled status, always branch on the top-level `status`.** Treat `status_source` and `state_conflict` as explanatory metadata; do not re-derive flow control from stale stage names.
- **For normal production runs, mark processed FreshRSS items as read. Only skip mark-read when the user explicitly says the run is debug/test/validation.**
- **For normal production runs, do not pass `debug_artifacts=true`. Only enable debug artifacts when the user explicitly says the run is debug/test/validation or when troubleshooting is the goal.**
- **Do not generate the daily digest from examples or placeholder data. Always require a real payload first.**
- Generate the daily digest markdown from the payload in OpenClaw.
- Split outputs into a **public digest** for Hugo and an **internal review digest** for chat / operator decision-making.
- **Public digest and internal review digest are orchestration-layer outputs, and by default are generated by the current OpenClaw session model rather than inheriting reader `LLM_*` settings.**
- Publish only the public digest to Hugo.
-Once a normal daily digest run succeeds and a public digest is generated, proceed directly with Hugo publication as the default action; do not ask the user for a separate confirmation about generating or publishing the Hugo page unless the user explicitly says to skip Hugo.
-**Publish only the public digest to Hugo, and only after the user has explicitly selected which articles go into the daily digest.**
-The default flow is: pipeline → report candidates → **user selects Hugo articles** → generate public digest → publish Hugo → (optional) user selects IMA articles → IMA deposition.
- Do NOT generate the public digest or publish Hugo before the user has confirmed the Hugo article selection.
- Report the internal review digest back to the user in chat.
- **Do not upload the full daily digest to IMA.**
- **Do not upload any selected article summary to IMA until the user has explicitly confirmed the selection. Once the user has confirmed which articles to keep, proceed directly with IMA deposition and do not ask for a second confirmation about uploading to the knowledge base.**
@@ -55,100 +58,103 @@ After the async job succeeds, treat the returned `run_id` as the stable handle f
If the pipeline fails, stop and report the exact failure point.
If the main pipeline job fails:
### Phase 2: Generate daily digest markdown
- read the linked run through `get_run_status`
- call `inspect_resume_plan(run_id)`
- if `recommended_action=resume`, continue with:
-`start_resume_job`
-`get_resume_job_status`
-`get_resume_job_result`
- if `recommended_action=read_terminal_result`, continue from the terminal run result instead of retrying
- if `recommended_action=start_new_run`, stop and report the exact failure point
Read the real run outputs and generate digest markdown for the day.
If there is no real payload, stop instead of writing a fake or example digest.
### Phase 2: Report candidates to the user (internal review digest only)
For **public digest**, prefer `candidates/digest-brief.json` when present; fall back to `candidates/openclaw-delivery-payload.json` only if the brief file is missing.
For **internal review digest**, continue reading the full `candidates/openclaw-delivery-payload.json`.
Produce two output views from the same run, preferably in **one generation step**:
1.**Public digest** — for Hugo / public browsing
2.**Internal review digest** — for chat reporting and operator decisions
Before publishing, persist digest outputs back into the same reader run directory under:
Then write only the public digest into Hugo using this structure:
-`content/daily/YYYY-MM-DD/index.md`
The public digest is the browsing layer, not the long-term knowledge layer.
It must not expose internal workflow states or operator-facing review labels.
Recommended **public digest** structure:
-`今日概览`
-`今日重点`
-`趋势观察`
-`延伸阅读`
Public digest writing rules:
- Use `digest-brief.json` as the default source when available.
- Treat it as a public-only view that already excludes non-keep items.
- **Hugo public digest must include ALL keep articles from `digest-brief.json`. Do NOT apply an additional manual filter or subset selection. The IMA deposition step (Phase 5–6) is separate and operates on a user-selected subset; Hugo always shows the full keep set.**
- Keep the tone suitable for public browsing and Hugo publishing.
- Style should follow `references/public-digest-example.md` as the default public-writing example.
- Public digest is a **public reading draft / editor-style public note**, not a workflow report.
- In `今日概览`, focus on the day’s topic lines, shared signals, and broader industry movement; do **not** describe filtering mechanics or internal selection process.
- Do **not** expose internal workflow labels or operator language such as `待确认`, `建议沉淀到 IMA`, `keep/review/drop`, or `selection_decision`.
- Explicitly avoid wording such as `共筛出`, `候选`, `保留`, `入选`, `待确认`, `建议沉淀` in public digest.
- Prefer concise but information-dense writing.
- For each item under `今日重点`, include not only summary and highlights, but also one short editor-style value sentence, for example: `这篇内容更值得关注的原因在于……`.
- When rendering highlights in public digest, prefer a short label such as `值得关注:` followed by one item per line, instead of packing multiple points into a single long sentence.
- In `延伸阅读`, every item must include source attribution in the form: `- [标题](url)|来源`.
- **Article numbering: MUST use `1.``2.``3.` (Arabic numeral + period). Do NOT use `① ② ③`,`一、二、三`,`第一条` or any other numbering variant.**
- **All four sections are required: `今日概览`, `今日重点`, `趋势观察`, `延伸阅读`. Missing any section is a format violation.**
After the pipeline run succeeds, do NOT generate the public digest or publish Hugo yet.
Read candidates and produce **only the internal review digest** in a concise format (not the full payload dump).
Recommended **internal review digest** structure:
-`今日候选概况`
-`已入选重点`
-`待你确认`
-`建议沉淀到 IMA`
-`原始候选清单`
Data source: use `candidates/digest-brief.json` (`top_candidates` array) — it now includes both keep and review articles in a concise, simplified format (title, source, summary, highlights, category). No need to read the full payload.
Internal review digest writing rules:
-Use the full `openclaw-delivery-payload.json`.
-Keep this as a human-readable review draft rather than a raw machine dump.
- Do **not** display `rank` values.
-Keep this as a human-readable concise review draft, not a raw machine dump.
-Do **not** display `rank` or `digest_rank` values.
- Convert machine states to Chinese operator-facing labels:
-`keep` → `已入选`
-`review` → `待确认`
-`drop` → `暂不纳入`
- For every item under `已入选重点`, include:
- title + source
- status
- a fuller summary paragraph
-a short judgment paragraph explaining why it matters in today's digest
- status (`已入选`)
- summary paragraph (use the concise version from digest-brief)
-highlights (from digest-brief)
- a short judgment paragraph explaining why it matters
- For every item under `待你确认`, include:
- title + source
- status
- a fuller summary paragraph
-reason
- recommendation
- In `原始候选清单`, also use Chinese status labels instead of raw machine values.
- status (`待确认`)
- summary paragraph (concise)
-highlights (if available)
- reason(为什么要你确认)
- recommendation(建议采纳/不采纳)
- In `原始候选清单`, present all articles as a brief list (title + status + one-liner), using Chinese status labels.
### Phase 3: Publish to Hugo
**Hard reporting requirement:** the chat report must not be only a title list. For every reported article, include at least:
- title
- one-sentence summary
- a short reason explaining why it matters / why it is recommended or pending confirmation
Publish only the public digest to Hugo.
At this step:
Required execution steps:
- the public digest is **not** generated yet
- Hugo is **not** published yet
- the internal review digest is sent to the user in chat
- the user decides: **which articles go into the Hugo daily digest** AND separately which articles go into IMA deposition
### Phase 3: User selects Hugo articles
The user reviews the internal digest and specifies which articles should appear in the Hugo daily digest.
- Confirm the selection explicitly before proceeding.
- If the user wants to include some `review` candidate articles, respect that choice.
- Only the user-selected articles will appear in the public digest.
### Phase 4: Generate and publish Hugo public digest
Generate the public digest markdown **only for the user-selected articles**, then publish to Hugo.
Public digest source material: use `candidates/digest-brief.json` — it has all the info needed (title, summary, highlights, source, url). No need to read the full payload.
Do not treat “markdown file written” as equivalent to publish success. Hugo publish for this SOP is complete only after redeploy and page verification pass.
Do not treat "markdown file written" as equivalent to publish success. Hugo publish for this SOP is complete only after redeploy and page verification pass.
Do not block on style polish unless the user explicitly asks.
### Phase 4: Report digest back to the user
The public digest is the browsing layer, not the long-term knowledge layer.
It must not expose internal workflow states or operator-facing review labels.
Send the internal review digest in chat and ask the user which articles should be retained for long-term knowledge.
Public digest writing rules:
**Hard reporting requirement:** the chat report must not be only a title list. For every reported article, include at least:
-title
-one-sentence summary
-a short reason explaining why it matters / why it is recommended or pending confirmation
- Use article content from `candidates/digest-brief.json` for the user-selected subset.
-**Hugo public digest includes ONLY the articles the user selected in Phase 3.** Not all `keep` items — only the user's explicit selection.
-Keep the tone suitable for public browsing and Hugo publishing.
-Style should follow `references/public-digest-example.md` as the default public-writing example.
- Public digest is a **public reading draft / editor-style public note**, not a workflow report.
- In `今日概览`, focus on the day's topic lines, shared signals, and broader industry movement; do **not** describe filtering mechanics or internal selection process.
- Do **not** expose internal workflow labels or operator language such as `待确认`, `建议沉淀到 IMA`, `keep/review/drop`, or `selection_decision`.
- Explicitly avoid wording such as `共筛出`, `候选`, `保留`, `入选`, `待确认`, `建议沉淀` in public digest.
- Prefer concise but information-dense writing.
- For each item under `今日重点`, include not only summary and highlights, but also one short editor-style value sentence, for example: `这篇内容更值得关注的原因在于……`.
- When rendering highlights in public digest, prefer a short label such as `值得关注:` followed by one item per line, instead of packing multiple points into a single long sentence.
- In `延伸阅读`, every item must include source attribution in the form: `- [标题](url)|来源`.
- **Article numbering: MUST use `1.``2.``3.` (Arabic numeral + period). Do NOT use `① ② ③`,`一、二、三`,`第一条` or any other numbering variant.**
- **All four sections are required: `今日概览`, `今日重点`, `趋势观察`, `延伸阅读`. Missing any section is a format violation.**
### Phase 5: User selects articles for IMA deposition
After Hugo publication, ask the user which articles should be retained for long-term knowledge (separate from the Hugo selection).
- The user can select from all `keep` and `review` candidates, including or excluding articles that were already put in Hugo.
- Confirm the selection explicitly before proceeding.
- Only the user-selected articles will be summarized and uploaded to IMA.
At this step:
- the public digest is already in Hugo
- the internal review digest stays in chat / operator workflow
- the digest is **not** uploaded to IMA
- the user decides which articles are worth preserving
- the user decides which articles are worth preserving as knowledge notes
- the digest is **not** uploaded to IMA as a whole
### Phase 5: Summarize selected articles
### Phase 6: Summarize selected articles
For every article explicitly selected by the user:
Use the real extracted JSON structure already produced by the project. Do not invent alternative inputs.
### Phase 6: Upload selected article notes to IMA
### Phase 7: Upload selected article notes to IMA
Upload only the generated single-article markdown summaries to IMA.
@@ -252,7 +290,7 @@ IMA Markdown layout guidance for selected article deposition:
- Before every upload, open and check the actual markdown file that will be uploaded; do not assume the generator already matched IMA style.
- The upload target must be an IMA-facing formatted markdown file, not the raw default output from `reader` if the styles differ.
- Remove stiff metadata headers such as `Source:` / `Category:` when preparing the IMA-facing Markdown.
- Keep source traceability by placing `原文链接:` near the top, followed by the original URL on the next line.
- Keep source traceability by placing `原文链接:` near the top, followed by the original URL on the next line.
- Break long prose under `核心结论` and `主要论点` into short paragraphs for IMA readability instead of relying on platform auto-formatting.
- The final upload filename should normally be `<文章标题>.md`; only when a same-name file already exists should you append a timestamp suffix before `.md`.
- If local working files use internal slugs or prefixes for convenience, create or rename a final upload copy before calling IMA upload APIs.
@@ -34,6 +34,8 @@ Concrete operational checklist for the `reader-digest-flow` skill.
- Generate two views from the same payload: a public digest for Hugo and an internal review digest for chat/operator workflow.
- Do not expose internal review states or operator-facing labels in the public digest.
- Do not re-fetch original URLs for selected summaries; use existing extracted text.
- If the main pipeline fails, inspect the run first; when `inspect_resume_plan` says `recommended_action=resume`, continue via the async resume job path instead of stopping immediately.
- Always branch on reader's top-level reconciled `status`; treat `status_source` and `state_conflict` only as explanatory metadata.
- Prefer `ARTICLE_SUMMARY_*` for selected article summarization, with fallback to main `LLM_*` only if needed.
- Actively report progress after each completed phase.
@@ -51,6 +53,17 @@ Formal production startup sequence:
3.`get_freshrss_pipeline_job_result`
4. after success, continue with `run_id` via `get_run_status` / `get_delivery_payload` / `get_run_report`
If the main pipeline job ends in `failed`:
1. inspect the linked run with `get_run_status`
2. call `inspect_resume_plan(run_id)`
3. if `recommended_action=resume`, continue with:
-`start_resume_job`
-`get_resume_job_status`
-`get_resume_job_result`
4. if `recommended_action=read_terminal_result`, continue from the terminal run result
5. if `recommended_action=start_new_run`, stop and report the failure
Treat the old synchronous `run_freshrss_openclaw_pipeline` as debug / light validation / fallback only.
Project root:
@@ -206,6 +219,12 @@ Expected inputs:
- optional `output_dir`
- optional article-summary LLM overrides
Single-item rule:
- when `extracted_path` is `outputs/freshrss/rerun/<run-id>/extracted/item-XX.extracted.json`, call one summary job per file
- in that case, `selected_ids` should contain only the matching single `item_id`
- if the candidate ID came from the delivery payload, strip the `cand:` prefix before passing it
Use this checklist before doing any cleanup or review-maintenance action for reader keyword artifacts.
## Pre-check
1. Confirm the current repo root is `/home/ubuntu/zhu/github/reader`
2. Confirm the user asked for a maintenance / cleanup / review-prep action
3. If the user actually wants formal keyword review generation, route to reader-side `keyword-cleanup-review` instead of using this maintenance skill
4. Identify whether the action targets:
- current bundle
- suggestions JSON
- markdown display draft
- old review outputs
## Safety check
Before deleting or overwriting anything:
1. Do not touch:
- `data/term_index/daily/*.json`
- `data/term_index/term_stats.json`
- `configs/filter_context.personal.json`
- `configs/term_watchlist.json`
- `configs/term_aliases.json`
- `configs/term_stopwords.json`
- `configs/term_change_log.json`
2. Confirm the suggestions JSON to keep is not the one about to be applied
3. Treat markdown drafts as disposable only after confirming they are display-only artifacts
## Review-prep flow
When preparing manual review:
1. Ensure the latest bundle exists
2. Ensure the latest suggestions JSON exists
3. Generate markdown only if the user explicitly wants human-readable review material
4. Prefer showing conclusions in chat before creating more files
## Cleanup flow
Recommended order:
1. remove old markdown display drafts
2. keep only the current/latest bundle
3. prune old suggestions JSON conservatively
4. leave facts/state/config untouched
## Post-check
After the action:
1. verify the expected kept files still exist
2. verify no config file was accidentally changed
3. summarize what was kept vs removed
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.