feat: add freshrss openclaw pipeline and clean repo

This commit is contained in:
zhuyongxin
2026-03-26 16:48:19 +08:00
parent 27fe1e8882
commit 100044e1f7
143 changed files with 1776 additions and 7293 deletions
+6 -2
View File
@@ -1,6 +1,10 @@
.claude/ .claude/
.codex/ .codex/
__pycache__/ __pycache__/
*.pyc *.pyc
*.egg-info/
.env.local .env.local
findings.md
progress.md
task_plan.md
outputs/freshrss/
+46 -4
View File
@@ -9,11 +9,12 @@ pip install -e .
summary-mcp summary-mcp
``` ```
The server exposes three tools: The server exposes four tools:
- `extract_url_content` - `extract_url_content`
- `extract_item_content` - `extract_item_content`
- `filter_summary_result` - `filter_summary_result`
- `run_freshrss_openclaw_pipeline`
Validate an LLM summary result: Validate an LLM summary result:
@@ -36,9 +37,12 @@ Pull FreshRSS entries and map them into normalized `item` objects:
set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=bot set FRESHRSS_USERNAME=bot
set FRESHRSS_API_PASSWORD=your-api-password set FRESHRSS_API_PASSWORD=your-api-password
python scripts/pull_freshrss_items.py --limit 5 python scripts/pull_freshrss_items.py --limit 5 --mark-read
``` ```
By default the script excludes entries already tagged as `read`. Add `--include-read` if you want the full reading list.
When `--mark-read` is enabled, fetched entries are marked as read after the script finishes successfully.
The script writes: The script writes:
- `outputs/freshrss/raw/freshrss.raw.json` - `outputs/freshrss/raw/freshrss.raw.json`
@@ -50,15 +54,48 @@ Pull FreshRSS entries and run content extraction for each mapped item:
set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=osiman set FRESHRSS_USERNAME=osiman
set FRESHRSS_API_PASSWORD=your-api-password set FRESHRSS_API_PASSWORD=your-api-password
python scripts/run_freshrss_extract.py --limit 1 python scripts/run_freshrss_extract.py --limit 1 --mark-read
``` ```
By default the script excludes entries already tagged as `read`. When `--mark-read` is enabled, only entries with successful extraction are marked as read.
The script writes: The script writes:
- `outputs/freshrss/raw/freshrss.raw.json` - `outputs/freshrss/raw/freshrss.raw.json`
- `outputs/freshrss/items/freshrss.items.json` - `outputs/freshrss/items/freshrss.items.json`
- `outputs/freshrss/extracted/freshrss.extracted.json` - `outputs/freshrss/extracted/freshrss.extracted.json`
Run the full FreshRSS pipeline and mark items as read only after the final OpenClaw delivery payload is written:
```bash
set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=osiman
set FRESHRSS_API_PASSWORD=your-api-password
set LLM_API_URL=https://api.deepseek.com
set LLM_API_KEY=your-llm-api-key
set LLM_MODEL=deepseek-chat
python scripts/run_freshrss_pipeline.py --limit 5 --mark-read
```
If you want to apply your personal engineering and AI-agent interest profile during filtering, pass a context file:
```bash
python scripts/run_freshrss_pipeline.py ^
--limit 5 ^
--context configs/filter_context.personal.json ^
--mark-read
```
This is the recommended production entrypoint. By default it writes only:
- `outputs/freshrss/rerun/<timestamp>/raw/freshrss.raw.json`
- `outputs/freshrss/rerun/<timestamp>/candidates/openclaw-delivery-payload.json`
- `outputs/freshrss/rerun/<timestamp>/run-report.json`
If you need per-item intermediates, add `--debug-artifacts`.
When OpenClaw is connected to the MCP server, it should call `run_freshrss_openclaw_pipeline` for the same behavior directly through MCP. The tool also supports `debug_artifacts=true` when deeper inspection is needed.
Run deterministic filter rules against a structured summary result: Run deterministic filter rules against a structured summary result:
```bash ```bash
@@ -78,6 +115,11 @@ python scripts/run_filter_rules.py ^
--output outputs/reference/filter/filter-decision.with-context.json --output outputs/reference/filter/filter-decision.with-context.json
``` ```
Rule engine details and rule authoring guidance live in:
- `docs/design/filter-rule-engine-design.md`
- `docs/design/filter-rule-engine-usage.md`
Write a filtered result into the Markdown sink: Write a filtered result into the Markdown sink:
```bash ```bash
@@ -117,4 +159,4 @@ The script writes by default:
- `outputs/reference/candidates/openclaw-delivery-payload.json` - `outputs/reference/candidates/openclaw-delivery-payload.json`
Output layout details live in `outputs/README.md`. Output layout details live in `outputs/README.md`.
+41 -66
View File
@@ -2,78 +2,56 @@
## 当前状态 ## 当前状态
项目当前处于 `Content Extract MCP` 的 MVP 完成阶段,已验证 `规则过滤 + Markdown sink`,下一阶段将转向 `OpenClaw 日报聚合 + 知识沉淀` 改造。 项目当前已经进入“可交付给 OpenClaw 调用”的阶段。
已完成: 当前主链路:
- [x] 明确整体阅读流链路 `FreshRSS 未读 -> RSS 内容提取 -> LLM 总结 -> 规则过滤 -> OpenClaw delivery payload`
- [x] 明确 `source -> item -> document/article` 的数据抽象
- [x] 明确 `MCP 负责提取,LLM 负责摘要` 的职责边界 当前已经完成:
- [x] 搭建 Python MCP 服务骨架
- [x] 实现 `extract_url_content` - [x] FreshRSS `greader` API 接入
- [x] 实现 `extract_item_content` - [x] `entry -> item` 标准化映射
- [x] 完成标题与正文提取 - [x] RSS-first 内容提取策略
- [x] 完成质量标记与结构化错误输出 - [x] LLM 摘要与校验闭环
- [x] 用参考文章完成真实提取测试 - [x] 第一版规则引擎
- [x] 输出结构化提取 JSON 文件 - [x] `ArticleCandidateRecord` / `OpenClawCandidateInput` 分层
- [x] 设计并迭代 LLM 摘要 prompt - [x] `OpenClawDeliveryPayload` 批量投递结构
- [x] 验证 LLM 输出的 `result.json` 基本符合预期 - [x] 最终 payload 成功后才标记 FreshRSS 已读
- [x] 已封装 LLM 摘要校验 workflow skill - [x] MCP 工具 `run_freshrss_openclaw_pipeline`
- [x] 接通 FreshRSS 上游并完成 `item` 映射 - [x] 默认精简输出模式
- [x] 跑通 `FreshRSS -> item -> content extraction` 单条链路
- [x] 定义规则过滤层 schema
- [x] 实现第一版规则引擎与过滤 MCP tool
- [x] 定义 sink 输入输出 schema
- [x] 实现第一版 Markdown sink 与本地写入脚本
- [x] 明确下一阶段主路径应调整为 `候选材料 -> 日报 -> 人工确认 -> 知识沉淀`
- [x] 明确 `ArticleCandidateRecord` 与 `OpenClawCandidateInput` 需要分层设计
--- ---
## P0 - 近期必须完成 ## P0 - 交接前后最优先
- [x] 为 LLM 摘要结果定义正式 JSON Schema - [x] 为 OpenClaw 补齐交接文档
- [x] 增加一个本地校验脚本,自动校验 `result.json` 是否符合 schema - [x] 将 MCP 工具作为统一生产入口
- [x] 把“提取 JSON -> LLM 摘要 JSON”串成一个标准化本地流程 - [x] 将默认输出收敛为最小必要文件
- [x] 清理或移除当前已不再使用的 `src/summary_mcp/core/summarizer.py` - [ ] 设计 OpenClaw webhook / delivery payload 的主动推送方式
- [x] 更新旧设计文档中仍然残留的 `summary mcp` 描述,避免和当前实现冲突 - [ ] 明确 OpenClaw 侧如何注册和启动本 MCP 服务
--- ---
## P1 - 下一阶段推进 ## P1 - 下一阶段推进
- [x] 把上游 RSS 聚合结果映射成标准化 `item`
- [x] 补充 `item` 的实际样例文件
- [x] 跑通 `FreshRSS -> item -> content extraction` 单条链路
- [x] 定义规则过滤层的输入输出 schema
- [x] 设计知识库入库格式
- [x] 在文档层定义 `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest`
- [x] 在代码里把当前 `article_candidate` 重新定位为 `ArticleCandidateRecord`
- [x] 新增 `OpenClawCandidateInput` 模型与转换逻辑
- [x] 给 `OpenClawCandidateInput` 增加 `canonical_url` 与 `language`
- [x] 输出面向 OpenClaw 的精简 `OpenClawCandidateInput` 批量载荷
- [x] 将“人工确认状态”拆成独立模型,不回写到 candidate 输入对象
- [ ] 设计 OpenClaw webhook / delivery payload 的实际传输方式
- [ ] 设计“人工确认后再沉淀知识库”的状态流转 - [ ] 设计“人工确认后再沉淀知识库”的状态流转
- [ ] 给提取结果增加更多正文清洗策略,比如尾部噪音清理 - [ ] 收敛 `paywall` 误判规则,降低中文文本误报
- [ ] 细化过滤规则并引入更多个性化上下文 - [ ] 细化过滤规则并引入更多个性化上下文
- [ ] 收敛 `paywall` 误判规则,避免仅因正文提到“付费/收费”就进入高优先级 `review` - [ ] 增加批量 run 的保留策略与历史清理策略
- [ ] 为 OpenClaw 补一份更正式的 MCP 调用示例和接线说明
--- ---
## P2 - 后续增强项 ## P2 - 后续增强
- [ ] 将当前 `Markdown sink` 调整为 debug / fallback 能力,而非主路径 - [ ] 将 `Markdown sink` 进一步降级为 debug / fallback 能力
- [ ] 增加按天批量收集 `ArticleCandidateRecord` 的脚本 - [ ] 增加按天聚合 `ArticleCandidateRecord` 的批处理能力
- [ ] 让 OpenClaw 聚合候选内容并生成日报 - [ ] 让 OpenClaw 聚合候选内容并生成日级摘要
- [ ] 将日报写入知识库,并同步生成面向用户的汇报消息 - [ ] 将日级摘要写入知识库,并同步生成面向用户的日报消息
- [ ] 增加批量提取能力 - [ ] 支持更多 `content_kind`
- [ ] 引入 Playwright 作为动态页面兜底抓取方案
- [ ] 支持更多 `content_kind`,例如 `release`、`thread`、`video`
- [ ] 增加提取缓存、重试和更细粒度日志 - [ ] 增加提取缓存、重试和更细粒度日志
- [ ] 重命名包和项目名,从 `summary_mcp` 调整为更符合当前职责的名称 - [ ] 整理历史 rerun 目录与调试产物保留策略
- [ ] 与 OpenClaw 做更正式的工作流编排整合
- [ ] 扩展 Notion / Webhook / 其他 sink
--- ---
@@ -81,19 +59,16 @@
优先做这三件事: 优先做这三件事:
1. 设计 OpenClaw webhook / delivery payload 的实际传输方式 1. 明确 OpenClaw 侧的 MCP 接线方式
2. 收敛 `paywall` 误判规则 2. 设计主动投递 / webhook 机制
3. 设计人工确认后进入知识库的状态流转 3. 收敛规则误判,尤其是 `paywall` 相关启发式
--- ---
## 收束上下文后建议先看 ## 交接时优先阅读
- docs/current/context-reset-brief.md - `README.md`
- docs/openclaw/openclaw-candidate-input-field-spec.md - `docs/openclaw/openclaw-handoff.md`
- docs/openclaw/openclaw-delivery-payload-spec.md - `docs/openclaw/openclaw-candidate-input-field-spec.md`
- docs/openclaw/openclaw-daily-digest-refactor.md - `docs/openclaw/openclaw-delivery-payload-spec.md`
- docs/openclaw/article-candidate-daily-digest-schema.md - `docs/current/context-reset-brief.md`
- docs/design/filter-rule-engine-design.md
- docs/design/markdown-sink-design.md
- TODO.md
+53
View File
@@ -0,0 +1,53 @@
{
"source_tags": [
"backend",
"ai-agent",
"frontier-tech"
],
"interest_topics": [
"后端工程",
"系统设计",
"分布式系统",
"数据库",
"缓存",
"消息队列",
"性能优化",
"可观测性",
"云原生",
"Kubernetes",
"AI Agent",
"LLM",
"RAG",
"MCP",
"工作流自动化",
"前沿科技"
],
"interest_keywords": [
"Java",
"Go",
"Python",
"Spring",
"FastAPI",
"Gin",
"gRPC",
"MySQL",
"PostgreSQL",
"Redis",
"Kafka",
"微服务",
"可观测性",
"Kubernetes",
"云原生",
"AI Agent",
"Agent",
"LLM",
"RAG",
"MCP",
"Prompt Engineering",
"Workflow",
"向量数据库",
"知识库",
"OpenAI",
"DeepSeek"
]
}
+38 -2
View File
@@ -76,13 +76,49 @@
"enabled": true, "enabled": true,
"stop_on_match": false, "stop_on_match": false,
"conditions_all": [ "conditions_all": [
{ "field": "summary.worth_keeping", "op": "eq", "value": true },
{ "field": "summary.category", "op": "not_in", "value": ["资讯"] },
{ "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } } { "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } }
], ],
"action": { "action": {
"decision": "keep", "decision": "keep",
"reason": "Topics overlap with current interest profile.", "reason": "Topics overlap with the backend and AI-agent interest profile on non-news content.",
"labels": ["interest", "topic-match"], "labels": ["interest", "topic-match"],
"priority": 75 "priority": 78
}
},
{
"rule_id": "keep-interest-keyword",
"enabled": true,
"stop_on_match": false,
"conditions_all": [
{ "field": "summary.worth_keeping", "op": "eq", "value": true },
{ "field": "summary.category", "op": "not_in", "value": ["资讯"] },
{ "field": "summary.keywords", "op": "overlap", "value": { "from_field": "context.interest_keywords" } }
],
"action": {
"decision": "keep",
"reason": "Keywords match the backend engineering or AI-agent watchlist on durable content.",
"labels": ["interest", "keyword-match", "engineering"],
"priority": 77
}
},
{
"rule_id": "review-interest-news-watch",
"enabled": true,
"stop_on_match": false,
"conditions_all": [
{ "field": "summary.category", "op": "eq", "value": "资讯" }
],
"conditions_any": [
{ "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } },
{ "field": "summary.keywords", "op": "overlap", "value": { "from_field": "context.interest_keywords" } }
],
"action": {
"decision": "review",
"reason": "Relevant frontier or engineering news should be watched first instead of auto-kept.",
"labels": ["interest", "news-watch"],
"priority": 70
} }
}, },
{ {
+20 -12
View File
@@ -1,4 +1,4 @@
# 文档索引 # 文档索引
## 当前目录结构 ## 当前目录结构
@@ -19,25 +19,29 @@
1. `docs/current/context-reset-brief.md` 1. `docs/current/context-reset-brief.md`
- 当前真实进度与下一步入口 - 当前真实进度与下一步入口
2. `docs/openclaw/openclaw-candidate-input-field-spec.md` 2. `docs/openclaw/openclaw-handoff.md`
- 给 OpenClaw 的接手说明、环境变量、MCP 调用方式与已知限制
3. `docs/openclaw/openclaw-candidate-input-field-spec.md`
- 提供给 OpenClaw 的单篇结构化输入字段说明 - 提供给 OpenClaw 的单篇结构化输入字段说明
3. `docs/openclaw/openclaw-delivery-payload-spec.md` 4. `docs/openclaw/openclaw-delivery-payload-spec.md`
- 提供给 OpenClaw 的批量投递 envelope 说明 - 提供给 OpenClaw 的批量投递 envelope 说明
4. `docs/design/summary-mcp-service-design.md` 5. `docs/design/summary-mcp-service-design.md`
- 当前 MCP 服务的职责、接口和边界 - 当前 MCP 服务的职责、接口和边界
5. `docs/design/filter-rule-engine-design.md` 6. `docs/design/filter-rule-engine-design.md`
- 过滤层的输入输出、规则结构与当前实现 - 过滤层的输入输出、规则结构与当前实现
6. `docs/design/markdown-sink-design.md` 7. `docs/design/filter-rule-engine-usage.md`
- 规则怎么写、怎么跑、结果怎么解读的使用说明
8. `docs/design/markdown-sink-design.md`
- 第一版 Markdown sink 的输入输出、目录结构与落地方式 - 第一版 Markdown sink 的输入输出、目录结构与落地方式
7. `docs/openclaw/openclaw-daily-digest-refactor.md` 9. `docs/openclaw/openclaw-daily-digest-refactor.md`
- 为什么要从单篇入库改成 OpenClaw 日报聚合链路 - 为什么要从单篇入库改成 OpenClaw 日报聚合链路
8. `docs/openclaw/article-candidate-daily-digest-schema.md` 10. `docs/openclaw/article-candidate-daily-digest-schema.md`
- `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` 的正式设计 - `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` 的正式设计
9. `docs/design/source-schema-design.md` 11. `docs/design/source-schema-design.md`
- `source -> item -> document` 的对象设计 - `source -> item -> document` 的对象设计
10. `docs/notes/reading-pipeline-design-notes.md` 12. `docs/notes/reading-pipeline-design-notes.md`
- 更上层的阅读流方案与阶段划分 - 更上层的阅读流方案与阶段划分
11. `docs/design/summary-loop-explained.md` 13. `docs/design/summary-loop-explained.md`
- 当前 LLM 摘要校验闭环的解释 - 当前 LLM 摘要校验闭环的解释
## 当前文档分层 ## 当前文档分层
@@ -65,11 +69,15 @@
- 提取 JSON -> LLM 摘要 JSON -> 校验 的闭环说明 - 提取 JSON -> LLM 摘要 JSON -> 校验 的闭环说明
- `docs/design/filter-rule-engine-design.md` - `docs/design/filter-rule-engine-design.md`
- 第一版规则过滤引擎设计与落地位置 - 第一版规则过滤引擎设计与落地位置
- `docs/design/filter-rule-engine-usage.md`
- 规则配置、调用方式与结果解读
- `docs/design/markdown-sink-design.md` - `docs/design/markdown-sink-design.md`
- 第一版 Markdown sink 设计与落地位置 - 第一版 Markdown sink 设计与落地位置
### 3. OpenClaw 与下游设计 ### 3. OpenClaw 与下游设计
- `docs/openclaw/openclaw-handoff.md`
- OpenClaw 接手所需的运行说明、工具入口与已知限制
- `docs/openclaw/openclaw-candidate-input-field-spec.md` - `docs/openclaw/openclaw-candidate-input-field-spec.md`
- 提供给 OpenClaw 的单篇结构化输入字段说明 - 提供给 OpenClaw 的单篇结构化输入字段说明
- `docs/openclaw/openclaw-delivery-payload-spec.md` - `docs/openclaw/openclaw-delivery-payload-spec.md`
@@ -95,4 +103,4 @@
- `TODO.md` 记录任务优先级与下一步 - `TODO.md` 记录任务优先级与下一步
- `outputs/README.md` 记录当前输出目录约定 - `outputs/README.md` 记录当前输出目录约定
- `docs/archive/content-extract-mcp-mvp-archive.md` 只当历史快照,不再作为最新事实来源 - `docs/archive/content-extract-mcp-mvp-archive.md` 只当历史快照,不再作为最新事实来源
- 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`docs/current/context-reset-brief.md` - 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`docs/current/context-reset-brief.md`
+92 -82
View File
@@ -1,102 +1,112 @@
# 项目当前状态简报 # 项目当前状态简报
## 当前结论
当前仓库已经具备交付给 OpenClaw 的基础条件。
当前主链路是:
`FreshRSS 未读 -> RSS 内容提取 -> LLM 总结 -> 规则过滤 -> OpenClaw delivery payload`
OpenClaw 应通过 MCP 工具 `run_freshrss_openclaw_pipeline` 调用这条链路,而不是自行拼接脚本。
## 当前已完成 ## 当前已完成
- 已明确整体链路:`来源 -> 聚合池 -> 内容提取 MCP -> LLM 摘要 -> 校验 -> 过滤 -> 入库/推送` - 已完成 FreshRSS `greader` API 接入与未读拉取
- 已确定当前 MCP 的职责边界: - 已完成 FreshRSS 条目到标准化 `item` 的映射
- 只负责内容提取 - 已完成 RSS-first 提取策略
- 不负责摘要、分类、价值判断 - 已完成 LLM 总结与校验闭环
- 已完成 Python MCP 骨架 - 已完成规则引擎过滤
- 已实现三个 tool: - 已完成 `ArticleCandidateRecord` 与 `OpenClawCandidateInput` 分层
- `extract_url_content` - 已完成 `OpenClawDeliveryPayload` 批量投递结构
- `extract_item_content` - 已完成 FreshRSS 已读状态回写
- `filter_summary_result` - 已完成“仅在最终 payload 成功写盘后再标记已读”的语义
- 已完成真实 URL 提取验证 - 已完成 MCP 工具 `run_freshrss_openclaw_pipeline`
- 已完成 LLM 摘要 prompt - 已完成默认精简输出模式,减少中间文件
- 已完成 LLM 摘要结果 schema 校验器
- 已完成“提取 JSON -> LLM 摘要 JSON -> 校验”的最小闭环脚本 ## 当前 MCP 工具
- 已完成 LLM 摘要校验 skill 封装
- 已清理旧的启发式 `summarizer.py` 当前服务入口:
- 已将旧的 MCP 设计文档更新为当前“Content Extract MCP”语义
- 已完成 FreshRSS `greader` API 接入 - `src/summary_mcp/server.py`
- 已完成 FreshRSS entry -> `item` 映射
- 已产出真实 `item` 样例文件 当前暴露的 MCP 工具:
- 已跑通 `FreshRSS -> item -> content extraction` 单条链路
- 已定义过滤层输入输出 schema - `extract_url_content`
- 已完成第一版规则引擎、本地脚本和 MCP tool - `extract_item_content`
- 已定义 sink 输入输出 schema - `filter_summary_result`
- 已完成第一版 Markdown sink 与本地写入脚本 - `run_freshrss_openclaw_pipeline`
其中生产主入口是:
- `run_freshrss_openclaw_pipeline`
## 当前关键文件 ## 当前关键文件
- MCP 入口: - MCP 服务入口
- `src/summary_mcp/server.py` - `src/summary_mcp/server.py`
- 提取主流程: - FreshRSS 统一工作流
- `src/summary_mcp/workflows/freshrss_pipeline.py`
- 摘要循环
- `src/summary_mcp/core/summary_loop.py`
- 提取主流程
- `src/summary_mcp/core/pipeline.py` - `src/summary_mcp/core/pipeline.py`
- LLM 结果模型: - FreshRSS 集成
- `src/summary_mcp/models/llm_result.py` - `src/summary_mcp/integrations/freshrss.py`
- LLM 校验器: - 规则引擎
- `src/summary_mcp/validators/llm_result.py`
- 过滤模型:
- `src/summary_mcp/models/filtering.py`
- 过滤引擎:
- `src/summary_mcp/filters/engine.py` - `src/summary_mcp/filters/engine.py`
- sink 模型: - LLM 结果校验
- `src/summary_mcp/models/sink.py` - `src/summary_mcp/validators/llm_result.py`
- Markdown sink: - OpenClaw candidate 模型
- `src/summary_mcp/sinks/markdown.py` - `src/summary_mcp/models/article_candidate.py`
- 默认过滤规则: - OpenClaw delivery 模型
- `configs/filter_rules.json` - `src/summary_mcp/models/openclaw_delivery.py`
- 校验 CLI: - 生产脚本入口
- `src/summary_mcp/validate_llm_result.py` - `scripts/run_freshrss_pipeline.py`
- 最小闭环脚本: - OpenClaw 交接说明
- `scripts/run_summary_loop.py` - `docs/openclaw/openclaw-handoff.md`
- FreshRSS 拉取脚本:
- `scripts/pull_freshrss_items.py`
- FreshRSS 提取脚本:
- `scripts/run_freshrss_extract.py`
- 过滤脚本:
- `scripts/run_filter_rules.py`
- Markdown sink 脚本:
- `scripts/run_markdown_sink.py`
- Markdown sink 文档:
- `docs/design/markdown-sink-design.md`
- 当前提示词:
- `outputs/prompts/llm-summary-prompt.txt`
- 过滤结果样例:
- `outputs/reference/filter/filter-decision.json`
- 文档索引:
- `docs/README.md`
- 当前 TODO:
- `TODO.md`
## 当前已经验证通过 ## 当前输出规则
- 参考文章 URL 可提取为结构化 JSON 默认生产模式只输出:
- LLM 可根据提取结果生成摘要 JSON
- validator 可校验摘要 JSON
- 最小闭环脚本可直接调用 LLM 接口并产出通过校验的结果
- FreshRSS API 可拉取真实 entry
- 真实 entry 可映射为标准化 `item`
- 标准化 `item` 可继续进入内容提取流程
- 规则引擎可对结构化摘要结果输出 `keep / drop / review` 决策
- MCP tool 可承接“由上层 LLM/Agent 调用过滤”的模式
- Markdown sink 可将过滤后的结果写入本地知识库目录
## 当前未开始的下一阶段 - `raw/freshrss.raw.json`
- `candidates/openclaw-delivery-payload.json`
- `run-report.json`
- 设计 webhook / 推送格式 如果需要排障,可开启:
- 把 FreshRSS 拉取与提取流程进一步批量化/调度化
- 迭代更细的过滤规则与个性化上下文
- 决定是否扩展 Notion / Webhook / 其他 sink
## 收束后建议从这里继续 - `debug_artifacts=true`
- 或脚本参数 `--debug-artifacts`
优先从这两个问题继续: 这样才会额外输出逐条中间文件。
1. 先设计 webhook / 推送格式 ## 当前验证状态
2. 再决定是否扩展其他 sink,而不是继续深化 Markdown sink 本身
已经验证通过:
- FreshRSS 未读拉取成功
- 已读回写成功
- MCP 工具入口可直接触发完整链路
- 微信公众号样本可直接使用 RSS 提供的 `summary` 内容提取,不再回源抓网页
- 精简输出模式已实际跑通
## 当前已知限制
- 当前对 FreshRSS 条目采用 RSS-first 策略,不再回源抓原网页
- 如果 RSS 中没有足够正文内容,该条会直接跳过,不会进入后续总结
- 某些规则仍偏保守,部分内容可能落到 `review`
- `paywall` 相关启发式仍可能误判中文文本
- Webhook / 主动投递到 OpenClaw 外部接口尚未实现,当前是由 OpenClaw 通过 MCP 主动调用
## 当前最建议的交接阅读顺序
1. `README.md`
2. `docs/openclaw/openclaw-handoff.md`
3. `docs/openclaw/openclaw-candidate-input-field-spec.md`
4. `docs/openclaw/openclaw-delivery-payload-spec.md`
5. `TODO.md`
## 一句话结论 ## 一句话结论
当前 MVP 已完成,FreshRSS 上游、第一版规则过滤层和第一版 Markdown sink 都已接通,下一阶段应转向推送层与更完整的下游集成。 当前仓库已经从“提取 MCP 原型”演进到“可供 OpenClaw 调用的 FreshRSS -> OpenClaw payload 上游处理器”,可以开始交接,但后续仍建议继续补 webhook / delivery 接线与规则收敛。
+328
View File
@@ -0,0 +1,328 @@
# 规则引擎使用说明
## 1. 它解决什么问题
规则引擎负责把上游产出的结构化信号收敛成最终筛选决策:
`item -> content extraction -> llm summary -> rule engine -> candidate/openclaw`
这里有一个明确边界:
- LLM 负责理解正文、生成结构化摘要信号
- 规则引擎负责输出稳定、可复现、可审计的 `keep / drop / review`
也就是说,规则引擎不是“再让 LLM 判断一遍”,而是用确定性规则做最后裁决。
## 2. 相关文件
- 规则模型: `src/summary_mcp/models/filtering.py`
- 规则执行器: `src/summary_mcp/filters/engine.py`
- 默认规则: `configs/filter_rules.json`
- 本地脚本: `scripts/run_filter_rules.py`
- MCP tool: `filter_summary_result`
## 3. 输入与输出
规则引擎统一读取一个 `FilterInput`,包含四部分:
- `item`
- 标准化后的条目对象
- `article`
- 正文提取结果
- `summary`
- LLM 结构化摘要结果
- `context`
- 运行时注入的偏好信息
当前最常用的判断信号主要来自两类字段:
- `article.quality_flags.*`
- 如 `is_low_content`、`is_truncated`、`is_paywalled`
- `summary.*`
- 如 `category`、`worth_keeping`、`topics`
输出是 `FilterDecisionResult`:
- `decision`
- 最终决策,`keep / drop / review`
- `matched_rules`
- 命中的规则 ID 列表
- `reasons`
- 命中规则的原因说明
- `labels`
- 聚合后的标签
- `priority`
- 命中规则中的最高优先级
- `matches`
- 每条命中规则的明细
## 4. 规则文件怎么写
规则文件位置是 `configs/filter_rules.json`,顶层必须是一个 JSON 数组。
单条规则结构:
```json
{
"rule_id": "keep-worth-keeping-method",
"enabled": true,
"stop_on_match": false,
"conditions_all": [
{ "field": "summary.worth_keeping", "op": "eq", "value": true },
{ "field": "summary.category", "op": "in", "value": ["方法论", "工具实践"] }
],
"action": {
"decision": "keep",
"reason": "Structured summary marked the content as worth keeping in a durable category.",
"labels": ["summary", "durable"],
"priority": 80
}
}
```
字段说明:
- `rule_id`
- 规则唯一标识,建议稳定命名
- `enabled`
- 是否启用
- `stop_on_match`
- 命中后是否立即停止继续匹配后续规则
- `conditions_all`
- 全部命中才算命中
- `conditions_any`
- 任意命中即可
- `action.decision`
- 该规则命中时产出的规则级决策
- `action.reason`
- 命中原因
- `action.labels`
- 打到结果里的标签
- `action.priority`
- 执行时排序优先级,越大越先执行
## 5. 当前支持的操作符
- `eq`
- `ne`
- `in`
- `not_in`
- `contains`
- `overlap`
- `gte`
- `lte`
- `exists`
常见例子:
```json
{ "field": "summary.worth_keeping", "op": "eq", "value": true }
```
```json
{ "field": "summary.category", "op": "in", "value": ["方法论", "工具实践"] }
```
```json
{ "field": "summary.topics", "op": "overlap", "value": ["知识管理", "阅读工作流"] }
```
## 6. 执行顺序和收敛逻辑
执行顺序不是按文件书写顺序,而是按 `action.priority` 从高到低排序。
命中后会先收集所有规则,再做最终收敛:
- 只要命中过任意 `drop`,最终就是 `drop`
- 否则只要命中过任意 `keep`,最终就是 `keep`
- 否则只要命中过任意 `review`,最终就是 `review`
- 如果完全没有命中,默认 `review`
这意味着:
- `drop` 是硬拦截
- `keep` 只能在没有更高约束的 `drop` 时生效
- `review` 是默认灰区兜底
如果你希望某条高优规则一旦命中就不再继续匹配,把 `stop_on_match` 设为 `true`。
## 7. 动态上下文怎么用
规则支持从 `context` 动态取值,不需要把用户偏好写死进规则文件。
示例:
```json
{
"field": "summary.topics",
"op": "overlap",
"value": { "from_field": "context.interest_topics" }
}
```
对应的 `context` 可以是:
```json
{
"interest_topics": ["个人知识管理", "阅读工作流"]
}
```
这样同一套规则就可以被不同用户、不同运行场景复用。
## 8. 本地怎么跑
最小调用:
```bash
python scripts/run_filter_rules.py ^
--summary outputs/reference/summary/result.loop.json ^
--extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
--output outputs/reference/filter/filter-decision.json
```
带上下文:
```bash
python scripts/run_filter_rules.py ^
--summary outputs/reference/summary/result.loop.json ^
--extracted outputs/reference/extracted/read-flow-2026.extracted.json ^
--context outputs/reference/filter/filter-context.json ^
--output outputs/reference/filter/filter-decision.with-context.json
```
也可以显式指定另一份规则文件:
```bash
python scripts/run_filter_rules.py ^
--summary outputs/reference/summary/result.loop.json ^
--rules configs/filter_rules.json ^
--output outputs/reference/filter/filter-decision.json
```
## 9. MCP 怎么调用
MCP tool 名称是 `filter_summary_result`。
输入参数:
- `summary_result`
- `extracted_article`
- `item`
- `context`
其中只有 `summary_result` 是必填,其余都是可选补充信号。
示例:
```json
{
"summary_result": {
"title": "如何构建个人阅读工作流",
"url": "https://example.com/read-flow",
"summary": "文章介绍了从采集、提炼到沉淀的个人阅读工作流设计。",
"highlights": ["先采集再提炼", "用规则做稳定筛选", "日报再进入知识库"],
"keywords": ["阅读工作流", "知识管理", "RSS", "规则引擎", "日报"],
"topics": ["阅读工作流", "知识管理", "信息筛选"],
"category": "方法论",
"worth_keeping": true,
"reason": "提供了可复用的方法框架。"
},
"context": {
"interest_topics": ["阅读工作流", "知识管理"]
}
}
```
## 10. 结果怎么看
一个典型结果会像这样:
```json
{
"decision": "keep",
"matched_rules": [
"keep-worth-keeping-method",
"keep-interest-topic"
],
"reasons": [
"Structured summary marked the content as worth keeping in a durable category.",
"Topics overlap with current interest profile."
],
"labels": ["durable", "interest", "summary", "topic-match"],
"priority": 80,
"matches": [
{
"rule_id": "keep-worth-keeping-method",
"decision": "keep",
"reason": "Structured summary marked the content as worth keeping in a durable category.",
"labels": ["summary", "durable"],
"priority": 80
}
]
}
```
解读方式:
- 看 `decision`
- 最终裁决
- 看 `matched_rules`
- 哪些规则生效了
- 看 `reasons`
- 为什么做出这个判断
- 看 `matches`
- 需要排查时看完整命中明细
## 11. 在当前整条链路里的位置
当前生产链路里,规则引擎已经集成在 `run_freshrss_openclaw_pipeline` 中。
顺序是:
1. 从 FreshRSS 拉未读
2. 从 RSS 项目里读取正文
3. 调用 LLM 生成结构化摘要
4. 规则引擎输出 `keep / drop / review`
5. 构建 `ArticleCandidateRecord`
6. 压缩成 `OpenClawCandidateInput`
7. 生成 `openclaw-delivery-payload.json`
8. 如果开启 `mark_read`,最后再标记已读
所以在生产模式下,一般不需要单独跑 `run_filter_rules.py`,只有在调规则或排查命中逻辑时才单独跑。
## 12. 调规则时的建议
- 把“硬性淘汰”规则放高优先级
- 比如低质量正文、明显噪音内容
- 把“强 keep”规则放在中高优先级
- 比如 `worth_keeping=true` 且类别是方法论
- 把“兜底 review”规则放低一些
- 避免过早收敛
- 用户偏好尽量走 `context`
- 不要把临时兴趣直接硬编码到规则里
- `rule_id` 保持稳定
- 方便后续审计、统计和排障
## 13. 一个最常见的改法
如果你想增加一条“命中关注主题就 keep”的规则,可以直接在 `configs/filter_rules.json` 里加:
```json
{
"rule_id": "keep-interest-topic",
"enabled": true,
"stop_on_match": false,
"conditions_all": [
{ "field": "summary.topics", "op": "overlap", "value": { "from_field": "context.interest_topics" } }
],
"action": {
"decision": "keep",
"reason": "Topics overlap with current interest profile.",
"labels": ["interest", "topic-match"],
"priority": 75
}
}
```
如果只是临时停用某条规则,最简单的是把它的 `enabled` 改成 `false`,不要先删规则。
+163
View File
@@ -0,0 +1,163 @@
# OpenClaw Handoff
## Purpose
This repository provides a FreshRSS-first reading pipeline for OpenClaw:
`FreshRSS unread items -> RSS content extraction -> LLM summary -> rule engine -> OpenClaw delivery payload`
OpenClaw should treat this repository as an MCP-backed upstream content processor.
## Production Entrypoint
OpenClaw should call the MCP tool:
- `run_freshrss_openclaw_pipeline`
This is the canonical entrypoint for production use.
## Required Environment Variables
The MCP server process must have these variables available:
- `FRESHRSS_API_BASE_URL`
- `FRESHRSS_USERNAME`
- `FRESHRSS_API_PASSWORD`
- `LLM_API_URL`
- `LLM_API_KEY`
- `LLM_MODEL`
Example:
```powershell
set FRESHRSS_API_BASE_URL=http://127.0.0.1:8081/api/greader.php
set FRESHRSS_USERNAME=osiman
set FRESHRSS_API_PASSWORD=your-api-password
set LLM_API_URL=https://api.deepseek.com
set LLM_API_KEY=your-llm-api-key
set LLM_MODEL=deepseek-chat
```
## Server Startup
Install dependencies:
```bash
pip install -e .
```
Start the MCP server:
```bash
summary-mcp
```
## Recommended MCP Call
Recommended default call:
```json
{
"limit": 5,
"mark_read": false,
"include_read": false,
"debug_artifacts": false,
"timeout_seconds": 60,
"max_retries": 2
}
```
Recommended semantics:
- Use `mark_read=false` while validating integration.
- Use `mark_read=true` only after confirming OpenClaw will consume the returned payload successfully.
- Keep `debug_artifacts=false` for routine production runs.
- Set `debug_artifacts=true` only when troubleshooting a bad batch.
## What The Tool Returns
Primary return fields:
- `run_id`
- `output_dir`
- `raw_output`
- `delivery_output`
- `report_output`
- `pulled_count`
- `delivered_count`
- `marked_read_count`
- `status_counts`
- `delivery_payload`
Optional:
- `items`
- Returned only when `include_item_reports=true`
## Minimal Output Files
By default the pipeline writes only:
- `outputs/freshrss/rerun/<run_id>/raw/freshrss.raw.json`
- `outputs/freshrss/rerun/<run_id>/candidates/openclaw-delivery-payload.json`
- `outputs/freshrss/rerun/<run_id>/run-report.json`
If `debug_artifacts=true`, the pipeline additionally writes per-item intermediate files.
## Payload Specs
OpenClaw payload field specs live here:
- `docs/openclaw/openclaw-candidate-input-field-spec.md`
- `docs/openclaw/openclaw-delivery-payload-spec.md`
## Read-State Semantics
The pipeline reads from FreshRSS unread items by default.
If `mark_read=true`:
- items are marked as read only after the final `openclaw-delivery-payload.json` has been written successfully
- only successfully delivered items are marked as read
- failed or skipped items remain unread
## FreshRSS Content Policy
For FreshRSS items, the pipeline is RSS-first and does not re-crawl webpages.
Behavior:
- use `item.raw_content` first
- if missing, use `item.raw_summary`
- if neither contains usable content, skip the item
- do not fetch the original webpage again for FreshRSS items
This is intentional.
## Known Limitations
- Some sources put only partial content in RSS; those items may be skipped if RSS content is insufficient.
- WeChat articles often block direct crawling, but this pipeline now avoids that path for FreshRSS items and uses RSS-provided content when available.
- Rule behavior is still conservative in some cases; many items may land in `review` depending on current rules.
- Paywall heuristics may produce false positives for some Chinese text patterns.
## Files OpenClaw Should Read First
Recommended reading order for a new maintainer:
1. `README.md`
2. `docs/openclaw/openclaw-handoff.md`
3. `docs/openclaw/openclaw-candidate-input-field-spec.md`
4. `docs/openclaw/openclaw-delivery-payload-spec.md`
5. `docs/current/context-reset-brief.md`
## Current Recommendation
For integration handoff, the repository is usable now.
The minimum you need to give OpenClaw is:
- the repository code
- the MCP server startup command
- the required environment variables in the target environment
- the instruction to call `run_freshrss_openclaw_pipeline`
-129
View File
@@ -1,129 +0,0 @@
我看了,这版 可以,方向是对的。
如果这是“上游项目 → OpenClaw”的输入格式,我觉得已经 基本能直接用了。
我的判断:
这版为什么合适
它正好满足我最需要的几类信息:
来源信息:title / url / published_at / author / source_name
语义理解:summary / highlights / keywords / topics / category
筛选排序信号:worth_keeping / worth_reason / selection_decision / selection_reason / digest_rank / digest_section_hint
用这批字段,我已经可以做:
日报聚合
去重
分栏目
排序
生成你的 review 清单
供你确认后再沉淀到知识库
所以单从“我好不好解析、能不能稳定消费”来说,
这版 JSON 明显比 md 更适合当上游输入。
我建议你保留的设计
这几个点我觉得是对的,不要轻易改掉:
单篇 candidate 扁平对象
非常适合我消费
不用反复钻嵌套
不带全文
对,别把正文全文塞进来
token 开销会爆,而且日报阶段根本不需要
同时保留语义字段 + 筛选字段
summary/highlights/topics 让我理解内容
selection_decision/digest_rank 让我快速决定怎么排
candidate_id 作为稳定主键
这个非常重要
后续你让我“保留第几条”“这条上次见过没”“已入库没”都靠它
我建议你再补 4 个点
这版已经能用,但如果你要长期跑,我建议再补几个小点。
1)加一个批量 envelope
你文档里其实已经提到了,我建议尽快定下来。
比如:
{
"run_id": "daily-2026-03-25-001",
"date": "2026-03-25",
"candidates": [ ... ],
"stats": {
"total": 42
}
}
原因:
我实际处理日报,不会只收一条
批次级信息对去重、追踪、失败重跑很重要
2)加一个 canonical_url 或 url_normalized
现在只有 url,但很多站点会有追踪参数。
建议补一个:
canonical_url或
url_normalized
原因:
去重更稳
同一篇文章不同 query 参数不会被当两篇
3)加一个 language
比如:
"language": "zh-CN"
原因:
以后你来源不一定全是中文
我做日报、摘要风格、后续入知识库时会更稳
4)“用户确认结果”不要塞回这个输入对象里
这个很关键。
你这个 OpenClawCandidateInput 很适合做 上游候选输入,
但“你后来确认它有价值”这件事,我建议 不要回写进这个对象定义里。
更好的做法是单独维护 downstream 状态,比如:
{
"candidate_id": "...",
"review_status": "confirmed",
"reviewed_at": "...",
"review_note": "保留,适合入知识库"
}
原因:
上游输入是“候选事实”
你的确认是“流程状态”
这两个层次最好分开,不然对象会慢慢变脏
有一个字段关系,我建议你保留现状
就是:
worth_keeping
selection_decision
这两个不要合并。
因为它们语义不一样:
worth_keeping:更像摘要层/语义层判断
selection_decision:更像规则层/流程层判断
我消费的时候,两者同时有用。
如果按你的目标流程,我建议最终这么分层
上游输入
用你现在这版 JSON candidate
OpenClaw 中间处理
我生成:
日报 markdown
待你确认的候选列表
人工确认后
再生成:
知识卡片对象
或笔记对象
再入知识库
也就是说:
候选输入 JSON ≠ 最终知识库格式
别把“日报候选格式”和“知识沉淀格式”硬合成一个。
一句话结论
这版 JSON 作为上游输入,已经比 md 合适很多,而且基本可落地。
如果再补上:
批量 envelope
canonical_url
language
下游确认状态单独建模
那这套就很稳了。
+59 -28
View File
@@ -1,38 +1,69 @@
# Outputs Layout # Outputs Layout
`outputs/` 按“来源 + 阶段”分层,避免所有中间产物堆在根目录。 `outputs/` 按来源和运行批次组织。当前推荐区分生产产物与调试产物。
## 目录约定 ## 生产默认输出
对于 FreshRSS 主流水线,默认只保留这 3 类文件:
- `outputs/freshrss/rerun/<run_id>/raw/freshrss.raw.json`
- FreshRSS 原始响应快照
- `outputs/freshrss/rerun/<run_id>/candidates/openclaw-delivery-payload.json`
- 发给 OpenClaw 的最终批量 payload
- `outputs/freshrss/rerun/<run_id>/run-report.json`
- 本次批处理的运行报告
这是当前推荐的生产模式。
## 调试扩展输出
当启用 `debug_artifacts` 时,才会额外写出这些中间文件:
- `outputs/freshrss/rerun/<run_id>/items/`
- 标准化 `item` 中间文件
- `outputs/freshrss/rerun/<run_id>/extracted/`
- 提取结果
- `outputs/freshrss/rerun/<run_id>/summary/`
- LLM 总结结果及调试尝试文件
- `outputs/freshrss/rerun/<run_id>/filter/`
- 规则过滤结果
- `outputs/freshrss/rerun/<run_id>/candidates/*.article-candidate-record.json`
- 内部候选记录
- `outputs/freshrss/rerun/<run_id>/candidates/*.openclaw-candidate-input.json`
- 单篇 OpenClaw 输入对象
## 何时启用调试产物
只在这些场景启用:
- 某一批次有异常,需要定位是提取、总结还是过滤阶段出错
- 需要核对某条内容为什么被 `keep` / `review` / `drop`
- 需要为规则调整收集样本
平时不要默认开启。
## 参考目录
- `outputs/prompts/` - `outputs/prompts/`
- prompt 模板与调试输入 - Prompt 模板
- `outputs/reference/` - `outputs/reference/`
- 手工样例、固定参考输入、通用演示产物 - 手工样例、固定参考输入输出
- `outputs/reference/extracted/`
- 参考提取结果
- `outputs/reference/summary/`
- 通用摘要结果与 loop 调试产物
- `outputs/reference/filter/`
- 通用过滤结果与上下文样例
- `outputs/reference/candidates/`
- 通用 `article_candidate` 样例
- `outputs/freshrss/` - `outputs/freshrss/`
- FreshRSS 实跑产物 - FreshRSS 实跑批次输出
- `outputs/freshrss/raw/`
- greader 原始响应
- `outputs/freshrss/items/`
- entry -> `item` 映射结果
- `outputs/freshrss/extracted/`
- FreshRSS 文章提取结果
- `outputs/freshrss/summary/`
- FreshRSS 摘要 loop 结果与调试文件
- `outputs/freshrss/filter/`
- FreshRSS 过滤结果
- `outputs/freshrss/candidates/`
- FreshRSS `article_candidate` 结果
## 命名原则 ## 命名原则
- 默认脚本输出应优先写入对应子目录,不再直接写 `outputs/` 根目录。 - 每次批处理使用独立目录:`outputs/freshrss/rerun/<timestamp>/`
- 同一条链路的调试文件放在同一阶段目录里,例如 `result.loop.json` 与 `result.loop.attempt-*.json`。 - 默认优先保留最终产物,不把所有中间文件都当成长期资产
- `reference/` 只放可复用的稳定样例,真实运行数据优先放 `freshrss/`。 - 调试文件只在需要时生成
- `reference/` 只放可复用样例,不放真实生产批次数据
## 当前建议
如果目标是交给 OpenClaw 稳定消费,优先依赖:
- `openclaw-delivery-payload.json`
- `run-report.json`
- `freshrss.raw.json`
其余文件默认都应视为调试辅助产物。
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"published_at": "2026-03-21T10:19:11Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其不断膨胀的估值,将其包装成大模型公司。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际调用的是Kimi K2.5模型。",
"Kimi官方确认Cursor通过Fireworks AI获得授权,因此不构成侵权。",
"Cursor隐瞒使用Kimi模型,被认为是为了支撑其高达500亿美元的估值。",
"事件显示中国大模型技术已具备输出能力,国产模型与国外旗舰差距缩小。",
"Composer 2性能低于GPT-5.4但成本最低,生成速度较快。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"套壳模型",
"模型授权",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术争议",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"published_at": "2026-03-19T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。",
"highlights": [
"未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。",
"面试问题需要考察将复杂需求转化为清晰提示词的能力。",
"AI编程时代,对系统架构知识和项目分解能力的要求依然重要。",
"传统的编程语法细节考察在AI辅助下意义可能减弱。",
"文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"Skill",
"MCP",
"多Agent协同",
"系统架构"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"技术趋势",
"人才评估"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"published_at": "2026-03-12T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文以 Cloudflare 工程师用 AI 在一周内复刻 Next.js 框架为例,指出 AI 使得代码的护城河不复存在。作者认为,软件公司未来将依赖保密的测试用例来防止 AI 复刻,测试成为新的竞争壁垒。",
"highlights": [
"Cloudflare 工程师仅用一周时间和 1100 美元 Token 费用,通过 AI 成功复刻了 Next.js 框架,性能优于原版。",
"AI 能够复刻软件的关键在于开源项目提供了完备的文档、社区文章和测试用例,使得 API 兼容性得以验证。",
"为防止 AI 复刻,大型软件项目可能选择将核心测试用例闭源,如 SQLite 的 TH3 测试套件和 tldraw 的计划。",
"AI 复刻软件引发了版权争议,例如 chardet 项目的许可证更改,且美国法律认定 AI 生成物无版权,冲击现有许可证体系。",
"文章还讨论了 AI 对软件行业的多方面影响,包括提高效率、替代岗位以及可能引发的社会复杂性崩溃问题。"
],
"keywords": [
"Next.js",
"AI 复刻",
"测试用例",
"SQLite",
"MIT 许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源协议",
"技术趋势",
"行业影响"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Article may be behind a paywall.",
"digest_section_hint": null,
"digest_rank": 95
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"published_at": "2026-01-25T18:20:16Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的回归问题。",
"新增了注册关闭时的可自定义消息功能。",
"在 Apache 访问日志和 Docker 日志中添加了用户名记录。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"
],
"keywords": [
"FreshRSS",
"bug fixing",
"regression",
"Apache logs",
"GReader API",
"Ajax",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"published_at": "2025-12-24T19:27:23Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
"highlights": [
"新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。",
"引入了新的高级搜索表单和文章长度排序选项。",
"改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。",
"修复了OpenID Connect在Debian 13上的兼容性问题。",
"Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Docker",
"Debian 13",
"PHP 8.4",
"OpenID Connect",
"性能优化"
],
"topics": [
"开源软件",
"RSS阅读器",
"版本发布",
"软件开发",
"系统部署"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
@@ -1,222 +0,0 @@
{
"run_id": "openclaw-delivery-20260325-102553",
"date": "2026-03-25",
"candidates": [
{
"candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"published_at": "2026-03-12T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文以 Cloudflare 工程师用 AI 在一周内复刻 Next.js 框架为例,指出 AI 使得代码的护城河不复存在。作者认为,软件公司未来将依赖保密的测试用例来防止 AI 复刻,测试成为新的竞争壁垒。",
"highlights": [
"Cloudflare 工程师仅用一周时间和 1100 美元 Token 费用,通过 AI 成功复刻了 Next.js 框架,性能优于原版。",
"AI 能够复刻软件的关键在于开源项目提供了完备的文档、社区文章和测试用例,使得 API 兼容性得以验证。",
"为防止 AI 复刻,大型软件项目可能选择将核心测试用例闭源,如 SQLite 的 TH3 测试套件和 tldraw 的计划。",
"AI 复刻软件引发了版权争议,例如 chardet 项目的许可证更改,且美国法律认定 AI 生成物无版权,冲击现有许可证体系。",
"文章还讨论了 AI 对软件行业的多方面影响,包括提高效率、替代岗位以及可能引发的社会复杂性崩溃问题。"
],
"keywords": [
"Next.js",
"AI 复刻",
"测试用例",
"SQLite",
"MIT 许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源协议",
"技术趋势",
"行业影响"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Article may be behind a paywall.",
"digest_section_hint": null,
"digest_rank": 95
},
{
"candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"published_at": "2026-03-21T10:19:11Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其不断膨胀的估值,将其包装成大模型公司。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际调用的是Kimi K2.5模型。",
"Kimi官方确认Cursor通过Fireworks AI获得授权,因此不构成侵权。",
"Cursor隐瞒使用Kimi模型,被认为是为了支撑其高达500亿美元的估值。",
"事件显示中国大模型技术已具备输出能力,国产模型与国外旗舰差距缩小。",
"Composer 2性能低于GPT-5.4但成本最低,生成速度较快。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"套壳模型",
"模型授权",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术争议",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"published_at": "2026-03-19T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。",
"highlights": [
"未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。",
"面试问题需要考察将复杂需求转化为清晰提示词的能力。",
"AI编程时代,对系统架构知识和项目分解能力的要求依然重要。",
"传统的编程语法细节考察在AI辅助下意义可能减弱。",
"文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"Skill",
"MCP",
"多Agent协同",
"系统架构"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"技术趋势",
"人才评估"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"published_at": "2026-01-25T18:20:16Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的回归问题。",
"新增了注册关闭时的可自定义消息功能。",
"在 Apache 访问日志和 Docker 日志中添加了用户名记录。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"
],
"keywords": [
"FreshRSS",
"bug fixing",
"regression",
"Apache logs",
"GReader API",
"Ajax",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"published_at": "2025-12-24T19:27:23Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
"highlights": [
"新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。",
"引入了新的高级搜索表单和文章长度排序选项。",
"改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。",
"修复了OpenID Connect在Debian 13上的兼容性问题。",
"Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Docker",
"Debian 13",
"PHP 8.4",
"OpenID Connect",
"性能优化"
],
"topics": [
"开源软件",
"RSS阅读器",
"版本发布",
"软件开发",
"系统部署"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
],
"stats": {
"total": 5,
"keep_total": 0,
"review_total": 5,
"drop_total": 0
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,32 +0,0 @@
{
"success": true,
"article": {
"extract_id": "sha256:169f2b50eec3d198df126a8daedb95c48cff252ead9d4d2598a449e128cae2b8",
"item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"source_id": "freshrss:2987af960359c5c0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"title": "FreshRSS 1.28.1",
"author": "Alkarex",
"published_at": "2026-01-25T18:20:16Z",
"language": null,
"content_kind": "article",
"plain_text": "Alkarex\nreleased this\n25 Jan 18:20\n·\n78 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n<template>\nelement #8443 - Fixes before PHPStan 2 #8445, simplepie#957\n- Update of\n- Extensions\n- Update\n.gitignore\nto ignore installed extensions #8372\n- Update\n- UI\n- I18n\n- Misc.",
"quality_flags": {
"is_paywalled": false,
"is_truncated": false,
"is_low_content": false
},
"metadata": {
"content_source": "fetched_html",
"extractor": "trafilatura",
"char_count": 2155
},
"pipeline_state": "extracted"
},
"error": null,
"debug": {
"content_source": "fetched_html",
"extractor": "trafilatura"
},
"warnings": []
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,40 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-paywalled-content",
"review-worth-keeping-other"
],
"reasons": [
"Article may be behind a paywall.",
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"paywall",
"quality",
"summary"
],
"priority": 95,
"matches": [
{
"rule_id": "review-paywalled-content",
"decision": "review",
"reason": "Article may be behind a paywall.",
"labels": [
"quality",
"paywall"
],
"priority": 95
},
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"published_at": "2026-03-21T10:19:11Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
"Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
"Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
"事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
"Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"模型套壳",
"MIT许可证",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术授权",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"published_at": "2026-03-19T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"多Agent协同",
"系统架构",
"科技动态",
"工具推荐"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"科技资讯",
"效率工具"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"published_at": "2026-03-12T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": [
"Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
"软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
"AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
"文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
"周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
],
"keywords": [
"Next.js",
"AI复刻",
"测试用例",
"SQLite",
"MIT许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源技术",
"科技趋势",
"版权法律"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Article may be behind a paywall.",
"digest_section_hint": null,
"digest_rank": 95
}
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"published_at": "2026-01-25T18:20:16Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的多个回归错误。",
"新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
"该版本由多位贡献者共同完成,包括新加入的开发者。"
],
"keywords": [
"FreshRSS",
"bug 修复",
"回归问题",
"GReader API",
"HTTP Basic Auth",
"Ajax 请求",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
{
"candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"published_at": "2025-12-24T19:27:23Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
"highlights": [
"新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
"改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
"Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
"修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
"将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Capy Reader",
"Docker",
"Debian 13 Trixie",
"PHP 8.4.11",
"OpenID Connect"
],
"topics": [
"开源软件",
"RSS 阅读器",
"版本发布",
"软件开发",
"系统维护"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
@@ -1,224 +0,0 @@
{
"schema_version": "v1",
"generated_at": "2026-03-26T02:17:31.459980Z",
"run_id": "openclaw-delivery-20260326-021731",
"date": "2026-03-25",
"candidates": [
{
"candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"published_at": "2026-03-12T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": [
"Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
"软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
"AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
"文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
"周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
],
"keywords": [
"Next.js",
"AI复刻",
"测试用例",
"SQLite",
"MIT许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源技术",
"科技趋势",
"版权法律"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。",
"selection_decision": "review",
"selection_reason": "Article may be behind a paywall.",
"digest_section_hint": null,
"digest_rank": 95
},
{
"candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"published_at": "2026-03-21T10:19:11Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
"Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
"Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
"事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
"Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"模型套壳",
"MIT许可证",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术授权",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"published_at": "2026-03-19T23:59:16Z",
"author": "阮一峰",
"source_name": "阮一峰的网络日志",
"language": null,
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"多Agent协同",
"系统架构",
"科技动态",
"工具推荐"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"科技资讯",
"效率工具"
],
"category": "观点评论",
"worth_keeping": true,
"worth_reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"published_at": "2026-01-25T18:20:16Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的多个回归错误。",
"新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
"该版本由多位贡献者共同完成,包括新加入的开发者。"
],
"keywords": [
"FreshRSS",
"bug 修复",
"回归问题",
"GReader API",
"HTTP Basic Auth",
"Ajax 请求",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
},
{
"candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"published_at": "2025-12-24T19:27:23Z",
"author": "Alkarex",
"source_name": "FreshRSS releases",
"language": null,
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
"highlights": [
"新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
"改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
"Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
"修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
"将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Capy Reader",
"Docker",
"Debian 13 Trixie",
"PHP 8.4.11",
"OpenID Connect"
],
"topics": [
"开源软件",
"RSS 阅读器",
"版本发布",
"软件开发",
"系统维护"
],
"category": "资讯",
"worth_keeping": true,
"worth_reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。",
"selection_decision": "review",
"selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"digest_section_hint": null,
"digest_rank": 60
}
],
"stats": {
"total": 5,
"keep_total": 0,
"review_total": 5,
"drop_total": 0
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,32 +0,0 @@
{
"success": true,
"article": {
"extract_id": "sha256:169f2b50eec3d198df126a8daedb95c48cff252ead9d4d2598a449e128cae2b8",
"item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
"source_id": "freshrss:2987af960359c5c0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"title": "FreshRSS 1.28.1",
"author": "Alkarex",
"published_at": "2026-01-25T18:20:16Z",
"language": null,
"content_kind": "article",
"plain_text": "Alkarex\nreleased this\n25 Jan 18:20\n·\n79 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n<template>\nelement #8443 - Fixes before PHPStan 2 #8445, simplepie#957\n- Update of\n- Extensions\n- Update\n.gitignore\nto ignore installed extensions #8372\n- Update\n- UI\n- I18n\n- Misc.",
"quality_flags": {
"is_paywalled": false,
"is_truncated": false,
"is_low_content": false
},
"metadata": {
"content_source": "fetched_html",
"extractor": "trafilatura",
"char_count": 2155
},
"pipeline_state": "extracted"
},
"error": null,
"debug": {
"content_source": "fetched_html",
"extractor": "trafilatura"
},
"warnings": []
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,40 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-paywalled-content",
"review-worth-keeping-other"
],
"reasons": [
"Article may be behind a paywall.",
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"paywall",
"quality",
"summary"
],
"priority": 95,
"matches": [
{
"rule_id": "review-paywalled-content",
"decision": "review",
"reason": "Article may be behind a paywall.",
"labels": [
"quality",
"paywall"
],
"priority": 95
},
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
@@ -1,26 +0,0 @@
{
"decision": "review",
"matched_rules": [
"review-worth-keeping-other"
],
"reasons": [
"Worth-keeping signal is positive but no stronger keep rule matched."
],
"labels": [
"needs-review",
"summary"
],
"priority": 60,
"matches": [
{
"rule_id": "review-worth-keeping-other",
"decision": "review",
"reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
"labels": [
"summary",
"needs-review"
],
"priority": 60
}
]
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,32 +0,0 @@
{
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
"Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
"Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
"事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
"Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"模型套壳",
"MIT许可证",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术授权",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
}
@@ -1,11 +0,0 @@
{
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": ["Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。", "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。", "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。", "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。", "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"],
"keywords": ["Cursor", "Composer 2", "Kimi K2.5", "Fireworks AI", "模型套壳", "MIT许可证", "估值泡沫", "AI编程工具"],
"topics": ["人工智能", "大模型", "商业伦理", "技术授权", "创业融资"],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
}
@@ -1,37 +0,0 @@
{
"valid": true,
"errors": [],
"warnings": [],
"normalized_result": {
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
"Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
"Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
"事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
"Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"模型套壳",
"MIT许可证",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术授权",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
}
}
@@ -1,32 +0,0 @@
{
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
"highlights": [
"Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
"Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
"Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
"事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
"Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
],
"keywords": [
"Cursor",
"Composer 2",
"Kimi K2.5",
"Fireworks AI",
"模型套壳",
"MIT许可证",
"估值泡沫",
"AI编程工具"
],
"topics": [
"人工智能",
"大模型",
"商业伦理",
"技术授权",
"创业融资"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
}
@@ -1,32 +0,0 @@
{
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"多Agent协同",
"系统架构",
"科技动态",
"工具推荐"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"科技资讯",
"效率工具"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
}
@@ -1,19 +0,0 @@
```json
{
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": ["AI编程", "程序员招聘", "面试问题", "提示词工程", "多Agent协同", "系统架构", "科技动态", "工具推荐"],
"topics": ["人工智能", "软件开发", "职业发展", "科技资讯", "效率工具"],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
}
```
@@ -1,37 +0,0 @@
{
"valid": true,
"errors": [],
"warnings": [],
"normalized_result": {
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"多Agent协同",
"系统架构",
"科技动态",
"工具推荐"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"科技资讯",
"效率工具"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
}
}
@@ -1,32 +0,0 @@
{
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
"summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
"highlights": [
"未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
"面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
"传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
"AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
"文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
],
"keywords": [
"AI编程",
"程序员招聘",
"面试问题",
"提示词工程",
"多Agent协同",
"系统架构",
"科技动态",
"工具推荐"
],
"topics": [
"人工智能",
"软件开发",
"职业发展",
"科技资讯",
"效率工具"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
}
@@ -1,32 +0,0 @@
{
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": [
"Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
"软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
"AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
"文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
"周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
],
"keywords": [
"Next.js",
"AI复刻",
"测试用例",
"SQLite",
"MIT许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源技术",
"科技趋势",
"版权法律"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
}
@@ -1,11 +0,0 @@
{
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": ["Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。", "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。", "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。", "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。", "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"],
"keywords": ["Next.js", "AI复刻", "测试用例", "SQLite", "MIT许可证", "Cloudflare", "vinext", "护城河"],
"topics": ["人工智能", "软件开发", "开源技术", "科技趋势", "版权法律"],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
}
@@ -1,37 +0,0 @@
{
"valid": true,
"errors": [],
"warnings": [],
"normalized_result": {
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": [
"Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
"软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
"AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
"文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
"周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
],
"keywords": [
"Next.js",
"AI复刻",
"测试用例",
"SQLite",
"MIT许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源技术",
"科技趋势",
"版权法律"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
}
}
@@ -1,32 +0,0 @@
{
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
"summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
"highlights": [
"Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
"软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
"AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
"文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
"周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
],
"keywords": [
"Next.js",
"AI复刻",
"测试用例",
"SQLite",
"MIT许可证",
"Cloudflare",
"vinext",
"护城河"
],
"topics": [
"人工智能",
"软件开发",
"开源技术",
"科技趋势",
"版权法律"
],
"category": "观点评论",
"worth_keeping": true,
"reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
}
@@ -1,32 +0,0 @@
{
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的多个回归错误。",
"新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
"该版本由多位贡献者共同完成,包括新加入的开发者。"
],
"keywords": [
"FreshRSS",
"bug 修复",
"回归问题",
"GReader API",
"HTTP Basic Auth",
"Ajax 请求",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
}
@@ -1,11 +0,0 @@
{
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": ["此版本主要修复了 1.28.0 版本引入的多个回归错误。", "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。", "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。", "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。", "该版本由多位贡献者共同完成,包括新加入的开发者。"],
"keywords": ["FreshRSS", "bug 修复", "回归问题", "GReader API", "HTTP Basic Auth", "Ajax 请求", "MySQL", "MariaDB"],
"topics": ["开源软件", "版本更新", "RSS 阅读器", "软件开发", "性能优化"],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
}
@@ -1,39 +0,0 @@
{
"valid": true,
"errors": [],
"warnings": [
"`??` category marked as worth keeping; check if this is intentional."
],
"normalized_result": {
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的多个回归错误。",
"新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
"该版本由多位贡献者共同完成,包括新加入的开发者。"
],
"keywords": [
"FreshRSS",
"bug 修复",
"回归问题",
"GReader API",
"HTTP Basic Auth",
"Ajax 请求",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
}
}
@@ -1,32 +0,0 @@
{
"title": "FreshRSS 1.28.1",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
"summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
"highlights": [
"此版本主要修复了 1.28.0 版本引入的多个回归错误。",
"新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
"通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
"修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
"该版本由多位贡献者共同完成,包括新加入的开发者。"
],
"keywords": [
"FreshRSS",
"bug 修复",
"回归问题",
"GReader API",
"HTTP Basic Auth",
"Ajax 请求",
"MySQL",
"MariaDB"
],
"topics": [
"开源软件",
"版本更新",
"RSS 阅读器",
"软件开发",
"性能优化"
],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
}
@@ -1,32 +0,0 @@
{
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
"highlights": [
"新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
"改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
"Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
"修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
"将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Capy Reader",
"Docker",
"Debian 13 Trixie",
"PHP 8.4.11",
"OpenID Connect"
],
"topics": [
"开源软件",
"RSS 阅读器",
"版本发布",
"软件开发",
"系统维护"
],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
}
@@ -1,19 +0,0 @@
```json
{
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
"highlights": [
"新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
"改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
"Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
"修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
"将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
],
"keywords": ["FreshRSS", "用户修改日期排序", "高级搜索表单", "Capy Reader", "Docker", "Debian 13 Trixie", "PHP 8.4.11", "OpenID Connect"],
"topics": ["开源软件", "RSS 阅读器", "版本发布", "软件开发", "系统维护"],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
}
```
@@ -1,39 +0,0 @@
{
"valid": true,
"errors": [],
"warnings": [
"`??` category marked as worth keeping; check if this is intentional."
],
"normalized_result": {
"title": "FreshRSS 1.28.0",
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
"summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
"highlights": [
"新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
"改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
"Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
"修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
"将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
],
"keywords": [
"FreshRSS",
"用户修改日期排序",
"高级搜索表单",
"Capy Reader",
"Docker",
"Debian 13 Trixie",
"PHP 8.4.11",
"OpenID Connect"
],
"topics": [
"开源软件",
"RSS 阅读器",
"版本发布",
"软件开发",
"系统维护"
],
"category": "资讯",
"worth_keeping": true,
"reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
}
}

Some files were not shown because too many files have changed in this diff Show More