diff --git a/.gitignore b/.gitignore index 525960f..babd03b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -.claude/ +.claude/ .codex/ __pycache__/ *.pyc +.env.local + diff --git a/README.md b/README.md index 4890853..be6b00f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Content Extract MCP +# Content Extract MCP Python MCP scaffold for article content extraction, structured summary validation, deterministic filtering, and Markdown sink output. @@ -18,16 +18,16 @@ The server exposes three tools: Validate an LLM summary result: ```bash -validate-llm-result outputs/result.json --extracted outputs/read-flow-2026.extracted.json +validate-llm-result outputs/reference/summary/result.json --extracted outputs/reference/extracted/read-flow-2026.extracted.json ``` Run the minimal extraction-to-summary loop: ```bash python scripts/run_summary_loop.py ^ - --extracted outputs/read-flow-2026.extracted.json ^ - --prompt outputs/llm-summary-prompt.txt ^ - --output outputs/result.json + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --prompt outputs/prompts/llm-summary-prompt.txt ^ + --output outputs/reference/summary/result.loop.json ``` Pull FreshRSS entries and map them into normalized `item` objects: @@ -41,8 +41,8 @@ python scripts/pull_freshrss_items.py --limit 5 The script writes: -- `outputs/freshrss.raw.json` -- `outputs/freshrss.items.json` +- `outputs/freshrss/raw/freshrss.raw.json` +- `outputs/freshrss/items/freshrss.items.json` Pull FreshRSS entries and run content extraction for each mapped item: @@ -55,37 +55,66 @@ python scripts/run_freshrss_extract.py --limit 1 The script writes: -- `outputs/freshrss.raw.json` -- `outputs/freshrss.items.json` -- `outputs/freshrss.extracted.json` +- `outputs/freshrss/raw/freshrss.raw.json` +- `outputs/freshrss/items/freshrss.items.json` +- `outputs/freshrss/extracted/freshrss.extracted.json` Run deterministic filter rules against a structured summary result: ```bash python scripts/run_filter_rules.py ^ - --summary outputs/result.json ^ - --extracted outputs/read-flow-2026.extracted.json ^ - --output outputs/filter-decision.json + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --output outputs/reference/filter/filter-decision.json ``` You can optionally pass a context file to inject interest topics or source tags: ```bash python scripts/run_filter_rules.py ^ - --summary outputs/result.json ^ - --extracted outputs/read-flow-2026.extracted.json ^ - --context outputs/filter-context.json ^ - --output outputs/filter-decision.with-context.json + --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 ``` Write a filtered result into the Markdown sink: ```bash python scripts/run_markdown_sink.py ^ - --summary outputs/result.json ^ - --extracted outputs/read-flow-2026.extracted.json ^ - --filter outputs/filter-decision.json + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --filter outputs/reference/filter/filter-decision.json ``` The script writes markdown notes under `knowledge-base/`. +Build an internal `ArticleCandidateRecord` and a slim `OpenClawCandidateInput`: + +```bash +python scripts/run_article_candidate.py ^ + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --filter outputs/reference/filter/filter-decision.json ^ + --section-hint tools_and_workflows +``` + +The script writes by default: + +- `outputs/reference/candidates/article-candidate-record.json` +- `outputs/reference/candidates/openclaw-candidate-input.json` + +Build a batch OpenClaw delivery payload: + +```bash +python scripts/build_openclaw_delivery.py ^ + --input-dir outputs/freshrss/candidates/batch ^ + --sort-by-rank ^ + --date 2026-03-25 +``` + +The script writes by default: + +- `outputs/reference/candidates/openclaw-delivery-payload.json` + +Output layout details live in `outputs/README.md`. \ No newline at end of file diff --git a/TODO.md b/TODO.md index 3e4d232..31dd431 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,8 @@ -# TODO +# TODO ## 当前状态 -项目当前处于 `Content Extract MCP` 的 MVP 完成,已进入规则过滤与 Markdown sink 阶段。 +项目当前处于 `Content Extract MCP` 的 MVP 完成阶段,已验证 `规则过滤 + Markdown sink`,下一阶段将转向 `OpenClaw 日报聚合 + 知识沉淀` 改造。 已完成: @@ -25,6 +25,8 @@ - [x] 实现第一版规则引擎与过滤 MCP tool - [x] 定义 sink 输入输出 schema - [x] 实现第一版 Markdown sink 与本地写入脚本 +- [x] 明确下一阶段主路径应调整为 `候选材料 -> 日报 -> 人工确认 -> 知识沉淀` +- [x] 明确 `ArticleCandidateRecord` 与 `OpenClawCandidateInput` 需要分层设计 --- @@ -45,14 +47,26 @@ - [x] 跑通 `FreshRSS -> item -> content extraction` 单条链路 - [x] 定义规则过滤层的输入输出 schema - [x] 设计知识库入库格式 -- [ ] 设计 webhook / 推送格式 +- [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` 误判规则,避免仅因正文提到“付费/收费”就进入高优先级 `review` --- ## P2 - 后续增强项 +- [ ] 将当前 `Markdown sink` 调整为 debug / fallback 能力,而非主路径 +- [ ] 增加按天批量收集 `ArticleCandidateRecord` 的脚本 +- [ ] 让 OpenClaw 聚合候选内容并生成日报 +- [ ] 将日报写入知识库,并同步生成面向用户的汇报消息 - [ ] 增加批量提取能力 - [ ] 引入 Playwright 作为动态页面兜底抓取方案 - [ ] 支持更多 `content_kind`,例如 `release`、`thread`、`video` @@ -65,16 +79,21 @@ ## 当前建议的下一步 -优先做这两件事: +优先做这三件事: -1. 设计 webhook / 推送格式 -2. 细化过滤规则并引入更多个性化上下文 +1. 设计 OpenClaw webhook / delivery payload 的实际传输方式 +2. 收敛 `paywall` 误判规则 +3. 设计人工确认后进入知识库的状态流转 --- ## 收束上下文后建议先看 -- docs/context-reset-brief.md -- docs/filter-rule-engine-design.md -- docs/markdown-sink-design.md -- TODO.md +- docs/current/context-reset-brief.md +- docs/openclaw/openclaw-candidate-input-field-spec.md +- docs/openclaw/openclaw-delivery-payload-spec.md +- docs/openclaw/openclaw-daily-digest-refactor.md +- docs/openclaw/article-candidate-daily-digest-schema.md +- docs/design/filter-rule-engine-design.md +- docs/design/markdown-sink-design.md +- TODO.md \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 128e36f..d3fc793 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,20 +1,43 @@ -# 文档索引 +# 文档索引 + +## 当前目录结构 + +- `docs/README.md` + - 文档总索引 +- `docs/current/` + - 当前状态、收束入口、阶段导航 +- `docs/design/` + - 当前实现的设计文档 +- `docs/openclaw/` + - OpenClaw 日报聚合与下游对象设计 +- `docs/notes/` + - 较上层的方案笔记与非最终设计 +- `docs/archive/` + - 历史归档,不作为最新事实来源 ## 当前推荐阅读顺序 -1. `context-reset-brief.md` +1. `docs/current/context-reset-brief.md` - 当前真实进度与下一步入口 -2. `summary-mcp-service-design.md` +2. `docs/openclaw/openclaw-candidate-input-field-spec.md` + - 提供给 OpenClaw 的单篇结构化输入字段说明 +3. `docs/openclaw/openclaw-delivery-payload-spec.md` + - 提供给 OpenClaw 的批量投递 envelope 说明 +4. `docs/design/summary-mcp-service-design.md` - 当前 MCP 服务的职责、接口和边界 -3. `filter-rule-engine-design.md` +5. `docs/design/filter-rule-engine-design.md` - 过滤层的输入输出、规则结构与当前实现 -4. `markdown-sink-design.md` +6. `docs/design/markdown-sink-design.md` - 第一版 Markdown sink 的输入输出、目录结构与落地方式 -5. `source-schema-design.md` +7. `docs/openclaw/openclaw-daily-digest-refactor.md` + - 为什么要从单篇入库改成 OpenClaw 日报聚合链路 +8. `docs/openclaw/article-candidate-daily-digest-schema.md` + - `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` 的正式设计 +9. `docs/design/source-schema-design.md` - `source -> item -> document` 的对象设计 -6. `reading-pipeline-design-notes.md` +10. `docs/notes/reading-pipeline-design-notes.md` - 更上层的阅读流方案与阶段划分 -7. `summary-loop-explained.md` +11. `docs/design/summary-loop-explained.md` - 当前 LLM 摘要校验闭环的解释 ## 当前文档分层 @@ -25,39 +48,51 @@ - 仓库入口与脚本运行方式 - `TODO.md` - 当前优先级、已完成项、下一阶段任务 -- `docs/context-reset-brief.md` +- `docs/current/context-reset-brief.md` - 当前阶段状态的最短摘要 - `docs/README.md` - 文档索引与阅读顺序 ### 2. 当前实现设计 -- `docs/summary-mcp-service-design.md` +- `docs/design/summary-mcp-service-design.md` - 当前内容提取 MCP 的真实设计 -- `docs/summary-core-interface-design.md` +- `docs/design/summary-core-interface-design.md` - 摘要/提取内核的接口抽象 -- `docs/source-schema-design.md` +- `docs/design/source-schema-design.md` - `source`、`item`、`document` 三层 schema -- `docs/summary-loop-explained.md` +- `docs/design/summary-loop-explained.md` - 提取 JSON -> LLM 摘要 JSON -> 校验 的闭环说明 -- `docs/filter-rule-engine-design.md` +- `docs/design/filter-rule-engine-design.md` - 第一版规则过滤引擎设计与落地位置 -- `docs/markdown-sink-design.md` +- `docs/design/markdown-sink-design.md` - 第一版 Markdown sink 设计与落地位置 -### 3. 上下游方案设计 +### 3. OpenClaw 与下游设计 -- `docs/reading-pipeline-design-notes.md` +- `docs/openclaw/openclaw-candidate-input-field-spec.md` + - 提供给 OpenClaw 的单篇结构化输入字段说明 +- `docs/openclaw/openclaw-delivery-payload-spec.md` + - 提供给 OpenClaw 的批量投递 envelope 说明 +- `docs/openclaw/openclaw-daily-digest-refactor.md` + - 改造为 OpenClaw 日报聚合链路的原因与目标结构 +- `docs/openclaw/article-candidate-daily-digest-schema.md` + - `ArticleCandidateRecord`、`OpenClawCandidateInput` 与 `DailyDigest` 的字段设计与对象关系 + +### 4. 方案笔记 + +- `docs/notes/reading-pipeline-design-notes.md` - 整体阅读流、规则、sink、push 的方案笔记 -### 4. 历史归档 +### 5. 历史归档 -- `docs/content-extract-mcp-mvp-archive.md` +- `docs/archive/content-extract-mcp-mvp-archive.md` - MVP 阶段归档,部分状态已被后续进展覆盖 ## 当前文档维护原则 -- `context-reset-brief.md` 记录当前最新状态 +- `docs/current/context-reset-brief.md` 记录当前最新状态 - `TODO.md` 记录任务优先级与下一步 -- `content-extract-mcp-mvp-archive.md` 只当历史快照,不再作为最新事实来源 -- 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`context-reset-brief.md` +- `outputs/README.md` 记录当前输出目录约定 +- `docs/archive/content-extract-mcp-mvp-archive.md` 只当历史快照,不再作为最新事实来源 +- 新增阶段性进展,优先更新 `README.md`、`TODO.md`、`docs/current/context-reset-brief.md` \ No newline at end of file diff --git a/docs/content-extract-mcp-mvp-archive.md b/docs/archive/content-extract-mcp-mvp-archive.md similarity index 100% rename from docs/content-extract-mcp-mvp-archive.md rename to docs/archive/content-extract-mcp-mvp-archive.md diff --git a/docs/context-reset-brief.md b/docs/current/context-reset-brief.md similarity index 94% rename from docs/context-reset-brief.md rename to docs/current/context-reset-brief.md index 9b64556..8dd4d81 100644 --- a/docs/context-reset-brief.md +++ b/docs/current/context-reset-brief.md @@ -1,4 +1,4 @@ -# 项目当前状态简报 +# 项目当前状态简报 ## 当前已完成 @@ -60,11 +60,11 @@ - Markdown sink 脚本: - `scripts/run_markdown_sink.py` - Markdown sink 文档: - - `docs/markdown-sink-design.md` + - `docs/design/markdown-sink-design.md` - 当前提示词: - - `outputs/llm-summary-prompt.txt` + - `outputs/prompts/llm-summary-prompt.txt` - 过滤结果样例: - - `outputs/filter-decision.json` + - `outputs/reference/filter/filter-decision.json` - 文档索引: - `docs/README.md` - 当前 TODO: @@ -99,4 +99,4 @@ ## 一句话结论 -当前 MVP 已完成,FreshRSS 上游、第一版规则过滤层和第一版 Markdown sink 都已接通,下一阶段应转向推送层与更完整的下游集成。 +当前 MVP 已完成,FreshRSS 上游、第一版规则过滤层和第一版 Markdown sink 都已接通,下一阶段应转向推送层与更完整的下游集成。 \ No newline at end of file diff --git a/docs/filter-rule-engine-design.md b/docs/design/filter-rule-engine-design.md similarity index 95% rename from docs/filter-rule-engine-design.md rename to docs/design/filter-rule-engine-design.md index 2ff7099..870135b 100644 --- a/docs/filter-rule-engine-design.md +++ b/docs/design/filter-rule-engine-design.md @@ -1,4 +1,4 @@ -# 规则过滤引擎设计 +# 规则过滤引擎设计 ## 1. 目标 @@ -169,9 +169,9 @@ ```bash python scripts/run_filter_rules.py ^ - --summary outputs/result.json ^ - --extracted outputs/read-flow-2026.extracted.json ^ - --output outputs/filter-decision.json + --summary outputs/reference/summary/result.loop.json ^ + --extracted outputs/reference/extracted/read-flow-2026.extracted.json ^ + --output outputs/reference/filter/filter-decision.json ``` ### 9.2 带上下文的调用 diff --git a/docs/markdown-sink-design.md b/docs/design/markdown-sink-design.md similarity index 100% rename from docs/markdown-sink-design.md rename to docs/design/markdown-sink-design.md diff --git a/docs/source-schema-design.md b/docs/design/source-schema-design.md similarity index 100% rename from docs/source-schema-design.md rename to docs/design/source-schema-design.md diff --git a/docs/summary-core-interface-design.md b/docs/design/summary-core-interface-design.md similarity index 100% rename from docs/summary-core-interface-design.md rename to docs/design/summary-core-interface-design.md diff --git a/docs/summary-loop-explained.md b/docs/design/summary-loop-explained.md similarity index 89% rename from docs/summary-loop-explained.md rename to docs/design/summary-loop-explained.md index a23940c..aa6acd7 100644 --- a/docs/summary-loop-explained.md +++ b/docs/design/summary-loop-explained.md @@ -1,4 +1,4 @@ -# Summary Loop 工作说明 +# Summary Loop 工作说明 ## 1. 目的 @@ -15,7 +15,7 @@ 这个闭环由三部分组成: - 提取结果 - - 来自 `outputs/*.extracted.json` + - 来自 `outputs/reference/extracted/*.json` 或 `outputs/freshrss/extracted/*.json` - 提供标题、链接、正文、质量标记 - LLM 摘要 @@ -53,8 +53,8 @@ 脚本主要使用两个输入文件: -- 提取结果:`outputs/read-flow-2026.extracted.json` -- 摘要 prompt:`outputs/llm-summary-prompt.txt` +- 提取结果:`outputs/reference/extracted/read-flow-2026.extracted.json` +- 摘要 prompt:`outputs/prompts/llm-summary-prompt.txt` 提取结果不会整包无差别塞给 LLM,而是先裁剪成更小的摘要输入: @@ -187,16 +187,16 @@ validator 每次执行脚本都会在输出目录下留下调试痕迹: -- `result.loop.attempt-1.raw.txt` +- `outputs/reference/summary/result.loop.attempt-1.raw.txt` - 模型原始输出 -- `result.loop.attempt-1.json` +- `outputs/reference/summary/result.loop.attempt-1.json` - 提取出的 JSON 结果 -- `result.loop.attempt-1.validation.json` +- `outputs/reference/summary/result.loop.attempt-1.validation.json` - 这一轮的校验报告 -- `result.loop.json` +- `outputs/reference/summary/result.loop.json` - 当前最终结果 这些文件的价值是: diff --git a/docs/summary-mcp-service-design.md b/docs/design/summary-mcp-service-design.md similarity index 100% rename from docs/summary-mcp-service-design.md rename to docs/design/summary-mcp-service-design.md diff --git a/docs/reading-pipeline-design-notes.md b/docs/notes/reading-pipeline-design-notes.md similarity index 100% rename from docs/reading-pipeline-design-notes.md rename to docs/notes/reading-pipeline-design-notes.md diff --git a/docs/openclaw/article-candidate-daily-digest-schema.md b/docs/openclaw/article-candidate-daily-digest-schema.md new file mode 100644 index 0000000..b0b79b8 --- /dev/null +++ b/docs/openclaw/article-candidate-daily-digest-schema.md @@ -0,0 +1,488 @@ +# Article Candidate / OpenClaw Input / Daily Digest 设计 + +## 1. 文档目的 + +本文档正式定义 OpenClaw 日报链路中的三层对象: + +- `ArticleCandidateRecord` +- `OpenClawCandidateInput` +- `DailyDigest` + +目标不是只定义字段,而是明确每一层对象的职责边界,避免把“内部记录对象”和“发给 OpenClaw 的下游输入对象”混成同一个 payload。 + +--- + +## 2. 这次为什么要改 + +前一版设计里,`article_candidate` 同时承担了三种职责: + +1. 本地审计与追溯 +2. 规则过滤后的内部候选记录 +3. 发给 OpenClaw 的下游输入 + +这会直接带来三个问题: + +- 字段过重 + - `article.plain_text` 这类正文内容会显著增加 token 消耗 +- 字段过细 + - `filter_decision.matches`、`matched_rules`、`labels` 这类规则证据链更适合本地审计,不适合发给下游聚合器 +- 字段过耦合 + - `source_refs` 是本地文件系统路径,对 OpenClaw 没有意义,反而会让上下游绑定内部实现 + +批量跑完 `FreshRSS -> extraction -> LLM summary -> filter -> article_candidate` 后,这个问题已经非常清楚: + +- 本地对象需要尽量保留信息,便于追溯误判 +- OpenClaw 输入需要尽量精简,便于聚合日报和控制 token + +因此,正确改法不是继续给一个 `article_candidate` 做加减法,而是把对象拆层。 + +--- + +## 3. 设计结论 + +建议正式拆成三层: + +### 3.1 `ArticleCandidateRecord` + +定位: + +- 内部候选记录对象 +- 面向本地留档、审计、调试、复跑 + +它回答的问题是: + +- 这条候选内容从哪里来 +- 提取、摘要、过滤各阶段到底产出了什么 +- 为什么规则引擎会给出当前决策 +- 后续如果要重放或排查,该去哪里追溯 + +### 3.2 `OpenClawCandidateInput` + +定位: + +- 发给 OpenClaw 的精简输入对象 +- 面向日报聚合与编排 + +它回答的问题是: + +- 这条内容是什么 +- 为什么值得放进候选池 +- 应该如何排序和栏目化 + +它不负责保存本地调试信息,也不负责承载完整正文。 + +### 3.3 `DailyDigest` + +定位: + +- OpenClaw 聚合后的日级主产物 +- 面向日报汇报、知识沉淀、人工 review + +它回答的问题是: + +- 今天最值得关注的内容是什么 +- 这些内容能提炼出什么结论 +- 哪些内容值得进入长期知识库 + +--- + +## 4. 推荐链路 + +推荐把链路明确为: + +`item -> article -> summary -> filter_result -> ArticleCandidateRecord -> OpenClawCandidateInput -> DailyDigest` + +这里有两个关键转换: + +1. `summary + filter_result` 先生成 `ArticleCandidateRecord` + - 这是内部标准记录 +2. `ArticleCandidateRecord` 再投影成 `OpenClawCandidateInput` + - 这是跨系统传输对象 + +这样做的本质是: + +- 内部对象追求可追溯 +- 下游对象追求低耦合、低 token、高可消费性 + +--- + +## 5. `ArticleCandidateRecord` 设计 + +### 5.1 角色定义 + +`ArticleCandidateRecord` 是当前项目内部的正式候选记录对象。 + +它不是: + +- 发给 OpenClaw 的最终 payload +- 发给用户的日报消息 +- 最终知识库对象 + +它是下游所有再加工动作之前的“内部事实底稿”。 + +### 5.2 设计原则 + +- 保留上游对象,便于调试和重放 +- 保留规则证据链,便于解释误判 +- 保留本地引用,便于审计 +- 允许后续重新生成不同版本的下游 payload + +### 5.3 建议字段 + +```json +{ + "candidate_id": "cand:sha256:xxx", + "item": {"...": "Item"}, + "article": {"...": "ExtractedArticle"}, + "summary": {"...": "LlmSummaryResult"}, + "filter_result": {"...": "FilterDecisionResult"}, + "digest_section_hint": "insights", + "digest_rank": 60, + "review_state": "pending", + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T10:00:00Z", + "pipeline_version": "v2", + "producer": "summary_mcp", + "run_id": "candidate-2026-03-25-001" + }, + "source_refs": { + "item_path": "outputs/freshrss/items/batch/item-01.item.json", + "extracted_path": "outputs/freshrss/extracted/batch/item-01.extracted.json", + "summary_path": "outputs/freshrss/summary/batch/item-01/result.loop.json", + "filter_path": "outputs/freshrss/filter/batch/item-01.filter.json" + } +} +``` + +### 5.4 字段说明 + +- `candidate_id` + - 候选记录唯一标识 + - 建议基于 `item_id` 或 `extract_id` 派生 + +- `item` + - 保留来源、标题、发布时间、作者等上游元数据 + +- `article` + - 保留正文提取结果与质量标记 + - 供本地调试与重放使用 + +- `summary` + - 保留结构化摘要结果 + - 是后续 OpenClaw 输入映射的主要来源 + +- `filter_result` + - 保留规则引擎的完整裁决与命中细节 + - 主要用于解释和排查 + +- `digest_section_hint` + - 给 OpenClaw 的栏目建议 + +- `digest_rank` + - 给 OpenClaw 的排序信号 + +- `review_state` + - 记录人工复核状态 + +- `rendered_markdown` + - 可选的人类可读卡片 + - 用于调试或 fallback 展示 + +- `metadata` + - 记录运行时元信息 + +- `source_refs` + - 仅用于本地追溯 + - 不应进入跨系统 payload + +### 5.5 为什么内部对象要保留正文和完整过滤结果 + +因为这层对象不是给 OpenClaw 直接消费的,而是给系统内部留档的。 + +如果这里过早裁掉字段,会丢失两种关键能力: + +1. 误判排查能力 + - 例如文章被误判为 `paywall` 时,必须能回看 `article` 与 `filter_result` +2. 下游重放能力 + - 后面如果调整了 OpenClaw payload 或摘要策略,可以从这层重新投影,而不必重新抓取全文 + +--- + +## 6. `OpenClawCandidateInput` 设计 + +### 6.1 角色定义 + +`OpenClawCandidateInput` 是当前项目发给 OpenClaw 的正式输入对象。 + +它应当是: + +- 扁平化的 +- 精简的 +- 稳定的 +- 不依赖本地文件路径的 + +### 6.2 设计原则 + +- 不携带正文全文 +- 不携带规则引擎的完整证据链 +- 不携带本地 `source_refs` +- 只保留 OpenClaw 聚合日报真正需要的字段 + +### 6.3 建议字段 + +```json +{ + "candidate_id": "cand:sha256:xxx", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的套壳疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "published_at": "2026-03-21T10:19:11Z", + "author": "阮一峰", + "source_name": "阮一峰博客", + "summary": "2 到 3 句话摘要", + "highlights": ["...", "...", "..."], + "keywords": ["Cursor", "Kimi K2.5"], + "topics": ["人工智能", "商业伦理"], + "category": "观点评论", + "worth_keeping": true, + "worth_reason": "有持续性的行业洞察价值", + "selection_decision": "review", + "selection_reason": "worth_keeping=true but no stronger keep rule matched", + "digest_section_hint": "insights", + "digest_rank": 60 +} +``` + +### 6.4 字段说明 + +- `candidate_id` + - 与内部记录保持同一主键,便于回溯 + +- `title` / `url` / `published_at` / `author` / `source_name` + - OpenClaw 做日报聚合所需的最小来源信息 + +- `summary` / `highlights` / `keywords` / `topics` / `category` + - OpenClaw 聚合时真正需要的语义材料 + +- `worth_keeping` / `worth_reason` + - 摘要层提供的长期价值判断信号 + +- `selection_decision` / `selection_reason` + - 规则层的压缩结果 + - 用于告诉 OpenClaw:这条为什么进入候选池,以及应该怎样对待 + +- `digest_section_hint` / `digest_rank` + - OpenClaw 做栏目化和排序时最直接的信号 + +### 6.5 为什么不用正文全文 + +因为 OpenClaw 当前承担的是“日报聚合”角色,不是“再次全文阅读器”。 + +如果把 `article.plain_text` 一并发给 OpenClaw,会出现三个问题: + +1. token 浪费 + - 每条都携带全文,批量聚合时成本会迅速膨胀 +2. 角色混乱 + - OpenClaw 会被迫重新阅读原文,而不是消费上游已经压缩好的摘要结果 +3. 输入不稳定 + - 正文长度差异很大,会让聚合阶段的上下文更难控制 + +因此,正文应保留在 `ArticleCandidateRecord`,而不是进入 `OpenClawCandidateInput`。 + +### 6.6 为什么过滤结果要压缩 + +完整的 `filter_result` 适合本地审计,不适合跨系统传输。 + +OpenClaw 通常只需要知道: + +- 这条是 `keep / review / drop` 中的哪一种 +- 为什么会进入候选池 +- 优先级大概是多少 + +它通常不需要知道: + +- 具体命中了哪几条规则 +- 每条规则携带了哪些 labels +- 完整的 `matches` 证据链 + +所以建议把规则层压缩为: + +- `selection_decision` +- `selection_reason` +- `digest_rank` + +### 6.7 为什么不要 `source_refs` + +因为 `source_refs` 是本地实现细节,不是业务语义。 + +把它发给 OpenClaw 的问题有两个: + +1. 没价值 + - OpenClaw 无法消费本地磁盘路径 +2. 高耦合 + - 这会让 OpenClaw 输入隐式依赖当前项目的目录结构与输出命名方式 + +因此,`source_refs` 应只保留在 `ArticleCandidateRecord`。 + +--- + +## 7. 两个对象之间的映射关系 + +建议映射规则如下: + +- `OpenClawCandidateInput.candidate_id` + - 来自 `ArticleCandidateRecord.candidate_id` +- `title` / `url` / `published_at` / `author` + - 优先来自 `item` +- `source_name` + - 优先来自 `item.source_title`,没有时可退化为域名或作者来源 +- `summary` / `highlights` / `keywords` / `topics` / `category` + - 来自 `summary` +- `worth_keeping` / `worth_reason` + - 来自 `summary.worth_keeping` 与 `summary.reason` +- `selection_decision` + - 来自 `filter_result.decision` +- `selection_reason` + - 可取 `filter_result.reasons[0]` 或压缩后的组合说明 +- `digest_section_hint` + - 来自 `ArticleCandidateRecord.digest_section_hint` +- `digest_rank` + - 来自 `ArticleCandidateRecord.digest_rank` + +简化理解: + +- `ArticleCandidateRecord` 保留证据 +- `OpenClawCandidateInput` 保留结论 + +--- + +## 8. `DailyDigest` 设计 + +### 8.1 角色定义 + +`DailyDigest` 是 OpenClaw 聚合多个 `OpenClawCandidateInput` 后形成的日级主产物。 + +它不应该再携带单篇全文,也不应该回退到内部调试结构。 + +### 8.2 建议字段 + +```json +{ + "digest_id": "digest:2026-03-25", + "date": "2026-03-25", + "title": "2026-03-25 阅读日报", + "summary": "今天的输入主要围绕 AI 工具、工程实践和软件产品策略展开。", + "sections": [ + { + "section_id": "insights", + "title": "观察与判断", + "summary": "今天更值得关注的是 AI 对软件行业护城河和商业包装的影响。", + "items": [ + { + "candidate_id": "cand:sha256:xxx", + "title": "文章标题", + "summary": "单篇摘要压缩版", + "why_it_matters": "为什么今天值得被放进这个栏目", + "action": "值得继续跟进" + } + ] + } + ], + "top_items": ["cand:sha256:xxx"], + "key_takeaways": [ + "摘要层和知识沉淀层应分开。", + "规则证据链应保留在本地,而不是直接下发给聚合器。" + ], + "watchlist": [ + "继续收敛 paywall 误判。" + ], + "candidate_ids": ["cand:sha256:xxx"], + "source_refs": [ + { + "candidate_id": "cand:sha256:xxx", + "url": "https://example.com/post/1" + } + ], + "editor_notes": "今天的输入以观点和周刊类内容为主。", + "stats": { + "candidate_total": 12, + "kept_total": 4, + "review_total": 6, + "dropped_total": 2 + }, + "metadata": { + "generated_at": "2026-03-25T21:00:00Z", + "producer": "openclaw", + "pipeline_version": "v2" + } +} +``` + +### 8.3 `sections.items[]` 子结构建议 + +```json +{ + "candidate_id": "cand:sha256:xxx", + "title": "文章标题", + "summary": "单篇摘要压缩版", + "why_it_matters": "为什么这条内容今天值得看", + "action": "值得试用 / 值得跟进 / 值得收藏 / 待验证" +} +``` + +这里最关键的不是原始摘要复述,而是 `why_it_matters`。 + +因为日报的价值不在于再列一遍新闻,而在于表达“今天为什么值得看”。 + +--- + +## 9. 为什么这样设计更合理 + +### 9.1 控制 token 成本 + +把正文全文挡在 OpenClaw 之前,能显著降低聚合阶段的 token 开销。 + +### 9.2 保持对象职责单一 + +- `ArticleCandidateRecord` 负责本地审计 +- `OpenClawCandidateInput` 负责下游消费 +- `DailyDigest` 负责日级成品 + +每层只做一件事,后续更容易演进。 + +### 9.3 降低上下游耦合 + +OpenClaw 不需要知道本地 `outputs/` 目录结构,也不应该依赖规则引擎的内部细节。 + +### 9.4 保留调试与重放能力 + +内部对象依然保留全文、质量标记、完整过滤证据链,因此不会因为“下游精简”而损失工程可维护性。 + +### 9.5 为后续人审与知识库沉淀留出口 + +当日报和知识库真正接起来时: + +- OpenClaw 基于精简输入做日报聚合 +- 人工基于日报成品做最终判断 +- 本地记录对象作为审计底稿长期保留 + +这个边界是清晰且可持续的。 + +--- + +## 10. 当前阶段的实现建议 + +建议按这个顺序推进: + +1. 在文档层正式采用这三个对象 +2. 将当前代码里的 `article_candidate` 重命名或重新定位为 `ArticleCandidateRecord` +3. 新增 `OpenClawCandidateInput` 模型 +4. 增加 `ArticleCandidateRecord -> OpenClawCandidateInput` 的转换逻辑 +5. 让 OpenClaw 只消费精简输入对象 +6. 后续再补 `DailyDigest` 的真实生成逻辑 + +--- + +## 11. 一句话结论 + +这次改动的本质,不是“删掉几个字段”,而是把“内部候选记录对象”和“发给 OpenClaw 的精简输入对象”彻底分层;只有这样,当前项目才能同时保留审计能力、控制 token 成本,并稳定服务 OpenClaw 的日报聚合。 \ No newline at end of file diff --git a/docs/openclaw/openclaw-candidate-input-field-spec.md b/docs/openclaw/openclaw-candidate-input-field-spec.md new file mode 100644 index 0000000..567ec04 --- /dev/null +++ b/docs/openclaw/openclaw-candidate-input-field-spec.md @@ -0,0 +1,351 @@ +# OpenClaw Candidate Input 字段说明 + +## 1. 文档目的 + +本文档定义当前项目输出给 OpenClaw 的结构化输入对象:`OpenClawCandidateInput`。 + +这是一份面向 OpenClaw 消费侧的接口说明文档,不要求了解本项目内部的 `item`、`article`、`filter_result` 等实现细节。 + +当前定位是: + +- 单篇候选内容的精简输入 +- 用于 OpenClaw 做日报聚合、排序、栏目分配和后续汇报 +- 不承载正文全文、不承载本地文件路径、不承载规则引擎完整证据链 + +--- + +## 2. 设计原则 + +这个 payload 的设计遵循以下原则: + +1. 足够轻 + - 不发送正文全文,避免浪费 token +2. 足够稳定 + - 不暴露本地目录结构和内部中间文件路径 +3. 足够可消费 + - 字段扁平化,避免 OpenClaw 反复解析嵌套对象 +4. 足够有判断信号 + - 保留摘要、主题、价值判断、筛选结果、排序信号 +5. 足够可去重 + - 同时提供原始 `url` 与归一化后的 `canonical_url` + +--- + +## 3. 完整 JSON 示例 + +```json +{ + "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html?utm_source=rss", + "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "published_at": "2026-03-21T10:19:11Z", + "author": "阮一峰", + "source_name": "阮一峰的网络日志", + "language": "zh-CN", + "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亿美元的估值。" + ], + "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": "insights", + "digest_rank": 60 +} +``` + +--- + +## 4. 字段总览 + +| 字段名 | 类型 | 必填 | 说明 | +| --- | --- | --- | --- | +| `candidate_id` | `string` | 是 | 单篇候选内容唯一标识 | +| `title` | `string` | 是 | 文章或内容标题 | +| `url` | `string` | 是 | 原始链接 | +| `canonical_url` | `string \| null` | 否 | 归一化链接,用于更稳定的去重 | +| `published_at` | `string \| null` | 否 | 发布时间,ISO 8601 格式 | +| `author` | `string \| null` | 否 | 作者名 | +| `source_name` | `string \| null` | 否 | 来源名称,例如博客名、站点名、Feed 名 | +| `language` | `string \| null` | 否 | 语言标记,例如 `zh-CN`、`en` | +| `summary` | `string` | 是 | 2 到 3 句话的精简摘要 | +| `highlights` | `string[]` | 是 | 3 到 5 条单句要点 | +| `keywords` | `string[]` | 是 | 5 到 8 个关键词 | +| `topics` | `string[]` | 是 | 3 到 5 个高层主题标签 | +| `category` | `string` | 是 | 内容分类 | +| `worth_keeping` | `boolean` | 是 | 摘要层给出的长期保留判断 | +| `worth_reason` | `string` | 是 | 对 `worth_keeping` 的解释 | +| `selection_decision` | `string` | 是 | 规则层压缩后的筛选决策 | +| `selection_reason` | `string \| null` | 否 | 对 `selection_decision` 的简短解释 | +| `digest_section_hint` | `string \| null` | 否 | 建议栏目 | +| `digest_rank` | `integer` | 是 | 建议排序分值,范围 `0-100` | + +--- + +## 5. 字段详细说明 + +### 5.1 `candidate_id` + +含义: +- 单篇候选内容的稳定唯一标识 + +约束: +- 同一条上游内容在当前系统中应保持稳定 +- OpenClaw 可以把它作为去重、回溯、引用的主键 + +### 5.2 `title` + +含义: +- 候选内容标题 + +来源: +- 优先来自标准化 `item.title` +- 如果上游标题缺失,则退回摘要结果中的 `summary.title` + +### 5.3 `url` + +含义: +- 原始内容链接 + +用途: +- OpenClaw 在日报中回链原文 +- 后续人工 review 或知识库引用时回溯来源 + +### 5.4 `canonical_url` + +含义: +- 对原始 `url` 做轻量归一化后的链接 + +当前归一化策略: +- 去掉 fragment +- 去掉常见追踪参数,例如 `utm_*`、`fbclid`、`gclid`、`ref` 等 +- 保留其他非追踪 query 参数 + +用途: +- 让 OpenClaw 在去重时更稳定 +- 避免同一篇文章因为带不同追踪参数被当成两篇 + +说明: +- `url` 保留原始值,`canonical_url` 提供去重辅助 +- OpenClaw 建议优先用 `canonical_url` 做去重键,不足时再结合 `candidate_id` + +### 5.5 `published_at` + +含义: +- 内容发布时间 + +格式: +- ISO 8601,例如 `2026-03-21T10:19:11Z` + +### 5.6 `author` + +含义: +- 作者名称 + +### 5.7 `source_name` + +含义: +- 内容来源名称 + +常见示例: +- `阮一峰的网络日志` +- `FreshRSS` +- 某个 Feed 标题 +- 某个站点域名 + +### 5.8 `language` + +含义: +- 语言标记 + +常见示例: +- `zh` +- `zh-CN` +- `en` + +用途: +- OpenClaw 后续处理多语言输入时做风格和分类控制 +- 为知识库入库、多语言日报、翻译或过滤策略留出口 + +说明: +- 如果当前上游无法可靠识别语言,可以为 `null` + +### 5.9 `summary` + +含义: +- 摘要主文本 + +约束: +- 当前上游约束是 2 到 3 句话 +- 长度不超过 140 个中文字符 + +### 5.10 `highlights` + +含义: +- 关键要点列表 + +约束: +- 3 到 5 条 +- 每条一条独立信息 + +### 5.11 `keywords` + +含义: +- 具体实体、工具名、方法名、关键概念 + +约束: +- 5 到 8 个 + +### 5.12 `topics` + +含义: +- 高层主题标签 + +约束: +- 3 到 5 个 +- 语义层级高于 `keywords` + +### 5.13 `category` + +含义: +- 内容分类 + +当前允许值: +- `资讯` +- `方法论` +- `工具实践` +- `观点评论` + +### 5.14 `worth_keeping` + +含义: +- 这条内容是否具有持续保留价值 + +说明: +- 这是摘要层的价值判断,不是最终入库决定 +- OpenClaw 可以把它当作优先筛选信号,而不是绝对真值 + +### 5.15 `worth_reason` + +含义: +- 对 `worth_keeping` 的解释 + +### 5.16 `selection_decision` + +含义: +- 规则引擎压缩后的筛选决策 + +当前允许值: +- `keep` +- `review` +- `drop` + +### 5.17 `selection_reason` + +含义: +- 对 `selection_decision` 的简短解释 + +说明: +- 当前一般取规则引擎 reasons 的第一条压缩说明 +- 不承诺包含全部规则命中细节 + +### 5.18 `digest_section_hint` + +含义: +- 建议日报栏目 + +当前允许值: +- `top_news` +- `tools_and_workflows` +- `risk_and_security` +- `open_source` +- `insights` +- `deep_dive` +- `null` + +### 5.19 `digest_rank` + +含义: +- 建议排序分值 + +范围: +- `0` 到 `100` + +建议解释: +- `80-100`:高优先级,建议优先关注 +- `50-79`:中优先级,建议正常进入候选池 +- `0-49`:低优先级,建议降权或仅保留参考 + +--- + +## 6. OpenClaw 消费建议 + +推荐 OpenClaw 主要消费这几组信号: + +### 6.1 语义聚合信号 + +- `summary` +- `highlights` +- `keywords` +- `topics` +- `category` + +### 6.2 选择与排序信号 + +- `worth_keeping` +- `worth_reason` +- `selection_decision` +- `selection_reason` +- `digest_rank` +- `digest_section_hint` + +### 6.3 来源展示信号 + +- `title` +- `url` +- `canonical_url` +- `published_at` +- `author` +- `source_name` +- `language` + +--- + +## 7. 当前不会提供的字段 + +OpenClaw 当前不应期待以下字段: + +- 正文全文,例如 `plain_text` +- 本地文件路径,例如 `source_refs` +- 完整规则证据链,例如 `filter_result.matches` +- 内部中间对象,例如完整的 `item`、`article`、`summary`、`filter_result` +- 人工确认状态,例如 `review_status`、`knowledge_decision` + +最后一类字段不会放在这个对象中,原因是: + +- `OpenClawCandidateInput` 表示的是上游候选事实 +- 人工确认和知识沉淀属于下游流程状态 +- 两者混在一起会让输入对象逐渐失真、变脏 + +--- + +## 8. 兼容性约定 + +当前版本约定: + +- 这是单篇输入对象,不是批量 envelope +- 批量投递由上层 `OpenClawDeliveryPayload` 承载 +- 本文档只约束 `candidates[]` 中单条对象的字段 + +--- + +## 9. 一句话结论 + +`OpenClawCandidateInput` 是“给 OpenClaw 聚合日报用的单篇精简对象”:它保留来源信息、摘要语义、价值判断、去重辅助和排序信号,但不会携带正文全文、本地路径、规则证据链或人工确认状态。 \ No newline at end of file diff --git a/docs/openclaw/openclaw-daily-digest-refactor.md b/docs/openclaw/openclaw-daily-digest-refactor.md new file mode 100644 index 0000000..d4c8c43 --- /dev/null +++ b/docs/openclaw/openclaw-daily-digest-refactor.md @@ -0,0 +1,222 @@ +# OpenClaw 日报聚合改造说明 + +## 1. 为什么要改 + +当前项目已经跑通了: + +`FreshRSS -> item -> extraction -> LLM summary -> validator -> filter -> Markdown sink` + +这条链路证明了上游拉取、结构化提取、摘要校验和规则过滤都是可行的。 + +但如果最终目标是: + +- 每日提炼总结进入知识库 +- OpenClaw 向用户汇报今天的日报 + +那么当前“单篇过滤后直接写入本地 Markdown 知识库”的主路径就不够准确了。 + +原因有四点: + +1. 单篇文章更像原材料,不是最终成品 +2. 用户要的是“日报级总结 + 知识沉淀”,不是“每篇都直接入库” +3. 参考文章中真正的终态是 `Digest -> Daily Review -> 人工确认 -> Lumina` +4. 当前 `article_candidate` 如果同时承担内部记录和下游投递,会导致 payload 过重、token 过高、边界混乱 + +所以当前项目要从“单篇直接入库”切换为“单篇候选材料 -> 日报聚合 -> 人工确认 -> 知识沉淀”。 + +## 2. 参考文章给出的真实结构 + +参考文章里的关键分层是: + +1. `Digest` + - 去重、抓正文、质量检查、生成摘要 + - 产出可判断的候选内容 +2. `Daily Review` + - 从候选内容中做栏目化精选 + - 产出当天的日报 +3. `Human in the loop` + - 人工判断哪些内容值得长期保留 +4. `Lumina` + - 只承接真正值得长期保留的内容 + +这意味着: + +- 日报不是知识库的替代品 +- 知识库也不应该承接所有单篇文章 +- 单篇内容更适合作为日报生成前的候选材料 + +## 3. 当前设计哪里不够 + +当前的不足主要在下游: + +### 3.1 `sink` 语义过重 + +现在的 `Markdown sink` 更像“最终入库器”。 + +但在新的目标里,它最多只应扮演: + +- debug sink +- fallback sink +- 审计/归档 sink + +主路径不应再把它视为最终知识库形态。 + +### 3.2 缺少“日级对象” + +当前项目有: + +- `item` +- `article` +- `summary` +- `filter_decision` + +但还没有: + +- `ArticleCandidateRecord` +- `OpenClawCandidateInput` +- `DailyDigest` + +如果没有这三个对象,就无法稳定表达: + +- 单篇内容如何作为内部候选材料存在 +- 单篇内容如何以低 token 的形式发给 OpenClaw +- 一天的内容如何被聚合为一个正式产物 + +### 3.3 缺少人工确认层 + +规则引擎的 `keep` 只能表示“值得进入下一步”,不能直接等价于“正式入知识库”。 + +如果没有人工确认层,系统就会退化成“规则命中即永久沉淀”,这和参考文章强调的 `Human in the loop` 不一致。 + +### 3.4 下游输入边界不清楚 + +如果把正文全文、完整规则证据链、本地文件路径都发给 OpenClaw,会出现三个直接问题: + +- token 浪费 +- 对象职责混乱 +- OpenClaw 输入与本地实现耦合 + +所以必须把“内部记录对象”和“下游精简输入对象”分开。 + +## 4. 改造后的主路径 + +建议主路径调整为: + +`FreshRSS/RSS -> extraction -> LLM summary -> validator -> rule engine -> ArticleCandidateRecord -> OpenClawCandidateInput -> OpenClaw -> DailyDigest -> human review -> knowledge base` + +这里要注意几件事: + +1. 当前项目负责生成高质量候选材料与精简输入 +2. OpenClaw 负责按天聚合、生成日报、编排后续动作 +3. 知识库只接收日报和人工确认后的长期内容 + +## 5. 新的对象分层 + +### 5.1 `ArticleCandidateRecord` + +定位: + +- 单篇内容的内部候选记录 +- 用于留档、追溯、重放、审计 + +最少应包含: + +- `item` +- `article` +- `summary` +- `filter_result` +- `metadata` +- 可选 `source_refs` +- 可选 `rendered_markdown` + +### 5.2 `OpenClawCandidateInput` + +定位: + +- 当前项目发给 OpenClaw 的标准投递对象 +- 用于日报聚合与排序 + +最少应包含: + +- `candidate_id` +- `title` +- `url` +- `published_at` +- `author` +- `summary` +- `highlights` +- `topics` +- `category` +- `worth_keeping` +- `selection_decision` +- `selection_reason` +- `digest_section_hint` +- `digest_rank` + +它不应包含: + +- `article.plain_text` +- `filter_result.matches` +- `source_refs` + +### 5.3 `DailyDigest` + +定位: + +- 一天的主产物 +- 同时服务于“知识沉淀”和“日报汇报” + +建议至少包含: + +- `date` +- `sections` +- `top_items` +- `key_takeaways` +- `watchlist` +- `candidate_ids` +- `source_refs` +- `editor_notes` + +## 6. 为什么这样更合理 + +这样改造有几个直接收益: + +1. 知识库不会被大量单篇摘要污染 +2. OpenClaw 不需要再次消费全文,token 更可控 +3. OpenClaw 的输入边界更清晰,不依赖本地目录结构和规则证据链 +4. 当前项目仍然保留完整候选记录,因此误判排查和重放能力不会丢 +5. 未来扩展周报、专题文章和反馈回流会更自然 + +本质上,这是把当前系统从“单篇落库工具”调整为“日报生产链路中的候选记录生产器 + 精简投递器”。 + +## 7. 对当前实现的影响 + +不需要推翻已有能力,主要是重新定位: + +- `extraction` 保留 +- `LLM summary validator` 保留 +- `rule engine` 保留 +- `FreshRSS integration` 保留 +- `Markdown sink` 保留,但降级为调试/回退能力 + +真正新增的是: + +- `ArticleCandidateRecord` schema +- `OpenClawCandidateInput` schema +- `ArticleCandidateRecord -> OpenClawCandidateInput` 映射逻辑 +- `DailyDigest` schema +- 人工确认后的状态流转 + +## 8. 下一步应该做什么 + +建议按这个顺序推进: + +1. 在代码里把当前 `article_candidate` 重新定位为 `ArticleCandidateRecord` +2. 新增 `OpenClawCandidateInput` 模型 +3. 增加精简 payload 的本地输出脚本或转换函数 +4. 让 OpenClaw 只消费精简输入对象 +5. 再设计批量聚合和 `DailyDigest` 生成 + +## 9. 一句话结论 + +如果最终目标是“每天有日报汇报,同时把日级提炼沉淀进知识库”,那么当前项目就不该继续围绕“单篇直接入库”演进,而应拆成“内部候选记录对象 + OpenClaw 精简输入对象 + 日级成品对象”三层结构。 \ No newline at end of file diff --git a/docs/openclaw/openclaw-delivery-payload-spec.md b/docs/openclaw/openclaw-delivery-payload-spec.md new file mode 100644 index 0000000..42b72b2 --- /dev/null +++ b/docs/openclaw/openclaw-delivery-payload-spec.md @@ -0,0 +1,195 @@ +# OpenClaw Delivery Payload 字段说明 + +## 1. 文档目的 + +本文档定义当前项目批量投递给 OpenClaw 的外层 envelope:`OpenClawDeliveryPayload`。 + +它不是单篇 candidate 对象,而是承载一批 `OpenClawCandidateInput` 的批次对象。 + +--- + +## 2. 完整 JSON 示例 + +```json +{ + "schema_version": "v1", + "generated_at": "2026-03-26T10:15:30Z", + "run_id": "openclaw-delivery-20260325-101530", + "date": "2026-03-25", + "candidates": [ + { + "candidate_id": "cand:sha256:xxx", + "title": "文章标题", + "url": "https://example.com/post", + "canonical_url": "https://example.com/post", + "published_at": "2026-03-25T09:30:00Z", + "author": "作者", + "source_name": "来源", + "language": "zh-CN", + "summary": "2 到 3 句话摘要", + "highlights": ["要点1", "要点2", "要点3"], + "keywords": ["关键词1", "关键词2", "关键词3", "关键词4", "关键词5"], + "topics": ["主题1", "主题2", "主题3"], + "category": "观点评论", + "worth_keeping": true, + "worth_reason": "有长期参考价值", + "selection_decision": "review", + "selection_reason": "worth_keeping=true but no stronger keep rule matched", + "digest_section_hint": "insights", + "digest_rank": 60 + } + ], + "stats": { + "total": 1, + "keep_total": 0, + "review_total": 1, + "drop_total": 0 + } +} +``` + +--- + +## 3. 字段总览 + +| 字段名 | 类型 | 必填 | 说明 | +| --- | --- | --- | --- | +| `schema_version` | `string` | 是 | 当前 envelope 的 schema 版本 | +| `generated_at` | `string` | 是 | 本批数据的生成时间,ISO 8601 格式 | +| `run_id` | `string` | 是 | 本次批量投递的唯一运行标识 | +| `date` | `string` | 是 | 本批次所属日期,格式 `YYYY-MM-DD` | +| `candidates` | `OpenClawCandidateInput[]` | 是 | 单篇候选内容列表 | +| `stats` | `object` | 是 | 批次级统计信息 | + +--- + +## 4. 字段详细说明 + +### 4.1 `schema_version` + +含义: +- 当前批量 envelope 的结构版本 + +用途: +- 未来字段调整时做兼容处理 +- 让 OpenClaw 能按版本选择不同解析逻辑 + +当前值: +- `v1` + +### 4.2 `generated_at` + +含义: +- 本批数据的实际生成时间 + +格式: +- ISO 8601,例如 `2026-03-26T10:15:30Z` + +用途: +- 排查数据新旧 +- 增量处理 +- 失败重跑和批次比对 + +### 4.3 `run_id` + +含义: +- 本次投递任务的唯一标识 + +用途: +- 失败重跑追踪 +- 批次去重 +- 运行日志关联 + +建议: +- 由上游在每次批量生成时唯一产生 +- 例如:`openclaw-delivery-20260325-101530` + +### 4.4 `date` + +含义: +- 本批次所属日期 + +格式: +- `YYYY-MM-DD` + +用途: +- OpenClaw 进行日报归档 +- 将多次投递映射到同一天的 digest 流程 + +### 4.5 `candidates` + +含义: +- 单篇候选输入对象列表 + +说明: +- 数组内每个元素都应满足 `OpenClawCandidateInput` 定义 +- 单篇字段说明请参考: + - `docs/openclaw/openclaw-candidate-input-field-spec.md` + +### 4.6 `stats` + +含义: +- 本批次的统计信息 + +当前字段包括: +- `total` +- `keep_total` +- `review_total` +- `drop_total` + +用途: +- OpenClaw 在接收后快速感知这批输入的规模和分布 +- 便于记录运行状态和对账 + +--- + +## 5. `stats` 子结构说明 + +| 字段名 | 类型 | 必填 | 说明 | +| --- | --- | --- | --- | +| `total` | `integer` | 是 | candidate 总数 | +| `keep_total` | `integer` | 是 | `selection_decision=keep` 的数量 | +| `review_total` | `integer` | 是 | `selection_decision=review` 的数量 | +| `drop_total` | `integer` | 是 | `selection_decision=drop` 的数量 | + +说明: +- 这些统计值由上游根据 `candidates[]` 自动汇总 +- OpenClaw 可以直接信任,也可以再次校验 + +--- + +## 6. 推荐消费方式 + +建议 OpenClaw 的批处理逻辑按以下顺序进行: + +1. 先读取 `schema_version` + - 选择对应版本的解析逻辑 +2. 再读取 `generated_at`、`run_id` 和 `date` + - 建立本次批处理上下文 +3. 再读取 `stats` + - 快速判断这批输入规模与分布 +4. 最后逐条消费 `candidates[]` + - 去重 + - 聚类 + - 分栏目 + - 排序 + - 产生日报和 review 清单 + +--- + +## 7. 当前不会放入 envelope 的字段 + +当前 envelope 不会额外放入: + +- 完整内部候选记录列表 +- 人工确认状态列表 +- 知识库入库状态列表 +- 执行日志文本 + +这些都属于其他层的对象,不应混进上游投递协议。 + +--- + +## 8. 一句话结论 + +`OpenClawDeliveryPayload` 是“给 OpenClaw 的批量投递对象”:它用 `schema_version`、`generated_at`、`run_id`、`date`、`stats` 管理批次上下文,用 `candidates[]` 承载真正的单篇候选输入。 \ No newline at end of file diff --git a/fellback.md b/fellback.md new file mode 100644 index 0000000..03b709e --- /dev/null +++ b/fellback.md @@ -0,0 +1,129 @@ +我看了,这版 可以,方向是对的。 +如果这是“上游项目 → 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 +下游确认状态单独建模 +那这套就很稳了。 diff --git a/outputs/README.md b/outputs/README.md new file mode 100644 index 0000000..e3fc924 --- /dev/null +++ b/outputs/README.md @@ -0,0 +1,38 @@ +# Outputs Layout + +`outputs/` 按“来源 + 阶段”分层,避免所有中间产物堆在根目录。 + +## 目录约定 + +- `outputs/prompts/` + - prompt 模板与调试输入 +- `outputs/reference/` + - 手工样例、固定参考输入、通用演示产物 +- `outputs/reference/extracted/` + - 参考提取结果 +- `outputs/reference/summary/` + - 通用摘要结果与 loop 调试产物 +- `outputs/reference/filter/` + - 通用过滤结果与上下文样例 +- `outputs/reference/candidates/` + - 通用 `article_candidate` 样例 +- `outputs/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/` 根目录。 +- 同一条链路的调试文件放在同一阶段目录里,例如 `result.loop.json` 与 `result.loop.attempt-*.json`。 +- `reference/` 只放可复用的稳定样例,真实运行数据优先放 `freshrss/`。 \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json new file mode 100644 index 0000000..2dcfec3 --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-01.article-candidate-record.json @@ -0,0 +1,130 @@ +{ + "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "item": { + "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "author": "阮一峰", + "published_at": "2026-03-21T10:19:11Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

1、

\n\n

本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。

\n\n

昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。

\n\n

\"\"

\n\n

上图是官网截图,现在点进去还写着\"自有模型\"。

\n\n

自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。

\n\n

现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?

\n\n

Cursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。

\n\n

首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。

\n\n

然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。

\n\n

真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。

\n\n

\"\"

\n\n

2、

\n\n

这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。

\n\n

\"\"

\n\n

可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。

\n\n

\"\"

\n\n

但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。

\n\n

\"\"

\n\n

这下好了,变成了公开的秘密,再也无法掩盖了。

\n\n

3、

\n\n

大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。

\n\n

\"\"

\n\n

许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。

\n\n

Cursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。

\n\n

就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。

\n\n

\"\"

\n\n

他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。

\n\n

稍后,Kimi 官方也发推了。

\n\n

\"\"

\n\n

Kimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。

\n\n

4、

\n\n

事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。

\n\n

既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?

\n\n

我猜测,原因跟 Cursor 不断膨胀的估值有关。

\n\n

彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。

\n\n

\"\"

\n\n

大家知道吗,它以前的估值是多少?

\n\n

2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。

\n\n

可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。

\n\n

为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。

\n\n

我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。

\n\n

5、

\n\n

纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。

\n\n

Cursor 发布 Composer 2 时,披露了性能和成本比较。

\n\n

Composer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。

\n\n

\"\"

\n\n

但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。

\n\n

\"\"

\n\n

既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。

\n\n

6、

\n\n

以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。

\n\n

联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。

\n\n

\"\"

\n\n

他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。

\n\n

\"\"

\n\n

这种新技术据说可以显著提升大模型的推理能力。

\n\n

我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。

\n\n

\"\"

\n\n

据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Developer" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1774088351 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:122a02c6bb154069e5b8d5cc9c7127f92c48bd940a032559b1812f6d861f1e36", + "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "author": "阮一峰", + "published_at": "2026-03-21T10:19:11Z", + "language": null, + "content_kind": "article", + "plain_text": "1、\n本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。\n昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。\n上图是官网截图,现在点进去还写着\"自有模型\"。\n自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。\n现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。\n2、\n这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。\n但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。\n这下好了,变成了公开的秘密,再也无法掩盖了。\n3、\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。\n稍后,Kimi 官方也发推了。\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。\n4、\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?\n我猜测,原因跟 Cursor 不断膨胀的估值有关。\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。\n大家知道吗,它以前的估值是多少?\n2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。\n可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。\n为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。\n我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。\n5、\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。\nCursor 发布 Composer 2 时,披露了性能和成本比较。\nComposer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。\n但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。\n既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。\n6、\n以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。\n联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。\n他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。\n这种新技术据说可以显著提升大模型的推理能力。\n我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。\n(完)\n小饿 说:\n大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n2026年3月22日 07:58 | # | 引用\n游钓四方 说:\nCursor 也到头了\n2026年3月22日 08:35 | # | 引用\nEdward 说:\n好呀你个cursor,居然用的是我们的kimi:)\n2026年3月22日 11:54 | # | 引用\njake 说:\n国产大模型的真实性能应该是没问题的,但是最大的问题是使用过程中突然就会明显降智,这种情况使用codex和claude中都没感受过。\n2026年3月22日 16:22 | # | 引用\nAlex 说:\nCursor膨脹全靠一開始vscode支援的慢了點,支援agent mode後cursor就一文不值了\n2026年3月22日 18:27 | # | 引用\n张三 说:\n太慢了,即便cursor套壳也比国产的直接用快多了\n2026年3月23日 11:37 | # | 引用\n一拳超人罢了 说:\n笑死了,几个月前用cursor的时候就发现了,使用composer1模型,思考逻辑里会突然蹦出中文来,我一开始以为是套壳的deepseek\n2026年3月23日 14:13 | # | 引用\n大名老王 说:\n老说国产慢,充钱就不慢了呀\n2026年3月23日 16:59 | # | 引用\ncolor 说:\n```12月的 B 轮融资,估值快速上升到26美元;```, 这句话少了亿字吧?阮老师\n2026年3月24日 06:42 | # | 引用\nHaKu 说:\n国模确实还行,问题就是太缺算力,高峰期降智问题很严重,如果这个问题可以解决还是很有性价比的\n2026年3月24日 08:39 | # | 引用\nbillzbc 说:\ncursor估值泡沫太大了\n2026年3月24日 10:57 | # | 引用", + "quality_flags": { + "is_paywalled": false, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 2922 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "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, + "reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。" + }, + "filter_result": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 60, + "review_state": "pending", + "source_refs": { + "item_path": "outputs\\freshrss\\items\\batch\\item-01.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-01.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-01\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-01.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T10:25:46.487441Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-102546" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-01.article-candidate.json b/outputs/freshrss/candidates/batch/item-01.article-candidate.json new file mode 100644 index 0000000..b1b8fac --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-01.article-candidate.json @@ -0,0 +1,130 @@ +{ + "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "item": { + "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "author": "阮一峰", + "published_at": "2026-03-21T10:19:11Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

1、

\n\n

本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。

\n\n

昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。

\n\n

\"\"

\n\n

上图是官网截图,现在点进去还写着\"自有模型\"。

\n\n

自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。

\n\n

现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?

\n\n

Cursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。

\n\n

首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。

\n\n

然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。

\n\n

真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。

\n\n

\"\"

\n\n

2、

\n\n

这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。

\n\n

\"\"

\n\n

可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。

\n\n

\"\"

\n\n

但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。

\n\n

\"\"

\n\n

这下好了,变成了公开的秘密,再也无法掩盖了。

\n\n

3、

\n\n

大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。

\n\n

\"\"

\n\n

许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。

\n\n

Cursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。

\n\n

就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。

\n\n

\"\"

\n\n

他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。

\n\n

稍后,Kimi 官方也发推了。

\n\n

\"\"

\n\n

Kimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。

\n\n

4、

\n\n

事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。

\n\n

既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?

\n\n

我猜测,原因跟 Cursor 不断膨胀的估值有关。

\n\n

彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。

\n\n

\"\"

\n\n

大家知道吗,它以前的估值是多少?

\n\n

2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。

\n\n

可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。

\n\n

为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。

\n\n

我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。

\n\n

5、

\n\n

纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。

\n\n

Cursor 发布 Composer 2 时,披露了性能和成本比较。

\n\n

Composer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。

\n\n

\"\"

\n\n

但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。

\n\n

\"\"

\n\n

既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。

\n\n

6、

\n\n

以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。

\n\n

联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。

\n\n

\"\"

\n\n

他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。

\n\n

\"\"

\n\n

这种新技术据说可以显著提升大模型的推理能力。

\n\n

我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。

\n\n

\"\"

\n\n

据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Developer" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1774088351 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:122a02c6bb154069e5b8d5cc9c7127f92c48bd940a032559b1812f6d861f1e36", + "item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "author": "阮一峰", + "published_at": "2026-03-21T10:19:11Z", + "language": null, + "content_kind": "article", + "plain_text": "1、\n本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。\n昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 Composer 2。\n上图是官网截图,现在点进去还写着\"自有模型\"。\n自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。\n现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。\n2、\n这位国外推友就把上面的截图,发布到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5。\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。\n但是为时已晚,网上传遍了,就连马斯克也发推:\"它就是 Kimi K2.5\"。\n这下好了,变成了公开的秘密,再也无法掩盖了。\n3、\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5。\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话了。\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。\n稍后,Kimi 官方也发推了。\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。\n4、\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?\n我猜测,原因跟 Cursor 不断膨胀的估值有关。\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。\n大家知道吗,它以前的估值是多少?\n2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。\n可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。\n为了支撑越来越高的估值,它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司。\n我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。\n5、\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。\nCursor 发布 Composer 2 时,披露了性能和成本比较。\nComposer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。\n但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。\n既然 Composer 2 就是微调的 Kimi K2.5,那么直接使用 Kimi,也能得到同样的效果。\n6、\n以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。\n联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会演讲,是唯一的中国大模型公司代表。\n他在台上宣讲,Kimi 团队刚刚发表的论文《注意力残差》(Attention Residuals)。\n这种新技术据说可以显著提升大模型的推理能力。\n我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n据杨植麟说,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。\n(完)\n小饿 说:\n大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。\n2026年3月22日 07:58 | # | 引用\n游钓四方 说:\nCursor 也到头了\n2026年3月22日 08:35 | # | 引用\nEdward 说:\n好呀你个cursor,居然用的是我们的kimi:)\n2026年3月22日 11:54 | # | 引用\njake 说:\n国产大模型的真实性能应该是没问题的,但是最大的问题是使用过程中突然就会明显降智,这种情况使用codex和claude中都没感受过。\n2026年3月22日 16:22 | # | 引用\nAlex 说:\nCursor膨脹全靠一開始vscode支援的慢了點,支援agent mode後cursor就一文不值了\n2026年3月22日 18:27 | # | 引用\n张三 说:\n太慢了,即便cursor套壳也比国产的直接用快多了\n2026年3月23日 11:37 | # | 引用\n一拳超人罢了 说:\n笑死了,几个月前用cursor的时候就发现了,使用composer1模型,思考逻辑里会突然蹦出中文来,我一开始以为是套壳的deepseek\n2026年3月23日 14:13 | # | 引用\n大名老王 说:\n老说国产慢,充钱就不慢了呀\n2026年3月23日 16:59 | # | 引用\ncolor 说:\n```12月的 B 轮融资,估值快速上升到26美元;```, 这句话少了亿字吧?阮老师\n2026年3月24日 06:42 | # | 引用\nHaKu 说:\n国模确实还行,问题就是太缺算力,高峰期降智问题很严重,如果这个问题可以解决还是很有性价比的\n2026年3月24日 08:39 | # | 引用\nbillzbc 说:\ncursor估值泡沫太大了\n2026年3月24日 10:57 | # | 引用", + "quality_flags": { + "is_paywalled": false, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 2922 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云", + "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html", + "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, + "reason": "文章深入剖析了AI行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。" + }, + "filter_decision": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 60, + "review_state": "pending", + "source_refs": { + "raw_item_path": "outputs\\freshrss\\items\\batch\\item-01.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-01.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-01\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-01.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T08:48:41.576492Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-084841" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json new file mode 100644 index 0000000..ec347bd --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-01.openclaw-candidate-input.json @@ -0,0 +1,42 @@ +{ + "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 +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json new file mode 100644 index 0000000..f426644 --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-02.article-candidate-record.json @@ -0,0 +1,130 @@ +{ + "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "item": { + "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc", + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "author": "阮一峰", + "published_at": "2026-03-19T23:59:16Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

这里记录每周值得分享的科技内容,周五发布。

\n\n

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

\n\n

封面图

\n\n

\"\"

\n\n

唐山河头老街景区的轨道车\"大唐云车\"。(via)

\n\n

未来如何招聘程序员

\n\n

前些天,讨论区有一个帖子,提出一个问题。

\n\n

如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?

\n\n

\"\"

\n\n

程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?

\n\n

你仔细想想,这个问题比预想的难多了。

\n\n

首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。

\n\n

但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:

\n\n\n\n

这些问题能识别出 AI 编程高手吗?我完全没有把握。

\n\n

其次,除了 AI,还要考察什么呢? 这也很不好想。

\n\n

我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。

\n\n

另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。

\n\n

总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?

\n\n

有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。

\n\n

科技动态

\n\n

1、访达小子

\n\n

苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。

\n\n

\"\"

\n\n

上面海报的左上角有一个玩偶,以前没见过。

\n\n

这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。

\n\n

\"\"

\n\n

几天后,苹果公司又在一场直播里面,使用了这个形象。

\n\n

\"\"

\n\n

人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?

\n\n

热心的网友让 AI 绘制了\"访达小子\"的完整形象。

\n\n

\"\"

\n\n

\"\"

\n\n

看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。

\n\n

2、红外线编码

\n\n

英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。

\n\n

\"\"

\n\n

肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。

\n\n

因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。

\n\n

3、机柜种植

\n\n

家里有多余的服务器机柜,怎么利用起来?

\n\n

\"\"

\n\n

一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。

\n\n

\"\"

\n\n

他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。

\n\n

\"\"

\n\n

如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。

\n\n

\"\"

\n\n

文章

\n\n

1、我放弃了 Elasticsearch,转而使用 Meil​​isearch(英文)

\n\n

\"\"

\n\n

Meil​​isearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。

\n\n

2、2016 年,我做过一次 AI 写代码创业(中文)

\n\n

\"\"

\n\n

作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)

\n\n

3、信息过载时代,我的漏斗式阅读工作流(中文)

\n\n

\"\"

\n\n

每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)

\n\n

4、编译器的前端与后端(英文)

\n\n

\"\"

\n\n

一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。

\n\n

5、CSS 的 lh 单位(英文)

\n\n

\"\"

\n\n

CSS 有一个字体大小属性lh,表示行高。

\n\n

6、寻觅杜鹃花之王(中文)

\n\n

\"\"

\n\n

大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。

\n\n

后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。

\n\n

工具

\n\n

1、APTUI

\n\n

\"\"

\n\n

一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。

\n\n

2、my.WordPress.net

\n\n

\"\"

\n\n

如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。

\n\n

它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。

\n\n

3、GrobPaint

\n\n

\"\"

\n\n

一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。

\n\n

4、Apple Matting

\n\n

\"\"

\n\n

一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)

\n\n

5、HealthTick

\n\n

\"\"

\n\n

macOS 菜单栏久坐提醒工具。(@lifedever 投稿)

\n\n

6、CheatReader

\n\n

\"\"

\n\n

一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)

\n\n

7、锤子便签

\n\n

\"\"

\n\n

开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)

\n\n

8、WeChat Download API

\n\n

\"\"

\n\n

开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)

\n\n

9、Speech Speed

\n\n

一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。

\n\n

AI 相关

\n\n

1、VibeGo

\n\n

\"\"

\n\n

Vibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)

\n\n

2、Mimic Them

\n\n

一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)

\n\n

3、AICheck

\n\n

\"\"

\n\n

一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)

\n\n

4、AionUi

\n\n

\"\"

\n\n

开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)

\n\n

5、Lumo

\n\n

\"\"

\n\n

一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)

\n\n

6、AIComicBuilder

\n\n

\"\"

\n\n

开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)

\n\n

资源

\n\n

1、canirun.ai

\n\n

\"\"

\n\n

网页检测你的机器,能够运行哪些本地的 AI 模型。

\n\n

2、AI 是怎么回事(中文)

\n\n

\"\"

\n\n

面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)

\n\n

3、TypeScript 数据结构与算法(Algorithms with TypeScript)

\n\n

\"\"

\n\n

免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。

\n\n

4、频道冲浪者(Channel Surfer)

\n\n

\"\"

\n\n

这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。

\n\n

图片

\n\n

1、巧妙的古建筑

\n\n

因为缺乏机械和动力,古代建筑物往往包含了很多巧思。

\n\n

(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。

\n\n

有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。

\n\n

为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。

\n\n

\"\"

\n\n

(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。

\n\n

这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。

\n\n

\"\"

\n\n

(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。

\n\n

\"\"

\n\n

\"\"

\n\n

(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。

\n\n

\"\"

\n\n

文摘

\n\n

1、避免使用定制框架

\n\n

很多小团队在工作中,往往会发明自己的\"定制框架\"。

\n\n

他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。

\n\n

这种\"定制框架\"有一些共同特点:

\n\n
\n

(1)由小团队创建,旨在解决他们的痛点;

\n\n

(2)底层是其他更通用的技术栈或框架;

\n\n

(3)引入原有技术栈不存在的新概念和术语;

\n\n

(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。

\n
\n\n

我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。

\n\n

我建议,大家避免使用\"定制框架\",原因有下面这些:

\n\n

(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。

\n\n

(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。

\n\n

(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。

\n\n

(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。

\n\n

(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。

\n\n

我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。

\n\n

言论

\n\n

1、

\n\n

我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。

\n\n

-- David Miranda

\n\n

2、

\n\n

AI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。

\n\n

-- lucumr.pocoo.org

\n\n

3、

\n\n

编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。

\n\n

-- 《生活在\"平面国\"的程序员》

\n\n

4、

\n\n

领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。

\n\n

-- 艾森豪威尔,美国前总统

\n\n

往年回顾

\n\n

面试的 AI 作弊----用数字人去面试(#342)

\n\n

所有代码都是技术债(#292)

\n\n

一次尴尬的服务器被黑(#242)

\n\n

最大的机会来自新技术(#192)

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Weekly" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1773964756 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:28f701753f6d82111e2f9105d9180bb359a75608b2669cb1e7dc741ff5ca17c6", + "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "author": "阮一峰", + "published_at": "2026-03-19T23:59:16Z", + "language": null, + "content_kind": "article", + "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n唐山河头老街景区的轨道车\"大唐云车\"。(via)\n未来如何招聘程序员\n前些天,讨论区有一个帖子,提出一个问题。\n如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?\n程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?\n你仔细想想,这个问题比预想的难多了。\n首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。\n但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:\n- 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。\n- 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。\n- 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。\n- ......\n这些问题能识别出 AI 编程高手吗?我完全没有把握。\n其次,除了 AI,还要考察什么呢? 这也很不好想。\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。\n另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?\n有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。\n科技动态\n1、访达小子\n苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。\n上面海报的左上角有一个玩偶,以前没见过。\n这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。\n几天后,苹果公司又在一场直播里面,使用了这个形象。\n人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?\n热心的网友让 AI 绘制了\"访达小子\"的完整形象。\n看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。\n2、红外线编码\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。\n3、机柜种植\n家里有多余的服务器机柜,怎么利用起来?\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n文章\n1、我放弃了 Elasticsearch,转而使用 Meilisearch(英文)\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。\n2、2016 年,我做过一次 AI 写代码创业(中文)\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)\n3、信息过载时代,我的漏斗式阅读工作流(中文)\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)\n4、编译器的前端与后端(英文)\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。\n5、CSS 的 lh 单位(英文)\nCSS 有一个字体大小属性lh\n,表示行高。\n6、寻觅杜鹃花之王(中文)\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。\n工具\n1、APTUI\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)\n7、锤子便签\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。\nAI 相关\n1、VibeGo\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)\n3、AICheck\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)\n4、AionUi\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)\n5、Lumo\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)\n资源\n网页检测你的机器,能够运行哪些本地的 AI 模型。\n2、AI 是怎么回事(中文)\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)\n3、TypeScript 数据结构与算法(Algorithms with TypeScript)\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。\n4、频道冲浪者(Channel Surfer)\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。\n图片\n1、巧妙的古建筑\n因为缺乏机械和动力,古代建筑物往往包含了很多巧思。\n(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。\n有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。\n为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。\n(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。\n这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。\n(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。\n(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。\n文摘\n1、避免使用定制框架\n很多小团队在工作中,往往会发明自己的\"定制框架\"。\n他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。\n这种\"定制框架\"有一些共同特点:\n(1)由小团队创建,旨在解决他们的痛点;\n(2)底层是其他更通用的技术栈或框架;\n(3)引入原有技术栈不存在的新概念和术语;\n(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。\n我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。\n我建议,大家避免使用\"定制框架\",原因有下面这些:\n(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。\n(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。\n(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。\n(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。\n(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。\n我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。\n言论\n1、\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。\n2、\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。\n3、\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。\n4、\n领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。\n-- 艾森豪威尔,美国前总统\n往年回顾\n面试的 AI 作弊----用数字人去面试(#342)\n所有代码都是技术债(#292)\n一次尴尬的服务器被黑(#242)\n最大的机会来自新技术(#192)\n(完)\njhc 说:\n国外的情况我不清楚,我认为在国内技术面试并不是考候选人能不能写出正确代码,而是一种筛选手段\n2026年3月20日 09:22 | # | 引用\n小白 说:\n访达小子有点“幻视”阴阳脸的意思[:狗头]\n2026年3月20日 09:53 | # | 引用\nNobita 说:\n看完了AI创业的文章,作者结尾的感慨发人深省\n“未来并不是线性展开的。\n所以,焦虑并不能真正帮助我们接近未来。更重要的是,在你当下所能看到的边界之内,做一个对得起自己的选择;至于剩下的部分,就交给时间。”\n2026年3月20日 09:56 | # | 引用\nDeathGhost 说:\n访达小子 像 奶龙~哈哈\n2026年3月20日 09:57 | # | 引用\nvxcoder 说:\n以前研发讲究的是要理解系统里细化到每个字节的运行原理,现在跟我说这是黑箱,但你可以放心的交给一个概率模型去维护。\n2026年3月20日 10:22 | # | 引用\n陆波 说:\nai时代来了,感觉突然多了很多新知识和技术需要学习\n2026年3月20日 10:26 | # | 引用\nJK 说:\nCheatReader 来源于我对象的摸鱼需求,用了2小时使用OpenSpec辅助开发的项目,很荣幸第一次投稿就被选上了。如果有朋友使用过程中遇到问题或者有新的需求,欢迎提ISSUE~\n我烧了几个B的token去实验各种开发的姿势,慢慢的也有一些心得,我和几个朋友最近在做一款很有意思的项目,期待可以出现在下个月的周报中!\n2026年3月20日 12:25 | # | 引用\nk 说:\n你如果没有自已的想法,而整个项目或系统都交给AI,那么AI写出来东西,不都是抄袭现成的吗?\n它也不能自已创建出来一套新的架构或模式吧?\n2026年3月20日 14:25 | # | 引用\nmorty 说:\n服务器养殖蔬菜这不纯纯浪费电力吗?这种没脑子的文章怎么出现在这里。。。。\n2026年3月20日 14:45 | # | 引用\nLY 说:\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n—— 看起来很赛博和有趣,但是\n室内、光照、隐蔽性\n这玩意儿更适合种的是某种加麻大特产\n2026年3月20日 14:47 | # | 引用\nDylan Yu 说:\n访达小子好像弗兰肯斯坦\n2026年3月20日 15:15 | # | 引用\nXZY 说:\n未来面试方也更加依赖AI,反正都是黑盒,都交由AI来判断啦。\n又或者是多开几个agent,减少程序员的需求。\n2026年3月20日 15:59 | # | 引用\nLeon 说:\n关于程序员面试问什么问题,我觉得除了考察 AI 的熟练度,还要考察对方的计算机基础、数据结构算法、设计模式,这些东西永远都不过时,如果时间充裕,可以给个课题,让对方现场用 ai 工具实现,看看效果如何\n2026年3月20日 16:34 | # | 引用\nh29 说:\n定制化框架可以理解为固化一些内部共识,但是也要能跟得上行业发展才行。\n2026年3月20日 16:58 | # | 引用\n求面试 说:\n对于程序员来说结构化表达越来越重要, 这包括能清晰的描述需求, 把需求讲解的编程Agent能充分理解, 清晰的表达技术要求, 需要作者有技术功底, 让大模型Agent理解设计质量, 避免写出一堆屎山代码。\n2026年3月20日 21:54 | # | 引用\nhttps://yijinlee.com李奕锦 说:\n未来的超级个体,是一个程序员带着一群 AI 助手,交付一支团队的产能。\n面试桌上,请放下笔试题,打开电脑,让他展示那些真正用 AI 辅助落地的项目。能把 AI 当作武器去攻城略地的实战派,才是 AI 时代真正稀缺的将才。\n2026年3月22日 10:38 | # | 引用\n徐晖 说:\n这一期质量很高,今后可以多转载些来自其它博客的文章\n2026年3月22日 10:39 | # | 引用\n阿楚 说:\n巴尔贝加尔水磨坊,近2000年还能保存这么多砖石?还是说后人修缮后的现状?\n2026年3月22日 12:16 | # | 引用\n勇者 StartUp 说:\n我来面试,会加上二分查找、冒牌排序的手写编码,难道一个程序员写不出排序和查找?\n2026年3月22日 21:31 | # | 引用\nwuqi 说:\n其实ai没那么全能,还有个问题,烧token是要钱的,有经验的至少知道怎么烧,你可以试试直接让产品烧token,看能不能烧出来正确的结果,ai一般是不会拒绝错误提议和方案的,正经程序员会考虑程序规模和布设成本,ai并不会管那么多...\n一个傻逼领导或者产品可是真的能提出来我们要做一个淘宝,ai也真的能附和这个傻逼\n2026年3月23日 08:45 | # | 引用\nSiu 说:\n我應徵過多次就只有一次是現場寫程序的。可能本港公司都不會現場考人。誰有這時間。\n2026年3月24日 12:47 | # | 引用", + "quality_flags": { + "is_paywalled": false, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 6599 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。", + "highlights": [ + "未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。", + "面试问题需要考察将复杂需求转化为清晰提示词的能力。", + "AI编程时代,对系统架构知识和项目分解能力的要求依然重要。", + "传统的编程语法细节考察在AI辅助下意义可能减弱。", + "文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。" + ], + "keywords": [ + "AI编程", + "程序员招聘", + "面试问题", + "提示词工程", + "Skill", + "MCP", + "多Agent协同", + "系统架构" + ], + "topics": [ + "人工智能", + "软件开发", + "职业发展", + "技术趋势", + "人才评估" + ], + "category": "观点评论", + "worth_keeping": true, + "reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。" + }, + "filter_result": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 60, + "review_state": "pending", + "source_refs": { + "item_path": "outputs\\freshrss\\items\\batch\\item-02.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-02.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-02\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-02.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T10:25:47.791246Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-102547" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.article-candidate.json b/outputs/freshrss/candidates/batch/item-02.article-candidate.json new file mode 100644 index 0000000..afb96b7 --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-02.article-candidate.json @@ -0,0 +1,130 @@ +{ + "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "item": { + "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc", + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "author": "阮一峰", + "published_at": "2026-03-19T23:59:16Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

这里记录每周值得分享的科技内容,周五发布。

\n\n

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

\n\n

封面图

\n\n

\"\"

\n\n

唐山河头老街景区的轨道车\"大唐云车\"。(via)

\n\n

未来如何招聘程序员

\n\n

前些天,讨论区有一个帖子,提出一个问题。

\n\n

如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?

\n\n

\"\"

\n\n

程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?

\n\n

你仔细想想,这个问题比预想的难多了。

\n\n

首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。

\n\n

但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:

\n\n\n\n

这些问题能识别出 AI 编程高手吗?我完全没有把握。

\n\n

其次,除了 AI,还要考察什么呢? 这也很不好想。

\n\n

我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。

\n\n

另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。

\n\n

总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?

\n\n

有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。

\n\n

科技动态

\n\n

1、访达小子

\n\n

苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。

\n\n

\"\"

\n\n

上面海报的左上角有一个玩偶,以前没见过。

\n\n

这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。

\n\n

\"\"

\n\n

几天后,苹果公司又在一场直播里面,使用了这个形象。

\n\n

\"\"

\n\n

人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?

\n\n

热心的网友让 AI 绘制了\"访达小子\"的完整形象。

\n\n

\"\"

\n\n

\"\"

\n\n

看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。

\n\n

2、红外线编码

\n\n

英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。

\n\n

\"\"

\n\n

肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。

\n\n

因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。

\n\n

3、机柜种植

\n\n

家里有多余的服务器机柜,怎么利用起来?

\n\n

\"\"

\n\n

一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。

\n\n

\"\"

\n\n

他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。

\n\n

\"\"

\n\n

如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。

\n\n

\"\"

\n\n

文章

\n\n

1、我放弃了 Elasticsearch,转而使用 Meil​​isearch(英文)

\n\n

\"\"

\n\n

Meil​​isearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。

\n\n

2、2016 年,我做过一次 AI 写代码创业(中文)

\n\n

\"\"

\n\n

作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)

\n\n

3、信息过载时代,我的漏斗式阅读工作流(中文)

\n\n

\"\"

\n\n

每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)

\n\n

4、编译器的前端与后端(英文)

\n\n

\"\"

\n\n

一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。

\n\n

5、CSS 的 lh 单位(英文)

\n\n

\"\"

\n\n

CSS 有一个字体大小属性lh,表示行高。

\n\n

6、寻觅杜鹃花之王(中文)

\n\n

\"\"

\n\n

大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。

\n\n

后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。

\n\n

工具

\n\n

1、APTUI

\n\n

\"\"

\n\n

一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。

\n\n

2、my.WordPress.net

\n\n

\"\"

\n\n

如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。

\n\n

它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。

\n\n

3、GrobPaint

\n\n

\"\"

\n\n

一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。

\n\n

4、Apple Matting

\n\n

\"\"

\n\n

一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)

\n\n

5、HealthTick

\n\n

\"\"

\n\n

macOS 菜单栏久坐提醒工具。(@lifedever 投稿)

\n\n

6、CheatReader

\n\n

\"\"

\n\n

一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)

\n\n

7、锤子便签

\n\n

\"\"

\n\n

开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)

\n\n

8、WeChat Download API

\n\n

\"\"

\n\n

开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)

\n\n

9、Speech Speed

\n\n

一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。

\n\n

AI 相关

\n\n

1、VibeGo

\n\n

\"\"

\n\n

Vibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)

\n\n

2、Mimic Them

\n\n

一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)

\n\n

3、AICheck

\n\n

\"\"

\n\n

一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)

\n\n

4、AionUi

\n\n

\"\"

\n\n

开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)

\n\n

5、Lumo

\n\n

\"\"

\n\n

一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)

\n\n

6、AIComicBuilder

\n\n

\"\"

\n\n

开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)

\n\n

资源

\n\n

1、canirun.ai

\n\n

\"\"

\n\n

网页检测你的机器,能够运行哪些本地的 AI 模型。

\n\n

2、AI 是怎么回事(中文)

\n\n

\"\"

\n\n

面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)

\n\n

3、TypeScript 数据结构与算法(Algorithms with TypeScript)

\n\n

\"\"

\n\n

免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。

\n\n

4、频道冲浪者(Channel Surfer)

\n\n

\"\"

\n\n

这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。

\n\n

图片

\n\n

1、巧妙的古建筑

\n\n

因为缺乏机械和动力,古代建筑物往往包含了很多巧思。

\n\n

(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。

\n\n

有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。

\n\n

为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。

\n\n

\"\"

\n\n

(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。

\n\n

这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。

\n\n

\"\"

\n\n

(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。

\n\n

\"\"

\n\n

\"\"

\n\n

(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。

\n\n

\"\"

\n\n

文摘

\n\n

1、避免使用定制框架

\n\n

很多小团队在工作中,往往会发明自己的\"定制框架\"。

\n\n

他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。

\n\n

这种\"定制框架\"有一些共同特点:

\n\n
\n

(1)由小团队创建,旨在解决他们的痛点;

\n\n

(2)底层是其他更通用的技术栈或框架;

\n\n

(3)引入原有技术栈不存在的新概念和术语;

\n\n

(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。

\n
\n\n

我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。

\n\n

我建议,大家避免使用\"定制框架\",原因有下面这些:

\n\n

(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。

\n\n

(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。

\n\n

(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。

\n\n

(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。

\n\n

(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。

\n\n

我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。

\n\n

言论

\n\n

1、

\n\n

我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。

\n\n

-- David Miranda

\n\n

2、

\n\n

AI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。

\n\n

-- lucumr.pocoo.org

\n\n

3、

\n\n

编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。

\n\n

-- 《生活在\"平面国\"的程序员》

\n\n

4、

\n\n

领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。

\n\n

-- 艾森豪威尔,美国前总统

\n\n

往年回顾

\n\n

面试的 AI 作弊----用数字人去面试(#342)

\n\n

所有代码都是技术债(#292)

\n\n

一次尴尬的服务器被黑(#242)

\n\n

最大的机会来自新技术(#192)

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Weekly" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1773964756 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:28f701753f6d82111e2f9105d9180bb359a75608b2669cb1e7dc741ff5ca17c6", + "item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "author": "阮一峰", + "published_at": "2026-03-19T23:59:16Z", + "language": null, + "content_kind": "article", + "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n唐山河头老街景区的轨道车\"大唐云车\"。(via)\n未来如何招聘程序员\n前些天,讨论区有一个帖子,提出一个问题。\n如果未来的代码都是 AI 写的,那么我们怎么招聘程序员呢?\n程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?\n你仔细想想,这个问题比预想的难多了。\n首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。\n但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:\n- 请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。\n- 描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。\n- 如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。\n- ......\n这些问题能识别出 AI 编程高手吗?我完全没有把握。\n其次,除了 AI,还要考察什么呢? 这也很不好想。\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。\n另外,我还要看看他以前的项目,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?\n有一点是确定的,面试各种编程细节意义不大了,因为你不需要记住语法细节了,直接问大模型就行。\n科技动态\n1、访达小子\n苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。\n上面海报的左上角有一个玩偶,以前没见过。\n这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。\n几天后,苹果公司又在一场直播里面,使用了这个形象。\n人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?\n热心的网友让 AI 绘制了\"访达小子\"的完整形象。\n看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。\n2、红外线编码\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。\n3、机柜种植\n家里有多余的服务器机柜,怎么利用起来?\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n文章\n1、我放弃了 Elasticsearch,转而使用 Meilisearch(英文)\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。\n2、2016 年,我做过一次 AI 写代码创业(中文)\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)\n3、信息过载时代,我的漏斗式阅读工作流(中文)\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)\n4、编译器的前端与后端(英文)\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。\n5、CSS 的 lh 单位(英文)\nCSS 有一个字体大小属性lh\n,表示行高。\n6、寻觅杜鹃花之王(中文)\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。\n工具\n1、APTUI\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章。\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)\n7、锤子便签\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。\nAI 相关\n1、VibeGo\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)\n3、AICheck\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)\n4、AionUi\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)\n5、Lumo\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)\n资源\n网页检测你的机器,能够运行哪些本地的 AI 模型。\n2、AI 是怎么回事(中文)\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)\n3、TypeScript 数据结构与算法(Algorithms with TypeScript)\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。\n4、频道冲浪者(Channel Surfer)\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。\n图片\n1、巧妙的古建筑\n因为缺乏机械和动力,古代建筑物往往包含了很多巧思。\n(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。\n有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。\n为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。\n(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。\n这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。\n(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。\n(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。\n文摘\n1、避免使用定制框架\n很多小团队在工作中,往往会发明自己的\"定制框架\"。\n他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。\n这种\"定制框架\"有一些共同特点:\n(1)由小团队创建,旨在解决他们的痛点;\n(2)底层是其他更通用的技术栈或框架;\n(3)引入原有技术栈不存在的新概念和术语;\n(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。\n我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。\n我建议,大家避免使用\"定制框架\",原因有下面这些:\n(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。\n(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。\n(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。\n(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。\n(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。\n我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。\n言论\n1、\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。\n2、\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。\n3、\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。\n4、\n领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。\n-- 艾森豪威尔,美国前总统\n往年回顾\n面试的 AI 作弊----用数字人去面试(#342)\n所有代码都是技术债(#292)\n一次尴尬的服务器被黑(#242)\n最大的机会来自新技术(#192)\n(完)\njhc 说:\n国外的情况我不清楚,我认为在国内技术面试并不是考候选人能不能写出正确代码,而是一种筛选手段\n2026年3月20日 09:22 | # | 引用\n小白 说:\n访达小子有点“幻视”阴阳脸的意思[:狗头]\n2026年3月20日 09:53 | # | 引用\nNobita 说:\n看完了AI创业的文章,作者结尾的感慨发人深省\n“未来并不是线性展开的。\n所以,焦虑并不能真正帮助我们接近未来。更重要的是,在你当下所能看到的边界之内,做一个对得起自己的选择;至于剩下的部分,就交给时间。”\n2026年3月20日 09:56 | # | 引用\nDeathGhost 说:\n访达小子 像 奶龙~哈哈\n2026年3月20日 09:57 | # | 引用\nvxcoder 说:\n以前研发讲究的是要理解系统里细化到每个字节的运行原理,现在跟我说这是黑箱,但你可以放心的交给一个概率模型去维护。\n2026年3月20日 10:22 | # | 引用\n陆波 说:\nai时代来了,感觉突然多了很多新知识和技术需要学习\n2026年3月20日 10:26 | # | 引用\nJK 说:\nCheatReader 来源于我对象的摸鱼需求,用了2小时使用OpenSpec辅助开发的项目,很荣幸第一次投稿就被选上了。如果有朋友使用过程中遇到问题或者有新的需求,欢迎提ISSUE~\n我烧了几个B的token去实验各种开发的姿势,慢慢的也有一些心得,我和几个朋友最近在做一款很有意思的项目,期待可以出现在下个月的周报中!\n2026年3月20日 12:25 | # | 引用\nk 说:\n你如果没有自已的想法,而整个项目或系统都交给AI,那么AI写出来东西,不都是抄袭现成的吗?\n它也不能自已创建出来一套新的架构或模式吧?\n2026年3月20日 14:25 | # | 引用\nmorty 说:\n服务器养殖蔬菜这不纯纯浪费电力吗?这种没脑子的文章怎么出现在这里。。。。\n2026年3月20日 14:45 | # | 引用\nLY 说:\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。\n—— 看起来很赛博和有趣,但是\n室内、光照、隐蔽性\n这玩意儿更适合种的是某种加麻大特产\n2026年3月20日 14:47 | # | 引用\nDylan Yu 说:\n访达小子好像弗兰肯斯坦\n2026年3月20日 15:15 | # | 引用\nXZY 说:\n未来面试方也更加依赖AI,反正都是黑盒,都交由AI来判断啦。\n又或者是多开几个agent,减少程序员的需求。\n2026年3月20日 15:59 | # | 引用\nLeon 说:\n关于程序员面试问什么问题,我觉得除了考察 AI 的熟练度,还要考察对方的计算机基础、数据结构算法、设计模式,这些东西永远都不过时,如果时间充裕,可以给个课题,让对方现场用 ai 工具实现,看看效果如何\n2026年3月20日 16:34 | # | 引用\nh29 说:\n定制化框架可以理解为固化一些内部共识,但是也要能跟得上行业发展才行。\n2026年3月20日 16:58 | # | 引用\n求面试 说:\n对于程序员来说结构化表达越来越重要, 这包括能清晰的描述需求, 把需求讲解的编程Agent能充分理解, 清晰的表达技术要求, 需要作者有技术功底, 让大模型Agent理解设计质量, 避免写出一堆屎山代码。\n2026年3月20日 21:54 | # | 引用\nhttps://yijinlee.com李奕锦 说:\n未来的超级个体,是一个程序员带着一群 AI 助手,交付一支团队的产能。\n面试桌上,请放下笔试题,打开电脑,让他展示那些真正用 AI 辅助落地的项目。能把 AI 当作武器去攻城略地的实战派,才是 AI 时代真正稀缺的将才。\n2026年3月22日 10:38 | # | 引用\n徐晖 说:\n这一期质量很高,今后可以多转载些来自其它博客的文章\n2026年3月22日 10:39 | # | 引用\n阿楚 说:\n巴尔贝加尔水磨坊,近2000年还能保存这么多砖石?还是说后人修缮后的现状?\n2026年3月22日 12:16 | # | 引用\n勇者 StartUp 说:\n我来面试,会加上二分查找、冒牌排序的手写编码,难道一个程序员写不出排序和查找?\n2026年3月22日 21:31 | # | 引用\nwuqi 说:\n其实ai没那么全能,还有个问题,烧token是要钱的,有经验的至少知道怎么烧,你可以试试直接让产品烧token,看能不能烧出来正确的结果,ai一般是不会拒绝错误提议和方案的,正经程序员会考虑程序规模和布设成本,ai并不会管那么多...\n一个傻逼领导或者产品可是真的能提出来我们要做一个淘宝,ai也真的能附和这个傻逼\n2026年3月23日 08:45 | # | 引用\nSiu 说:\n我應徵過多次就只有一次是現場寫程序的。可能本港公司都不會現場考人。誰有這時間。\n2026年3月24日 12:47 | # | 引用", + "quality_flags": { + "is_paywalled": false, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 6599 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html", + "summary": "本文探讨了在AI编程普及的未来,如何招聘和面试程序员。作者认为考察重点应从代码能力转向AI使用、架构理解和需求转化能力。文章指出传统面试方法面临挑战,并引发了对未来程序员核心技能的思考。", + "highlights": [ + "未来程序员招聘的重点可能从代码能力转向AI工具的使用熟练度。", + "面试问题需要考察将复杂需求转化为清晰提示词的能力。", + "AI编程时代,对系统架构知识和项目分解能力的要求依然重要。", + "传统的编程语法细节考察在AI辅助下意义可能减弱。", + "文章引发了关于AI如何颠覆软件开发及人才评估标准的讨论。" + ], + "keywords": [ + "AI编程", + "程序员招聘", + "面试问题", + "提示词工程", + "Skill", + "MCP", + "多Agent协同", + "系统架构" + ], + "topics": [ + "人工智能", + "软件开发", + "职业发展", + "技术趋势", + "人才评估" + ], + "category": "观点评论", + "worth_keeping": true, + "reason": "文章深入探讨了AI时代程序员招聘的前瞻性问题,具有启发性和讨论价值。" + }, + "filter_decision": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 60, + "review_state": "pending", + "source_refs": { + "raw_item_path": "outputs\\freshrss\\items\\batch\\item-02.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-02.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-02\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-02.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T08:48:43.003811Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-084843" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json new file mode 100644 index 0000000..e7e39a8 --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-02.openclaw-candidate-input.json @@ -0,0 +1,42 @@ +{ + "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 +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json new file mode 100644 index 0000000..9f553e5 --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-03.article-candidate-record.json @@ -0,0 +1,144 @@ +{ + "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "item": { + "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db", + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "author": "阮一峰", + "published_at": "2026-03-12T23:59:16Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

这里记录每周值得分享的科技内容,周五发布。

\n\n

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

\n\n

封面图

\n\n

\"\"

\n\n

重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)

\n\n

测试是新的护城河

\n\n

Next.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。

\n\n

\"\"

\n\n

两周前,这个框架被一则新闻颠覆了。

\n\n

一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。

\n\n

\"\"

\n\n

事实上,一天就生成产品原型了,后面几天只是在完善。

\n\n
\n

\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。

\n\n

接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"

\n
\n\n

这个新的实现,比原版 Next.js 性能更好。

\n\n
\n

\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"

\n
\n\n

这个 vinext 的代码已经放出来了。

\n\n

\"\"

\n\n

我觉得,这件事对 Next.js 的打击非常大。

\n\n

Next.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。

\n\n

这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。

\n\n

你知道花了多少钱?Token 费用仅仅为 1100 美元!

\n\n

这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。

\n\n

推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。

\n\n

那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。

\n\n

怎么防呢?关键就是测试用例。

\n\n

Cloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。

\n\n

如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。

\n\n

可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。

\n\n

\"\"

\n\n

世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!

\n\n

其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。

\n\n

无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。

\n\n

\"\"

\n\n

说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。

\n\n

AI 复刻的版权问题

\n\n

AI 复刻软件还有一个版权问题,也引起了很大争议。

\n\n

\"\"

\n\n

Next.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。

\n\n

chardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。

\n\n

网上的意见也分成了两派。

\n\n

支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。

\n\n

反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。

\n\n

更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。

\n\n

按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。

\n\n

科技动态

\n\n

1、AI 改写脏话

\n\n

游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。

\n\n

\"\"

\n\n

以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。

\n\n

现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。

\n\n

虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。

\n\n

2、飞机的激光上网

\n\n

欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。

\n\n

\"\"

\n\n

飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。

\n\n

\"\"

\n\n

上图就是安装在飞机舷窗上的激光终端。

\n\n

激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。

\n\n

缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。

\n\n

3、Grammarly 的专家意见

\n\n

Grammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。

\n\n

\"\"

\n\n

一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。

\n\n

\"\"

\n\n

原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。

\n\n

这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?

\n\n

4、太阳能邮筒

\n\n

网络通信普及以后,传统的邮筒怎么办?

\n\n

英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。

\n\n

\"\"

\n\n

邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。

\n\n

\"\"

\n\n

这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。

\n\n

\"\"

\n\n

文章

\n\n

1、GitHub Issue 标题的注入攻击(英文)

\n\n

\"\"

\n\n

这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。

\n\n

2、重新评估 AGENTS.md(英文)

\n\n

\"\"

\n\n

最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。

\n\n

它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。

\n\n

3、Temporal API 的九年历程(英文)

\n\n

\"\"

\n\n

本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。

\n\n

4、AI 的胡说测试(英文)

\n\n

\"\"

\n\n

国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。

\n\n

5、原生 CSS 就足够了(英文)

\n\n

\"\"

\n\n

本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。

\n\n

6、粪便物理学(英文)

\n\n

\"\"

\n\n

一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。

\n\n

工具

\n\n

1、KULA

\n\n

\"\"

\n\n

Linux 服务器的监控工具,只有一个二进制文件。

\n\n

2、AnsiSaver

\n\n

\"\"

\n\n

mac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。

\n\n

3、upiano

\n\n

\"\"

\n\n

在命令行下模拟钢琴弹奏。

\n\n

4、WSL Distro Manager

\n\n

\"\"

\n\n

一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。

\n\n

5、Mole

\n\n

\"\"

\n\n

开源的 Mac 电脑清理和优化工具。

\n\n

6、PipeGate

\n\n

一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。

\n\n

7、HookListener

\n\n

\"\"

\n\n

一个管理、测试 Webhook 的在线工具,个人可以免费使用。

\n\n

8、Sentinel

\n\n

\"\"

\n\n

将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)

\n\n

9、Flux Monitor

\n\n

\"\"

\n\n

Mac 电脑的系统监控、管理面板。(@chentao1006 投稿)

\n\n

AI 相关

\n\n

1、Agentic Metric

\n\n

\"\"

\n\n

一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)

\n\n

2、cc-connect

\n\n

\"\"

\n\n

一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)

\n\n

3、Page Agent

\n\n

\"\"

\n\n

只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。

\n\n

4、Agent Safehouse

\n\n

一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。

\n\n

5、Repo Tokens

\n\n

\"\"

\n\n

一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。

\n\n

资源

\n\n

1、世界监控(World Monitor)

\n\n

\"\"

\n\n

世界局势的一个实时看板,把各种消息源都放在一个网页里。

\n\n

2、炼油厂探索

\n\n

\"\"

\n\n

一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。

\n\n

3、Mechanical Pencil

\n\n

\"\"

\n\n

弹簧笔、打火机等生活小物品的机械装置动画。

\n\n

图片

\n\n

1、密码的替代方法

\n\n

一位程序员发明了一种新的密码方法,你觉得可行吗?

\n\n

系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。

\n\n

\"\"

\n\n

下次登录时,用户必须按同样顺序挑出同样的5张牌。

\n\n

文摘

\n\n

1、复杂社会的崩溃

\n\n

我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。

\n\n

美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。

\n\n

\"\"

\n\n

1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?

\n\n

他认为,原因是这些社会有一个敌人----复杂性。

\n\n

随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。

\n\n

一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。

\n\n

(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。

\n\n

(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。

\n\n

(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。

\n\n

(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。

\n\n

以上因素的共同作用,导致历史上很多强大的社会最终崩溃。

\n\n

言论

\n\n

1、

\n\n

2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。

\n\n

2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。

\n\n

-- 《我不知道十年后我的工作是否还存在》

\n\n

2、

\n\n

与强大的 AI 对抗会是什么感觉?

\n\n

你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。

\n\n

这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。

\n\n

-- probablydance.com

\n\n

3、

\n\n

阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。

\n\n

这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。

\n\n

-- 《阅读商战书籍是浪费时间》

\n\n

4、

\n\n

我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。

\n\n

-- Simon Willison,著名开发者

\n\n

5、

\n\n

时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。

\n\n

-- 《不要太看重 AI 大模型的订阅费》

\n\n

往年回顾

\n\n

低代码编程,恐怕不会成功(#341)

\n\n

AI 没有护城河(#291)

\n\n

中国的增长动力在内陆(#241)

\n\n

一个程序员的财务独立之路(#191)

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Weekly" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1773359956 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:fdc9230d42ec24f867f94f3198960e8104f633fb8ab532645b384baf1df6b369", + "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "author": "阮一峰", + "published_at": "2026-03-12T23:59:16Z", + "language": null, + "content_kind": "article", + "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)\n测试是新的护城河\nNext.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。\n两周前,这个框架被一则新闻颠覆了。\n一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。\n事实上,一天就生成产品原型了,后面几天只是在完善。\n\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。\n接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"\n这个新的实现,比原版 Next.js 性能更好。\n\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"\n这个 vinext 的代码已经放出来了。\n我觉得,这件事对 Next.js 的打击非常大。\nNext.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。\n这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。\n你知道花了多少钱?Token 费用仅仅为 1100 美元!\n这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。\n推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。\n那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。\n怎么防呢?关键就是测试用例。\nCloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。\n如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。\n可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。\n世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!\n其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。\n无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。\n说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。\nAI 复刻的版权问题\nAI 复刻软件还有一个版权问题,也引起了很大争议。\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。\n网上的意见也分成了两派。\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。\n科技动态\n1、AI 改写脏话\n游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####\n,你还是知道他在骂人。\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。\n2、飞机的激光上网\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。\n上图就是安装在飞机舷窗上的激光终端。\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?\n4、太阳能邮筒\n网络通信普及以后,传统的邮筒怎么办?\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。\n文章\n1、GitHub Issue 标题的注入攻击(英文)\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。\n2、重新评估 AGENTS.md(英文)\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。\n3、Temporal API 的九年历程(英文)\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。\n4、AI 的胡说测试(英文)\n国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。\n5、原生 CSS 就足够了(英文)\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。\n6、粪便物理学(英文)\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。\n工具\n1、KULA\nLinux 服务器的监控工具,只有一个二进制文件。\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。\n3、upiano\n在命令行下模拟钢琴弹奏。\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。\n5、Mole\n开源的 Mac 电脑清理和优化工具。\n6、PipeGate\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。\n8、Sentinel\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)\nAI 相关\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。\n资源\n1、世界监控(World Monitor)\n世界局势的一个实时看板,把各种消息源都放在一个网页里。\n2、炼油厂探索\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。\n弹簧笔、打火机等生活小物品的机械装置动画。\n图片\n1、密码的替代方法\n一位程序员发明了一种新的密码方法,你觉得可行吗?\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。\n下次登录时,用户必须按同样顺序挑出同样的5张牌。\n文摘\n1、复杂社会的崩溃\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?\n他认为,原因是这些社会有一个敌人----复杂性。\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。\n言论\n1、\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。\n2、\n与强大的 AI 对抗会是什么感觉?\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。\n3、\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。\n4、\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。\n-- Simon Willison,著名开发者\n5、\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。\n往年回顾\n低代码编程,恐怕不会成功(#341)\nAI 没有护城河(#291)\n中国的增长动力在内陆(#241)\n一个程序员的财务独立之路(#191)\n(完)\n一剑飘红 说:\n密码的替代方法?往期周刊好像提到有人开发过一种图像密码,就是点击图片中的某几个位置来作为密码的\n2026年3月13日 09:11 | # | 引用\ndong 说:\n我fork了一个next.js仓库,算是重新生成了一个next.js的替代品吗?\n有大公司会用AI生成的吗?\n保证没有bug吗?\n以后的升级、维护,以及支持,有人管吗?\n2026年3月13日 09:12 | # | 引用\nqiba 说:\n关于那个原生css就够了。所有的框架和构建工具最终都还是要转成原生css的,并没有在原生之外使用什么新的技术,所以不存在原生css就够了这个问题。框架和构建工具只不过是为了方便开发者,减轻部分重复的工作量\n2026年3月13日 09:18 | # | 引用\n北石 说:\n昨天公司也裁员了,现在AI的大力推广对于普通程序员来说并不是一件好事,可替代性太强\n2026年3月13日 09:52 | # | 引用\nAmaF 说:\n扑克牌密码我觉得非常不可行,5个数字好说,5个花色的顺序好难记\n2026年3月13日 10:34 | # | 引用\nF^[email protected] 说:\n在未来,AI会被政府所完全掌控,包括所有的能用到的AI领域与边界。由政府来分配AI资源。因为AI的产生与使用本身就是集整个社会资源与一体的东西。所以,这样的东西不应被任何资本或个人滥用。就像WIFI-水-电-油-粮这样的基础设施。\n只有这样,才能维持稳定的人口结构与避免陷入全球内卷的陷阱。\n当然,这时候的世界,已经很像《我们》与《美丽新世界》了。\n当我前段时间想到这样的未来时,我豁然开朗,不再焦虑。\n2026年3月13日 10:44 | # | 引用\n4cos90 说:\n重新实现? ❌\n照着开源代码优化了一版 √\n没有原版的产品原型和代码 AI 能用这么少token实现吗,光整理需求输入都费劲吧。\n2026年3月13日 11:03 | # | 引用\njiangnanboy 说:\nai的发展是码农的终结者,一声叹息\n2026年3月13日 11:09 | # | 引用\napp 说:\n为什么不能用ai生成测试用例\n2026年3月13日 11:37 | # | 引用\nid17 说:\nClinejection 那个攻击一顿操作猛如虎,最后是装 openclaw。最近付费装 openclaw 的可以装个 cline 解决一下哈哈。这是真的安装免费,付费删除了\n2026年3月13日 12:03 | # | 引用\nanny 说:\n我觉得裁员和ai没有必然的关系,无论有没有都会拆员,AI的出现会提高程序员效率是显而易见的,就像不断有新的技术和框架出现一样,你如果停滞不前被淘汰是早晚的问题。和技术没关系。\n2026年3月13日 12:49 | # | 引用\nLeo 说:\n8、Sentinel\n实际仓库名是 CCTV-Smartphone-AI-Monitoring。\n2026年3月13日 13:12 | # | 引用\nNoOne 说:\n涉及复杂的专业业务场景,这些是不公开的。\n2026年3月13日 13:52 | # | 引用\nlio 说:\nAI对于各个代码第三方包。并不进行校验,而是依赖于文字描述\nai的知识库中并没有对于人类和ai进行合作的知识。所以ai的回答并不是最优解。人类社会甚至还没发明出成熟的 “AI协作方法论”\n上下文腐烂问题。聊的越久,可能反应的越差\n自动化的程序越高,需要人力参与的进度越多,Automation Paradox(自动化悖论)自动化越高,人类越关键。并不是解决了问题,而是将问题进行转移了。\n当 AI 模型不知道某件事时,它并不总会说“I don't know.” 相反,它会基于见过的模式生成看起来最可能的内容。这几条是我整理出来的对于ai的一些心得。不知道大家是什么看法\n2026年3月13日 13:55 | # | 引用\nXZY 说:\n就像唱片普及了之后,去听音乐会的人就少了。现场听的确沉浸感更强,但是大多数人能够忍受这样的品质下降的了。\n没有test case保证的AI生成的代码,也会有那些只要短时间能上而不是那么在意品质的人喜欢用的。毕竟大部分软件都没有办法活到类似sqlite的高度的。\n2026年3月13日 14:00 | # | 引用\nBFlower 说:\nwindows 锁屏可以设这种图片密码诶\n2026年3月13日 14:03 | # | 引用\nmirakyux 说:\nwindows之前的登录方式里就有个这样的图片密码\n2026年3月13日 14:05 | # | 引用\n老牛 说:\n大概率都是:黑红梅方 LOL\n2026年3月13日 14:11 | # | 引用\nrz 说:\n我建议可以搞一个“爱泼斯坦”分身,谁赞成?谁同意?\n2026年3月13日 14:12 | # | 引用\n秋风于渭水 说:\n即使chardet 7.0开发者只给 AI 提供 chardet 的 API 文档、功能描述和测试用例,完全不给 AI 看 chardet 的底层源码。看上去 AI 真的是凭空写出了一套能通过所有测试的代码。\n但像 GPT-4、Claude、Gemini 这样的超大模型,其训练数据中极大概率已经包含了开源的 chardet 源码。当chardet 7.0的开发者要求 AI “写一个类似 chardet 的工具”时,AI 实际上可能是从它的权重记忆中“回想”并“拼凑”出了原版 LGPL 代码的逻辑或片段,而不是真正从零开始推导。如果生成的代码中带有原始 chardet 的“代码指纹”或特有的非标准逻辑,并不是真正意义上的从0开始写的,我感觉在法律上依然会被判定为衍生作品。\n2026年3月13日 14:35 | # | 引用\nxsng 说:\n不就是以前的卡密吗?\n2026年3月13日 15:00 | # | 引用\nDangGwanHOu 说:\n扑克牌密码的复杂度应该是(A_52)^5,即排列组合的A、52下标、5上标,存在52 * 51 * 50 * 49 * 48 = 311_875_200种可能,即3.11亿种。如果网站没有设置锁IP等防暴力破解的安全措施,理论上很容易被破解\n2026年3月13日 15:13 | # | 引用\nbaochuquan 说:\nAI发展至今,一切始于代码开源,程序员最终把自己的命革掉了\n2026年3月13日 15:44 | # | 引用\ntietouwa 说:\n人类成功从cmd发展出UI,现在又回到了cmd,以后人手一个AI,是不是就不需要UI了\n2026年3月13日 16:17 | # | 引用\n草梅友仁 说:\n扑克牌密码从本质上讲是52个字符选5个到排列数,甚至不能重复,粗略算了下一共就3亿多种可能性。\n字符数量其实跟只使用英文字符大小写是一样的,而通常安全的密码还会要求添加数字、特殊字符等来扩大字符范围,也会要求更长的密码来增加破解时间。\n故扑克牌密码作为一个秘密是不怎么安全的,只是看上去花哨。\n2026年3月13日 16:35 | # | 引用\nzheng 说:\n数字芯片设计,不仅RTL代码不开源,工具链还支持代码加密,可以商业IP买卖,验证代码一样,各种协议的验证代码,测试用例,都有商业化,比如synopsis。想AI化?连训练素材都拿不到,只有使用文档,有问题就人工技术支持\n2026年3月13日 16:38 | # | 引用\n云闲 说:\n“早晚”的问题对于程序员来事就是最大的问题。多工作一年多赚一年,AI的快速进步使得问题变得更严峻。虽然未来很美好,可惜现阶段人们需要工作来赚钱养家糊口。\n2026年3月13日 17:18 | # | 引用\nLance 说:\n问题是,走向这一最终图景(且是积极的结局,而非cyberpunk)的过程是很痛苦黑暗动荡的\n2026年3月13日 17:25 | # | 引用\nKsir 说:\n代码正在变得廉价,而“解决问题的逻辑”正在变得昂贵。 测试中包含了解决什么问题的细节和验证\n2026年3月13日 19:24 | # | 引用\n老鱼 说:\n你错了。你们公司并不是因为 AI 才裁员的。而是因为现在经济很不好,巨头们拿走了大多数利益并且掌控了互联网上面的多数变现渠道。你们公司因为利润过低亏损而开始裁员。AI 当然提升了效率,增加了需求和岗位,但是这些岗位又被集中到大厂去,因为只有大厂才有资源训练 AI 以及对应用场景进行试错。并且现在的大厂似乎并不愿意把生态让出来给中小厂,而是自己亲自动手做应用。因此,这次的 AI 狂潮,对于国内,几乎只是大厂们自己的狂欢。\n另外,有可能你们公司已经亏损很久了,所以用 AI 这个借口开始裁员而已。\n这就是一句名言所说的“雪崩时,没有一片雪花是无辜的。”国内经济不好时,只要身处这个环境就不可能独善其身。\n2026年3月13日 19:54 | # | 引用\n老鱼 说:\n这基本上就是做梦。这种许愿发生的可能性很低。AI 必然会被资本控制。普通人,还是准备好迎接时代大山压来吧。几乎每次工业革命都会带来战争,第一次、第二次都是。第三次信息革命带来了冷战。很快就要热战了。大家不打几仗是打不成共识的。\n2026年3月13日 19:59 | # | 引用\n明知故犯 说:\n人类目前的排便时间应该会超过这个平均数字,如果是拿着手机,时间会更久一些\n2026年3月13日 21:01 | # | 引用\nRedNax 说:\n略扯。\n先不说第一次第二次工业革命是不是“带来”了战争,第三次信息革命发生的时候都苏联解体冷战结束了,哪来战争?海湾战争也要按到信息革命上去吗?\n2026年3月14日 04:50 | # | 引用\ndg1245 说:\n过去记录密码是:脑子想一组数字字符,注册账号输入密码,然后用纸笔记录密码;\n现在是:从一副扑克牌里随机抽取几张牌,注册账号选择扑克牌作为密码,然后把抽取的扑克牌按顺序塞到信封里放到抽屉里;\n好处是:抽牌比脑子想更随机,不用费劲写字,实物存储密码比网络存储安全;\n缺点很多,不一一列举。\n2026年3月14日 12:49 | # | 引用\ndatou 说:\n《复杂社会的崩溃》-复杂性边际收益递减,我觉得AI有机会解决这个问题,类似规则太多和需要律师的事,需要使用AI工具打破,包括阶级也是。现在有些医疗种类,明目张胆地结团牟利,感觉已经形成了利益阶层,没有重大变故,难以打破。需要AI工具支持下的平权冲击。\n2026年3月14日 21:20 | # | 引用\nc0m4r 说:\n感谢您提到我的监控工具 - KULA。我邀请所有中国朋友来尝试一下!如果您有任何问题或想要提出更改建议,请在 Github 上写一个问题 - 可能会用您的语言!谢谢。\n2026年3月15日 09:13 | # | 引用\nmat 说:\n很多测试用例都是根据实际问题衍生的,这种测试用例AI没法生成\n2026年3月15日 13:31 | # | 引用\nplaster 说:\n不同的是,速度太快了。\n原来新的技术、新的框架出来,到真正大规模应用都有一个比较长的过程,在这个过程中会产生更多的需求,因此效率提高了但对人的需求不会显著降低。\n现在AI替代编程的这个速度,直接把人的岗位的替代了,而新岗位还没有产生\n2026年3月16日 12:03 | # | 引用\n光 说:\n不但不需要ui,我看高级语言也不需要,直接二进制。反正AI写的一定大概率会比人写的好,而且只要通过测试,管它代码怎么写的呢?参考AlphaGo下围棋人类看不懂之案例。\n2026年3月16日 21:42 | # | 引用\ndodo 说:\n这不就是安卓的锁屏密码嘛\n2026年3月17日 11:35 | # | 引用\nshen 说:\n1. 巨石悬索桥是怎么保证游客安全的?\n2. 英国红色邮筒,太阳能板和寄包裹有啥关系呢?\n2026年3月18日 17:52 | # | 引用\nshen 说:\n说明不相信AI\n2026年3月18日 18:03 | # | 引用\nKit Yeung 说:\n虽然测试用例可以用于复刻开源产品,但是生态还是无法复刻的。而且从用户的角度来看,其实这是好事,谁的点子多,功能好,就可以取代你,相应的会促进当前产品开发的居安思危,才能把产品做得更好,否则随时被取代。\n不然想A\\一样,面对opencode和openclaw的行为,只会增加公众对他的厌恶\n2026年3月20日 15:27 | # | 引用\n阿债 说:\n大树杜鹃那个原文,“0.25平方米内发现了40多株”,西双版纳植物所的研究员,都不看自己的稿子了,对吗?\n2026年3月20日 17:29 | # | 引用", + "quality_flags": { + "is_paywalled": true, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 10296 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "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, + "reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。" + }, + "filter_result": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 95, + "review_state": "pending", + "source_refs": { + "item_path": "outputs\\freshrss\\items\\batch\\item-03.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-03.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-03\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-03.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T10:25:49.267743Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-102549" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.article-candidate.json b/outputs/freshrss/candidates/batch/item-03.article-candidate.json new file mode 100644 index 0000000..890524a --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-03.article-candidate.json @@ -0,0 +1,144 @@ +{ + "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "item": { + "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "source_id": "freshrss:66c2d55d7563e741", + "external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db", + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "author": "阮一峰", + "published_at": "2026-03-12T23:59:16Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "

这里记录每周值得分享的科技内容,周五发布。

\n\n

本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系(yifeng.ruan@gmail.com)。

\n\n

封面图

\n\n

\"\"

\n\n

重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)

\n\n

测试是新的护城河

\n\n

Next.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。

\n\n

\"\"

\n\n

两周前,这个框架被一则新闻颠覆了。

\n\n

一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。

\n\n

\"\"

\n\n

事实上,一天就生成产品原型了,后面几天只是在完善。

\n\n
\n

\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。

\n\n

接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"

\n
\n\n

这个新的实现,比原版 Next.js 性能更好。

\n\n
\n

\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"

\n
\n\n

这个 vinext 的代码已经放出来了。

\n\n

\"\"

\n\n

我觉得,这件事对 Next.js 的打击非常大。

\n\n

Next.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。

\n\n

这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。

\n\n

你知道花了多少钱?Token 费用仅仅为 1100 美元!

\n\n

这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。

\n\n

推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。

\n\n

那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。

\n\n

怎么防呢?关键就是测试用例。

\n\n

Cloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。

\n\n

如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。

\n\n

可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。

\n\n

\"\"

\n\n

世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!

\n\n

其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。

\n\n

无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。

\n\n

\"\"

\n\n

说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。

\n\n

AI 复刻的版权问题

\n\n

AI 复刻软件还有一个版权问题,也引起了很大争议。

\n\n

\"\"

\n\n

Next.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。

\n\n

chardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。

\n\n

网上的意见也分成了两派。

\n\n

支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。

\n\n

反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。

\n\n

更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。

\n\n

按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。

\n\n

科技动态

\n\n

1、AI 改写脏话

\n\n

游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。

\n\n

\"\"

\n\n

以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。

\n\n

现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。

\n\n

虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。

\n\n

2、飞机的激光上网

\n\n

欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。

\n\n

\"\"

\n\n

飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。

\n\n

\"\"

\n\n

上图就是安装在飞机舷窗上的激光终端。

\n\n

激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。

\n\n

缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。

\n\n

3、Grammarly 的专家意见

\n\n

Grammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。

\n\n

\"\"

\n\n

一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。

\n\n

\"\"

\n\n

原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。

\n\n

这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?

\n\n

4、太阳能邮筒

\n\n

网络通信普及以后,传统的邮筒怎么办?

\n\n

英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。

\n\n

\"\"

\n\n

邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。

\n\n

\"\"

\n\n

这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。

\n\n

\"\"

\n\n

文章

\n\n

1、GitHub Issue 标题的注入攻击(英文)

\n\n

\"\"

\n\n

这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。

\n\n

2、重新评估 AGENTS.md(英文)

\n\n

\"\"

\n\n

最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。

\n\n

它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。

\n\n

3、Temporal API 的九年历程(英文)

\n\n

\"\"

\n\n

本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。

\n\n

4、AI 的胡说测试(英文)

\n\n

\"\"

\n\n

国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。

\n\n

5、原生 CSS 就足够了(英文)

\n\n

\"\"

\n\n

本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。

\n\n

6、粪便物理学(英文)

\n\n

\"\"

\n\n

一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。

\n\n

工具

\n\n

1、KULA

\n\n

\"\"

\n\n

Linux 服务器的监控工具,只有一个二进制文件。

\n\n

2、AnsiSaver

\n\n

\"\"

\n\n

mac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。

\n\n

3、upiano

\n\n

\"\"

\n\n

在命令行下模拟钢琴弹奏。

\n\n

4、WSL Distro Manager

\n\n

\"\"

\n\n

一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。

\n\n

5、Mole

\n\n

\"\"

\n\n

开源的 Mac 电脑清理和优化工具。

\n\n

6、PipeGate

\n\n

一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。

\n\n

7、HookListener

\n\n

\"\"

\n\n

一个管理、测试 Webhook 的在线工具,个人可以免费使用。

\n\n

8、Sentinel

\n\n

\"\"

\n\n

将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)

\n\n

9、Flux Monitor

\n\n

\"\"

\n\n

Mac 电脑的系统监控、管理面板。(@chentao1006 投稿)

\n\n

AI 相关

\n\n

1、Agentic Metric

\n\n

\"\"

\n\n

一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)

\n\n

2、cc-connect

\n\n

\"\"

\n\n

一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)

\n\n

3、Page Agent

\n\n

\"\"

\n\n

只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。

\n\n

4、Agent Safehouse

\n\n

一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。

\n\n

5、Repo Tokens

\n\n

\"\"

\n\n

一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。

\n\n

资源

\n\n

1、世界监控(World Monitor)

\n\n

\"\"

\n\n

世界局势的一个实时看板,把各种消息源都放在一个网页里。

\n\n

2、炼油厂探索

\n\n

\"\"

\n\n

一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。

\n\n

3、Mechanical Pencil

\n\n

\"\"

\n\n

弹簧笔、打火机等生活小物品的机械装置动画。

\n\n

图片

\n\n

1、密码的替代方法

\n\n

一位程序员发明了一种新的密码方法,你觉得可行吗?

\n\n

系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。

\n\n

\"\"

\n\n

下次登录时,用户必须按同样顺序挑出同样的5张牌。

\n\n

文摘

\n\n

1、复杂社会的崩溃

\n\n

我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。

\n\n

美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。

\n\n

\"\"

\n\n

1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?

\n\n

他认为,原因是这些社会有一个敌人----复杂性。

\n\n

随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。

\n\n

一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。

\n\n

(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。

\n\n

(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。

\n\n

(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。

\n\n

(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。

\n\n

以上因素的共同作用,导致历史上很多强大的社会最终崩溃。

\n\n

言论

\n\n

1、

\n\n

2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。

\n\n

2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。

\n\n

-- 《我不知道十年后我的工作是否还存在》

\n\n

2、

\n\n

与强大的 AI 对抗会是什么感觉?

\n\n

你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。

\n\n

这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。

\n\n

-- probablydance.com

\n\n

3、

\n\n

阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。

\n\n

这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。

\n\n

-- 《阅读商战书籍是浪费时间》

\n\n

4、

\n\n

我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。

\n\n

-- Simon Willison,著名开发者

\n\n

5、

\n\n

时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。

\n\n

-- 《不要太看重 AI 大模型的订阅费》

\n\n

往年回顾

\n\n

低代码编程,恐怕不会成功(#341)

\n\n

AI 没有护城河(#291)

\n\n

中国的增长动力在内陆(#241)

\n\n

一个程序员的财务独立之路(#191)

\n\n

(完)

\n\n

文档信息

\n
\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/2", + "htmlUrl": "http://www.ruanyifeng.com/blog/", + "title": "阮一峰的网络日志" + }, + "categories": [ + "rss", + "user/-/state/org.freshrss/main", + "Weekly" + ], + "crawled_at": "2026-03-24T09:18:21.528000Z", + "published_epoch": 1773359956 + }, + "fetch_state": "pending" + }, + "article": { + "extract_id": "sha256:fdc9230d42ec24f867f94f3198960e8104f633fb8ab532645b384baf1df6b369", + "item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093", + "source_id": "freshrss:66c2d55d7563e741", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "author": "阮一峰", + "published_at": "2026-03-12T23:59:16Z", + "language": null, + "content_kind": "article", + "plain_text": "这里记录每周值得分享的科技内容,周五发布。\n本杂志开源,欢迎投稿。另有《谁在招人》服务,发布程序员招聘信息。合作请邮件联系([email protected])。\n封面图\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via)\n测试是新的护城河\nNext.js 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。\n两周前,这个框架被一则新闻颠覆了。\n一个 Cloudflare 工程师宣布,他只用一个星期就用 AI 重新实现了 Next.js,起名为 vinext。\n事实上,一天就生成产品原型了,后面几天只是在完善。\n\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。\n接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"\n这个新的实现,比原版 Next.js 性能更好。\n\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\"\n这个 vinext 的代码已经放出来了。\n我觉得,这件事对 Next.js 的打击非常大。\nNext.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。\n这种看似难以逾越的护城河,在 AI 面前不堪一击。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。\n你知道花了多少钱?Token 费用仅仅为 1100 美元!\n这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。\n推而广之,所有的商业软件都受到了重创。代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。\n那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。\n怎么防呢?关键就是测试用例。\nCloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。\n如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。\n可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。测试才是新的护城河。\n世界最流行的数据库 SQLite,本身代码15.6万行,但是测试用例9205万行,足足大了590倍!\n其中,最核心的测试套件 TH3 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。\n无独有偶,就在前两天,另一个开源项目 tldraw 也准备将测试用例闭源。\n说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。\nAI 复刻的版权问题\nAI 复刻软件还有一个版权问题,也引起了很大争议。\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。\n网上的意见也分成了两派。\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。\n科技动态\n1、AI 改写脏话\n游戏平台 Roblox 宣布,将用 AI 实时修改玩家的对话,让其变得更文明。\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####\n,你还是知道他在骂人。\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。\n2、飞机的激光上网\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。\n上图就是安装在飞机舷窗上的激光终端。\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?\n4、太阳能邮筒\n网络通信普及以后,传统的邮筒怎么办?\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。\n文章\n1、GitHub Issue 标题的注入攻击(英文)\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。\n2、重新评估 AGENTS.md(英文)\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。\n3、Temporal API 的九年历程(英文)\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。\n4、AI 的胡说测试(英文)\n国外有一个 BuillshitBench,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。\n5、原生 CSS 就足够了(英文)\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。\n6、粪便物理学(英文)\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。\n工具\n1、KULA\nLinux 服务器的监控工具,只有一个二进制文件。\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。\n3、upiano\n在命令行下模拟钢琴弹奏。\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。\n5、Mole\n开源的 Mac 电脑清理和优化工具。\n6、PipeGate\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。\n8、Sentinel\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)\nAI 相关\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。\n资源\n1、世界监控(World Monitor)\n世界局势的一个实时看板,把各种消息源都放在一个网页里。\n2、炼油厂探索\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。\n弹簧笔、打火机等生活小物品的机械装置动画。\n图片\n1、密码的替代方法\n一位程序员发明了一种新的密码方法,你觉得可行吗?\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。\n下次登录时,用户必须按同样顺序挑出同样的5张牌。\n文摘\n1、复杂社会的崩溃\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?\n他认为,原因是这些社会有一个敌人----复杂性。\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。\n言论\n1、\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。\n2、\n与强大的 AI 对抗会是什么感觉?\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。\n3、\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。\n4、\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。\n-- Simon Willison,著名开发者\n5、\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。\n往年回顾\n低代码编程,恐怕不会成功(#341)\nAI 没有护城河(#291)\n中国的增长动力在内陆(#241)\n一个程序员的财务独立之路(#191)\n(完)\n一剑飘红 说:\n密码的替代方法?往期周刊好像提到有人开发过一种图像密码,就是点击图片中的某几个位置来作为密码的\n2026年3月13日 09:11 | # | 引用\ndong 说:\n我fork了一个next.js仓库,算是重新生成了一个next.js的替代品吗?\n有大公司会用AI生成的吗?\n保证没有bug吗?\n以后的升级、维护,以及支持,有人管吗?\n2026年3月13日 09:12 | # | 引用\nqiba 说:\n关于那个原生css就够了。所有的框架和构建工具最终都还是要转成原生css的,并没有在原生之外使用什么新的技术,所以不存在原生css就够了这个问题。框架和构建工具只不过是为了方便开发者,减轻部分重复的工作量\n2026年3月13日 09:18 | # | 引用\n北石 说:\n昨天公司也裁员了,现在AI的大力推广对于普通程序员来说并不是一件好事,可替代性太强\n2026年3月13日 09:52 | # | 引用\nAmaF 说:\n扑克牌密码我觉得非常不可行,5个数字好说,5个花色的顺序好难记\n2026年3月13日 10:34 | # | 引用\nF^[email protected] 说:\n在未来,AI会被政府所完全掌控,包括所有的能用到的AI领域与边界。由政府来分配AI资源。因为AI的产生与使用本身就是集整个社会资源与一体的东西。所以,这样的东西不应被任何资本或个人滥用。就像WIFI-水-电-油-粮这样的基础设施。\n只有这样,才能维持稳定的人口结构与避免陷入全球内卷的陷阱。\n当然,这时候的世界,已经很像《我们》与《美丽新世界》了。\n当我前段时间想到这样的未来时,我豁然开朗,不再焦虑。\n2026年3月13日 10:44 | # | 引用\n4cos90 说:\n重新实现? ❌\n照着开源代码优化了一版 √\n没有原版的产品原型和代码 AI 能用这么少token实现吗,光整理需求输入都费劲吧。\n2026年3月13日 11:03 | # | 引用\njiangnanboy 说:\nai的发展是码农的终结者,一声叹息\n2026年3月13日 11:09 | # | 引用\napp 说:\n为什么不能用ai生成测试用例\n2026年3月13日 11:37 | # | 引用\nid17 说:\nClinejection 那个攻击一顿操作猛如虎,最后是装 openclaw。最近付费装 openclaw 的可以装个 cline 解决一下哈哈。这是真的安装免费,付费删除了\n2026年3月13日 12:03 | # | 引用\nanny 说:\n我觉得裁员和ai没有必然的关系,无论有没有都会拆员,AI的出现会提高程序员效率是显而易见的,就像不断有新的技术和框架出现一样,你如果停滞不前被淘汰是早晚的问题。和技术没关系。\n2026年3月13日 12:49 | # | 引用\nLeo 说:\n8、Sentinel\n实际仓库名是 CCTV-Smartphone-AI-Monitoring。\n2026年3月13日 13:12 | # | 引用\nNoOne 说:\n涉及复杂的专业业务场景,这些是不公开的。\n2026年3月13日 13:52 | # | 引用\nlio 说:\nAI对于各个代码第三方包。并不进行校验,而是依赖于文字描述\nai的知识库中并没有对于人类和ai进行合作的知识。所以ai的回答并不是最优解。人类社会甚至还没发明出成熟的 “AI协作方法论”\n上下文腐烂问题。聊的越久,可能反应的越差\n自动化的程序越高,需要人力参与的进度越多,Automation Paradox(自动化悖论)自动化越高,人类越关键。并不是解决了问题,而是将问题进行转移了。\n当 AI 模型不知道某件事时,它并不总会说“I don't know.” 相反,它会基于见过的模式生成看起来最可能的内容。这几条是我整理出来的对于ai的一些心得。不知道大家是什么看法\n2026年3月13日 13:55 | # | 引用\nXZY 说:\n就像唱片普及了之后,去听音乐会的人就少了。现场听的确沉浸感更强,但是大多数人能够忍受这样的品质下降的了。\n没有test case保证的AI生成的代码,也会有那些只要短时间能上而不是那么在意品质的人喜欢用的。毕竟大部分软件都没有办法活到类似sqlite的高度的。\n2026年3月13日 14:00 | # | 引用\nBFlower 说:\nwindows 锁屏可以设这种图片密码诶\n2026年3月13日 14:03 | # | 引用\nmirakyux 说:\nwindows之前的登录方式里就有个这样的图片密码\n2026年3月13日 14:05 | # | 引用\n老牛 说:\n大概率都是:黑红梅方 LOL\n2026年3月13日 14:11 | # | 引用\nrz 说:\n我建议可以搞一个“爱泼斯坦”分身,谁赞成?谁同意?\n2026年3月13日 14:12 | # | 引用\n秋风于渭水 说:\n即使chardet 7.0开发者只给 AI 提供 chardet 的 API 文档、功能描述和测试用例,完全不给 AI 看 chardet 的底层源码。看上去 AI 真的是凭空写出了一套能通过所有测试的代码。\n但像 GPT-4、Claude、Gemini 这样的超大模型,其训练数据中极大概率已经包含了开源的 chardet 源码。当chardet 7.0的开发者要求 AI “写一个类似 chardet 的工具”时,AI 实际上可能是从它的权重记忆中“回想”并“拼凑”出了原版 LGPL 代码的逻辑或片段,而不是真正从零开始推导。如果生成的代码中带有原始 chardet 的“代码指纹”或特有的非标准逻辑,并不是真正意义上的从0开始写的,我感觉在法律上依然会被判定为衍生作品。\n2026年3月13日 14:35 | # | 引用\nxsng 说:\n不就是以前的卡密吗?\n2026年3月13日 15:00 | # | 引用\nDangGwanHOu 说:\n扑克牌密码的复杂度应该是(A_52)^5,即排列组合的A、52下标、5上标,存在52 * 51 * 50 * 49 * 48 = 311_875_200种可能,即3.11亿种。如果网站没有设置锁IP等防暴力破解的安全措施,理论上很容易被破解\n2026年3月13日 15:13 | # | 引用\nbaochuquan 说:\nAI发展至今,一切始于代码开源,程序员最终把自己的命革掉了\n2026年3月13日 15:44 | # | 引用\ntietouwa 说:\n人类成功从cmd发展出UI,现在又回到了cmd,以后人手一个AI,是不是就不需要UI了\n2026年3月13日 16:17 | # | 引用\n草梅友仁 说:\n扑克牌密码从本质上讲是52个字符选5个到排列数,甚至不能重复,粗略算了下一共就3亿多种可能性。\n字符数量其实跟只使用英文字符大小写是一样的,而通常安全的密码还会要求添加数字、特殊字符等来扩大字符范围,也会要求更长的密码来增加破解时间。\n故扑克牌密码作为一个秘密是不怎么安全的,只是看上去花哨。\n2026年3月13日 16:35 | # | 引用\nzheng 说:\n数字芯片设计,不仅RTL代码不开源,工具链还支持代码加密,可以商业IP买卖,验证代码一样,各种协议的验证代码,测试用例,都有商业化,比如synopsis。想AI化?连训练素材都拿不到,只有使用文档,有问题就人工技术支持\n2026年3月13日 16:38 | # | 引用\n云闲 说:\n“早晚”的问题对于程序员来事就是最大的问题。多工作一年多赚一年,AI的快速进步使得问题变得更严峻。虽然未来很美好,可惜现阶段人们需要工作来赚钱养家糊口。\n2026年3月13日 17:18 | # | 引用\nLance 说:\n问题是,走向这一最终图景(且是积极的结局,而非cyberpunk)的过程是很痛苦黑暗动荡的\n2026年3月13日 17:25 | # | 引用\nKsir 说:\n代码正在变得廉价,而“解决问题的逻辑”正在变得昂贵。 测试中包含了解决什么问题的细节和验证\n2026年3月13日 19:24 | # | 引用\n老鱼 说:\n你错了。你们公司并不是因为 AI 才裁员的。而是因为现在经济很不好,巨头们拿走了大多数利益并且掌控了互联网上面的多数变现渠道。你们公司因为利润过低亏损而开始裁员。AI 当然提升了效率,增加了需求和岗位,但是这些岗位又被集中到大厂去,因为只有大厂才有资源训练 AI 以及对应用场景进行试错。并且现在的大厂似乎并不愿意把生态让出来给中小厂,而是自己亲自动手做应用。因此,这次的 AI 狂潮,对于国内,几乎只是大厂们自己的狂欢。\n另外,有可能你们公司已经亏损很久了,所以用 AI 这个借口开始裁员而已。\n这就是一句名言所说的“雪崩时,没有一片雪花是无辜的。”国内经济不好时,只要身处这个环境就不可能独善其身。\n2026年3月13日 19:54 | # | 引用\n老鱼 说:\n这基本上就是做梦。这种许愿发生的可能性很低。AI 必然会被资本控制。普通人,还是准备好迎接时代大山压来吧。几乎每次工业革命都会带来战争,第一次、第二次都是。第三次信息革命带来了冷战。很快就要热战了。大家不打几仗是打不成共识的。\n2026年3月13日 19:59 | # | 引用\n明知故犯 说:\n人类目前的排便时间应该会超过这个平均数字,如果是拿着手机,时间会更久一些\n2026年3月13日 21:01 | # | 引用\nRedNax 说:\n略扯。\n先不说第一次第二次工业革命是不是“带来”了战争,第三次信息革命发生的时候都苏联解体冷战结束了,哪来战争?海湾战争也要按到信息革命上去吗?\n2026年3月14日 04:50 | # | 引用\ndg1245 说:\n过去记录密码是:脑子想一组数字字符,注册账号输入密码,然后用纸笔记录密码;\n现在是:从一副扑克牌里随机抽取几张牌,注册账号选择扑克牌作为密码,然后把抽取的扑克牌按顺序塞到信封里放到抽屉里;\n好处是:抽牌比脑子想更随机,不用费劲写字,实物存储密码比网络存储安全;\n缺点很多,不一一列举。\n2026年3月14日 12:49 | # | 引用\ndatou 说:\n《复杂社会的崩溃》-复杂性边际收益递减,我觉得AI有机会解决这个问题,类似规则太多和需要律师的事,需要使用AI工具打破,包括阶级也是。现在有些医疗种类,明目张胆地结团牟利,感觉已经形成了利益阶层,没有重大变故,难以打破。需要AI工具支持下的平权冲击。\n2026年3月14日 21:20 | # | 引用\nc0m4r 说:\n感谢您提到我的监控工具 - KULA。我邀请所有中国朋友来尝试一下!如果您有任何问题或想要提出更改建议,请在 Github 上写一个问题 - 可能会用您的语言!谢谢。\n2026年3月15日 09:13 | # | 引用\nmat 说:\n很多测试用例都是根据实际问题衍生的,这种测试用例AI没法生成\n2026年3月15日 13:31 | # | 引用\nplaster 说:\n不同的是,速度太快了。\n原来新的技术、新的框架出来,到真正大规模应用都有一个比较长的过程,在这个过程中会产生更多的需求,因此效率提高了但对人的需求不会显著降低。\n现在AI替代编程的这个速度,直接把人的岗位的替代了,而新岗位还没有产生\n2026年3月16日 12:03 | # | 引用\n光 说:\n不但不需要ui,我看高级语言也不需要,直接二进制。反正AI写的一定大概率会比人写的好,而且只要通过测试,管它代码怎么写的呢?参考AlphaGo下围棋人类看不懂之案例。\n2026年3月16日 21:42 | # | 引用\ndodo 说:\n这不就是安卓的锁屏密码嘛\n2026年3月17日 11:35 | # | 引用\nshen 说:\n1. 巨石悬索桥是怎么保证游客安全的?\n2. 英国红色邮筒,太阳能板和寄包裹有啥关系呢?\n2026年3月18日 17:52 | # | 引用\nshen 说:\n说明不相信AI\n2026年3月18日 18:03 | # | 引用\nKit Yeung 说:\n虽然测试用例可以用于复刻开源产品,但是生态还是无法复刻的。而且从用户的角度来看,其实这是好事,谁的点子多,功能好,就可以取代你,相应的会促进当前产品开发的居安思危,才能把产品做得更好,否则随时被取代。\n不然想A\\一样,面对opencode和openclaw的行为,只会增加公众对他的厌恶\n2026年3月20日 15:27 | # | 引用\n阿债 说:\n大树杜鹃那个原文,“0.25平方米内发现了40多株”,西双版纳植物所的研究员,都不看自己的稿子了,对吗?\n2026年3月20日 17:29 | # | 引用", + "quality_flags": { + "is_paywalled": true, + "is_truncated": false, + "is_low_content": false + }, + "metadata": { + "content_source": "fetched_html", + "extractor": "trafilatura", + "char_count": 10296 + }, + "pipeline_state": "extracted" + }, + "summary": { + "title": "科技爱好者周刊(第 388 期):测试是新的护城河", + "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html", + "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, + "reason": "文章深入探讨了 AI 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。" + }, + "filter_decision": { + "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 + } + ] + }, + "digest_section_hint": null, + "digest_rank": 95, + "review_state": "pending", + "source_refs": { + "raw_item_path": "outputs\\freshrss\\items\\batch\\item-03.item.json", + "extracted_path": "outputs\\freshrss\\extracted\\batch\\item-03.extracted.json", + "summary_path": "outputs\\freshrss\\summary\\batch\\item-03\\result.loop.json", + "filter_path": "outputs\\freshrss\\filter\\batch\\item-03.filter.json" + }, + "rendered_markdown": null, + "metadata": { + "generated_at": "2026-03-25T08:48:44.069174Z", + "pipeline_version": "v1", + "producer": "run_article_candidate.py", + "run_id": "candidate-20260325-084844" + } +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json b/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json new file mode 100644 index 0000000..9dcc4ce --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-03.openclaw-candidate-input.json @@ -0,0 +1,42 @@ +{ + "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 +} \ No newline at end of file diff --git a/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json b/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json new file mode 100644 index 0000000..b16988a --- /dev/null +++ b/outputs/freshrss/candidates/batch/item-04.article-candidate-record.json @@ -0,0 +1,129 @@ +{ + "candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103", + "item": { + "item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103", + "source_id": "freshrss:2987af960359c5c0", + "external_id": "tag:google.com,2005:reader/item/00064dc18f09d916", + "title": "FreshRSS 1.28.1", + "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1", + "author": "Alkarex", + "published_at": "2026-01-25T18:20:16Z", + "discovered_at": "2026-03-25T08:40:22.917124Z", + "content_kind": "article", + "language": null, + "raw_summary": "\n

This is a release focussing on bug fixing, in particular regressions from the release 1.28.0.

\n

Selected new features ✨:

\n\n

Improved performance 🏎️:

\n\n

Many bug fixes 🐛

\n

This release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.

\n

Full changelog:

\n
\n\t

\n\t\t\"\"\n\t

\n
", + "raw_content": null, + "metadata": { + "upstream": "freshrss", + "origin": { + "streamId": "feed/1", + "htmlUrl": "https://github.com/FreshRSS/FreshRSS/", + "title": "FreshRSS releases" + }, + "categories": [ + "未分类", + "user/-/state/org.freshrss/main" + ], + "crawled_at": "2026-03-24T09:13:04.078000Z", + "published_epoch": 1769365216 + }, + "fetch_state": "pending" + }, + "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