7.4 KiB
OpenClaw Handoff
Role
This file is the integration overview for OpenClaw maintainers.
Use it for:
- reader capability boundary
- production MCP entrypoints
- environment requirements
- integration rules and limitations
Do not use it as the step-by-step runbook.
For formal orchestration, read docs/openclaw/openclaw-orchestration-flow.md.
For field contracts, read:
docs/openclaw/openclaw-candidate-input-field-spec.mddocs/openclaw/openclaw-delivery-payload-spec.md
Historical plans and incident documents live under docs/openclaw/archive/.
Purpose
reader is the upstream FreshRSS processing service for OpenClaw:
FreshRSS unread items -> RSS content extraction -> LLM summary -> rule engine -> OpenClaw delivery payload
reader is responsible for:
- FreshRSS pull
- content extraction
- LLM summary generation and validation
- rule-based filtering
- OpenClaw delivery payload generation
- run-state persistence and run/result lookup
- async resume control for the FreshRSS workflow
- async selected-article summary generation from existing extracted files
reader is not responsible for:
- Hugo publishing
- chat reporting
- user confirmation handling
- IMA upload orchestration
Production Surface
Current MCP tool count: 21.
Main daily workflow:
start_freshrss_pipeline_jobget_freshrss_pipeline_job_statusget_freshrss_pipeline_job_resultget_run_statuslist_runslist_run_artifactsget_delivery_payloadget_run_report
Resume workflow:
inspect_resume_planstart_resume_jobget_resume_job_statusget_resume_job_resultresume_run
Selected-article summary workflow:
start_article_summary_jobget_article_summary_job_statusget_article_summary_job_resultgenerate_article_summaries
Debug / single-step tools:
run_freshrss_openclaw_pipelineextract_url_contentextract_item_contentfilter_summary_result
Production rules:
- main production start path is
start_freshrss_pipeline_job - production resume path is
inspect_resume_plan -> start_resume_job -> get_resume_job_status -> get_resume_job_result run_freshrss_openclaw_pipelineis sync debug / fallback onlyresume_runis sync debug / fallback onlygenerate_article_summariesis sync debug / fallback only
Production Contract
OpenClaw should treat the returned run_id from get_freshrss_pipeline_job_result as the only stable handle for follow-up reads.
OpenClaw should not hand-build these paths:
outputs/freshrss/rerun/<run_dir>/run-state.jsonoutputs/freshrss/rerun/<run_dir>/candidates/openclaw-delivery-payload.jsonoutputs/freshrss/rerun/<run_dir>/run-report.json
If filesystem access is needed for debugging, only consume paths returned by MCP:
output_dirartifact.pathdelivery_outputreport_output
Top-level status is the only status field callers should branch on.
status_source and state_conflict are explanatory fields for reconciled status.
Minimal Production Sequence
Daily workflow:
- Call
start_freshrss_pipeline_job - Poll
get_freshrss_pipeline_job_status - On success, read
get_freshrss_pipeline_job_result - Persist the returned
run_id - Use
get_run_status,get_delivery_payload, andget_run_reportfor follow-up reads
Resume workflow:
- Call
inspect_resume_plan(run_id) - Only if
can_resume=trueandrecommended_action=resume, callstart_resume_job - Poll
get_resume_job_status - Read
get_resume_job_result
Selected-article summary workflow:
- Call
start_article_summary_jobwith a real extracted file path and non-emptyselected_ids - Poll
get_article_summary_job_status - Read
get_article_summary_job_result
Capability Boundary
Formal workflow boundary:
- only workflow
freshrss_daily_digest - every current FreshRSS run writes
run-state.json get_run_status/list_runs/list_run_artifactscan still infer basic state for older runs withoutrun-state.json- resume requires a valid
run-state.json; inferred historical runs are not resumable
Resume boundary:
- resume in place on the original
run_id - supported resume points:
generate_summariesapply_filtersbuild_delivery_payloadwrite_run_report
- unsupported resume points:
fetch_feedextract_articles
- production resume prefers:
summary/summary-batch.jsoncandidates/candidate-batch.json
- if required artifacts are missing, recovery should return non-resumable instead of silently falling back
Selected-article summary boundary:
- uses existing extracted files as input
- should not re-fetch original URLs
Output Expectations
Main daily pipeline core artifacts:
outputs/freshrss/rerun/<run_dir>/run-state.jsonoutputs/freshrss/rerun/<run_dir>/raw/freshrss.raw.jsonoutputs/freshrss/rerun/<run_dir>/summary/summary-batch.jsonoutputs/freshrss/rerun/<run_dir>/candidates/candidate-batch.jsonoutputs/freshrss/rerun/<run_dir>/candidates/openclaw-delivery-payload.jsonoutputs/freshrss/rerun/<run_dir>/candidates/digest-brief.jsonoutputs/freshrss/rerun/<run_dir>/run-report.jsonoutputs/freshrss/rerun/<run_dir>/extracted/item-XX.extracted.json
Async job state directories:
- main pipeline job:
outputs/freshrss/pipeline_jobs/<job_id>/ - resume job:
outputs/freshrss/resume_jobs/<job_id>/ - article-summary job:
outputs/freshrss/article_summary_jobs/<job_id>/
Each job directory minimally contains:
run-state.jsoninput.jsonresult.jsonon successjob-report.json
Environment And Startup
Required environment variables:
FRESHRSS_API_BASE_URLFRESHRSS_USERNAMEFRESHRSS_API_PASSWORDLLM_API_URLLLM_API_KEYLLM_MODEL
Startup:
pip install -e .
summary-mcp
Recommended production start call:
{
"limit": 5,
"mark_read": true,
"include_read": false,
"debug_artifacts": false,
"timeout_seconds": 60,
"max_retries": 2
}
Data And Content Policy
FreshRSS processing is RSS-first:
- use
item.raw_contentfirst - if missing, use
item.raw_summary - if neither contains usable content, skip the item
- do not fetch the original webpage again for FreshRSS items
Read-state policy:
- items are marked read only after successful delivery payload write
- only successfully delivered items are marked read
Downstream boundary:
- the daily digest goes to Hugo and chat reporting
- the full daily digest should not be uploaded to IMA
- only explicitly user-selected article summaries should be uploaded to IMA
Related Maintenance Flow
Keyword cleanup exists as a separate maintenance flow, not the main RSS ingestion path.
Relevant files:
docs/design/daily-keyword-index-design.mdskills/keyword-cleanup-review/SKILL.mdscripts/apply_term_suggestions.py
Known Limitations
- some sources expose only partial RSS content; those items may be skipped
- rule behavior is still conservative; many items may land in
review - paywall heuristics may still produce false positives on some Chinese text
- keyword cleanup governance is usable but not yet wired to periodic scheduling
Read First
Recommended reading order for a new maintainer:
README.mddocs/openclaw/README.mddocs/openclaw/openclaw-handoff.mddocs/openclaw/openclaw-orchestration-flow.mddocs/openclaw/openclaw-candidate-input-field-spec.mddocs/openclaw/openclaw-delivery-payload-spec.mddocs/current/context-reset-brief.md