\n#8190 - Improve scroll of article after load of user labels #7962\n- Keep scroll state of page when closing the slider #8295, #8301\n- Scroll into filtered feed/category on page load #8281\n- Display sidebar dropdowns above if no space below #8335, #8336\n- Use native CSS instead of SCSS #8200, #8241\n- Using CSS nesting and relative colours.\n- Various UI and style improvements: #8171, #8185, #8196\n- JavaScript finalise migration from\nPromise\ntoasync\n/await\n: #8182\n- API\n- Extensions\n- I18n\n- Translation status as text in README #7842\n- Add new translate CLI commands\nmove\n#8214 - Change some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065\n- Improve German #8028\n- Improve Greek #8146\n- Improve Finnish #8073, #8092\n- Improve Hungarian #8244\n- Improve Italian #8115, #8186\n- Improve Polish #8134, #8135\n- Improve Russian #8155, #8197\n- Improve Simplified Chinese #8308, #8313\n- Misc.\n- Add code to modify a search expression #8293\n- Remove Pocket sharing service #8127, #8128\n- Update to PHPMailer 7.0.1 #8048, #8180, #8272\n- 💥 Housekeeping of\nlib_rss.php\nwith potential breaking changes for some extensions #8193, - Use native PHP\n#[Deprecated]\n#8325 - Improve PHP code #8156, #8203, #8284,\n#8292, #8297 - GitHub Actions:\n--no-progress\n#8315 - Update dev dependencies #8043, #8044,\n#8045, #8046, #8047,\n#8052, #8176, #8177,\n#8178, #8179, #8210,\n#8270, #8271, #8273,\n#8274, #8275, #8276",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 8644
+ },
+ "pipeline_state": "extracted"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss.extracted.json b/outputs/freshrss/extracted/freshrss.try.extracted.json
similarity index 99%
rename from outputs/freshrss.extracted.json
rename to outputs/freshrss/extracted/freshrss.try.extracted.json
index f496b25..ea7336d 100644
--- a/outputs/freshrss.extracted.json
+++ b/outputs/freshrss/extracted/freshrss.try.extracted.json
@@ -13,7 +13,7 @@
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"author": "阮一峰",
"published_at": "2026-03-21T10:19:11Z",
- "discovered_at": "2026-03-24T09:54:30.195895Z",
+ "discovered_at": "2026-03-25T07:42:10.307590Z",
"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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \n\n \n
",
diff --git a/outputs/freshrss/extracted/freshrss.try.extracted.single.json b/outputs/freshrss/extracted/freshrss.try.extracted.single.json
new file mode 100644
index 0000000..ba97493
--- /dev/null
+++ b/outputs/freshrss/extracted/freshrss.try.extracted.single.json
@@ -0,0 +1,32 @@
+{
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/batch/item-01.filter.json b/outputs/freshrss/filter/batch/item-01.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/filter/batch/item-01.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/batch/item-02.filter.json b/outputs/freshrss/filter/batch/item-02.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/filter/batch/item-02.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/batch/item-03.filter.json b/outputs/freshrss/filter/batch/item-03.filter.json
new file mode 100644
index 0000000..579f27a
--- /dev/null
+++ b/outputs/freshrss/filter/batch/item-03.filter.json
@@ -0,0 +1,40 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/batch/item-04.filter.json b/outputs/freshrss/filter/batch/item-04.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/filter/batch/item-04.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/batch/item-05.filter.json b/outputs/freshrss/filter/batch/item-05.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/filter/batch/item-05.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/filter/freshrss.try.filter.json b/outputs/freshrss/filter/freshrss.try.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/filter/freshrss.try.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/batch/item-01.item.json b/outputs/freshrss/items/batch/item-01.item.json
new file mode 100644
index 0000000..6953f03
--- /dev/null
+++ b/outputs/freshrss/items/batch/item-01.item.json
@@ -0,0 +1,30 @@
+{
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/batch/item-02.item.json b/outputs/freshrss/items/batch/item-02.item.json
new file mode 100644
index 0000000..c453e7a
--- /dev/null
+++ b/outputs/freshrss/items/batch/item-02.item.json
@@ -0,0 +1,30 @@
+{
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/batch/item-03.item.json b/outputs/freshrss/items/batch/item-03.item.json
new file mode 100644
index 0000000..2d2b4a6
--- /dev/null
+++ b/outputs/freshrss/items/batch/item-03.item.json
@@ -0,0 +1,30 @@
+{
+ "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\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/batch/item-04.item.json b/outputs/freshrss/items/batch/item-04.item.json
new file mode 100644
index 0000000..500d8f6
--- /dev/null
+++ b/outputs/freshrss/items/batch/item-04.item.json
@@ -0,0 +1,29 @@
+{
+ "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": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/batch/item-05.item.json b/outputs/freshrss/items/batch/item-05.item.json
new file mode 100644
index 0000000..197fb85
--- /dev/null
+++ b/outputs/freshrss/items/batch/item-05.item.json
@@ -0,0 +1,29 @@
+{
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T08:40:22.917124Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/items/freshrss.items.json b/outputs/freshrss/items/freshrss.items.json
new file mode 100644
index 0000000..a3b0449
--- /dev/null
+++ b/outputs/freshrss/items/freshrss.items.json
@@ -0,0 +1,150 @@
+[
+ {
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+ },
+ {
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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"
+ },
+ {
+ "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\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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"
+ },
+ {
+ "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": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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"
+ },
+ {
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T08:40:22.917124Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+ }
+]
\ No newline at end of file
diff --git a/outputs/freshrss/items/freshrss.try.item.single.json b/outputs/freshrss/items/freshrss.try.item.single.json
new file mode 100644
index 0000000..2126036
--- /dev/null
+++ b/outputs/freshrss/items/freshrss.try.item.single.json
@@ -0,0 +1,30 @@
+{
+ "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-25T07:42:10.307590Z",
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss.items.json b/outputs/freshrss/items/freshrss.try.items.json
similarity index 99%
rename from outputs/freshrss.items.json
rename to outputs/freshrss/items/freshrss.try.items.json
index 0ea297f..162734a 100644
--- a/outputs/freshrss.items.json
+++ b/outputs/freshrss/items/freshrss.try.items.json
@@ -7,7 +7,7 @@
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
"author": "阮一峰",
"published_at": "2026-03-21T10:19:11Z",
- "discovered_at": "2026-03-24T09:54:30.195895Z",
+ "discovered_at": "2026-03-25T07:42:10.307590Z",
"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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \n\n \n
",
diff --git a/outputs/freshrss/raw/freshrss.raw.json b/outputs/freshrss/raw/freshrss.raw.json
new file mode 100644
index 0000000..09f859d
--- /dev/null
+++ b/outputs/freshrss/raw/freshrss.raw.json
@@ -0,0 +1,167 @@
+{
+ "id": "user/-/state/com.google/reading-list",
+ "updated": 1774428022,
+ "items": [
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528285",
+ "published": 1774088351,
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Developer"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528284",
+ "published": 1773964756,
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Weekly"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "这里记录每周值得分享的科技内容,周五发布。
\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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528283",
+ "published": 1773359956,
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Weekly"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc18f09d916",
+ "crawlTimeMsec": "1774343584078",
+ "timestampUsec": "1774343584078102",
+ "published": 1769365216,
+ "title": "FreshRSS 1.28.1",
+ "canonical": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/未分类",
+ "user/-/state/org.freshrss/main",
+ "user/-/state/com.google/read"
+ ],
+ "origin": {
+ "streamId": "feed/1",
+ "htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
+ "title": "FreshRSS releases"
+ },
+ "summary": {
+ "content": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \n \n\t\n\t\t \n\t
\n "
+ },
+ "author": "Alkarex"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "crawlTimeMsec": "1774343584078",
+ "timestampUsec": "1774343584078101",
+ "published": 1766604443,
+ "title": "FreshRSS 1.28.0",
+ "canonical": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/未分类",
+ "user/-/state/org.freshrss/main",
+ "user/-/state/com.google/read"
+ ],
+ "origin": {
+ "streamId": "feed/1",
+ "htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
+ "title": "FreshRSS releases"
+ },
+ "summary": {
+ "content": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \n \n\t\n\t\t \n\t
\n "
+ },
+ "author": "Alkarex"
+ }
+ ],
+ "continuation": "1774343584078101"
+}
\ No newline at end of file
diff --git a/outputs/freshrss.raw.json b/outputs/freshrss/raw/freshrss.try.raw.json
similarity index 99%
rename from outputs/freshrss.raw.json
rename to outputs/freshrss/raw/freshrss.try.raw.json
index c1adaf2..54d07be 100644
--- a/outputs/freshrss.raw.json
+++ b/outputs/freshrss/raw/freshrss.try.raw.json
@@ -1,6 +1,6 @@
{
"id": "user/-/state/com.google/reading-list",
- "updated": 1774346070,
+ "updated": 1774424530,
"items": [
{
"id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd",
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-01.article-candidate-record.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-01.article-candidate-record.json
new file mode 100644
index 0000000..85621b0
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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-25T10:32:30.103137Z",
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
+ },
+ "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\\rerun\\20260325-183221\\items\\batch\\item-01.item.json",
+ "extracted_path": "outputs\\freshrss\\rerun\\20260325-183221\\extracted\\batch\\item-01.extracted.json",
+ "summary_path": "outputs\\freshrss\\rerun\\20260325-183221\\summary\\item-01.result.loop.json",
+ "filter_path": "outputs\\freshrss\\rerun\\20260325-183221\\filter\\item-01.filter.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T10:33:08.631672Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-103308"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-01.openclaw-candidate-input.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-01.openclaw-candidate-input.json
new file mode 100644
index 0000000..5f2ae16
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-02.article-candidate-record.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-02.article-candidate-record.json
new file mode 100644
index 0000000..1b43ef4
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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-25T10:32:30.103137Z",
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多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\\rerun\\20260325-183221\\items\\batch\\item-02.item.json",
+ "extracted_path": "outputs\\freshrss\\rerun\\20260325-183221\\extracted\\batch\\item-02.extracted.json",
+ "summary_path": "outputs\\freshrss\\rerun\\20260325-183221\\summary\\item-02.result.loop.json",
+ "filter_path": "outputs\\freshrss\\rerun\\20260325-183221\\filter\\item-02.filter.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T10:33:30.435292Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-103330"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-02.openclaw-candidate-input.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-02.openclaw-candidate-input.json
new file mode 100644
index 0000000..8bfbf81
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多Agent协同",
+ "系统架构",
+ "科技动态",
+ "工具推荐"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "职业发展",
+ "科技资讯",
+ "效率工具"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-03.article-candidate-record.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-03.article-candidate-record.json
new file mode 100644
index 0000000..b8cc70a
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
+ },
+ "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\\rerun\\20260325-183221\\items\\batch\\item-03.item.json",
+ "extracted_path": "outputs\\freshrss\\rerun\\20260325-183221\\extracted\\batch\\item-03.extracted.json",
+ "summary_path": "outputs\\freshrss\\rerun\\20260325-183221\\summary\\item-03.result.loop.json",
+ "filter_path": "outputs\\freshrss\\rerun\\20260325-183221\\filter\\item-03.filter.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T10:33:50.137131Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-103350"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-03.openclaw-candidate-input.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-03.openclaw-candidate-input.json
new file mode 100644
index 0000000..471b200
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。",
+ "selection_decision": "review",
+ "selection_reason": "Article may be behind a paywall.",
+ "digest_section_hint": null,
+ "digest_rank": 95
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-04.article-candidate-record.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-04.article-candidate-record.json
new file mode 100644
index 0000000..0680355
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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·\n79 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n\nelement #8443 - Fixes before PHPStan 2 #8445, simplepie#957\n- Update of\n- Extensions\n- Update\n.gitignore\nto ignore installed extensions #8372\n- Update\n- UI\n- I18n\n- Misc.",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 2155
+ },
+ "pipeline_state": "extracted"
+ },
+ "summary": {
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
+ },
+ "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\\rerun\\20260325-183221\\items\\batch\\item-04.item.json",
+ "extracted_path": "outputs\\freshrss\\rerun\\20260325-183221\\extracted\\batch\\item-04.extracted.json",
+ "summary_path": "outputs\\freshrss\\rerun\\20260325-183221\\summary\\item-04.result.loop.json",
+ "filter_path": "outputs\\freshrss\\rerun\\20260325-183221\\filter\\item-04.filter.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T10:34:08.723118Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-103408"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-04.openclaw-candidate-input.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-04.openclaw-candidate-input.json
new file mode 100644
index 0000000..2195e89
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/item-04.openclaw-candidate-input.json
@@ -0,0 +1,42 @@
+{
+ "candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "published_at": "2026-01-25T18:20:16Z",
+ "author": "Alkarex",
+ "source_name": "FreshRSS releases",
+ "language": null,
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "worth_reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-05.article-candidate-record.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-05.article-candidate-record.json
new file mode 100644
index 0000000..34ab87b
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/item-05.article-candidate-record.json
@@ -0,0 +1,129 @@
+{
+ "candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "item": {
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+ },
+ "article": {
+ "extract_id": "sha256:398657bc79f4c8d43f1f695f772f296c9a0fc28df30758562c6cc2fbcc277ab9",
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "title": "FreshRSS 1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "FreshRSS 1.28.0\nAlkarex\nreleased this\n24 Dec 19:27\n·\n135 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a major release, just in time for the holidays 🎄\nSelected new features ✨:\n- New sorting and filtering by date of User modified, with corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour - New sorting by article length\n- New advanced search form\n- New overview of dates with most unread articles\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader)\n- Bonus: Capy Reader is also the first open source Android app to support user labels\n- Better transitions UI between groups of articles\n- New links in UI for transitions between groups of articles, and jump to next transition\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11\n- And much more…\nImproved performance 🏎️:\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users\n- Improve SQL speed for some critical requests for large databases\n- API performance optimisation thanks to streaming of large responses\nSelected bug fixes 🐛:\n- Fix OpenID Connect with Debian 13\n- Fix MySQL / MariaDB bug wrongly sorting new articles\n- Fix SQLite bind bug when adding tag\nBreaking changes 💥:\n- Move unsafe autologin to an extension\n- Potential breaking changes for some extensions (which have to rename some old functions)\nThis release has been made by @Alkarex, @Frenzie, @Inverle, @aledeg, @andris155, @horvi28, @math-GH, @minna-xD and newcomers @Darkentia, @FollowTheWizard, @GreyChame1eon, @McFev, @jocmp, @larsks, @martinhartmann, @matthew-neavling, @pudymody, @raspo, @scharmach, @scollovati, @stag-enterprises, @vandys, @xtmd, @yzx9.\nFull changelog:\n- Features\n- New sorting and filtering by date of User modified #7886, #8090,\n#8105, #8118, #8130- Corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour #8093 - Allows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action.\n- Corresponding search operator, e.g.\n- New sorting by article length #8119\n- New advanced search form #8103, #8122, #8226\n- Add compatibility with PCRE word boundary\n\\b\nand\\B\nfor regex search using PostgreSQL #8141 - More uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329\n- New overview of dates with most unread articles #8089\n- Allow marking as read articles older than 1 or 7 days also when sorting by publication date #8163\n- New option to show user labels instead of tags in RSS share #8112\n- Add new feed visibility (priority) Show in its feed #7972\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583, #8158\n- Configurable notification timeout #7942\n- OPML export/import of unicity criteria #8243\n- Ensure stable IDs (categories, feeds, labels) during export/import #7988\n- Add username and timestamp to SQLite export from Web UI #8169\n- Add option to apply filter actions to existing articles #7959, #8259\n- Support CSS selector\n~\nsubsequent-sibling #8154- Upstream PR phpgt/CssXPath#231\n- Rework saving of configuration files for more reliability in case of e.g. full disk #8220\n- Web scraping support date format as milliseconds for Unix epoch #8266\n- Allow negative category sort numbers #8330\n- New sorting and filtering by date of User modified #7886, #8090,\n- Performance\n- Improve SQL speed for updating cached information #6957, #8207,\n#8255, #8254, #8255 - Fix SQL performance issue with MySQL, using an index hint #8211\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277\n- API streaming of large responses for reducing memory consumption and increasing speed #8041\n- Improve SQL speed for updating cached information #6957, #8207,\n- Security\n- 💥 Move unsafe autologin to an extension #7958\n- Fix some CSRFs #8035\n- Strengthen some crypto (login, tokens, nonces) #8061, #8320\n- Create separate HTTP\nRetry-After\nrules for proxies #8029, #8218 - Add\ndata:\nto CSP in subscription controller #8253 - Improve anonymous authentication logic #8165\n- Enable GitHub release immutability #8205\n- Bug fixing\n- Exclude local networks for domain-wide HTTP\nRetry-After\n#8195 - Fix OpenID Connect with Debian 13 #8032\n- Fix MySQL / MariaDB bug wrongly sorting new articles #8223\n- Fix MySQL / MariaDB database size calculation #8282\n- Fix SQLite bind bug when adding tag #8101\n- Fix SQL auto-update of field\nf.kind\nto ease migrations from FreshRSS versions older than 1.20.0 #8148 - Fix search encoding and quoting #8311, #8324, #8338\n- Fix handling of database unexpected null content (during migrations) #8319, #8321\n- Fix drag & drop of user query losing information #8113\n- Fix DOM error while filtering retrieved full content #8132, #8161\n- Fix\nconfig.custom.php\nduring install #8033 - Fix do not mark important feeds as read from category #8067\n- Fix regression of warnings in Web browser console due to lack of\nwindow.bcrypt\nobject #8166 - Fix chart resize regression due to\nchart.js\nv4 update #8298 - Fix CLI user creation warning when language is not given #8283\n- Fix merging of custom HTTP headers #8251\n- Fix bug in the case of duplicated mark-as-read filters #8322\n- Exclude local networks for domain-wide HTTP\n- SimplePie\n- Fix support of HTTP trailer headers #7983, simplepie#943\n- Apply HTTPS policy also on GUIDs and permalinks #8037, simplepie#951\n- Fix\nWordPress.com\nHTTP duplicates with WebSub Automattic/pushpress#16\n- Fix\n- Implement HTML whitelist for SimplePie sanitizer #7924, simplepie#947\n- Various upstream contributions simplepie#940, simplepie#944\n- Deployment\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032\n- Docker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285\n- Fix Docker healthcheck\ncli/health.php\ncompatibility with OpenID Connect #8040 - Improve Docker for compatibility with other base images such as Arch Linux #8299\n- Improve\ncli/access-permissions.sh\nto detect the correct permission Web group such aswww-data\n,apache\n, orhttp\n- Improve\n- Update PostgreSQL volume for Docker #8216, #8224\n- Catch lack of\nexec()\nfunction for git update #8228 - Work around\nDOMDocument::saveHTML()\nscrambling charset encoding in some versions of libxml2 #8296 - Improve configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g.\nphp-intl\n#8334\n- UI\n- New button for toggling sidebar on desktop view #8201, #8286\n- Better transitions between groups of articles #8174\n- New links in transitions and jump to next transition #8294\n- More visible selected article #8230\n- Show the parsed search query instead of the original user input #8293,\n#8306, #8341 - Show search query in the page title #8217\n- Scroll into filtered feed/category on page load in the sidebar #8281, #8307\n- Fix autocomplete issues in change password form #7812\n- Fix navigating between read feeds using shortcut shift+j/k #8057\n- Dark background in Web app manifest to avoid white flash when opening #8140\n- Increase button visibility in UI to change theme #8149\n- Replace arrow navigation in theme switcher with\n\n#8190 - Improve scroll of article after load of user labels #7962\n- Keep scroll state of page when closing the slider #8295, #8301\n- Scroll into filtered feed/category on page load #8281\n- Display sidebar dropdowns above if no space below #8335, #8336\n- Use native CSS instead of SCSS #8200, #8241\n- Using CSS nesting and relative colours.\n- Various UI and style improvements: #8171, #8185, #8196\n- JavaScript finalise migration from\nPromise\ntoasync\n/await\n: #8182\n- API\n- Extensions\n- I18n\n- Translation status as text in README #7842\n- Add new translate CLI commands\nmove\n#8214 - Change some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065\n- Improve German #8028\n- Improve Greek #8146\n- Improve Finnish #8073, #8092\n- Improve Hungarian #8244\n- Improve Italian #8115, #8186\n- Improve Polish #8134, #8135\n- Improve Russian #8155, #8197\n- Improve Simplified Chinese #8308, #8313\n- Misc.\n- Add code to modify a search expression #8293\n- Remove Pocket sharing service #8127, #8128\n- Update to PHPMailer 7.0.1 #8048, #8180, #8272\n- 💥 Housekeeping of\nlib_rss.php\nwith potential breaking changes for some extensions #8193, - Use native PHP\n#[Deprecated]\n#8325 - Improve PHP code #8156, #8203, #8284,\n#8292, #8297 - GitHub Actions:\n--no-progress\n#8315 - Update dev dependencies #8043, #8044,\n#8045, #8046, #8047,\n#8052, #8176, #8177,\n#8178, #8179, #8210,\n#8270, #8271, #8273,\n#8274, #8275, #8276",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 8644
+ },
+ "pipeline_state": "extracted"
+ },
+ "summary": {
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
+ },
+ "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\\rerun\\20260325-183221\\items\\batch\\item-05.item.json",
+ "extracted_path": "outputs\\freshrss\\rerun\\20260325-183221\\extracted\\batch\\item-05.extracted.json",
+ "summary_path": "outputs\\freshrss\\rerun\\20260325-183221\\summary\\item-05.result.loop.json",
+ "filter_path": "outputs\\freshrss\\rerun\\20260325-183221\\filter\\item-05.filter.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T10:34:29.143039Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-103429"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/item-05.openclaw-candidate-input.json b/outputs/freshrss/rerun/20260325-183221/candidates/item-05.openclaw-candidate-input.json
new file mode 100644
index 0000000..fb5f693
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/item-05.openclaw-candidate-input.json
@@ -0,0 +1,42 @@
+{
+ "candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "published_at": "2025-12-24T19:27:23Z",
+ "author": "Alkarex",
+ "source_name": "FreshRSS releases",
+ "language": null,
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "worth_reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/candidates/openclaw-delivery-payload.json b/outputs/freshrss/rerun/20260325-183221/candidates/openclaw-delivery-payload.json
new file mode 100644
index 0000000..b82a274
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/candidates/openclaw-delivery-payload.json
@@ -0,0 +1,224 @@
+{
+ "schema_version": "v1",
+ "generated_at": "2026-03-26T02:17:31.459980Z",
+ "run_id": "openclaw-delivery-20260326-021731",
+ "date": "2026-03-25",
+ "candidates": [
+ {
+ "candidate_id": "cand:sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "published_at": "2026-03-12T23:59:16Z",
+ "author": "阮一峰",
+ "source_name": "阮一峰的网络日志",
+ "language": null,
+ "summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。",
+ "selection_decision": "review",
+ "selection_reason": "Article may be behind a paywall.",
+ "digest_section_hint": null,
+ "digest_rank": 95
+ },
+ {
+ "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "published_at": "2026-03-21T10:19:11Z",
+ "author": "阮一峰",
+ "source_name": "阮一峰的网络日志",
+ "language": null,
+ "summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+ },
+ {
+ "candidate_id": "cand:sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "canonical_url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "published_at": "2026-03-19T23:59:16Z",
+ "author": "阮一峰",
+ "source_name": "阮一峰的网络日志",
+ "language": null,
+ "summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多Agent协同",
+ "系统架构",
+ "科技动态",
+ "工具推荐"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "职业发展",
+ "科技资讯",
+ "效率工具"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "worth_reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+ },
+ {
+ "candidate_id": "cand:sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "published_at": "2026-01-25T18:20:16Z",
+ "author": "Alkarex",
+ "source_name": "FreshRSS releases",
+ "language": null,
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "worth_reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+ },
+ {
+ "candidate_id": "cand:sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "canonical_url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "published_at": "2025-12-24T19:27:23Z",
+ "author": "Alkarex",
+ "source_name": "FreshRSS releases",
+ "language": null,
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "worth_reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。",
+ "selection_decision": "review",
+ "selection_reason": "Worth-keeping signal is positive but no stronger keep rule matched.",
+ "digest_section_hint": null,
+ "digest_rank": 60
+ }
+ ],
+ "stats": {
+ "total": 5,
+ "keep_total": 0,
+ "review_total": 5,
+ "drop_total": 0
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-01.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-01.extracted.json
new file mode 100644
index 0000000..ba97493
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-01.extracted.json
@@ -0,0 +1,32 @@
+{
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-02.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-02.extracted.json
new file mode 100644
index 0000000..d06f83e
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-02.extracted.json
@@ -0,0 +1,32 @@
+{
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-03.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-03.extracted.json
new file mode 100644
index 0000000..3b132b2
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-03.extracted.json
@@ -0,0 +1,34 @@
+{
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": [
+ "Potential paywall detected in content."
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-04.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-04.extracted.json
new file mode 100644
index 0000000..34c8209
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-04.extracted.json
@@ -0,0 +1,32 @@
+{
+ "success": true,
+ "article": {
+ "extract_id": "sha256:169f2b50eec3d198df126a8daedb95c48cff252ead9d4d2598a449e128cae2b8",
+ "item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
+ "source_id": "freshrss:2987af960359c5c0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "title": "FreshRSS 1.28.1",
+ "author": "Alkarex",
+ "published_at": "2026-01-25T18:20:16Z",
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "Alkarex\nreleased this\n25 Jan 18:20\n·\n79 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n\nelement #8443 - Fixes before PHPStan 2 #8445, simplepie#957\n- Update of\n- Extensions\n- Update\n.gitignore\nto ignore installed extensions #8372\n- Update\n- UI\n- I18n\n- Misc.",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 2155
+ },
+ "pipeline_state": "extracted"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-05.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-05.extracted.json
new file mode 100644
index 0000000..0b85956
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/batch/item-05.extracted.json
@@ -0,0 +1,32 @@
+{
+ "success": true,
+ "article": {
+ "extract_id": "sha256:398657bc79f4c8d43f1f695f772f296c9a0fc28df30758562c6cc2fbcc277ab9",
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "title": "FreshRSS 1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "FreshRSS 1.28.0\nAlkarex\nreleased this\n24 Dec 19:27\n·\n135 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a major release, just in time for the holidays 🎄\nSelected new features ✨:\n- New sorting and filtering by date of User modified, with corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour - New sorting by article length\n- New advanced search form\n- New overview of dates with most unread articles\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader)\n- Bonus: Capy Reader is also the first open source Android app to support user labels\n- Better transitions UI between groups of articles\n- New links in UI for transitions between groups of articles, and jump to next transition\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11\n- And much more…\nImproved performance 🏎️:\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users\n- Improve SQL speed for some critical requests for large databases\n- API performance optimisation thanks to streaming of large responses\nSelected bug fixes 🐛:\n- Fix OpenID Connect with Debian 13\n- Fix MySQL / MariaDB bug wrongly sorting new articles\n- Fix SQLite bind bug when adding tag\nBreaking changes 💥:\n- Move unsafe autologin to an extension\n- Potential breaking changes for some extensions (which have to rename some old functions)\nThis release has been made by @Alkarex, @Frenzie, @Inverle, @aledeg, @andris155, @horvi28, @math-GH, @minna-xD and newcomers @Darkentia, @FollowTheWizard, @GreyChame1eon, @McFev, @jocmp, @larsks, @martinhartmann, @matthew-neavling, @pudymody, @raspo, @scharmach, @scollovati, @stag-enterprises, @vandys, @xtmd, @yzx9.\nFull changelog:\n- Features\n- New sorting and filtering by date of User modified #7886, #8090,\n#8105, #8118, #8130- Corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour #8093 - Allows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action.\n- Corresponding search operator, e.g.\n- New sorting by article length #8119\n- New advanced search form #8103, #8122, #8226\n- Add compatibility with PCRE word boundary\n\\b\nand\\B\nfor regex search using PostgreSQL #8141 - More uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329\n- New overview of dates with most unread articles #8089\n- Allow marking as read articles older than 1 or 7 days also when sorting by publication date #8163\n- New option to show user labels instead of tags in RSS share #8112\n- Add new feed visibility (priority) Show in its feed #7972\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583, #8158\n- Configurable notification timeout #7942\n- OPML export/import of unicity criteria #8243\n- Ensure stable IDs (categories, feeds, labels) during export/import #7988\n- Add username and timestamp to SQLite export from Web UI #8169\n- Add option to apply filter actions to existing articles #7959, #8259\n- Support CSS selector\n~\nsubsequent-sibling #8154- Upstream PR phpgt/CssXPath#231\n- Rework saving of configuration files for more reliability in case of e.g. full disk #8220\n- Web scraping support date format as milliseconds for Unix epoch #8266\n- Allow negative category sort numbers #8330\n- New sorting and filtering by date of User modified #7886, #8090,\n- Performance\n- Improve SQL speed for updating cached information #6957, #8207,\n#8255, #8254, #8255 - Fix SQL performance issue with MySQL, using an index hint #8211\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277\n- API streaming of large responses for reducing memory consumption and increasing speed #8041\n- Improve SQL speed for updating cached information #6957, #8207,\n- Security\n- 💥 Move unsafe autologin to an extension #7958\n- Fix some CSRFs #8035\n- Strengthen some crypto (login, tokens, nonces) #8061, #8320\n- Create separate HTTP\nRetry-After\nrules for proxies #8029, #8218 - Add\ndata:\nto CSP in subscription controller #8253 - Improve anonymous authentication logic #8165\n- Enable GitHub release immutability #8205\n- Bug fixing\n- Exclude local networks for domain-wide HTTP\nRetry-After\n#8195 - Fix OpenID Connect with Debian 13 #8032\n- Fix MySQL / MariaDB bug wrongly sorting new articles #8223\n- Fix MySQL / MariaDB database size calculation #8282\n- Fix SQLite bind bug when adding tag #8101\n- Fix SQL auto-update of field\nf.kind\nto ease migrations from FreshRSS versions older than 1.20.0 #8148 - Fix search encoding and quoting #8311, #8324, #8338\n- Fix handling of database unexpected null content (during migrations) #8319, #8321\n- Fix drag & drop of user query losing information #8113\n- Fix DOM error while filtering retrieved full content #8132, #8161\n- Fix\nconfig.custom.php\nduring install #8033 - Fix do not mark important feeds as read from category #8067\n- Fix regression of warnings in Web browser console due to lack of\nwindow.bcrypt\nobject #8166 - Fix chart resize regression due to\nchart.js\nv4 update #8298 - Fix CLI user creation warning when language is not given #8283\n- Fix merging of custom HTTP headers #8251\n- Fix bug in the case of duplicated mark-as-read filters #8322\n- Exclude local networks for domain-wide HTTP\n- SimplePie\n- Fix support of HTTP trailer headers #7983, simplepie#943\n- Apply HTTPS policy also on GUIDs and permalinks #8037, simplepie#951\n- Fix\nWordPress.com\nHTTP duplicates with WebSub Automattic/pushpress#16\n- Fix\n- Implement HTML whitelist for SimplePie sanitizer #7924, simplepie#947\n- Various upstream contributions simplepie#940, simplepie#944\n- Deployment\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032\n- Docker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285\n- Fix Docker healthcheck\ncli/health.php\ncompatibility with OpenID Connect #8040 - Improve Docker for compatibility with other base images such as Arch Linux #8299\n- Improve\ncli/access-permissions.sh\nto detect the correct permission Web group such aswww-data\n,apache\n, orhttp\n- Improve\n- Update PostgreSQL volume for Docker #8216, #8224\n- Catch lack of\nexec()\nfunction for git update #8228 - Work around\nDOMDocument::saveHTML()\nscrambling charset encoding in some versions of libxml2 #8296 - Improve configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g.\nphp-intl\n#8334\n- UI\n- New button for toggling sidebar on desktop view #8201, #8286\n- Better transitions between groups of articles #8174\n- New links in transitions and jump to next transition #8294\n- More visible selected article #8230\n- Show the parsed search query instead of the original user input #8293,\n#8306, #8341 - Show search query in the page title #8217\n- Scroll into filtered feed/category on page load in the sidebar #8281, #8307\n- Fix autocomplete issues in change password form #7812\n- Fix navigating between read feeds using shortcut shift+j/k #8057\n- Dark background in Web app manifest to avoid white flash when opening #8140\n- Increase button visibility in UI to change theme #8149\n- Replace arrow navigation in theme switcher with\n\n#8190 - Improve scroll of article after load of user labels #7962\n- Keep scroll state of page when closing the slider #8295, #8301\n- Scroll into filtered feed/category on page load #8281\n- Display sidebar dropdowns above if no space below #8335, #8336\n- Use native CSS instead of SCSS #8200, #8241\n- Using CSS nesting and relative colours.\n- Various UI and style improvements: #8171, #8185, #8196\n- JavaScript finalise migration from\nPromise\ntoasync\n/await\n: #8182\n- API\n- Extensions\n- I18n\n- Translation status as text in README #7842\n- Add new translate CLI commands\nmove\n#8214 - Change some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065\n- Improve German #8028\n- Improve Greek #8146\n- Improve Finnish #8073, #8092\n- Improve Hungarian #8244\n- Improve Italian #8115, #8186\n- Improve Polish #8134, #8135\n- Improve Russian #8155, #8197\n- Improve Simplified Chinese #8308, #8313\n- Misc.\n- Add code to modify a search expression #8293\n- Remove Pocket sharing service #8127, #8128\n- Update to PHPMailer 7.0.1 #8048, #8180, #8272\n- 💥 Housekeeping of\nlib_rss.php\nwith potential breaking changes for some extensions #8193, - Use native PHP\n#[Deprecated]\n#8325 - Improve PHP code #8156, #8203, #8284,\n#8292, #8297 - GitHub Actions:\n--no-progress\n#8315 - Update dev dependencies #8043, #8044,\n#8045, #8046, #8047,\n#8052, #8176, #8177,\n#8178, #8179, #8210,\n#8270, #8271, #8273,\n#8274, #8275, #8276",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 8644
+ },
+ "pipeline_state": "extracted"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/extracted/freshrss.extracted.json b/outputs/freshrss/rerun/20260325-183221/extracted/freshrss.extracted.json
new file mode 100644
index 0000000..c866816
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/extracted/freshrss.extracted.json
@@ -0,0 +1,328 @@
+{
+ "stream_id": "user/-/state/com.google/reading-list",
+ "requested_limit": 5,
+ "entry_count": 5,
+ "extracted_success_count": 5,
+ "results": [
+ {
+ "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-25T10:32:30.103137Z",
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+ },
+ "extraction": {
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+ }
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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"
+ },
+ "extraction": {
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+ }
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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"
+ },
+ "extraction": {
+ "success": true,
+ "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"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": [
+ "Potential paywall detected in content."
+ ]
+ }
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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"
+ },
+ "extraction": {
+ "success": true,
+ "article": {
+ "extract_id": "sha256:169f2b50eec3d198df126a8daedb95c48cff252ead9d4d2598a449e128cae2b8",
+ "item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
+ "source_id": "freshrss:2987af960359c5c0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "title": "FreshRSS 1.28.1",
+ "author": "Alkarex",
+ "published_at": "2026-01-25T18:20:16Z",
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "Alkarex\nreleased this\n25 Jan 18:20\n·\n79 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0.\nSelected new features ✨:\n- New customisable message for closed registrations\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy\nImproved performance 🏎️:\n- Disable counting articles in user labels for Ajax requests (unused)\nMany bug fixes 🐛\nThis release has been made by @Alkarex, @Frenzie, @Inverle and newcomers @ciro-mota, @eveiscoull, @hackerman70000, @Hufschmidt, @johan456789, @martgnz, @mmeier86, @netsho, @neuhaus, @RobLoach, @rupakbajgain.\nFull changelog:\n- Features\n- Bug fixing\n- Fix unwanted expansion of user queries (saved searches) applied to filters #8395\n- Fix encoding of filter actions for labels #8368\n- Fix searching of tags #8425\n- Fix refreshing feeds with token while anonymous refresh is disabled #8371\n- Fix RSS and OPML access by token #8434\n- Fix MySQL/MariaDB\ntransliterator_transliterate\nfallback (when thephp-intl\nextension is unavailable) #8427 - Fix regression with MySQL/MariaDB index hint #8460\n- Auto-add\nlastUserModified\ndatabase column also during mark-as-read action #8346 - Do not include hidden feeds when counting unread articles in categories #8357\n- Remove wrong PHP deprecation of OPML export action #8399\n- Fix shortcut for next unread article #8466\n- Fix custom\nsession.cookie-lifetime\n#8446 - Fix feed validator button when changing the feed URL #8436\n- Performance\n- Disable counting articles in user labels for Ajax requests (unused) #8352\n- Security\n- Deployment\n- Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392\n- SimplePie\n- Update of\nCURLOPT_ACCEPT_ENCODING\n#8376, simplepie#960, simplepie#962 - Fix don’t preserve children inside disallowed\n\nelement #8443 - Fixes before PHPStan 2 #8445, simplepie#957\n- Update of\n- Extensions\n- Update\n.gitignore\nto ignore installed extensions #8372\n- Update\n- UI\n- I18n\n- Misc.",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 2155
+ },
+ "pipeline_state": "extracted"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+ }
+ },
+ {
+ "item": {
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+ },
+ "extraction": {
+ "success": true,
+ "article": {
+ "extract_id": "sha256:398657bc79f4c8d43f1f695f772f296c9a0fc28df30758562c6cc2fbcc277ab9",
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "title": "FreshRSS 1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "FreshRSS 1.28.0\nAlkarex\nreleased this\n24 Dec 19:27\n·\n135 commits\nto edge\nsince this release\nImmutable\nrelease. Only release title and notes can be modified.\nThis is a major release, just in time for the holidays 🎄\nSelected new features ✨:\n- New sorting and filtering by date of User modified, with corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour - New sorting by article length\n- New advanced search form\n- New overview of dates with most unread articles\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader)\n- Bonus: Capy Reader is also the first open source Android app to support user labels\n- Better transitions UI between groups of articles\n- New links in UI for transitions between groups of articles, and jump to next transition\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11\n- And much more…\nImproved performance 🏎️:\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users\n- Improve SQL speed for some critical requests for large databases\n- API performance optimisation thanks to streaming of large responses\nSelected bug fixes 🐛:\n- Fix OpenID Connect with Debian 13\n- Fix MySQL / MariaDB bug wrongly sorting new articles\n- Fix SQLite bind bug when adding tag\nBreaking changes 💥:\n- Move unsafe autologin to an extension\n- Potential breaking changes for some extensions (which have to rename some old functions)\nThis release has been made by @Alkarex, @Frenzie, @Inverle, @aledeg, @andris155, @horvi28, @math-GH, @minna-xD and newcomers @Darkentia, @FollowTheWizard, @GreyChame1eon, @McFev, @jocmp, @larsks, @martinhartmann, @matthew-neavling, @pudymody, @raspo, @scharmach, @scollovati, @stag-enterprises, @vandys, @xtmd, @yzx9.\nFull changelog:\n- Features\n- New sorting and filtering by date of User modified #7886, #8090,\n#8105, #8118, #8130- Corresponding search operator, e.g.\nuserdate:PT1H\nfor the past hour #8093 - Allows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action.\n- Corresponding search operator, e.g.\n- New sorting by article length #8119\n- New advanced search form #8103, #8122, #8226\n- Add compatibility with PCRE word boundary\n\\b\nand\\B\nfor regex search using PostgreSQL #8141 - More uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329\n- New overview of dates with most unread articles #8089\n- Allow marking as read articles older than 1 or 7 days also when sorting by publication date #8163\n- New option to show user labels instead of tags in RSS share #8112\n- Add new feed visibility (priority) Show in its feed #7972\n- New ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583, #8158\n- Configurable notification timeout #7942\n- OPML export/import of unicity criteria #8243\n- Ensure stable IDs (categories, feeds, labels) during export/import #7988\n- Add username and timestamp to SQLite export from Web UI #8169\n- Add option to apply filter actions to existing articles #7959, #8259\n- Support CSS selector\n~\nsubsequent-sibling #8154- Upstream PR phpgt/CssXPath#231\n- Rework saving of configuration files for more reliability in case of e.g. full disk #8220\n- Web scraping support date format as milliseconds for Unix epoch #8266\n- Allow negative category sort numbers #8330\n- New sorting and filtering by date of User modified #7886, #8090,\n- Performance\n- Improve SQL speed for updating cached information #6957, #8207,\n#8255, #8254, #8255 - Fix SQL performance issue with MySQL, using an index hint #8211\n- Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277\n- API streaming of large responses for reducing memory consumption and increasing speed #8041\n- Improve SQL speed for updating cached information #6957, #8207,\n- Security\n- 💥 Move unsafe autologin to an extension #7958\n- Fix some CSRFs #8035\n- Strengthen some crypto (login, tokens, nonces) #8061, #8320\n- Create separate HTTP\nRetry-After\nrules for proxies #8029, #8218 - Add\ndata:\nto CSP in subscription controller #8253 - Improve anonymous authentication logic #8165\n- Enable GitHub release immutability #8205\n- Bug fixing\n- Exclude local networks for domain-wide HTTP\nRetry-After\n#8195 - Fix OpenID Connect with Debian 13 #8032\n- Fix MySQL / MariaDB bug wrongly sorting new articles #8223\n- Fix MySQL / MariaDB database size calculation #8282\n- Fix SQLite bind bug when adding tag #8101\n- Fix SQL auto-update of field\nf.kind\nto ease migrations from FreshRSS versions older than 1.20.0 #8148 - Fix search encoding and quoting #8311, #8324, #8338\n- Fix handling of database unexpected null content (during migrations) #8319, #8321\n- Fix drag & drop of user query losing information #8113\n- Fix DOM error while filtering retrieved full content #8132, #8161\n- Fix\nconfig.custom.php\nduring install #8033 - Fix do not mark important feeds as read from category #8067\n- Fix regression of warnings in Web browser console due to lack of\nwindow.bcrypt\nobject #8166 - Fix chart resize regression due to\nchart.js\nv4 update #8298 - Fix CLI user creation warning when language is not given #8283\n- Fix merging of custom HTTP headers #8251\n- Fix bug in the case of duplicated mark-as-read filters #8322\n- Exclude local networks for domain-wide HTTP\n- SimplePie\n- Fix support of HTTP trailer headers #7983, simplepie#943\n- Apply HTTPS policy also on GUIDs and permalinks #8037, simplepie#951\n- Fix\nWordPress.com\nHTTP duplicates with WebSub Automattic/pushpress#16\n- Fix\n- Implement HTML whitelist for SimplePie sanitizer #7924, simplepie#947\n- Various upstream contributions simplepie#940, simplepie#944\n- Deployment\n- Docker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032\n- Docker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285\n- Fix Docker healthcheck\ncli/health.php\ncompatibility with OpenID Connect #8040 - Improve Docker for compatibility with other base images such as Arch Linux #8299\n- Improve\ncli/access-permissions.sh\nto detect the correct permission Web group such aswww-data\n,apache\n, orhttp\n- Improve\n- Update PostgreSQL volume for Docker #8216, #8224\n- Catch lack of\nexec()\nfunction for git update #8228 - Work around\nDOMDocument::saveHTML()\nscrambling charset encoding in some versions of libxml2 #8296 - Improve configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g.\nphp-intl\n#8334\n- UI\n- New button for toggling sidebar on desktop view #8201, #8286\n- Better transitions between groups of articles #8174\n- New links in transitions and jump to next transition #8294\n- More visible selected article #8230\n- Show the parsed search query instead of the original user input #8293,\n#8306, #8341 - Show search query in the page title #8217\n- Scroll into filtered feed/category on page load in the sidebar #8281, #8307\n- Fix autocomplete issues in change password form #7812\n- Fix navigating between read feeds using shortcut shift+j/k #8057\n- Dark background in Web app manifest to avoid white flash when opening #8140\n- Increase button visibility in UI to change theme #8149\n- Replace arrow navigation in theme switcher with\n\n#8190 - Improve scroll of article after load of user labels #7962\n- Keep scroll state of page when closing the slider #8295, #8301\n- Scroll into filtered feed/category on page load #8281\n- Display sidebar dropdowns above if no space below #8335, #8336\n- Use native CSS instead of SCSS #8200, #8241\n- Using CSS nesting and relative colours.\n- Various UI and style improvements: #8171, #8185, #8196\n- JavaScript finalise migration from\nPromise\ntoasync\n/await\n: #8182\n- API\n- Extensions\n- I18n\n- Translation status as text in README #7842\n- Add new translate CLI commands\nmove\n#8214 - Change some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065\n- Improve German #8028\n- Improve Greek #8146\n- Improve Finnish #8073, #8092\n- Improve Hungarian #8244\n- Improve Italian #8115, #8186\n- Improve Polish #8134, #8135\n- Improve Russian #8155, #8197\n- Improve Simplified Chinese #8308, #8313\n- Misc.\n- Add code to modify a search expression #8293\n- Remove Pocket sharing service #8127, #8128\n- Update to PHPMailer 7.0.1 #8048, #8180, #8272\n- 💥 Housekeeping of\nlib_rss.php\nwith potential breaking changes for some extensions #8193, - Use native PHP\n#[Deprecated]\n#8325 - Improve PHP code #8156, #8203, #8284,\n#8292, #8297 - GitHub Actions:\n--no-progress\n#8315 - Update dev dependencies #8043, #8044,\n#8045, #8046, #8047,\n#8052, #8176, #8177,\n#8178, #8179, #8210,\n#8270, #8271, #8273,\n#8274, #8275, #8276",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 8644
+ },
+ "pipeline_state": "extracted"
+ },
+ "error": null,
+ "debug": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura"
+ },
+ "warnings": []
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/filter/item-01.filter.json b/outputs/freshrss/rerun/20260325-183221/filter/item-01.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/filter/item-01.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/filter/item-02.filter.json b/outputs/freshrss/rerun/20260325-183221/filter/item-02.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/filter/item-02.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/filter/item-03.filter.json b/outputs/freshrss/rerun/20260325-183221/filter/item-03.filter.json
new file mode 100644
index 0000000..579f27a
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/filter/item-03.filter.json
@@ -0,0 +1,40 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/filter/item-04.filter.json b/outputs/freshrss/rerun/20260325-183221/filter/item-04.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/filter/item-04.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/filter/item-05.filter.json b/outputs/freshrss/rerun/20260325-183221/filter/item-05.filter.json
new file mode 100644
index 0000000..b454c6d
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/filter/item-05.filter.json
@@ -0,0 +1,26 @@
+{
+ "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
+ }
+ ]
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/batch/item-01.item.json b/outputs/freshrss/rerun/20260325-183221/items/batch/item-01.item.json
new file mode 100644
index 0000000..85f670d
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/batch/item-01.item.json
@@ -0,0 +1,30 @@
+{
+ "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-25T10:32:30.103137Z",
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/batch/item-02.item.json b/outputs/freshrss/rerun/20260325-183221/items/batch/item-02.item.json
new file mode 100644
index 0000000..14ad5db
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/batch/item-02.item.json
@@ -0,0 +1,30 @@
+{
+ "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-25T10:32:30.103137Z",
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/batch/item-03.item.json b/outputs/freshrss/rerun/20260325-183221/items/batch/item-03.item.json
new file mode 100644
index 0000000..65a2542
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/batch/item-03.item.json
@@ -0,0 +1,30 @@
+{
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/batch/item-04.item.json b/outputs/freshrss/rerun/20260325-183221/items/batch/item-04.item.json
new file mode 100644
index 0000000..aa1bbb9
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/batch/item-04.item.json
@@ -0,0 +1,29 @@
+{
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/batch/item-05.item.json b/outputs/freshrss/rerun/20260325-183221/items/batch/item-05.item.json
new file mode 100644
index 0000000..05e916c
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/batch/item-05.item.json
@@ -0,0 +1,29 @@
+{
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/items/freshrss.items.json b/outputs/freshrss/rerun/20260325-183221/items/freshrss.items.json
new file mode 100644
index 0000000..cf0683f
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/items/freshrss.items.json
@@ -0,0 +1,150 @@
+[
+ {
+ "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-25T10:32:30.103137Z",
+ "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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"
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \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"
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \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"
+ },
+ {
+ "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-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \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"
+ },
+ {
+ "item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
+ "source_id": "freshrss:2987af960359c5c0",
+ "external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "author": "Alkarex",
+ "published_at": "2025-12-24T19:27:23Z",
+ "discovered_at": "2026-03-25T10:32:30.103137Z",
+ "content_kind": "article",
+ "language": null,
+ "raw_summary": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \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": 1766604443
+ },
+ "fetch_state": "pending"
+ }
+]
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/raw/freshrss.raw.json b/outputs/freshrss/rerun/20260325-183221/raw/freshrss.raw.json
new file mode 100644
index 0000000..501c909
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/raw/freshrss.raw.json
@@ -0,0 +1,167 @@
+{
+ "id": "user/-/state/com.google/reading-list",
+ "updated": 1774434750,
+ "items": [
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528285",
+ "published": 1774088351,
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Developer"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528284",
+ "published": 1773964756,
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Weekly"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "这里记录每周值得分享的科技内容,周五发布。
\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描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。 \n如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。 \n...... \n \n\n这些问题能识别出 AI 编程高手吗?我完全没有把握。
\n\n其次,除了 AI,还要考察什么呢? 这也很不好想。
\n\n我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。
\n\n另外,我还要看看他以前的项目 ,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。
\n\n总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?
\n\n有一点是确定的,面试各种编程细节意义不大了 ,因为你不需要记住语法细节了,直接问大模型就行。
\n\n科技动态 \n\n1、访达小子
\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\n2、红外线编码
\n\n英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。
\n\n
\n\n肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。
\n\n因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。
\n\n3、机柜种植
\n\n家里有多余的服务器机柜,怎么利用起来?
\n\n
\n\n一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。
\n\n
\n\n他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。
\n\n
\n\n如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。
\n\n
\n\n文章 \n\n1、我放弃了 Elasticsearch,转而使用 Meilisearch (英文)
\n\n
\n\nMeilisearch 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。
\n\n2、2016 年,我做过一次 AI 写代码创业 (中文)
\n\n
\n\n作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(@gengxiuli 投稿)
\n\n3、信息过载时代,我的漏斗式阅读工作流 (中文)
\n\n
\n\n每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(@shawnxie94 投稿)
\n\n4、编译器的前端与后端 (英文)
\n\n
\n\n一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。
\n\n5、CSS 的 lh 单位 (英文)
\n\n
\n\nCSS 有一个字体大小属性lh,表示行高。
\n\n6、寻觅杜鹃花之王 (中文)
\n\n
\n\n大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。
\n\n后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。
\n\n工具 \n\n1、APTUI
\n\n
\n\n一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。
\n\n2、my.WordPress.net
\n\n
\n\n如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。
\n\n它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见介绍文章 。
\n\n3、GrobPaint
\n\n
\n\n一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。
\n\n4、Apple Matting
\n\n
\n\n一个 Mac 抠图软件,大小只有 8MB。(@pangxiaobin 投稿)
\n\n5、HealthTick
\n\n
\n\nmacOS 菜单栏久坐提醒工具。(@lifedever 投稿)
\n\n6、CheatReader
\n\n
\n\n一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(@yaoyao2mm 投稿)
\n\n7、锤子便签
\n\n
\n\n开源的网页版锤子便签,可以作为 Skill 调用。(@zhaoolee 投稿)
\n\n8、WeChat Download API
\n\n
\n\n开源的微信公众号转 RSS 工具。(@tmwgsicp 投稿)
\n\n9、Speech Speed
\n\n一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。
\n\nAI 相关 \n\n1、VibeGo
\n\n
\n\nVibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(@xxnuo 投稿)
\n\n2、Mimic Them
\n\n一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(@zhanchey 投稿)
\n\n3、AICheck
\n\n
\n\n一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(@MatrixA 投稿)
\n\n4、AionUi
\n\n
\n\n开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(@cdxiaodong 投稿)
\n\n5、Lumo
\n\n
\n\n一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(@zhnd 投稿)
\n\n6、AIComicBuilder
\n\n
\n\n开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(@twwch 投稿)
\n\n资源 \n\n1、canirun.ai
\n\n
\n\n网页检测你的机器,能够运行哪些本地的 AI 模型。
\n\n2、AI 是怎么回事 (中文)
\n\n
\n\n面向普通读者的通俗 AI 原理教程。(@wmyskxz 投稿)
\n\n3、TypeScript 数据结构与算法 (Algorithms with TypeScript)
\n\n
\n\n免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。
\n\n4、频道冲浪者 (Channel Surfer)
\n\n
\n\n这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。
\n\n图片 \n\n1、巧妙的古建筑
\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\n1、避免使用定制框架
\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\n1、
\n\n我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。
\n\n-- David Miranda
\n\n2、
\n\nAI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。
\n\n-- lucumr.pocoo.org
\n\n3、
\n\n编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。
\n\n-- 《生活在\"平面国\"的程序员》
\n\n4、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月20日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db",
+ "crawlTimeMsec": "1774343901528",
+ "timestampUsec": "1774343901528283",
+ "published": 1773359956,
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "canonical": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/rss",
+ "user/-/state/org.freshrss/main",
+ "Weekly"
+ ],
+ "origin": {
+ "streamId": "feed/2",
+ "htmlUrl": "http://www.ruanyifeng.com/blog/",
+ "title": "阮一峰的网络日志"
+ },
+ "summary": {
+ "content": "这里记录每周值得分享的科技内容,周五发布。
\n\n 本杂志开源 ,欢迎投稿 。另有《谁在招人》 服务,发布程序员招聘信息。合作请邮件联系 (yifeng.ruan@gmail.com)。
\n\n封面图 \n\n
\n\n重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(via )
\n\n测试是新的护城河 \n\nNext.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\nNext.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\nCloudflare 工程师这一次能够复刻成功,主要原因是 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\nAI 复刻的版权问题 \n\nAI 复刻软件还有一个版权问题,也引起了很大争议 。
\n\n
\n\nNext.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 chardet 的项目,就争议巨大。
\n\nchardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。
\n\n网上的意见也分成了两派。
\n\n支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。
\n\n反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。
\n\n更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,AI 复刻的软件不能设置许可证,设置了无效。
\n\n按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。
\n\n科技动态 \n\n1、AI 改写脏话
\n\n游戏平台 Roblox 宣布 ,将用 AI 实时修改玩家的对话,让其变得更文明。
\n\n
\n\n以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 ####,你还是知道他在骂人。
\n\n现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。
\n\n虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。
\n\n2、飞机的激光上网
\n\n欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。
\n\n
\n\n飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。
\n\n
\n\n上图就是安装在飞机舷窗上的激光终端。
\n\n激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。
\n\n缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。
\n\n3、Grammarly 的专家意见
\n\nGrammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。
\n\n
\n\n一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。
\n\n
\n\n原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。
\n\n这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?
\n\n4、太阳能邮筒
\n\n网络通信普及以后,传统的邮筒怎么办?
\n\n英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。
\n\n
\n\n邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。
\n\n
\n\n这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。
\n\n
\n\n文章 \n\n1、GitHub Issue 标题的注入攻击 (英文)
\n\n
\n\n这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。
\n\n2、重新评估 AGENTS.md (英文)
\n\n
\n\n最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。
\n\n它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。
\n\n3、Temporal API 的九年历程 (英文)
\n\n
\n\n本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。
\n\n4、AI 的胡说测试 (英文)
\n\n
\n\n国外有一个 BuillshitBench ,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。
\n\n5、原生 CSS 就足够了 (英文)
\n\n
\n\n本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。
\n\n6、粪便物理学 (英文)
\n\n
\n\n一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。
\n\n工具 \n\n1、KULA
\n\n
\n\nLinux 服务器的监控工具,只有一个二进制文件。
\n\n2、AnsiSaver
\n\n
\n\nmac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。
\n\n3、upiano
\n\n
\n\n在命令行下模拟钢琴弹奏。
\n\n4、WSL Distro Manager
\n\n
\n\n一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。
\n\n5、Mole
\n\n
\n\n开源的 Mac 电脑清理和优化工具。
\n\n6、PipeGate
\n\n一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。
\n\n7、HookListener
\n\n
\n\n一个管理、测试 Webhook 的在线工具,个人可以免费使用。
\n\n8、Sentinel
\n\n
\n\n将安卓手机转化为网络摄像头,实现实时监控和图像采集。(@suzuran0 投稿)
\n\n9、Flux Monitor
\n\n
\n\nMac 电脑的系统监控、管理面板。(@chentao1006 投稿)
\n\nAI 相关 \n\n1、Agentic Metric
\n\n
\n\n一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(@MrQianjinsi 投稿)
\n\n2、cc-connect
\n\n
\n\n一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(@chenhg5 投稿)
\n\n3、Page Agent
\n\n
\n\n只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。
\n\n4、Agent Safehouse
\n\n一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。
\n\n5、Repo Tokens
\n\n
\n\n一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。
\n\n资源 \n\n1、世界监控 (World Monitor)
\n\n
\n\n世界局势的一个实时看板,把各种消息源都放在一个网页里。
\n\n2、炼油厂探索
\n\n
\n\n一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。
\n\n3、Mechanical Pencil
\n\n
\n\n弹簧笔、打火机等生活小物品的机械装置动画。
\n\n图片 \n\n1、密码的替代方法
\n\n一位程序员发明了一种新的密码方法,你觉得可行吗?
\n\n系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。
\n\n
\n\n下次登录时,用户必须按同样顺序挑出同样的5张牌。
\n\n文摘 \n\n1、复杂社会的崩溃
\n\n我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。
\n\n美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。
\n\n
\n\n1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:为什么强大的社会会崩溃?
\n\n他认为,原因是这些社会有一个敌人----复杂性。
\n\n随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。
\n\n一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。
\n\n(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。
\n\n(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。
\n\n(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。
\n\n(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。
\n\n以上因素的共同作用,导致历史上很多强大的社会最终崩溃。
\n\n言论 \n\n1、
\n\n2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。
\n\n2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。
\n\n-- 《我不知道十年后我的工作是否还存在》
\n\n2、
\n\n与强大的 AI 对抗会是什么感觉?
\n\n你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。
\n\n这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。
\n\n-- probablydance.com
\n\n3、
\n\n阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。
\n\n这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。
\n\n-- 《阅读商战书籍是浪费时间》
\n\n4、
\n\n我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。
\n\n-- Simon Willison ,著名开发者
\n\n5、
\n\n时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。
\n\n-- 《不要太看重 AI 大模型的订阅费》
\n\n往年回顾 \n\n低代码编程,恐怕不会成功 (#341)
\n\nAI 没有护城河 (#291)
\n\n中国的增长动力在内陆 (#241)
\n\n一个程序员的财务独立之路 (#191)
\n\n(完)
\n\n 文档信息 \n
\n版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月13日 \n\n \n
"
+ },
+ "author": "阮一峰"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc18f09d916",
+ "crawlTimeMsec": "1774343584078",
+ "timestampUsec": "1774343584078102",
+ "published": 1769365216,
+ "title": "FreshRSS 1.28.1",
+ "canonical": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/未分类",
+ "user/-/state/org.freshrss/main",
+ "user/-/state/com.google/read"
+ ],
+ "origin": {
+ "streamId": "feed/1",
+ "htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
+ "title": "FreshRSS releases"
+ },
+ "summary": {
+ "content": "\nThis is a release focussing on bug fixing, in particular regressions from the release 1.28.0 .
\nSelected new features ✨:
\n\nNew customisable message for closed registrations \nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy \n \nImproved performance 🏎️:
\n\nDisable counting articles in user labels for Ajax requests (unused) \n \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\nFeatures\n\nHandle Web scraping of text/plain as <pre class=\"text-plain\"> #8340 \nNew customisable message for closed registrations #8462 \n \n \nBug fixing\n\nFix unwanted expansion of user queries (saved searches) applied to filters #8395 \nFix encoding of filter actions for labels #8368 \nFix searching of tags #8425 \nFix refreshing feeds with token while anonymous refresh is disabled #8371 \nFix RSS and OPML access by token #8434 \nFix MySQL/MariaDB transliterator_transliterate fallback (when the php-intl extension is unavailable) #8427 \nFix regression with MySQL/MariaDB index hint #8460 \nAuto-add lastUserModified database column also during mark-as-read action #8346 \nDo not include hidden feeds when counting unread articles in categories #8357 \nRemove wrong PHP deprecation of OPML export action #8399 \nFix shortcut for next unread article #8466 \nFix custom session.cookie-lifetime #8446 \nFix feed validator button when changing the feed URL #8436 \n \n \nPerformance\n\nDisable counting articles in user labels for Ajax requests (unused) #8352 \n \n \nSecurity\n\nChange Content-Disposition: inline to attachment in f.php #8344 \nHardened user methods exists, mtime, ctime #26c1102 \n \n \nDeployment\n\nAdd username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy #8392 \n \n \nSimplePie\n\n \nExtensions\n\nUpdate .gitignore to ignore installed extensions #8372 \n \n \nUI\n\nAdd data-category=\"3\" to ease custom CSS styling of articles #8397 \nFix space between By: and the author’s name #8422 \n \n \nI18n\n\nImprove Brazilian Portuguese #8411 \nImprove Dutch #8403 \nImprove German #8402 \nImprove Polish #8408 \nImprove Spanish #8464 \n \n \nMisc.\n\n \n \n\t\n\t\t \n\t
\n "
+ },
+ "author": "Alkarex"
+ },
+ {
+ "id": "tag:google.com,2005:reader/item/00064dc18f09d915",
+ "crawlTimeMsec": "1774343584078",
+ "timestampUsec": "1774343584078101",
+ "published": 1766604443,
+ "title": "FreshRSS 1.28.0",
+ "canonical": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0"
+ }
+ ],
+ "alternate": [
+ {
+ "href": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0"
+ }
+ ],
+ "categories": [
+ "user/-/state/com.google/reading-list",
+ "user/-/label/未分类",
+ "user/-/state/org.freshrss/main",
+ "user/-/state/com.google/read"
+ ],
+ "origin": {
+ "streamId": "feed/1",
+ "htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
+ "title": "FreshRSS releases"
+ },
+ "summary": {
+ "content": "\nThis is a major release, just in time for the holidays 🎄
\nSelected new features ✨:
\n\nNew sorting and filtering by date of User modified , with corresponding search operator, e.g. userdate:PT1H for the past hour \nNew sorting by article length \nNew advanced search form \nNew overview of dates with most unread articles \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader )\n\nBonus: Capy Reader is also the first open source Android app to support user labels \n \n \nBetter transitions UI between groups of articles \nNew links in UI for transitions between groups of articles, and jump to next transition \nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 \nAnd much more… \n \nImproved performance 🏎️:
\n\nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users \nImprove SQL speed for some critical requests for large databases \nAPI performance optimisation thanks to streaming of large responses \n \nSelected bug fixes 🐛:
\n\nFix OpenID Connect with Debian 13 \nFix MySQL / MariaDB bug wrongly sorting new articles \nFix SQLite bind bug when adding tag \n \nBreaking changes 💥:
\n\nMove unsafe autologin to an extension \nPotential breaking changes for some extensions (which have to rename some old functions) \n \nThis release has been made by @Alkarex , @Frenzie , @Inverle , @aledeg , @andris155 , @horvi28 , @math-GH , @minna-xD and newcomers @Darkentia , @FollowTheWizard , @GreyChame1eon , @McFev , @jocmp , @larsks , @martinhartmann , @matthew-neavling , @pudymody , @raspo , @scharmach , @scollovati , @stag-enterprises , @vandys , @xtmd , @yzx9 .
\nFull changelog :
\n\nFeatures\n\nNew sorting and filtering by date of User modified #7886 , #8090 , \n#8105 , #8118 , #8130 \n\nCorresponding search operator, e.g. userdate:PT1H for the past hour #8093 \nAllows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action. \n \n \nNew sorting by article length #8119 \nNew advanced search form #8103 , #8122 , #8226 \nAdd compatibility with PCRE word boundary \\b and \\B for regex search using PostgreSQL #8141 \nMore uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) #8329 \nNew overview of dates with most unread articles #8089 \nAllow marking as read articles older than 1 or 7 days also when sorting by publication date #8163 \nNew option to show user labels instead of tags in RSS share #8112 \nAdd new feed visibility (priority) Show in its feed #7972 \nNew ability to share feed visibility through API (implemented by e.g. Capy Reader) #7583 , #8158 \nConfigurable notification timeout #7942 \nOPML export/import of unicity criteria #8243 \nEnsure stable IDs (categories, feeds, labels) during export/import #7988 \nAdd username and timestamp to SQLite export from Web UI #8169 \nAdd option to apply filter actions to existing articles #7959 , #8259 \nSupport CSS selector ~ subsequent-sibling #8154 \n\n \nRework saving of configuration files for more reliability in case of e.g. full disk #8220 \nWeb scraping support date format as milliseconds for Unix epoch #8266 \nAllow negative category sort numbers #8330 \n \n \nPerformance\n\nImprove SQL speed for updating cached information #6957 , #8207 , \n#8255 , #8254 , #8255 \nFix SQL performance issue with MySQL, using an index hint #8211 \nScaling of user statistics in Web UI and CLI, to help instances with 1k+ users #8277 \nAPI streaming of large responses for reducing memory consumption and increasing speed #8041 \n \n \nSecurity\n\n💥 Move unsafe autologin to an extension #7958 \nFix some CSRFs #8035 \nStrengthen some crypto (login, tokens, nonces) #8061 , #8320 \nCreate separate HTTP Retry-After rules for proxies #8029 , #8218 \nAdd data: to CSP in subscription controller #8253 \nImprove anonymous authentication logic #8165 \nEnable GitHub release immutability #8205 \n \n \nBug fixing\n\nExclude local networks for domain-wide HTTP Retry-After #8195 \nFix OpenID Connect with Debian 13 #8032 \nFix MySQL / MariaDB bug wrongly sorting new articles #8223 \nFix MySQL / MariaDB database size calculation #8282 \nFix SQLite bind bug when adding tag #8101 \nFix SQL auto-update of field f.kind to ease migrations from FreshRSS versions older than 1.20.0 #8148 \nFix search encoding and quoting #8311 , #8324 , #8338 \nFix handling of database unexpected null content (during migrations) #8319 , #8321 \nFix drag & drop of user query losing information #8113 \nFix DOM error while filtering retrieved full content #8132 , #8161 \nFix config.custom.php during install #8033 \nFix do not mark important feeds as read from category #8067 \nFix regression of warnings in Web browser console due to lack of window.bcrypt object #8166 \nFix chart resize regression due to chart.js v4 update #8298 \nFix CLI user creation warning when language is not given #8283 \nFix merging of custom HTTP headers #8251 \nFix bug in the case of duplicated mark-as-read filters #8322 \n \n \nSimplePie\n\n \nDeployment\n\nDocker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 #8032 \nDocker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 #8285 \nFix Docker healthcheck cli/health.php compatibility with OpenID Connect #8040 \nImprove Docker for compatibility with other base images such as Arch Linux #8299 \n\nImprove cli/access-permissions.sh to detect the correct permission Web group such as www-data, apache, or http \n \n \nUpdate PostgreSQL volume for Docker #8216 , #8224 \nCatch lack of exec() function for git update #8228 \nWork around DOMDocument::saveHTML() scrambling charset encoding in some versions of libxml2 #8296 \nImprove configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. php-intl #8334 \n \n \nUI\n\nNew button for toggling sidebar on desktop view #8201 , #8286 \nBetter transitions between groups of articles #8174 \nNew links in transitions and jump to next transition #8294 \nMore visible selected article #8230 \nShow the parsed search query instead of the original user input #8293 , \n#8306 , #8341 \nShow search query in the page title #8217 \nScroll into filtered feed/category on page load in the sidebar #8281 , #8307 \nFix autocomplete issues in change password form #7812 \nFix navigating between read feeds using shortcut shift +j /k #8057 \nDark background in Web app manifest to avoid white flash when opening #8140 \nIncrease button visibility in UI to change theme #8149 \nReplace arrow navigation in theme switcher with <select> #8190 \nImprove scroll of article after load of user labels #7962 \nKeep scroll state of page when closing the slider #8295 , #8301 \nScroll into filtered feed/category on page load #8281 \nDisplay sidebar dropdowns above if no space below #8335 , #8336 \nUse native CSS instead of SCSS #8200 , #8241 \n\n \nVarious UI and style improvements: #8171 , #8185 , #8196 \nJavaScript finalise migration from Promise to async/await: #8182 \n \n \nAPI\n\nAPI performance optimisation: streaming of large responses #8041 \nFever API: Add with_ids parameter to mass-change read/unread/saved/unsaved on lists of articles #8312 \nMisc API: better REST error semantics #8232 \n \n \nExtensions\n\nAdd support for extension priority #8038 \nAdd support for extension compatibility #8081 \nImprove PHP code with hook enums #8036 \nNew hook nav_entries #8054 \nRename Extensions default branch from master to main #8194 \n \n \nI18n\n\nTranslation status as text in README #7842 \nAdd new translate CLI commands move #8214 \nChange some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 #8065 \nImprove German #8028 \nImprove Greek #8146 \nImprove Finnish #8073 , #8092 \nImprove Hungarian #8244 \nImprove Italian #8115 , #8186 \nImprove Polish #8134 , #8135 \nImprove Russian #8155 , #8197 \nImprove Simplified Chinese #8308 , #8313 \n \n \nMisc.\n\nAdd code to modify a search expression #8293 \nRemove Pocket sharing service #8127 , #8128 \nUpdate to PHPMailer 7.0.1 #8048 , #8180 , #8272 \n💥 Housekeeping of lib_rss.php with potential breaking changes for some extensions #8193 , \nUse native PHP #[Deprecated] #8325 \nImprove PHP code #8156 , #8203 , #8284 , \n#8292 , #8297 \nGitHub Actions: --no-progress #8315 \nUpdate dev dependencies #8043 , #8044 , \n#8045 , #8046 , #8047 , \n#8052 , #8176 , #8177 , \n#8178 , #8179 , #8210 , \n#8270 , #8271 , #8273 , \n#8274 , #8275 , #8276 \n \n \n \n\t\n\t\t \n\t
\n "
+ },
+ "author": "Alkarex"
+ }
+ ],
+ "continuation": "1774343584078101"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.json b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.json
new file mode 100644
index 0000000..fdba6a4
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.raw.txt b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..3580e5e
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": ["Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。", "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。", "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。", "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。", "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"],
+ "keywords": ["Cursor", "Composer 2", "Kimi K2.5", "Fireworks AI", "模型套壳", "MIT许可证", "估值泡沫", "AI编程工具"],
+ "topics": ["人工智能", "大模型", "商业伦理", "技术授权", "创业融资"],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.validation.json b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..b366377
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.json b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.json
new file mode 100644
index 0000000..fdba6a4
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-01.result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被揭露实为套壳中国模型Kimi K2.5。尽管Cursor通过合作伙伴获得授权未侵权,但其隐瞒行为被认为是为支撑高估值而包装成自研模型公司。事件引发对国产大模型技术输出和信心的讨论。",
+ "highlights": [
+ "Cursor的Composer 2模型被技术手段揭露实际请求的模型ID为Kimi K2.5。",
+ "Cursor通过Fireworks AI获得Kimi授权,未违反许可条款,但刻意隐瞒使用事实。",
+ "Cursor估值在短期内从数千万美元飙升至数百亿美元,有动机包装自研能力以支撑估值。",
+ "事件显示中国大模型技术已能对外输出,国产模型与国外旗舰差距正在缩小。",
+ "Kimi在此事件中获得大量曝光,其下一代K3模型被期待有显著性能提升。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "模型套壳",
+ "MIT许可证",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术授权",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入剖析了AI行业热点事件,涉及技术真相、商业动机和产业趋势,具有较高的讨论和参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.json b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.json
new file mode 100644
index 0000000..c514b97
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多Agent协同",
+ "系统架构",
+ "科技动态",
+ "工具推荐"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "职业发展",
+ "科技资讯",
+ "效率工具"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.raw.txt b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..d53d6fb
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.raw.txt
@@ -0,0 +1,19 @@
+```json
+{
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": ["AI编程", "程序员招聘", "面试问题", "提示词工程", "多Agent协同", "系统架构", "科技动态", "工具推荐"],
+ "topics": ["人工智能", "软件开发", "职业发展", "科技资讯", "效率工具"],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
+}
+```
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.validation.json b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..7c70436
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多Agent协同",
+ "系统架构",
+ "科技动态",
+ "工具推荐"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "职业发展",
+ "科技资讯",
+ "效率工具"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.json b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.json
new file mode 100644
index 0000000..c514b97
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-02.result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
+ "summary": "本文探讨了在AI编程普及的未来,如何有效招聘程序员。作者认为传统的代码能力考察将不再重要,面试重点应转向考察应聘者使用AI工具、分解项目需求以及系统架构的能力。文章也指出,目前尚难确定一套能可靠筛选合格AI编程人才的面试问题。",
+ "highlights": [
+ "未来程序员招聘的核心考察点将从手写代码能力转向熟练运用AI工具的能力。",
+ "面试问题可能包括如何将复杂需求转化为清晰的提示词,以及设计多Agent协同工作机制。",
+ "传统的编程语法细节考察意义下降,系统架构知识和项目经验可能仍是重要参考。",
+ "AI的快速发展使得软件开发流程和人才评估标准面临颠覆性变化。",
+ "文章还包含科技动态、工具推荐、资源分享等周刊常规栏目内容。"
+ ],
+ "keywords": [
+ "AI编程",
+ "程序员招聘",
+ "面试问题",
+ "提示词工程",
+ "多Agent协同",
+ "系统架构",
+ "科技动态",
+ "工具推荐"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "职业发展",
+ "科技资讯",
+ "效率工具"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入探讨了AI时代对程序员职业及招聘流程的潜在影响,具有前瞻性和讨论价值,且内容结构完整、信息量丰富。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.json b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.json
new file mode 100644
index 0000000..a8a6d0e
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.raw.txt b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..97e58fe
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": ["Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。", "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。", "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。", "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。", "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"],
+ "keywords": ["Next.js", "AI复刻", "测试用例", "SQLite", "MIT许可证", "Cloudflare", "vinext", "护城河"],
+ "topics": ["人工智能", "软件开发", "开源技术", "科技趋势", "版权法律"],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.validation.json b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..d93152c
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.json b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.json
new file mode 100644
index 0000000..a8a6d0e
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-03.result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "科技爱好者周刊(第 388 期):测试是新的护城河",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
+ "summary": "本期讨论了AI快速复刻大型软件的现象,以Cloudflare工程师一周内用AI重写Next.js为例。文章指出,完备的测试用例成为软件公司防止AI复刻的新护城河,并探讨了AI复刻带来的版权问题。",
+ "highlights": [
+ "Cloudflare工程师仅用一周和1100美元Token费用,通过AI复刻了Next.js,性能优于原版。",
+ "软件护城河从代码转向测试用例,例如SQLite的闭源测试套件TH3是其难以复刻的核心。",
+ "AI复刻软件引发版权争议,如chardet项目因许可证更改产生纠纷,且AI生成物可能无版权。",
+ "文章列举了多个科技动态,包括AI改写脏话、激光飞机上网、数字分身争议等。",
+ "周刊还包含工具推荐、资源分享及读者评论,探讨了AI对程序员行业的影响。"
+ ],
+ "keywords": [
+ "Next.js",
+ "AI复刻",
+ "测试用例",
+ "SQLite",
+ "MIT许可证",
+ "Cloudflare",
+ "vinext",
+ "护城河"
+ ],
+ "topics": [
+ "人工智能",
+ "软件开发",
+ "开源技术",
+ "科技趋势",
+ "版权法律"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI对软件行业的冲击,提出了测试作为新护城河的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.json b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.json
new file mode 100644
index 0000000..f6e6a2b
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.raw.txt b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..d378a01
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": ["此版本主要修复了 1.28.0 版本引入的多个回归错误。", "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。", "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。", "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。", "该版本由多位贡献者共同完成,包括新加入的开发者。"],
+ "keywords": ["FreshRSS", "bug 修复", "回归问题", "GReader API", "HTTP Basic Auth", "Ajax 请求", "MySQL", "MariaDB"],
+ "topics": ["开源软件", "版本更新", "RSS 阅读器", "软件开发", "性能优化"],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.validation.json b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..96079fe
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.attempt-1.validation.json
@@ -0,0 +1,39 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [
+ "`??` category marked as worth keeping; check if this is intentional."
+ ],
+ "normalized_result": {
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.json b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.json
new file mode 100644
index 0000000..f6e6a2b
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-04.result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能,如可自定义的注册关闭消息,并进行了性能优化。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的多个回归错误。",
+ "新增了可自定义的注册关闭消息和 Apache 访问日志中的用户名记录功能。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了涉及过滤器、标签搜索、RSS/OPML 访问和数据库等多个具体问题。",
+ "该版本由多位贡献者共同完成,包括新加入的开发者。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug 修复",
+ "回归问题",
+ "GReader API",
+ "HTTP Basic Auth",
+ "Ajax 请求",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章清晰记录了 FreshRSS 一个具体版本的更新内容,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.json b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.json
new file mode 100644
index 0000000..f1bcd4c
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.raw.txt b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..273d203
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.raw.txt
@@ -0,0 +1,19 @@
+```json
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": ["FreshRSS", "用户修改日期排序", "高级搜索表单", "Capy Reader", "Docker", "Debian 13 Trixie", "PHP 8.4.11", "OpenID Connect"],
+ "topics": ["开源软件", "RSS 阅读器", "版本发布", "软件开发", "系统维护"],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
+}
+```
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.validation.json b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..004cec6
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.attempt-1.validation.json
@@ -0,0 +1,39 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [
+ "`??` category marked as worth keeping; check if this is intentional."
+ ],
+ "normalized_result": {
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.json b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.json
new file mode 100644
index 0000000..f1bcd4c
--- /dev/null
+++ b/outputs/freshrss/rerun/20260325-183221/summary/item-05.result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了多项新功能、性能改进和错误修复。更新包括新的排序过滤选项、高级搜索表单、API 功能增强以及 Docker 镜像更新。此版本还包含安全增强、UI 优化和针对大型实例的性能扩展。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,支持如 userdate:PT1H 的搜索操作符。",
+ "改进了对拥有 1000 以上用户的大型实例的统计信息扩展和 SQL 查询速度。",
+ "Docker 默认镜像已更新至 Debian 13 Trixie 和 PHP 8.4.11。",
+ "修复了 OpenID Connect 在 Debian 13 上的问题以及 MySQL/MariaDB 的错误排序。",
+ "将不安全的自动登录功能移至扩展,并对部分扩展存在潜在的破坏性变更。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Capy Reader",
+ "Docker",
+ "Debian 13 Trixie",
+ "PHP 8.4.11",
+ "OpenID Connect"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS 阅读器",
+ "版本发布",
+ "软件开发",
+ "系统维护"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了 FreshRSS 一个重要版本的功能更新、性能优化和修复内容,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.json b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.json
new file mode 100644
index 0000000..7da4b31
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "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行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.raw.txt b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..5b6f353
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "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行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.validation.json b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..e5e20a6
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-01/result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。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行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-01/result.loop.json b/outputs/freshrss/summary/batch/item-01/result.loop.json
new file mode 100644
index 0000000..7da4b31
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-01/result.loop.json
@@ -0,0 +1,32 @@
+{
+ "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行业的热点事件,涉及技术真相、商业动机和行业趋势,具有较高的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.json b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.json
new file mode 100644
index 0000000..0d4b3d5
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "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时代程序员招聘的前瞻性问题,具有启发性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.raw.txt b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..969a636
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.raw.txt
@@ -0,0 +1,19 @@
+```json
+{
+ "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时代程序员招聘的前瞻性问题,具有启发性和讨论价值。"
+}
+```
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.validation.json b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..fd21834
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-02/result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "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时代程序员招聘的前瞻性问题,具有启发性和讨论价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-02/result.loop.json b/outputs/freshrss/summary/batch/item-02/result.loop.json
new file mode 100644
index 0000000..0d4b3d5
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-02/result.loop.json
@@ -0,0 +1,32 @@
+{
+ "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时代程序员招聘的前瞻性问题,具有启发性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.json b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.json
new file mode 100644
index 0000000..ac970ad
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "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 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.raw.txt b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..5863da0
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.raw.txt
@@ -0,0 +1,17 @@
+{
+ "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 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.validation.json b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..5d0d636
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-03/result.loop.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "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 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-03/result.loop.json b/outputs/freshrss/summary/batch/item-03/result.loop.json
new file mode 100644
index 0000000..ac970ad
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-03/result.loop.json
@@ -0,0 +1,32 @@
+{
+ "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 对软件行业护城河的颠覆性影响,并提出了测试用例作为新壁垒的见解,具有前瞻性和讨论价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.json b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.json
new file mode 100644
index 0000000..efff8fc
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的回归问题。",
+ "新增了注册关闭时的可自定义消息功能。",
+ "在 Apache 访问日志和 Docker 日志中添加了用户名记录。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug fixing",
+ "regression",
+ "Apache logs",
+ "GReader API",
+ "Ajax",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.raw.txt b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..f3f1c06
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
+ "highlights": ["此版本主要修复了 1.28.0 版本引入的回归问题。", "新增了注册关闭时的可自定义消息功能。", "在 Apache 访问日志和 Docker 日志中添加了用户名记录。", "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。", "修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"],
+ "keywords": ["FreshRSS", "bug fixing", "regression", "Apache logs", "GReader API", "Ajax", "MySQL", "MariaDB"],
+ "topics": ["开源软件", "版本更新", "RSS 阅读器", "软件开发", "性能优化"],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.validation.json b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..b4de5ee
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-04/result.loop.attempt-1.validation.json
@@ -0,0 +1,39 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [
+ "`??` category marked as worth keeping; check if this is intentional."
+ ],
+ "normalized_result": {
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的回归问题。",
+ "新增了注册关闭时的可自定义消息功能。",
+ "在 Apache 访问日志和 Docker 日志中添加了用户名记录。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug fixing",
+ "regression",
+ "Apache logs",
+ "GReader API",
+ "Ajax",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-04/result.loop.json b/outputs/freshrss/summary/batch/item-04/result.loop.json
new file mode 100644
index 0000000..efff8fc
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-04/result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.1",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
+ "summary": "FreshRSS 1.28.1 是一个专注于修复错误的版本,主要解决了 1.28.0 版本引入的回归问题。该版本包含少量新功能、性能改进和多项错误修复。",
+ "highlights": [
+ "此版本主要修复了 1.28.0 版本引入的回归问题。",
+ "新增了注册关闭时的可自定义消息功能。",
+ "在 Apache 访问日志和 Docker 日志中添加了用户名记录。",
+ "通过禁用 Ajax 请求中用户标签的文章计数来提升性能。",
+ "修复了包括用户查询扩展、标签搜索、令牌访问在内的多项错误。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "bug fixing",
+ "regression",
+ "Apache logs",
+ "GReader API",
+ "Ajax",
+ "MySQL",
+ "MariaDB"
+ ],
+ "topics": [
+ "开源软件",
+ "版本更新",
+ "RSS 阅读器",
+ "软件开发",
+ "性能优化"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "提供了 FreshRSS 特定版本更新的详细变更信息,对用户和开发者有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.json b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.json
new file mode 100644
index 0000000..0c77c71
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。",
+ "引入了新的高级搜索表单和文章长度排序选项。",
+ "改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。",
+ "修复了OpenID Connect在Debian 13上的兼容性问题。",
+ "Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Docker",
+ "Debian 13",
+ "PHP 8.4",
+ "OpenID Connect",
+ "性能优化"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS阅读器",
+ "版本发布",
+ "软件开发",
+ "系统部署"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.raw.txt b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.raw.txt
new file mode 100644
index 0000000..9e0368c
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
+ "highlights": ["新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。", "引入了新的高级搜索表单和文章长度排序选项。", "改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。", "修复了OpenID Connect在Debian 13上的兼容性问题。", "Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"],
+ "keywords": ["FreshRSS", "用户修改日期排序", "高级搜索表单", "Docker", "Debian 13", "PHP 8.4", "OpenID Connect", "性能优化"],
+ "topics": ["开源软件", "RSS阅读器", "版本发布", "软件开发", "系统部署"],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.validation.json b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.validation.json
new file mode 100644
index 0000000..132dcef
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-05/result.loop.attempt-1.validation.json
@@ -0,0 +1,39 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [
+ "`??` category marked as worth keeping; check if this is intentional."
+ ],
+ "normalized_result": {
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。",
+ "引入了新的高级搜索表单和文章长度排序选项。",
+ "改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。",
+ "修复了OpenID Connect在Debian 13上的兼容性问题。",
+ "Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Docker",
+ "Debian 13",
+ "PHP 8.4",
+ "OpenID Connect",
+ "性能优化"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS阅读器",
+ "版本发布",
+ "软件开发",
+ "系统部署"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/batch/item-05/result.loop.json b/outputs/freshrss/summary/batch/item-05/result.loop.json
new file mode 100644
index 0000000..0c77c71
--- /dev/null
+++ b/outputs/freshrss/summary/batch/item-05/result.loop.json
@@ -0,0 +1,32 @@
+{
+ "title": "FreshRSS 1.28.0",
+ "url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
+ "summary": "FreshRSS 1.28.0 是一个主要版本更新,引入了按用户修改日期排序、高级搜索表单等新功能,并改进了性能和安全性。此版本还包含多项错误修复,并更新了Docker默认镜像。",
+ "highlights": [
+ "新增按用户修改日期排序和过滤功能,并支持对应的搜索操作符。",
+ "引入了新的高级搜索表单和文章长度排序选项。",
+ "改进了用户统计的扩展性,以支持拥有1000名以上用户的实例。",
+ "修复了OpenID Connect在Debian 13上的兼容性问题。",
+ "Docker默认镜像已更新至Debian 13 Trixie和PHP 8.4.11。"
+ ],
+ "keywords": [
+ "FreshRSS",
+ "用户修改日期排序",
+ "高级搜索表单",
+ "Docker",
+ "Debian 13",
+ "PHP 8.4",
+ "OpenID Connect",
+ "性能优化"
+ ],
+ "topics": [
+ "开源软件",
+ "RSS阅读器",
+ "版本发布",
+ "软件开发",
+ "系统部署"
+ ],
+ "category": "资讯",
+ "worth_keeping": true,
+ "reason": "该文章详细记录了FreshRSS一个重要版本的功能更新、性能改进和错误修复,对用户和开发者具有明确的参考价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/freshrss.try.result.attempt-1.json b/outputs/freshrss/summary/freshrss.try.result.attempt-1.json
new file mode 100644
index 0000000..172f595
--- /dev/null
+++ b/outputs/freshrss/summary/freshrss.try.result.attempt-1.json
@@ -0,0 +1,32 @@
+{
+ "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模型实际请求的模型ID为kimi-k2p5-rl-0317-s515-fast,证实其为套壳Kimi K2.5。",
+ "Kimi官方确认Cursor通过合作伙伴Fireworks AI获得授权,因此不构成侵权。",
+ "Cursor正在寻求500亿美元估值,其隐瞒使用Kimi模型可能是为了将自己包装成具有模型研发能力的大模型公司。",
+ "事件曝光后,Kimi获得了高价值曝光,作者呼吁对国产大模型保持信心。",
+ "Composer 2在性能、速度和成本上相比GPT-5.4和Opus 4.6具有竞争力,但本质是微调的Kimi K2.5。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "套壳模型",
+ "模型授权",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术争议",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI行业的热点事件,揭示了技术套壳与商业估值之间的关联,具有行业洞察价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/freshrss.try.result.attempt-1.raw.txt b/outputs/freshrss/summary/freshrss.try.result.attempt-1.raw.txt
new file mode 100644
index 0000000..1ae07f3
--- /dev/null
+++ b/outputs/freshrss/summary/freshrss.try.result.attempt-1.raw.txt
@@ -0,0 +1,11 @@
+{
+ "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模型实际请求的模型ID为kimi-k2p5-rl-0317-s515-fast,证实其为套壳Kimi K2.5。", "Kimi官方确认Cursor通过合作伙伴Fireworks AI获得授权,因此不构成侵权。", "Cursor正在寻求500亿美元估值,其隐瞒使用Kimi模型可能是为了将自己包装成具有模型研发能力的大模型公司。", "事件曝光后,Kimi获得了高价值曝光,作者呼吁对国产大模型保持信心。", "Composer 2在性能、速度和成本上相比GPT-5.4和Opus 4.6具有竞争力,但本质是微调的Kimi K2.5。"],
+ "keywords": ["Cursor", "Composer 2", "Kimi K2.5", "Fireworks AI", "套壳模型", "模型授权", "估值泡沫", "AI编程工具"],
+ "topics": ["人工智能", "大模型", "商业伦理", "技术争议", "创业融资"],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI行业的热点事件,揭示了技术套壳与商业估值之间的关联,具有行业洞察价值。"
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/freshrss.try.result.attempt-1.validation.json b/outputs/freshrss/summary/freshrss.try.result.attempt-1.validation.json
new file mode 100644
index 0000000..fc78f27
--- /dev/null
+++ b/outputs/freshrss/summary/freshrss.try.result.attempt-1.validation.json
@@ -0,0 +1,37 @@
+{
+ "valid": true,
+ "errors": [],
+ "warnings": [],
+ "normalized_result": {
+ "title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
+ "url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
+ "summary": "AI编程工具Cursor推出的Composer 2模型被证实套壳中国Kimi K2.5模型,引发侵权争议。Kimi官方确认Cursor通过Fireworks AI获得授权,不存在侵权。作者分析Cursor隐瞒事实是为了支撑其快速膨胀的估值,将其包装成大模型公司。",
+ "highlights": [
+ "Cursor的Composer 2模型实际请求的模型ID为kimi-k2p5-rl-0317-s515-fast,证实其为套壳Kimi K2.5。",
+ "Kimi官方确认Cursor通过合作伙伴Fireworks AI获得授权,因此不构成侵权。",
+ "Cursor正在寻求500亿美元估值,其隐瞒使用Kimi模型可能是为了将自己包装成具有模型研发能力的大模型公司。",
+ "事件曝光后,Kimi获得了高价值曝光,作者呼吁对国产大模型保持信心。",
+ "Composer 2在性能、速度和成本上相比GPT-5.4和Opus 4.6具有竞争力,但本质是微调的Kimi K2.5。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "套壳模型",
+ "模型授权",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术争议",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI行业的热点事件,揭示了技术套壳与商业估值之间的关联,具有行业洞察价值。"
+ }
+}
\ No newline at end of file
diff --git a/outputs/freshrss/summary/freshrss.try.result.json b/outputs/freshrss/summary/freshrss.try.result.json
new file mode 100644
index 0000000..172f595
--- /dev/null
+++ b/outputs/freshrss/summary/freshrss.try.result.json
@@ -0,0 +1,32 @@
+{
+ "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模型实际请求的模型ID为kimi-k2p5-rl-0317-s515-fast,证实其为套壳Kimi K2.5。",
+ "Kimi官方确认Cursor通过合作伙伴Fireworks AI获得授权,因此不构成侵权。",
+ "Cursor正在寻求500亿美元估值,其隐瞒使用Kimi模型可能是为了将自己包装成具有模型研发能力的大模型公司。",
+ "事件曝光后,Kimi获得了高价值曝光,作者呼吁对国产大模型保持信心。",
+ "Composer 2在性能、速度和成本上相比GPT-5.4和Opus 4.6具有竞争力,但本质是微调的Kimi K2.5。"
+ ],
+ "keywords": [
+ "Cursor",
+ "Composer 2",
+ "Kimi K2.5",
+ "Fireworks AI",
+ "套壳模型",
+ "模型授权",
+ "估值泡沫",
+ "AI编程工具"
+ ],
+ "topics": [
+ "人工智能",
+ "大模型",
+ "商业伦理",
+ "技术争议",
+ "创业融资"
+ ],
+ "category": "观点评论",
+ "worth_keeping": true,
+ "reason": "文章深入分析了AI行业的热点事件,揭示了技术套壳与商业估值之间的关联,具有行业洞察价值。"
+}
\ No newline at end of file
diff --git a/outputs/llm-summary-prompt.txt b/outputs/prompts/llm-summary-prompt.txt
similarity index 100%
rename from outputs/llm-summary-prompt.txt
rename to outputs/prompts/llm-summary-prompt.txt
diff --git a/outputs/reference/candidates/article-candidate-record.sample.json b/outputs/reference/candidates/article-candidate-record.sample.json
new file mode 100644
index 0000000..cdd2f88
--- /dev/null
+++ b/outputs/reference/candidates/article-candidate-record.sample.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\nCursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso 发现 ,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。
\n\n首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。
\n\n然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。
\n\n真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。
\n\n
\n\n2、
\n\n这位国外推友就把上面的截图,发布 到网上。这下炸锅了,明眼人都看出来,这是铁证,Composer 2 实际上是套壳的 Kimi K2.5 。
\n\n
\n\n可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。
\n\n
\n\n但是为时已晚,网上传遍了,就连马斯克也发推 :\"它就是 Kimi K2.5\"。
\n\n
\n\n这下好了,变成了公开的秘密,再也无法掩盖了。
\n\n3、
\n\n大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。
\n\n
\n\n许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5 。
\n\nCursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。
\n\n就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来说话 了。
\n\n
\n\n他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。
\n\n稍后,Kimi 官方也发推 了。
\n\n
\n\nKimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。
\n\n4、
\n\n事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。
\n\n既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?
\n\n我猜测,原因跟 Cursor 不断膨胀的估值有关 。
\n\n彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。
\n\n
\n\n大家知道吗,它以前的估值是多少?
\n\n2023年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\n5、
\n\n纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。
\n\nCursor 发布 Composer 2 时,披露了性能和成本比较。
\n\nComposer 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\n6、
\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版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证 ) \n发表日期: 2026年3月21日 \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": "insights",
+ "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-25T09:30:24.538179Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-093024"
+ }
+}
\ No newline at end of file
diff --git a/outputs/reference/candidates/article-candidate.json b/outputs/reference/candidates/article-candidate.json
new file mode 100644
index 0000000..9dc4919
--- /dev/null
+++ b/outputs/reference/candidates/article-candidate.json
@@ -0,0 +1,112 @@
+{
+ "candidate_id": "cand:sha256:1ee177246bce46534c81718bee693fea43a4b491f545e61b3c41f22e20994057",
+ "item": null,
+ "article": {
+ "extract_id": "sha256:1ee177246bce46534c81718bee693fea43a4b491f545e61b3c41f22e20994057",
+ "item_id": null,
+ "source_id": null,
+ "url": "https://shawnxie.top/blogs/tools/read-flow-2026.html",
+ "title": "信息过载时代,我的漏斗式阅读工作流",
+ "author": null,
+ "published_at": null,
+ "language": null,
+ "content_kind": "article",
+ "plain_text": "信息过载时代,我的漏斗式阅读工作流\n这两年我越来越强烈地感觉到,信息问题早就不是获取不到,而是处理不过来。\n真正让我疲惫的,不是没东西看,而是每天都有太多东西值得看:公众号文章、技术博客、GitHub Release、AI 新闻、社区讨论、长文、短讯、碎片化观点等等,全都在争夺我的注意力。\n如果不做点什么,一个人的信息生活很容易退化成这样:\n- 收藏夹里躺满了文章,真正读完的却寥寥无几\n- 每天浏览大量内容,能留在脑子里的却屈指可数\n- 输入看似充实,输出却异常薄弱\n- 以为自己一直在吸收信息,实际上只是在不同窗口间疲于切换\n2026年,我开始认真整理自己的一套信息处理工作流。我不需要大而全的平台,也不想要那种号称能“一键替我读完互联网”的 AI 产品。\n我只需要一套围绕自己运转的信息吸收漏斗:既能尽可能广泛地捕捉信息,又能提前过滤掉噪音和重复内容,只把真正值得投入时间的内容呈现在我面前。更重要的是,这套系统还要能将我精读后的高价值内容沉淀下来,反过来优化下一轮的信息筛选。\n信息处理不追求看得更多,而是在于更稳定地吸收、判断和沉淀。\n这篇文章,我将把这套工作流思路完整写下来,包括:\n- 为什么我要这样做\n- 它是怎么搭起来的\n- 每一层分别承担什么职责\n- 未来优化方向\n如果你也在被信息过载折磨,或者你已经有不少输入工具,却还是觉得每天看了很多,脑子里没留下什么,那也许这篇文章会有点参考价值。\n为什么要做信息吸收漏斗?\n我以前也尝试过很多方法:\n- 订阅很多 RSS,然后每天刷\n- 把值得看的东西先扔进稍后阅读\n- 用收藏、标签、笔记软件把文章存起来\n- 靠搜索和回忆去找以前读过的内容\n这些工具各有用处,但通常只能解决信息处理中的某一个环节。而个人信息处理真正的难点,从来都不在于单点突破,而在于如何将这些分散的环节串联起来。信息系统如果不能同时解决这两个问题,就很容易失控:\n输入太多,内容太杂\n几乎每一个你关心的领域,都在持续产生新内容。技术突破、产品迭代、AI进展、工具更新、商业动态、研究成果、行业变化……\n而且在未经过滤之前,重要新闻、工具发布、经验复盘、广告软文、标题党、重复报道等往往都混在一起,让人难以分辨。\n如果每一条内容都需要你从零开始判断其价值,那日积月累下来的认知负担会非常高。很多时候,人真正感到疲惫的不是读一篇长文,而是反复做这些微小但无意义的判断:\n- 这篇文章值不值得点开?\n- 这条消息是不是和刚才那条重复?\n- 这个标题是不是在夸大其词?\n- 这条内容到底在说什么?\n- 这篇文章我只是需要了解一下,还是值得保存?\n缺少精读回路\n很多内容看完就过去了,既没有标记,也没有沉淀,更没有真正融入自己的知识体系。\n如果信息系统永远只知道最新内容是什么,却不知道什么内容真正对你有帮助,那最多只能算是一个信息输送管道,而不是一个能越来越懂你的个性化系统。\n所以我要的不是做一个更强的信息池,而是做一个更稳的信息漏斗。\n桶的思路是往里装更多,漏斗的思路是让信息在往下走的过程中不断收窄,最后留下真正值得进入大脑和长期记忆的部分。\n从实践效果来看,这套漏斗式信息处理工作流至少给我带来了几个显著的变化:\n- 我不再需要每天从海量标题中艰难地筛选重点内容\n- 低质量和重复的信息大部分在上游就被过滤掉了\n- 真正值得精读的内容,会在更靠后的环节中呈现在我面前\n- 我读过并认为有价值的内容,终于开始能够反过来优化后续的筛选逻辑\n不是追求更快地刷完信息,而是实现更稳定地吸收知识。\n为什么基于 OpenClaw 搭建?\n由于流程尚处探索阶段,选择先用 OpenClaw 将整条链路串联起来,让系统先运行起来,验证可行性,发现问题后再逐步优化和完善。\nOpenClaw 主要扮演编排层的角色,负责以下工作:\n- 定时触发各类任务\n- 串联不同的外部工具和系统\n- 与飞书文档进行交互\n- 与 Lumina 知识库进行联动\n- 在需要的环节引入 AI 进行结构化内容生成\n这种方式起步快、迭代快,非常适合边运行边优化,不需要一开始就投入大量精力构建完整的前后端系统。\n如果你也想搭建一套类似的信息处理流程,需要做这些准备:\n1. 可持续维护的信息源\n这是整个系统的上游基础,需要先想清楚几个问题:\n- 自己真正长期关注的主题领域是什么\n- 这些领域的主要信息来源有哪些\n- 哪些信息源值得长期订阅,哪些只是偶尔查看即可\n这一步不需要追求大而全,但要尽量保持稳定和高质量。\n如果你还没有构建自己的信息源,可以先参考我收集的 RSS 订阅源。\n2. 统一的聚合池\n我选择的聚合池是 FreshRSS,一个开源的RSS阅读器,支持多平台,支持自定义订阅,内容分类管理和API,非常适合用来进行内容存储和同步。\n它并非最终阅读工具,而是信息汇聚的中转站,让所有信息源先汇聚到同一个地方,形成可持续消费的内容候选池。\n3. 自动化编排层\n这是 OpenClaw 最能发挥价值的地方,极大地降低了自动化流程实现的难度,通过自然语言描述诉求,在对话中逐步落地想法。我主要用它来完成以下任务:\n- 定时执行 digest(自定义的预处理Skill)\n- 定时执行 daily-review(自定义的内容精选Skill)\n- 发布飞书文档\n- 调用 Lumina(个人开源的知识库项目)\n- 串联各个技能和脚本\n4. 长期知识沉淀层\n在我的工作流中,这一层使用 Lumina——个人开发的信息管理工作台。当然也可以使用别的笔记工具,如Notion、Obsidian等。\nLumina 只承接我经过筛选后确认值得长期保留的优质内容,这一步直接决定了后续反馈机制的质量。\n一个系统最终能学到什么,很大程度上取决于你为它提供了什么样的正反馈样本。\n信息处理工作流\n一句话描述:用 RSS 尽可能广泛地捕捉信息,用 FreshRSS 进行稳定聚合,用 Digest 完成预处理,用 Daily Review 实现每日精选,通过人工精读判断内容的长期价值,用 Lumina 进行知识沉淀,最后将这些沉淀的价值反向转化为轻量的个性化信号。\n这套流程的核心优势不是追求全自动,而是在于分层处理的设计理念。这意味着:\n- 并非所有信息都值得投入时间精读\n- 并非所有信息都值得长期留存\n- 并非所有信息都需要进行个性化加权\n- 并非所有信息都适合直接作为输出内容\n一旦层次划分清晰,系统就不会退化为单一维度的推荐流,而会演变成一个真正的认知加工流程。漏斗的真正价值不在于让信息越来越少,而在于实现了这几个关键目标:\n- 上游宽广:确保不会错过真正重要的信息变化\n- 中游稳定:有效过滤噪音,避免其直接干扰注意力系统\n- 下游精准:让我不必在不值得精读的内容上浪费时间\n- 回流轻柔:通过轻量反馈机制,避免系统演变成封闭的信息茧房\n个人信息系统核心能力不是如何接入更多信息源,而是要明确:哪些信息值得进入系统,哪些信息值得投入时间精读,哪些内容值得长期留存,哪些知识最终真正融入了你的思考和行动?\n当能够清晰地回答这些问题时,就不再是互联网信息的被动接收者,你将拥有一套真正属于自己的认知处理系统。接下来将按顺序详细介绍每一层的工作原理。\n信息源:以 RSS 为主,但不局限于原生 RSS\n整个系统的最上游是信息源,主要依赖 RSS。\nRSS 是最被低估的个人信息基础设施。其天然符合个人信息系统最核心的几个要求:\n- 订阅权完全掌握在自己手中\n- 信息来源清晰明确\n- 更新内容结构化\n- 不受平台推荐算法直接支配\n- 便于程序接入和自动化处理\n然而在现实中,有一个不可避免的问题:并非所有值得关注的信息源都提供 RSS 订阅。例如:部分公众号内容、某些社区的特定栏目、垂直网站的更新页面和社交平台上的账号动态。\n因此,需要在信息源进入流程之前,尽可能将其统一转换为 RSS 或类似 feed 的格式。常见的方案有:\n- RSSHub / RSS-Bridge 等转换工具:能够将大量原本不提供 RSS 订阅的内容源,转换为可以被订阅和程序自动化消费的 feed 格式;\n- GitHub feed:项目的 Releases、Commits、Discussions 等,都天然提供了结构化的 feed 接口;\n- wewe-rss:能够将公众号文章转换成RSS订阅源;\n- nitter:将 Twitter/X 动态转换为RSS源;\n- 自定义抓取脚本:对于没有现成 RSS 解决方案的页面,也可以自行编写轻量级的抓取脚本,将其转换为内部可用的 feed 格式。\n这一步的原则很简单:上游信息源可以多种多样,但在进入系统之前,格式必须尽可能统一。只有这样,下游的预处理和筛选环节才能稳定可靠地运行。\n更多信息源归一处理方案可参考之前文章碎片时间刷文章!懒人阅读方案分享。\n聚合池:用 FreshRSS 打造稳定的“中间水库”\n所有订阅源最终都会汇聚到 FreshRSS 中,它并非\"我每天真正坐下来阅读的地方\",而是流程的缓冲层,主要有以下作用:\n实现信息来源的统一管理\n无论内容来自博客、社区、GitHub 还是转换后的 feed,最终都以统一的格式呈现,成为可被消费的标准化对象。\n让下游环节无需直接对接互联网\ndigest 模块无需再逐个访问各个网站抓取今日更新内容,只需从 FreshRSS 这个统一的内容池中获取未读候选即可。大大降低了系统各环节之间的耦合度。\n确保了信息处理的时间连续性\n信息系统最忌讳的是“今天临时查看一下、明天就忘了、后天又重新开始”的碎片化处理方式。FreshRSS 提供了一个稳定的时间窗口,使后续任务能够按照固定节奏有序运行。\n我的目标不是追求无边界的信息获取,而是实现有边界的信息处理。\n预处理:Digest 将海量候选内容转化为可判断对象\n如果把 FreshRSS 比作蓄水池,那么 Digest 就是这套系统中的第一道加工厂,专注于完成内容预处理任务。\n让人每天真正感到疲惫的,往往不是精读一篇高质量文章,而是反复判断大量低质量内容是否值得投入时间。\n核心处理任务\n- URL 精确去重\n- 相似内容去重\n- 正文抓取\n- 质量检查\n- 噪音过滤\n- 摘要生成\n- 初步排序与文档输出\n在真正的“阅读”开始之前,先将互联网上天然混乱的信息整理成一批更具可读性的候选内容。\n为什么重要?\n如果没有预处理环节,后续的所有精选工作都将建立在一堆未经整理的原始标题之上。而经过 Digest 处理后,情况会改善:\n- 标题党内容大幅减少\n- 重复报道得到有效过滤\n- 无法获取正文的无效数据明显减少\n- 每条候选内容至少附带一个可供快速判断的摘要\n这将显著降低后续阅读的认知成本。Digest 的职责并非编辑终稿,而是将候选内容池整理干净、结构化,为后续的精选环节奠定基础。\nAI 精选:Daily Review 为我呈现重点关注内容\n如果说 Digest 的作用是将原始候选内容处理得更具可读性,那么 Daily Review 则是从这些经过预处理的候选中,进一步提炼出当天真正值得关注的精华内容。\n这一步让流程从预处理迈向编辑阶段。不再追求内容的广度,而是致力于打造重点更突出、结构更清晰的阅读体验,让最终产物更像一份真正意义上的日报,而非简单堆砌的摘要集合。\n目前,我将 Daily Review 设计为几个固定栏目,将不同类型的信息分配到不同的认知槽位中,包含:\n- 今日大事:聚焦具有公共重要性的事件\n- 变更与实践:关注对个人有直接操作价值的内容\n- 安全与风险:警惕潜在的风险因素\n- 开源与工具:追踪工具生态的发展变化\n- 洞察与数据点:把握行业趋势和关键数据\n- 主题深挖:将单一新闻事件提升到趋势层面进行分析\nLLM 赋能\n从 Digest 输出的候选内容,到 Daily Review 最终的成稿层,中间有很多工作适合 AI 来完成:\n- 合并同一事件的多个信息来源\n- 提炼核心主题\n- 为内容分类并分配到对应栏目\n- 识别值得深入探讨的话题\n- 将零散的候选内容重组为人类可以快速阅读的日报结构\n但我对 AI 在这一环节的应用始终保持克制。不是让 AI 全自动生成日报,而是扮演结构化整理者的角色,从候选内容中筛选出当天和我相关的精华部分。\n精读留存:将 Human in the loop 置于系统核心\n前面所有流程,都是为将信息筛选到值得精读的阶段。真正让系统不至于退化为另一种自动化信息流的,正是这一关键环节:Human in the loop(人在回路中)。\n我坚信,在个人知识系统中,最不能完全外包的是长期价值判断能力。\n系统可以协助我完成许多任务,如信息收集、去重、摘要、聚类、排序和精选等。但它无法完全替我做出关键决策:\n- 哪些内容真正值得纳入长期知识库\n- 哪些内容在未来会持续发挥价值\n- 哪些内容会对我的写作和判断产生深远影响\n因此,在我的工作流中,Lumina 前面始终设有一道人工筛选门槛。我会从之前各个环节产生的内容中,挑选出真正值得精读和长期留存的内容。\n这是整套系统中最关键的价值确认环节。能够进入 Lumina 的内容,不仅代表我看过,更意味着我认为这篇内容值得在未来持续为我所用。\n个人画像:让系统学会识别对我真正有价值的内容\n如果流程到 Lumina 就戛然而止,那么它仍然只是一个单纯的过滤和沉淀系统。只有当沉淀的内容开始反过来影响上游的信息选择时,整个系统才真正形成了闭环。\n为此我加入了一层设计较为克制的兴趣画像逻辑。\n刻意控制了影响力,不希望整个系统演变成另一个猜你喜欢的推荐引擎。我只需要它能稍微更懂我,但又不过度迎合我的偏好,保留对公共重要性内容的关注和探索未知领域的空间。\n这层画像目前主要承担轻量 rerank 的功能,作为辅助信号,轻微影响 Digest 和 Daily Review 环节中候选内容的排序。主要从以下几个维度逐步学习我的偏好:\n- 长期精读的主题领域\n- 能稳定提供价值的信息源\n- 偏好的内容格式\n- 最终存入 Lumina 知识库的内容类型\n轻量引导的设计,旨在减少无效信息对注意力的浪费,同时避免构建封闭的信息茧房。个性化推荐应帮助我们减少无意义的判断,而非让我们躲进舒适区。\n沉淀:将信息流转化为长期内容资产\n信息漏斗的终点不是读完,而是沉淀。目前从两个方向拓展沉淀的价值:\n1. 周刊生成\n当系统积累了一周的高质量内容后,就不应再局限于每天生成一份日报。一周的时间跨度非常适合进行复盘总结。此时,系统已经拥有了丰富的素材:\n- 一周的 Digest 预处理结果\n- 一周的 Daily Review 精选内容\n- 若干经过价值确认的 Lumina 知识库内容\n- 一些开始反复出现的热门主题\n此时生成周刊,比单纯从网页上抓取热点更有价值。因为这些内容已经经过了个人筛选和沉淀,带有明显的个性化痕迹。周刊不应仅仅是本周发生了什么的简单罗列,更应该具备深度和价值:\n- 本周有哪些主题值得重点关注和记忆\n- 哪些变化只是短期噪音,哪些是值得重视的长期信号\n- 哪些内容具有长期参考价值,值得反复回看\n周刊合集👉🏻:肖恩技术周刊\n2. 主题文章生成\n另一个方向是让系统能够逐渐识别哪些主题已经积累了足够的素材,值得写成长篇文章。\n虽然信息流中的内容看起来是离散的,但如果拉长时间维度观察,就会发现很多内容其实都在指向同一个核心主题,例如:\n- AI Agent 工程的发展趋势\n- 开源工具链的演变\n- 内容平台分发机制的变革\n- 隐私保护、合规要求与数据治理\n一旦某个主题在一段时间内反复出现,并且我多次对相关内容进行精读、收藏和沉淀,那么它就不应再仅仅是多条零散的新闻,而应该逐渐发展成为一个可以深入挖掘和输出的长期主题。\n内容合集👉🏻:今日观察\n未来迭代方向\n尽管工作流目前已经能够稳定运行,但它远未达到最终完成的状态。可以继续完善的方面有:\n细化反馈机制\n目前系统中最强的反馈信号是这篇内容是否被存入 Lumina。但在理想状态下,我希望系统能够逐渐识别更多层次的用户行为:\n- 点开内容但未读完\n- 读完内容但未收藏\n- 内容值得精读\n- 内容值得长期沉淀\n- 内容最终影响了写作、决策或实际实现\n- 不喜欢的内容(负反馈)\n一旦这些层次的反馈机制得以完善,兴趣画像将变得更加精准,不再只是一个粗粒度的偏好集合。\n进一步抽象流程\n目前,我更倾向于继续在现有的 OpenClaw 体系内迭代优化,这是探索阶段最适合的方式。\n但如果这套流程能够变得更加稳定,职责边界也更加清晰,那么抽象出其中的信息处理内核,会更有利于后续工程化迭代。\n不过比起将其产品化,还是先让这套漏斗系统持续稳定地运转,越来越懂我。\n结语\n信息处理的关键,从来不是看到更多,而是让真正重要的信息被自己接住。\n当信息经过筛选、精读、沉淀和反馈,真正融入知识结构时,我们不再是信息的被动消费者,将真正成为自己信息环境的主人。\n感谢阅读\n微信公众号「肖恩聊技术」\n如果这篇文章对你有帮助,欢迎扫码关注,获取原创文章推送。",
+ "quality_flags": {
+ "is_paywalled": false,
+ "is_truncated": false,
+ "is_low_content": false
+ },
+ "metadata": {
+ "content_source": "fetched_html",
+ "extractor": "trafilatura",
+ "char_count": 7019
+ },
+ "pipeline_state": "extracted"
+ },
+ "summary": {
+ "title": "信息过载时代,我的漏斗式阅读工作流",
+ "url": "https://shawnxie.top/blogs/tools/read-flow-2026.html",
+ "summary": "作者为解决信息过载问题,构建了一套以RSS为上游、FreshRSS为聚合池、OpenClaw为编排层的漏斗式工作流,通过分层筛选、AI精选和人工精读,将信息逐步沉淀至Lumina知识库,形成稳定可控的个人信息处理闭环。",
+ "highlights": [
+ "以RSS为主统一信息源,通过转换工具将公众号、社交动态等非RSS内容标准化接入。",
+ "Digest预处理负责去重、抓取正文和生成摘要,Daily Review结合AI将内容分类为日报栏目。",
+ "人工精读是长期价值判断的核心环节,只有经过筛选的内容才进入Lumina知识库沉淀。",
+ "通过轻量兴趣画像和反馈机制,系统能逐步优化筛选排序,同时避免形成信息茧房。",
+ "沉淀后的内容可进一步生成周刊或主题文章,将信息流转化为长期资产。"
+ ],
+ "keywords": [
+ "RSS",
+ "FreshRSS",
+ "OpenClaw",
+ "Digest",
+ "Daily Review",
+ "Lumina",
+ "信息漏斗",
+ "人在回路"
+ ],
+ "topics": [
+ "个人信息管理",
+ "阅读工作流",
+ "知识沉淀"
+ ],
+ "category": "方法论",
+ "worth_keeping": true,
+ "reason": "系统性地阐述了个人信息处理的分层架构与工程实践,兼具理念清晰度和可操作性,对知识工作者有较高参考价值。"
+ },
+ "filter_decision": {
+ "decision": "keep",
+ "matched_rules": [
+ "keep-worth-keeping-method",
+ "review-worth-keeping-other"
+ ],
+ "reasons": [
+ "Structured summary marked the content as worth keeping in a durable category.",
+ "Worth-keeping signal is positive but no stronger keep rule matched."
+ ],
+ "labels": [
+ "durable",
+ "needs-review",
+ "summary"
+ ],
+ "priority": 80,
+ "matches": [
+ {
+ "rule_id": "keep-worth-keeping-method",
+ "decision": "keep",
+ "reason": "Structured summary marked the content as worth keeping in a durable category.",
+ "labels": [
+ "summary",
+ "durable"
+ ],
+ "priority": 80
+ },
+ {
+ "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": "tools_and_workflows",
+ "digest_rank": 80,
+ "review_state": "pending",
+ "source_refs": {
+ "raw_item_path": null,
+ "extracted_path": "outputs\\read-flow-2026.extracted.json",
+ "summary_path": "outputs\\result.json",
+ "filter_path": "outputs\\filter-decision.json"
+ },
+ "rendered_markdown": null,
+ "metadata": {
+ "generated_at": "2026-03-25T07:21:24.469312Z",
+ "pipeline_version": "v1",
+ "producer": "run_article_candidate.py",
+ "run_id": "candidate-20260325-072124"
+ }
+}
\ No newline at end of file
diff --git a/outputs/reference/candidates/openclaw-candidate-input.sample.json b/outputs/reference/candidates/openclaw-candidate-input.sample.json
new file mode 100644
index 0000000..440172e
--- /dev/null
+++ b/outputs/reference/candidates/openclaw-candidate-input.sample.json
@@ -0,0 +1,40 @@
+{
+ "candidate_id": "cand:sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
+ "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": "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": "insights",
+ "digest_rank": 60
+}
\ No newline at end of file
diff --git a/outputs/read-flow-2026.extracted.json b/outputs/reference/extracted/read-flow-2026.extracted.json
similarity index 100%
rename from outputs/read-flow-2026.extracted.json
rename to outputs/reference/extracted/read-flow-2026.extracted.json
diff --git a/outputs/filter-decision.json b/outputs/reference/filter/filter-decision.json
similarity index 100%
rename from outputs/filter-decision.json
rename to outputs/reference/filter/filter-decision.json
diff --git a/outputs/filter-decision.with-context.json b/outputs/reference/filter/filter-decision.with-context.json
similarity index 100%
rename from outputs/filter-decision.with-context.json
rename to outputs/reference/filter/filter-decision.with-context.json
diff --git a/outputs/result.json b/outputs/reference/summary/result.json
similarity index 100%
rename from outputs/result.json
rename to outputs/reference/summary/result.json
diff --git a/outputs/result.loop.attempt-1.json b/outputs/reference/summary/result.loop.attempt-1.json
similarity index 100%
rename from outputs/result.loop.attempt-1.json
rename to outputs/reference/summary/result.loop.attempt-1.json
diff --git a/outputs/result.loop.attempt-1.raw.txt b/outputs/reference/summary/result.loop.attempt-1.raw.txt
similarity index 100%
rename from outputs/result.loop.attempt-1.raw.txt
rename to outputs/reference/summary/result.loop.attempt-1.raw.txt
diff --git a/outputs/result.loop.attempt-1.validation.json b/outputs/reference/summary/result.loop.attempt-1.validation.json
similarity index 100%
rename from outputs/result.loop.attempt-1.validation.json
rename to outputs/reference/summary/result.loop.attempt-1.validation.json
diff --git a/outputs/result.loop.json b/outputs/reference/summary/result.loop.json
similarity index 100%
rename from outputs/result.loop.json
rename to outputs/reference/summary/result.loop.json
diff --git a/scripts/build_openclaw_delivery.py b/scripts/build_openclaw_delivery.py
new file mode 100644
index 0000000..322ea7f
--- /dev/null
+++ b/scripts/build_openclaw_delivery.py
@@ -0,0 +1,85 @@
+from __future__ import annotations
+
+import argparse
+import json
+import sys
+from datetime import date
+from pathlib import Path
+from typing import Any
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SRC_ROOT = REPO_ROOT / "src"
+OUTPUT_ROOT = REPO_ROOT / "outputs"
+REFERENCE_OUTPUT_ROOT = OUTPUT_ROOT / "reference"
+
+if str(SRC_ROOT) not in sys.path:
+ sys.path.insert(0, str(SRC_ROOT))
+
+from summary_mcp.models import OpenClawCandidateInput, build_openclaw_delivery_payload
+
+
+def _load_json(path: Path) -> dict[str, Any]:
+ return json.loads(path.read_text(encoding="utf-8-sig"))
+
+
+def _save_json(path: Path, payload: dict[str, Any]) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
+
+
+def _collect_input_paths(inputs: list[Path], input_dir: Path | None, pattern: str) -> list[Path]:
+ resolved = list(inputs)
+ if input_dir is not None:
+ resolved.extend(sorted(input_dir.glob(pattern)))
+ seen: set[Path] = set()
+ unique_paths: list[Path] = []
+ for path in resolved:
+ normalized = path.resolve()
+ if normalized in seen:
+ continue
+ seen.add(normalized)
+ unique_paths.append(path)
+ return unique_paths
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(description="Build an OpenClaw batch delivery payload from slim candidate JSON files.")
+ parser.add_argument("--inputs", nargs="*", type=Path, default=[], help="One or more OpenClaw candidate input JSON files")
+ parser.add_argument("--input-dir", type=Path, default=None, help="Directory containing OpenClaw candidate input JSON files")
+ parser.add_argument(
+ "--pattern",
+ type=str,
+ default="*.openclaw-candidate-input.json",
+ help="Glob pattern used together with --input-dir",
+ )
+ parser.add_argument("--run-id", type=str, default=None, help="Optional delivery run id")
+ parser.add_argument("--date", type=str, default=None, help="Optional delivery date in YYYY-MM-DD format")
+ parser.add_argument("--sort-by-rank", action="store_true", help="Sort candidates by digest_rank descending")
+ parser.add_argument(
+ "--output",
+ type=Path,
+ default=REFERENCE_OUTPUT_ROOT / "candidates" / "openclaw-delivery-payload.json",
+ help="Where to save the OpenClaw delivery payload",
+ )
+ args = parser.parse_args()
+
+ input_paths = _collect_input_paths(args.inputs, args.input_dir, args.pattern)
+ if not input_paths:
+ raise SystemExit("No candidate input files found. Pass --inputs or --input-dir.")
+
+ candidates = [OpenClawCandidateInput.model_validate(_load_json(path)) for path in input_paths]
+ if args.sort_by_rank:
+ candidates.sort(key=lambda candidate: candidate.digest_rank, reverse=True)
+
+ payload = build_openclaw_delivery_payload(
+ candidates,
+ run_id=args.run_id,
+ for_date=date.fromisoformat(args.date) if args.date else None,
+ )
+ _save_json(args.output, payload.model_dump(mode="json"))
+ print(f"Saved OpenClaw delivery payload with {len(candidates)} candidates to {args.output}")
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/scripts/pull_freshrss_items.py b/scripts/pull_freshrss_items.py
index 2325f8c..4444e1a 100644
--- a/scripts/pull_freshrss_items.py
+++ b/scripts/pull_freshrss_items.py
@@ -1,4 +1,4 @@
-from __future__ import annotations
+from __future__ import annotations
import argparse
import json
@@ -10,6 +10,8 @@ from typing import Any
REPO_ROOT = Path(__file__).resolve().parents[1]
SRC_ROOT = REPO_ROOT / "src"
+OUTPUT_ROOT = REPO_ROOT / "outputs"
+FRESHRSS_OUTPUT_ROOT = OUTPUT_ROOT / "freshrss"
if str(SRC_ROOT) not in sys.path:
sys.path.insert(0, str(SRC_ROOT))
@@ -46,13 +48,13 @@ def main() -> None:
parser.add_argument(
"--raw-output",
type=Path,
- default=REPO_ROOT / "outputs" / "freshrss.raw.json",
+ default=FRESHRSS_OUTPUT_ROOT / "raw" / "freshrss.raw.json",
help="Where to save the raw FreshRSS response",
)
parser.add_argument(
"--items-output",
type=Path,
- default=REPO_ROOT / "outputs" / "freshrss.items.json",
+ default=FRESHRSS_OUTPUT_ROOT / "items" / "freshrss.items.json",
help="Where to save the mapped item list",
)
parser.add_argument("--timeout", type=float, default=20.0, help="Request timeout in seconds")
@@ -89,4 +91,4 @@ def main() -> None:
if __name__ == "__main__":
- main()
+ main()
\ No newline at end of file
diff --git a/scripts/run_article_candidate.py b/scripts/run_article_candidate.py
new file mode 100644
index 0000000..3189d11
--- /dev/null
+++ b/scripts/run_article_candidate.py
@@ -0,0 +1,124 @@
+from __future__ import annotations
+
+import argparse
+import json
+import sys
+from datetime import UTC, datetime
+from pathlib import Path
+from typing import Any
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+SRC_ROOT = REPO_ROOT / "src"
+OUTPUT_ROOT = REPO_ROOT / "outputs"
+REFERENCE_OUTPUT_ROOT = OUTPUT_ROOT / "reference"
+
+if str(SRC_ROOT) not in sys.path:
+ sys.path.insert(0, str(SRC_ROOT))
+
+from summary_mcp.models.article_candidate import (
+ CandidateMetadata,
+ CandidateSourceRefs,
+ build_article_candidate_record,
+ build_openclaw_candidate_input,
+)
+from summary_mcp.models.document import ExtractedArticle
+from summary_mcp.models.filtering import FilterDecisionResult
+from summary_mcp.models.item import Item
+from summary_mcp.models.llm_result import LlmSummaryResult
+
+
+def _load_json(path: Path) -> dict[str, Any]:
+ return json.loads(path.read_text(encoding="utf-8-sig"))
+
+
+def _save_json(path: Path, payload: dict[str, Any]) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(
+ description="Build an internal ArticleCandidateRecord and a slim OpenClawCandidateInput from pipeline outputs."
+ )
+ parser.add_argument("--summary", type=Path, required=True, help="Structured LLM summary JSON file")
+ parser.add_argument("--extracted", type=Path, required=True, help="Extracted article JSON file")
+ parser.add_argument("--filter", type=Path, required=True, help="Filter decision JSON file")
+ parser.add_argument("--item", type=Path, default=None, help="Optional normalized item JSON file")
+ parser.add_argument(
+ "--section-hint",
+ default=None,
+ choices=[
+ "top_news",
+ "tools_and_workflows",
+ "risk_and_security",
+ "open_source",
+ "insights",
+ "deep_dive",
+ ],
+ help="Optional digest section hint for downstream aggregation",
+ )
+ parser.add_argument(
+ "--rank",
+ type=int,
+ default=None,
+ help="Optional digest rank override. Defaults to filter priority when omitted.",
+ )
+ parser.add_argument(
+ "--rendered-markdown",
+ type=Path,
+ default=None,
+ help="Optional markdown file to embed as rendered_markdown",
+ )
+ parser.add_argument(
+ "--output",
+ dest="record_output",
+ type=Path,
+ default=REFERENCE_OUTPUT_ROOT / "candidates" / "article-candidate-record.json",
+ help="Where to save the internal ArticleCandidateRecord payload",
+ )
+ parser.add_argument(
+ "--openclaw-output",
+ type=Path,
+ default=REFERENCE_OUTPUT_ROOT / "candidates" / "openclaw-candidate-input.json",
+ help="Where to save the slim OpenClawCandidateInput payload",
+ )
+ args = parser.parse_args()
+
+ summary = LlmSummaryResult.model_validate(_load_json(args.summary))
+ extracted_payload = _load_json(args.extracted)
+ article = ExtractedArticle.model_validate(extracted_payload.get("article", extracted_payload))
+ decision = FilterDecisionResult.model_validate(_load_json(args.filter))
+ item = Item.model_validate(_load_json(args.item)) if args.item else None
+ rendered_markdown = args.rendered_markdown.read_text(encoding="utf-8-sig") if args.rendered_markdown else None
+
+ record = build_article_candidate_record(
+ summary=summary,
+ article=article,
+ filter_result=decision,
+ item=item,
+ digest_section_hint=args.section_hint,
+ digest_rank=args.rank,
+ rendered_markdown=rendered_markdown,
+ source_refs=CandidateSourceRefs(
+ item_path=str(args.item) if args.item else None,
+ extracted_path=str(args.extracted),
+ summary_path=str(args.summary),
+ filter_path=str(args.filter),
+ ),
+ metadata=CandidateMetadata(
+ generated_at=datetime.now(tz=UTC),
+ producer="run_article_candidate.py",
+ run_id=datetime.now(tz=UTC).strftime("candidate-%Y%m%d-%H%M%S"),
+ ),
+ )
+ openclaw_input = build_openclaw_candidate_input(record)
+
+ _save_json(args.record_output, record.model_dump(mode="json"))
+ _save_json(args.openclaw_output, openclaw_input.model_dump(mode="json"))
+ print(f"Saved article candidate record to {args.record_output}")
+ print(f"Saved OpenClaw candidate input to {args.openclaw_output}")
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/scripts/run_filter_rules.py b/scripts/run_filter_rules.py
index f49c031..9128ec3 100644
--- a/scripts/run_filter_rules.py
+++ b/scripts/run_filter_rules.py
@@ -1,4 +1,4 @@
-from __future__ import annotations
+from __future__ import annotations
import argparse
import json
@@ -9,6 +9,8 @@ from typing import Any
REPO_ROOT = Path(__file__).resolve().parents[1]
SRC_ROOT = REPO_ROOT / "src"
+OUTPUT_ROOT = REPO_ROOT / "outputs"
+REFERENCE_OUTPUT_ROOT = OUTPUT_ROOT / "reference"
if str(SRC_ROOT) not in sys.path:
sys.path.insert(0, str(SRC_ROOT))
@@ -44,7 +46,7 @@ def main() -> None:
parser.add_argument(
"--output",
type=Path,
- default=REPO_ROOT / "outputs" / "filter-decision.json",
+ default=REFERENCE_OUTPUT_ROOT / "filter" / "filter-decision.json",
help="Where to save the filter decision",
)
args = parser.parse_args()
@@ -73,5 +75,4 @@ def main() -> None:
if __name__ == "__main__":
- main()
-
+ main()
\ No newline at end of file
diff --git a/scripts/run_freshrss_extract.py b/scripts/run_freshrss_extract.py
index 8a9cd56..f336795 100644
--- a/scripts/run_freshrss_extract.py
+++ b/scripts/run_freshrss_extract.py
@@ -1,4 +1,4 @@
-from __future__ import annotations
+from __future__ import annotations
import argparse
import json
@@ -10,6 +10,8 @@ from typing import Any
REPO_ROOT = Path(__file__).resolve().parents[1]
SRC_ROOT = REPO_ROOT / "src"
+OUTPUT_ROOT = REPO_ROOT / "outputs"
+FRESHRSS_OUTPUT_ROOT = OUTPUT_ROOT / "freshrss"
if str(SRC_ROOT) not in sys.path:
sys.path.insert(0, str(SRC_ROOT))
@@ -48,19 +50,19 @@ def main() -> None:
parser.add_argument(
"--raw-output",
type=Path,
- default=REPO_ROOT / "outputs" / "freshrss.raw.json",
+ default=FRESHRSS_OUTPUT_ROOT / "raw" / "freshrss.raw.json",
help="Where to save the raw FreshRSS response",
)
parser.add_argument(
"--items-output",
type=Path,
- default=REPO_ROOT / "outputs" / "freshrss.items.json",
+ default=FRESHRSS_OUTPUT_ROOT / "items" / "freshrss.items.json",
help="Where to save the mapped item list",
)
parser.add_argument(
"--extracted-output",
type=Path,
- default=REPO_ROOT / "outputs" / "freshrss.extracted.json",
+ default=FRESHRSS_OUTPUT_ROOT / "extracted" / "freshrss.extracted.json",
help="Where to save the extraction results",
)
parser.add_argument("--timeout", type=float, default=20.0, help="Request timeout in seconds")
@@ -122,4 +124,4 @@ def main() -> None:
if __name__ == "__main__":
- main()
+ main()
\ No newline at end of file
diff --git a/src/summary_mcp/models/__init__.py b/src/summary_mcp/models/__init__.py
index cd13687..148460d 100644
--- a/src/summary_mcp/models/__init__.py
+++ b/src/summary_mcp/models/__init__.py
@@ -1 +1,55 @@
-"""Shared models for the summary MCP service."""
+"""Shared models for the summary MCP service."""
+
+from .article_candidate import (
+ ArticleCandidate,
+ ArticleCandidateRecord,
+ CandidateMetadata,
+ CandidateSourceRefs,
+ DigestSectionHint,
+ OpenClawCandidateInput,
+ ReviewState,
+ build_article_candidate_record,
+ build_openclaw_candidate_input,
+ candidate_id_for,
+ normalize_candidate_url,
+)
+from .candidate_review import CandidateReviewStatus, KnowledgeDecision, ReviewStatus
+from .daily_digest import (
+ DailyDigest,
+ DailyDigestItem,
+ DailyDigestMetadata,
+ DailyDigestSection,
+ DailyDigestSourceRef,
+ DailyDigestStats,
+)
+from .openclaw_delivery import (
+ OpenClawDeliveryPayload,
+ OpenClawDeliveryStats,
+ build_openclaw_delivery_payload,
+)
+
+__all__ = [
+ "ArticleCandidate",
+ "ArticleCandidateRecord",
+ "CandidateMetadata",
+ "CandidateReviewStatus",
+ "CandidateSourceRefs",
+ "DailyDigest",
+ "DailyDigestItem",
+ "DailyDigestMetadata",
+ "DailyDigestSection",
+ "DailyDigestSourceRef",
+ "DailyDigestStats",
+ "DigestSectionHint",
+ "KnowledgeDecision",
+ "OpenClawCandidateInput",
+ "OpenClawDeliveryPayload",
+ "OpenClawDeliveryStats",
+ "ReviewState",
+ "ReviewStatus",
+ "build_article_candidate_record",
+ "build_openclaw_delivery_payload",
+ "build_openclaw_candidate_input",
+ "candidate_id_for",
+ "normalize_candidate_url",
+]
\ No newline at end of file
diff --git a/src/summary_mcp/models/article_candidate.py b/src/summary_mcp/models/article_candidate.py
new file mode 100644
index 0000000..844d08c
--- /dev/null
+++ b/src/summary_mcp/models/article_candidate.py
@@ -0,0 +1,190 @@
+from __future__ import annotations
+
+from datetime import datetime
+from typing import Literal
+from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
+
+from pydantic import BaseModel, Field, HttpUrl
+
+from .document import ExtractedArticle
+from .filtering import FilterDecision, FilterDecisionResult
+from .item import Item
+from .llm_result import Category, LlmSummaryResult
+
+
+ReviewState = Literal["pending", "accepted", "rejected", "deferred"]
+DigestSectionHint = Literal[
+ "top_news",
+ "tools_and_workflows",
+ "risk_and_security",
+ "open_source",
+ "insights",
+ "deep_dive",
+]
+
+_TRACKING_QUERY_PARAMS = {
+ "fbclid",
+ "gclid",
+ "igshid",
+ "mc_cid",
+ "mc_eid",
+ "mkt_tok",
+ "ref",
+ "ref_src",
+ "si",
+ "spm",
+}
+
+
+class CandidateSourceRefs(BaseModel):
+ item_path: str | None = None
+ extracted_path: str | None = None
+ summary_path: str | None = None
+ filter_path: str | None = None
+
+
+class CandidateMetadata(BaseModel):
+ generated_at: datetime | None = None
+ pipeline_version: str = "v1"
+ producer: str | None = None
+ run_id: str | None = None
+
+
+class ArticleCandidateRecord(BaseModel):
+ candidate_id: str
+ item: Item | None = None
+ article: ExtractedArticle
+ summary: LlmSummaryResult
+ filter_result: FilterDecisionResult
+ digest_section_hint: DigestSectionHint | None = None
+ digest_rank: int = Field(default=50, ge=0, le=100)
+ review_state: ReviewState = "pending"
+ source_refs: CandidateSourceRefs = Field(default_factory=CandidateSourceRefs)
+ rendered_markdown: str | None = None
+ metadata: CandidateMetadata = Field(default_factory=CandidateMetadata)
+
+
+class OpenClawCandidateInput(BaseModel):
+ candidate_id: str
+ title: str
+ url: HttpUrl
+ canonical_url: HttpUrl | None = None
+ published_at: datetime | None = None
+ author: str | None = None
+ source_name: str | None = None
+ language: str | None = None
+ summary: str
+ highlights: list[str] = Field(default_factory=list)
+ keywords: list[str] = Field(default_factory=list)
+ topics: list[str] = Field(default_factory=list)
+ category: Category
+ worth_keeping: bool
+ worth_reason: str
+ selection_decision: FilterDecision
+ selection_reason: str | None = None
+ digest_section_hint: DigestSectionHint | None = None
+ digest_rank: int = Field(default=50, ge=0, le=100)
+
+
+# Backward-compatible alias while the rest of the codebase migrates to the new name.
+ArticleCandidate = ArticleCandidateRecord
+
+
+def normalize_candidate_url(url: str) -> str:
+ parsed = urlparse(url)
+ filtered_query = [
+ (key, value)
+ for key, value in parse_qsl(parsed.query, keep_blank_values=True)
+ if key.lower() not in _TRACKING_QUERY_PARAMS and not key.lower().startswith("utm_")
+ ]
+ normalized = parsed._replace(query=urlencode(filtered_query, doseq=True), fragment="")
+ return urlunparse(normalized)
+
+
+def candidate_id_for(item: Item | None, article: ExtractedArticle) -> str:
+ if item is not None and item.item_id:
+ return f"cand:{item.item_id}"
+ if article.item_id:
+ return f"cand:{article.item_id}"
+ return f"cand:{article.extract_id}"
+
+
+def build_article_candidate_record(
+ *,
+ summary: LlmSummaryResult,
+ article: ExtractedArticle,
+ filter_result: FilterDecisionResult,
+ item: Item | None = None,
+ digest_section_hint: DigestSectionHint | None = None,
+ digest_rank: int | None = None,
+ rendered_markdown: str | None = None,
+ source_refs: CandidateSourceRefs | None = None,
+ metadata: CandidateMetadata | None = None,
+) -> ArticleCandidateRecord:
+ return ArticleCandidateRecord(
+ candidate_id=candidate_id_for(item, article),
+ item=item,
+ article=article,
+ summary=summary,
+ filter_result=filter_result,
+ digest_section_hint=digest_section_hint,
+ digest_rank=digest_rank if digest_rank is not None else filter_result.priority,
+ source_refs=source_refs or CandidateSourceRefs(),
+ rendered_markdown=rendered_markdown,
+ metadata=metadata or CandidateMetadata(),
+ )
+
+
+def _source_name_from_item(item: Item | None, article: ExtractedArticle) -> str | None:
+ if item is not None:
+ metadata = item.metadata if isinstance(item.metadata, dict) else {}
+ origin = metadata.get("origin")
+ if isinstance(origin, dict):
+ origin_title = origin.get("title")
+ if isinstance(origin_title, str) and origin_title.strip():
+ return origin_title.strip()
+
+ for key in ("source_title", "feed_title", "site_name", "source_name"):
+ value = metadata.get(key)
+ if isinstance(value, str) and value.strip():
+ return value.strip()
+
+ candidate_url = str(item.url) if item is not None else str(article.url)
+ hostname = urlparse(candidate_url).netloc
+ return hostname or None
+
+
+def build_openclaw_candidate_input(record: ArticleCandidateRecord) -> OpenClawCandidateInput:
+ item = record.item
+ article = record.article
+ summary = record.summary
+ filter_result = record.filter_result
+
+ title = item.title if item is not None and item.title else summary.title
+ raw_url = str(item.url) if item is not None else str(summary.url)
+ published_at = item.published_at if item is not None else article.published_at
+ author = item.author if item is not None and item.author else article.author
+ language = item.language if item is not None and item.language else article.language
+ selection_reason = filter_result.reasons[0] if filter_result.reasons else None
+
+ return OpenClawCandidateInput(
+ candidate_id=record.candidate_id,
+ title=title,
+ url=raw_url,
+ canonical_url=normalize_candidate_url(raw_url),
+ published_at=published_at,
+ author=author,
+ source_name=_source_name_from_item(item, article),
+ language=language,
+ summary=summary.summary,
+ highlights=summary.highlights,
+ keywords=summary.keywords,
+ topics=summary.topics,
+ category=summary.category,
+ worth_keeping=summary.worth_keeping,
+ worth_reason=summary.reason,
+ selection_decision=filter_result.decision,
+ selection_reason=selection_reason,
+ digest_section_hint=record.digest_section_hint,
+ digest_rank=record.digest_rank,
+ )
\ No newline at end of file
diff --git a/src/summary_mcp/models/candidate_review.py b/src/summary_mcp/models/candidate_review.py
new file mode 100644
index 0000000..9714a4d
--- /dev/null
+++ b/src/summary_mcp/models/candidate_review.py
@@ -0,0 +1,19 @@
+from __future__ import annotations
+
+from datetime import datetime
+from typing import Literal
+
+from pydantic import BaseModel
+
+
+ReviewStatus = Literal["pending", "confirmed", "rejected", "deferred"]
+KnowledgeDecision = Literal["pending", "ingest", "skip"]
+
+
+class CandidateReviewStatus(BaseModel):
+ candidate_id: str
+ review_status: ReviewStatus = "pending"
+ reviewed_at: datetime | None = None
+ review_note: str | None = None
+ knowledge_decision: KnowledgeDecision = "pending"
+ knowledge_note: str | None = None
\ No newline at end of file
diff --git a/src/summary_mcp/models/daily_digest.py b/src/summary_mcp/models/daily_digest.py
new file mode 100644
index 0000000..873c031
--- /dev/null
+++ b/src/summary_mcp/models/daily_digest.py
@@ -0,0 +1,58 @@
+from __future__ import annotations
+
+from datetime import date, datetime
+
+from pydantic import BaseModel, Field, HttpUrl
+
+from .article_candidate import DigestSectionHint
+
+
+class DailyDigestItem(BaseModel):
+ candidate_id: str
+ title: str
+ summary: str | None = None
+ why_it_matters: str
+ action: str | None = None
+
+
+class DailyDigestSection(BaseModel):
+ section_id: DigestSectionHint
+ title: str
+ summary: str
+ items: list[DailyDigestItem] = Field(default_factory=list)
+
+
+class DailyDigestSourceRef(BaseModel):
+ candidate_id: str
+ url: HttpUrl | None = None
+ title: str | None = None
+
+
+class DailyDigestStats(BaseModel):
+ candidate_total: int = Field(default=0, ge=0)
+ kept_total: int = Field(default=0, ge=0)
+ review_total: int = Field(default=0, ge=0)
+ dropped_total: int = Field(default=0, ge=0)
+
+
+class DailyDigestMetadata(BaseModel):
+ generated_at: datetime | None = None
+ producer: str | None = None
+ pipeline_version: str = "v1"
+ run_id: str | None = None
+
+
+class DailyDigest(BaseModel):
+ digest_id: str
+ date: date
+ title: str
+ summary: str
+ sections: list[DailyDigestSection] = Field(default_factory=list)
+ top_items: list[str] = Field(default_factory=list)
+ key_takeaways: list[str] = Field(default_factory=list)
+ watchlist: list[str] = Field(default_factory=list)
+ candidate_ids: list[str] = Field(default_factory=list)
+ source_refs: list[DailyDigestSourceRef] = Field(default_factory=list)
+ editor_notes: str | None = None
+ stats: DailyDigestStats = Field(default_factory=DailyDigestStats)
+ metadata: DailyDigestMetadata = Field(default_factory=DailyDigestMetadata)
diff --git a/src/summary_mcp/models/openclaw_delivery.py b/src/summary_mcp/models/openclaw_delivery.py
new file mode 100644
index 0000000..a49df23
--- /dev/null
+++ b/src/summary_mcp/models/openclaw_delivery.py
@@ -0,0 +1,49 @@
+from __future__ import annotations
+
+from datetime import UTC, date, datetime
+
+from pydantic import BaseModel, Field
+
+from .article_candidate import OpenClawCandidateInput
+
+
+class OpenClawDeliveryStats(BaseModel):
+ total: int = Field(default=0, ge=0)
+ keep_total: int = Field(default=0, ge=0)
+ review_total: int = Field(default=0, ge=0)
+ drop_total: int = Field(default=0, ge=0)
+
+
+class OpenClawDeliveryPayload(BaseModel):
+ schema_version: str = "v1"
+ generated_at: datetime
+ run_id: str
+ date: date
+ candidates: list[OpenClawCandidateInput] = Field(default_factory=list)
+ stats: OpenClawDeliveryStats = Field(default_factory=OpenClawDeliveryStats)
+
+
+def build_openclaw_delivery_payload(
+ candidates: list[OpenClawCandidateInput],
+ *,
+ run_id: str | None = None,
+ for_date: date | None = None,
+) -> OpenClawDeliveryPayload:
+ now = datetime.now(tz=UTC)
+ payload_date = for_date or now.date()
+ resolved_run_id = run_id or now.strftime("openclaw-delivery-%Y%m%d-%H%M%S")
+
+ stats = OpenClawDeliveryStats(
+ total=len(candidates),
+ keep_total=sum(1 for candidate in candidates if candidate.selection_decision == "keep"),
+ review_total=sum(1 for candidate in candidates if candidate.selection_decision == "review"),
+ drop_total=sum(1 for candidate in candidates if candidate.selection_decision == "drop"),
+ )
+ return OpenClawDeliveryPayload(
+ schema_version="v1",
+ generated_at=now,
+ run_id=resolved_run_id,
+ date=payload_date,
+ candidates=candidates,
+ stats=stats,
+ )
\ No newline at end of file