lunheng-article-pipeline 18.78.1 → 18.78.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-es.md +5 -3
- package/README-hi.md +5 -3
- package/README-pt.md +5 -3
- package/README-zh.md +5 -3
- package/README.md +5 -3
- package/SECURITY.md +2 -2
- package/cordis.patch.yml +1 -1
- package/docs/architecture.md +2 -2
- package/docs/installation.md +2 -2
- package/docs/introduction.md +8 -7
- package/docs/troubleshooting.md +1 -1
- package/examples/preset/README.md +1 -1
- package/lib/ethics-sanitize.js +16 -6
- package/lib/guard.js +42 -10
- package/lib/index.js +12 -3
- package/lib/tools.js +9 -1
- package/package.json +1 -1
- package/skills/lunheng-article-pipeline/AGENTS.md +2 -0
- package/skills/lunheng-article-pipeline/QUICKSTART.md +2 -2
- package/skills/lunheng-article-pipeline/README.md +3 -1
- package/skills/lunheng-article-pipeline/SKILL.md +6 -6
- package/skills/lunheng-article-pipeline/references/_shared/DSH-/351/233/206/346/210/220/346/226/271/346/241/210.md +2 -2
- package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm-appendix.md +1 -0
- package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared/audit-checklist-quickref.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared/auto_cite-integration.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared/degraded-scenarios.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared/failure-modes.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared/format-export.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//344/270/255/346/226/207/346/225/260/346/215/256/346/272/220/351/233/206/346/210/220.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//345/244/226/351/203/250/346/243/200/347/264/242/346/272/220/346/216/245/345/205/245/351/235/242.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//345/255/227/346/225/260/345/210/244/345/256/232/350/241/250.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//345/274/225/347/224/250/346/240/274/345/274/217.md +2 -0
- package/skills/lunheng-article-pipeline/references/_shared//346/226/207/347/261/273/346/241/243/346/241/210.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//346/234/237/345/210/212/345/214/271/351/205/215/347/256/227/346/263/225.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//346/234/237/345/210/212/346/225/260/346/215/256/345/272/223.md +2 -2
- package/skills/lunheng-article-pipeline/references/_shared//346/234/272/346/243/200/347/241/254/346/240/274/345/274/217.md +2 -0
- package/skills/lunheng-article-pipeline/references/_shared//346/235/220/346/226/231/346/221/204/345/217/226.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//346/243/200/347/264/242/346/263/250/345/205/245/351/230/262/345/276/241.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//346/250/241/345/236/213/350/267/257/347/224/261.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//350/247/204/350/214/203-/346/234/272/346/242/260/351/227/250/345/257/271/347/205/247/350/241/250.md +1 -1
- package/skills/lunheng-article-pipeline/references/_shared//350/264/237/347/237/245/350/257/206/350/264/246/346/234/254.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/00-/344/270/273/346/216/247-coordinator.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/00-/344/270/273/346/216/247-/346/211/251/345/261/225/350/201/214/350/264/243.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/01-/346/226/207/347/214/256/346/243/200/347/264/242-literature-scout.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/02-/346/225/260/346/215/256/346/243/200/347/264/242-data-scout.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/03-/346/241/210/344/276/213/346/243/200/347/264/242-case-scout.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/04-/345/210/206/346/236/220-analyst.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/05-/345/206/231/344/275/234-writer.md +4 -4
- package/skills/lunheng-article-pipeline/references/agents/06-/346/211/271/345/210/244-critical-companion.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/07-/345/256/241/350/256/241-auditor.md +1 -1
- package/skills/lunheng-article-pipeline/references/agents/08-/347/273/210/346/243/200-finalizer.md +2 -2
- package/skills/lunheng-article-pipeline/references/agents/09-/345/256/241/347/250/277-peer-reviewer.md +1 -1
- package/skills/lunheng-article-pipeline/references/case-studies.md +3 -1
- package/skills/lunheng-article-pipeline/references/checkers//344/270/255/346/226/207AI/347/227/225/350/277/271-checker.md +2 -2
- package/skills/lunheng-article-pipeline/references/checkers//345/217/257/350/257/273/346/200/247-checker.md +5 -2
- package/skills/lunheng-article-pipeline/references/deliverables.md +1 -1
- package/skills/lunheng-article-pipeline/references/dispatch-cards.md +3 -1
- package/skills/lunheng-article-pipeline/references/errors.md +2 -0
- package/skills/lunheng-article-pipeline/references/gates/14-/344/270/255/346/226/207AI/347/227/225/350/277/271-gate.md +1 -1
- package/skills/lunheng-article-pipeline/references/gates//345/217/257/350/257/273/346/200/247/345/211/226/351/235/242-gate.md +6 -4
- package/skills/lunheng-article-pipeline/references/glossary.md +2 -2
- package/skills/lunheng-article-pipeline/references/maintainers.md +20 -20
- package/skills/lunheng-article-pipeline/references/memory/lessons.md +2 -0
- package/skills/lunheng-article-pipeline/references/operations.md +2 -0
- package/skills/lunheng-article-pipeline/references/pipeline-readme.md +3 -5
- package/skills/lunheng-article-pipeline/references/templates/AI-/344/275/277/347/224/250/345/243/260/346/230/216-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/COI-/345/210/251/347/233/212/345/206/262/347/252/201/345/243/260/346/230/216.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/CRediT-/344/275/234/350/200/205/350/264/241/347/214/256/345/243/260/346/230/216.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/G14/346/243/200/346/265/213/346/212/245/345/221/212-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/auto_cite-/350/241/245/345/205/205-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/status-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates/style-baseline-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/270/273/344/272/272/346/212/225/345/226/202/346/270/205/345/215/225-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/270/273/344/272/272/347/241/256/350/256/244-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/272/244/344/273/230/350/257/264/346/230/216-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/273/273/345/212/241/347/256/200/346/212/245-template-lite.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/273/273/345/212/241/347/256/200/346/212/245-template.md +2 -2
- package/skills/lunheng-article-pipeline/references/templates//344/274/246/347/220/206/345/256/241/346/211/271/345/243/260/346/230/216.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//344/277/256/350/256/242/350/257/264/346/230/216-template-full.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//345/261/200/351/231/220/346/200/247-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//346/212/225/347/250/277/345/260/261/347/273/252/346/243/200/346/237/245/350/241/250-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//346/225/260/346/215/256/345/217/257/347/224/250/346/200/247/345/243/260/346/230/216.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//346/250/241/345/236/213/350/267/257/347/224/261/350/241/250-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//347/264/240/346/235/220/345/212/240/350/275/275/346/270/205/345/215/225-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//350/277/233/345/261/225-/344/270/273/344/272/272/347/211/210-template.md +1 -1
- package/skills/lunheng-article-pipeline/references/templates//351/227/270/351/227/250/350/256/260/345/275/225-template.md +1 -1
- package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/content-rules.mjs +15 -4
- package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/docs-version-rules.mjs +26 -0
- package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/repo-surface-rules.mjs +88 -7
- package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/rule-registry.mjs +66 -0
- package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/truth-source.mjs +39 -0
- package/skills/lunheng-article-pipeline/scripts/_lib/mgate-gates/gate-count.mjs +46 -0
- package/skills/lunheng-article-pipeline/scripts/_lib/mgate-gates/mexist-gates.mjs +37 -7
- package/skills/lunheng-article-pipeline/scripts/build-evidence-bundle.mjs +22 -4
- package/skills/lunheng-article-pipeline/scripts/consistency-check.mjs +42 -25
- package/skills/lunheng-article-pipeline/scripts/handoff-check.mjs +6 -0
- package/skills/lunheng-commands/SKILL.md +2 -2
- package/skills/lunheng-commands/scripts/history-cli.mjs +1 -1
- package/skills/lunheng-commands/scripts/stats-cli.mjs +1 -1
package/README-es.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lunheng (lunheng-article-pipeline) — pipeline multiagente para textos largos
|
|
2
2
|
|
|
3
|
-
> 版本:v18.78.
|
|
3
|
+
> 版本:v18.78.2(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
|
|
4
4
|
|
|
5
5
|
> 🌐 [English](README.md) | [中文](README-zh.md) | **Español**(este archivo)| [Português](README-pt.md) | [हिन्दी](README-hi.md)
|
|
6
6
|
|
|
@@ -57,7 +57,9 @@ Fase 3.5 Perspectiva El humano aporta contexto de primera mano (en el circuito)
|
|
|
57
57
|
Fase 3.6 Crítica T6 compañero crítico → informe C1–C7
|
|
58
58
|
Fase 4 Auditoría T7 auditor → informe G0–G14 y lista de revisión
|
|
59
59
|
Fase 4.2 Revisión Redactor + notas de revisión (≤2 rondas, redactor independiente)
|
|
60
|
-
Fase 4.5
|
|
60
|
+
Fase 4.5 Figuras Generación de figuras (SVG) antes de la puerta
|
|
61
|
+
Fase 4.6 Puerta G14 Puerta G14 de huellas de IA (en serie; congela el texto)
|
|
62
|
+
Fase 4.7 Revisión T9 revisión por pares
|
|
61
63
|
Puerta T7.5 Auditoría más reciente + lista P0/P1 + puerta M exit 0 + aislamiento
|
|
62
64
|
Fase 5 Verificación T8 (lo ejecuta el coordinador) → texto final, paquete probatorio, notas de entrega
|
|
63
65
|
```
|
|
@@ -115,7 +117,7 @@ La capa patch hace dos cosas: **inserta una fila para este paquete** (`- id: lun
|
|
|
115
117
|
Las versiones se publican **solo por tag**; `npm publish` local está prohibido (evita las puertas de CI y la procedencia OIDC, y una versión npm nunca se puede sobrescribir).
|
|
116
118
|
|
|
117
119
|
```sh
|
|
118
|
-
git tag v18.78.
|
|
120
|
+
git tag v18.78.2 && git push origin v18.78.2 # un tag por push (GitHub: >3 tags en un push no dispara workflow)
|
|
119
121
|
# publish.yml ejecuta: puerta 1 consistencia → puerta 2 empaquetado → puerta 3 higiene → puerta 4 humo del paquete → tests
|
|
120
122
|
# → tag/versión iguales → guarda de idempotencia → OIDC publish --provenance --tag dsh → auditoría posterior
|
|
121
123
|
```
|
package/README-hi.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# लुन्हेंग (lunheng-article-pipeline) — बहु-एजेंट दीर्घ-लेख पाइपलाइन
|
|
2
2
|
|
|
3
|
-
> 版本:v18.78.
|
|
3
|
+
> 版本:v18.78.2(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
|
|
4
4
|
|
|
5
5
|
> 🌐 [English](README.md) | [中文](README-zh.md) | [Español](README-es.md) | [Português](README-pt.md) | **हिन्दी**(यह फ़ाइल)
|
|
6
6
|
|
|
@@ -57,7 +57,9 @@
|
|
|
57
57
|
चरण 3.6 समालोचना T6 समालोचक साथी → C1–C7 रिपोर्ट
|
|
58
58
|
चरण 4 लेखा-परीक्षा T7 परीक्षक → G0–G14 रिपोर्ट और संशोधन सूची
|
|
59
59
|
चरण 4.2 संशोधन लेखक + संशोधन टिप्पणियाँ (≤2 चक्र, स्वतंत्र लेखक)
|
|
60
|
-
चरण 4.5
|
|
60
|
+
चरण 4.5 चित्र गेट से पहले आकृति निर्माण (SVG)
|
|
61
|
+
चरण 4.6 G14 द्वार G14 AI-चिह्न द्वार (क्रमिक; मुख्य नियंत्रक द्वारा)
|
|
62
|
+
चरण 4.7 समीक्षा T9 सहकर्मी समीक्षा
|
|
61
63
|
द्वार T7.5 नवीनतम परीक्षा + P0/P1 सूची + M-द्वार exit 0 + पृथक्करण
|
|
62
64
|
चरण 5 अंतिम जाँच T8 (समन्वयक द्वारा) → अंतिम पाठ, प्रमाण-पुंज, वितरण टिप्पणियाँ
|
|
63
65
|
```
|
|
@@ -115,7 +117,7 @@ patch परत दो काम करती है: **इस पैकेज
|
|
|
115
117
|
संस्करण **केवल tag से** प्रकाशित होते हैं; स्थानीय `npm publish` वर्जित है (यह CI द्वारों और OIDC provenance को दरकिनार करता है, और npm संस्करण कभी अधिलेखित नहीं हो सकता)।
|
|
116
118
|
|
|
117
119
|
```sh
|
|
118
|
-
git tag v18.78.
|
|
120
|
+
git tag v18.78.2 && git push origin v18.78.2 # एक बार में एक ही tag (GitHub: >3 tag एक push में कोई workflow नहीं चलाता)
|
|
119
121
|
# publish.yml क्रम: द्वार 1 सुसंगति → द्वार 2 पैकेजिंग → द्वार 3 स्वच्छता → द्वार 4 पैकेज स्मोक → स्क्रिप्ट परीक्षण
|
|
120
122
|
# → tag/संस्करण समानता → idempotency गार्ड → OIDC publish --provenance --tag dsh → प्रकाशन-पश्चात लेखा-परीक्षा
|
|
121
123
|
```
|
package/README-pt.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Lunheng (lunheng-article-pipeline) — pipeline multiagente para textos longos
|
|
2
2
|
|
|
3
|
-
> 版本:v18.78.
|
|
3
|
+
> 版本:v18.78.2(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
|
|
4
4
|
|
|
5
5
|
> 🌐 [English](README.md) | [中文](README-zh.md) | [Español](README-es.md) | **Português**(este arquivo)| [हिन्दी](README-hi.md)
|
|
6
6
|
|
|
@@ -57,7 +57,9 @@ Fase 3.5 Perspectiva O humano fornece contexto em primeira mão (no circuito)
|
|
|
57
57
|
Fase 3.6 Crítica T6 companheiro crítico → relatório C1–C7
|
|
58
58
|
Fase 4 Auditoria T7 auditor → relatório G0–G14 e lista de revisão
|
|
59
59
|
Fase 4.2 Revisão Redator + notas de revisão (≤2 rodadas, redator independente)
|
|
60
|
-
Fase 4.5
|
|
60
|
+
Fase 4.5 Figuras Geração de figuras (SVG) antes do portão
|
|
61
|
+
Fase 4.6 Portão G14 Portão G14 de vestígios de IA (em série; congela o texto)
|
|
62
|
+
Fase 4.7 Revisão T9 revisão por pares
|
|
61
63
|
Portão T7.5 Auditoria mais recente + lista P0/P1 + portão M exit 0 + isolamento
|
|
62
64
|
Fase 5 Verificação T8 (executada pelo coordenador) → texto final, pacote probatório, notas de entrega
|
|
63
65
|
```
|
|
@@ -115,7 +117,7 @@ A camada patch faz duas coisas: **insere uma linha para este pacote** (`- id: lu
|
|
|
115
117
|
As versões são publicadas **apenas por tag**; `npm publish` local é proibido (contorna os portões de CI e a proveniência OIDC, e uma versão npm nunca pode ser sobrescrita).
|
|
116
118
|
|
|
117
119
|
```sh
|
|
118
|
-
git tag v18.78.
|
|
120
|
+
git tag v18.78.2 && git push origin v18.78.2 # uma tag por push (GitHub: >3 tags em um push não dispara workflow)
|
|
119
121
|
# publish.yml executa: portão 1 consistência → portão 2 empacotamento → portão 3 higiene → portão 4 teste de fumaça do pacote → testes
|
|
120
122
|
# → tag/versão iguais → guarda de idempotência → OIDC publish --provenance --tag dsh → auditoria posterior
|
|
121
123
|
```
|
package/README-zh.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 [English](README.md) | **中文**(本文件)| [Español](README-es.md) | [Português](README-pt.md) | [हिन्दी](README-hi.md)
|
|
4
4
|
|
|
5
|
-
> 版本:v18.78.
|
|
5
|
+
> 版本:v18.78.2(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
|
|
6
6
|
|
|
7
7
|
> 一个 DeepSeek Harness(DSH)bundle 插件,注册**两个按需加载的 agent 技能**:`lunheng-article-pipeline`(9 角色主流水线)与 `lunheng-commands`(薄壳包装 11 个 `/lunheng-*` 斜杠命令:draft / resume / cite / audit / journal / ppt / history / rollback / status / stats / help;**不引入新角色、不引入新 M 门**,详见 `skills/lunheng-commands/SKILL.md`)。主技能把深度长文的生产——学术论文、行业分析、商业评论、公众号深文——变成**带人在环节点的 9 角色流水线**。
|
|
8
8
|
|
|
@@ -57,7 +57,9 @@ Phase 3.5 洞察补充 主人补充一手语境(人在环)→ 初稿 v2
|
|
|
57
57
|
Phase 3.6 批判 T6 批判伙伴 → C1–C7 报告
|
|
58
58
|
Phase 4 审计 T7 审计员 → G0–G14 审计报告 + 修订任务书
|
|
59
59
|
Phase 4.2 修订 写手修订 + 修订说明(≤2 轮,独立写手)
|
|
60
|
-
Phase 4.5
|
|
60
|
+
Phase 4.5 配图 主控按模板填 SVG 图落盘(在 G14 终闸之前完成)
|
|
61
|
+
Phase 4.6 G14终闸 G14 中文 AI 痕迹闸(v18.75.0 起串行,不再与 T9 并行;Pass 即冻结正文)
|
|
62
|
+
Phase 4.7 审稿 T9 同行评审
|
|
61
63
|
闸门 T7.5 最新审计 + P0/P1 清单 + M 门 exit 0 + 报告隔离
|
|
62
64
|
Phase 5 终检 T8 终检(主控执行)→ 定稿、证据包、交付说明
|
|
63
65
|
```
|
|
@@ -117,7 +119,7 @@ patch 层做两件事:**插入一行本包自注册行**(`- id: lunheng-arti
|
|
|
117
119
|
**只推 tag 发布,禁止本地 `npm publish`**(本地直发会绕过 CI 三道门与 OIDC 来源证明,且 npm 版本不可覆盖)。
|
|
118
120
|
|
|
119
121
|
```sh
|
|
120
|
-
git tag v18.78.
|
|
122
|
+
git tag v18.78.2 && git push origin v18.78.2 # 一次只推 1 个 tag(GitHub:单次 push >3 个 tag 不触发任何 workflow)
|
|
121
123
|
# publish.yml 依次跑:门 1 一致性 → 门 2 打包面 → 门 3 机械卫生 → 门 4 打包产物冒烟 → 脚本回归测试
|
|
122
124
|
# → tag/版本一致校验 → 幂等守卫 → OIDC 发布 --provenance --tag dsh → 发布后审计
|
|
123
125
|
```
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 🌐 **English** (this file) | [中文](README-zh.md) | [Español](README-es.md) | [Português](README-pt.md) | [हिन्दी](README-hi.md)
|
|
4
4
|
|
|
5
|
-
> 版本:v18.78.
|
|
5
|
+
> 版本:v18.78.2(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
|
|
6
6
|
|
|
7
7
|
> A DeepSeek Harness (DSH) bundle that registers **two on-demand agent skills**:
|
|
8
8
|
> - `lunheng-article-pipeline` — the main 9-role pipeline (T1–T9, see below).
|
|
@@ -62,7 +62,9 @@ Phase 3.5 Insight Human supplies first-hand context (in the loop) → draft
|
|
|
62
62
|
Phase 3.6 Critique T6 critical companion → C1–C7 report
|
|
63
63
|
Phase 4 Audit T7 auditor → G0–G14 audit report and revision task list
|
|
64
64
|
Phase 4.2 Revision Writer revision + revision notes (≤2 rounds, independent writer)
|
|
65
|
-
Phase 4.5
|
|
65
|
+
Phase 4.5 Figures Figure generation (SVG) before the gate
|
|
66
|
+
Phase 4.6 G14 gate G14 Chinese AI-trace gate (serial; Pass freezes the body)
|
|
67
|
+
Phase 4.7 Review T9 peer review
|
|
66
68
|
Gate T7.5 Latest audit + P0/P1 list + M-gate exit 0 + report isolation
|
|
67
69
|
Phase 5 Finalize T8 finalizer (run by the coordinator) → final draft, evidence bundle, delivery notes
|
|
68
70
|
```
|
|
@@ -120,7 +122,7 @@ The patch layer does two things: it **inserts one row for this package** (`- id:
|
|
|
120
122
|
Releases are **tag-only**; a local `npm publish` is forbidden (it would bypass the CI gates and OIDC provenance, and a published npm version can never be overwritten).
|
|
121
123
|
|
|
122
124
|
```sh
|
|
123
|
-
git tag v18.78.
|
|
125
|
+
git tag v18.78.2 && git push origin v18.78.2 # push one tag at a time (GitHub: >3 tags in one push triggers no workflow)
|
|
124
126
|
# publish.yml then runs gate 1 consistency → gate 2 packaging surface → gate 3 hygiene → gate 4 pack smoke → script tests
|
|
125
127
|
# → tag/version equality → idempotency guard → OIDC publish --provenance --tag dsh → post-publish audit
|
|
126
128
|
```
|
package/SECURITY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 安全策略(SECURITY)
|
|
2
2
|
|
|
3
|
-
> 版本:v18.78.
|
|
3
|
+
> 版本:v18.78.2(DSH 原生插件)
|
|
4
4
|
|
|
5
5
|
## 上报漏洞
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
| 入口代码 · 人类命令(`lib/commands.js`) | 注册两条人类命令(`ctx.commands.register()`;官方语义:命令 dispatch **不产生模型消息**):<br>① **`/lunheng-status`** —— handler **只读工作区文件**:`<cwd>/run/<项目>/status.md` 与 `进展-主人版.md`,输出截断到 4000 字符。**不写文件、不联网、不派生子进程**。未给项目名时 `readdirSync(<cwd>/run)` 取 `status.md` 最近修改的项目,并把最多 12 个项目名回显到命令输出。<br>② **`/lunheng-stats`** —— handler **派生宿主进程** `spawnSync(process.execPath, [<skillRoot>/scripts/lunheng-stats.mjs, '--run-dir', <run>, ...args])`(与 `tools.js` 的异步沙箱内 spawn 不同:本命令跑在宿主进程、有完整 spawn 权限)。**参数白名单化(v18.16.0;v18.62.4 扩面)**:接受 `--json` 与**受围栏的** `--run-dir <path>` 两个旗标;其它 token 一律拒绝(`/lunheng-stats --something-else` → 错误返回,不派生子进程)。`--run-dir` 的值**必须**落在 `<会话工作区>/run/` 之内(逐个 realpath 后判包含关系,与 `/lunheng-status` 的 `pickProject` 同一套三层收口:词法 → 结构 → 物理),用户无法借此把 spawn 指向工作区之外。`lunheng-stats.mjs` 本身只读 `run/<项目>`,**不写文件、不联网**。stdout 截断到 8000 字符。 |
|
|
25
25
|
| 入口代码 · DSH 新能力接缝监听器(v18.60.1 反哺 v3,主人显式授权;按符号引用:`lib/index.js` 的 `ctx.on(...)` 块,位于 §执行能力边界 末项之后;H5 已按 v18.62.1 全量审计 P1-1 移除) | **H2 伦理脱敏监听器**(`ctx.on('tools/post-execute', listener)`,**3 参 `(exec, result, next)`**):监听**材料类工具**(`read` / `web_*` / `subagent*`)的 result,自动调 `lib/ethics-sanitize.js` 的 `sanitize()`(basic 模式,`maxChars: MAX_SAFE_INTEGER`)。**载体(v18.76.0 · v18.75.1 全量架构审计 R1 修复)**:命中摘要写成**一行标记**、经 `decision.additionalContexts` 送达下一轮上下文(宿主 `tools/post-execute` **唯一采纳**的插件副通道);`reviewFlags` / `ethicsSanitized` 只挂在**返回值**上、供更晚注册的同进程监听器读取——**不写 `result`**(真宿主交给监听器的 result 是深冻对象,结果随后还要过字段白名单投影,写 `result.*` **必然静默失效**;证据见 `audits/核实报告-v18.75.1-全量架构审计-2026-10-04.md` §2)。**默认不改写工具结果正文**(v18.62.5 定默认值)——避免误伤「时间戳」「订单 ID」「银行卡模式数字」等被硬模式误判的合法文本;**改写为 opt-in**(`Config.hookRewriteContent: true`,走 `decision.content`,默认 `false`);v18.62.4 及更早版本是默认改写,已被审计为 P0-2(见 v18.62.4 全量审计-性能与安全报告 §P0-2)。标记文本**只含计数与类别**,不含原文(避免把 PII 写进会话日志)。**读面**:监听器读 result.content 块数组、读三个随包词表 (`references/dicts/*.txt`);**子进程派生**:**零**(纯函数);**写盘**:**零**(守住 v18.60.0 ethics_sanitize「只读」承诺)。失败只降级 warn,不影响技能。**H5 refresh-gates HMR 联动(已移除)**:原 `ctx.on('file-watcher:change', listener)` 已在 v18.62.1 全量审计 P1-1 删除(宿主无该事件派发方,死监听器);refresh-gates 仍是幂等脚本、可手动跑。 |
|
|
26
26
|
| 入口代码 · v18.61.0 反哺 v4 监听器(主人显式授权;原三个,**H3 与 H7 均已移除**——H3 按 v18.62.1 全量审计 P1-1、H7 按 v18.75.1 全量架构审计 R2;按符号引用:`lib/index.js` §执行能力边界末项之后的 `ctx.on(...)` 块) | **H3 G14 启发式预筛监听器(已移除)**:原 `ctx.on('assistant/chunk', listener)` 已在 v18.62.1 全量审计 P1-1 删除(`assistant/chunk` 是 session 日志事件、无 ctx 派发方,监听器永不触发);G14 中文 AI 痕迹检测由 G14 终闸(v2.4.0 + v18.2.8 三层防御第 3 层 LLM 推理判定)完整覆盖。**H4 system-prompt/assemble 钩子**(`ctx.on('system-prompt/assemble', listener)`,**3 参 `(assembly, context, next)`**):监听 prompt 装配 → `await next()` 后向 `sections` **只追加不覆盖** dsh 默认 prompt(附加「论衡技能加载中」提示段 + **每次装配现读**的版本号,v18.76.0 起不再用 apply 期快照——原地升级也能看到真实版本)。**读面**:listener 读装配结果对象 + 向下游追加 sections 项;**子进程派生**:**零**;**写盘**:**零**(仅修改返回的装配结果对象)。失败只降级为返回下游结果原样。**H7 agent/request waterfall 模型路由(已移除 —— v18.76.0 · v18.75.1 全量架构审计 R2)**:原 `ctx.on('agent/request', listener)` 读 `request.toolName` 判三档,但该事件 payload **只有 `{turn, step, signal}`**(宿主 `dsh-agent-loop` 的派发点)→ 判别键恒 `undefined` → **每次请求空转**,属「派发方存在但判别键缺失」的死监听器,且挂在每个模型请求的 waterfall 上。分档路由改由 `examples/preset/agent-tiered/cordis.yml` 的 `agentOptions` 单独承载(**加载期**求值,改 env 后**需重载插件行**);「改 env 不重启即切模型」的旧承诺已撤下。**删除后本包不再注册 `agent/request` 监听器。**
|
|
27
|
-
| 可调参数(`export const Config`,v18.2.6 起) | 入口导出 standard-schema 形态的 `Config`(**零宿主依赖**——刻意不 import `@deepseek-ai/schemastery`,见 `lib/index.js` 头注释)。**七个开关**:`allowMechanismEdit`(等价 `LUNHENG_ALLOW_MECH_EDIT=1`)、`quiet`(等价 `LUNHENG_QUIET=1`,只静音 info 级状态行,warn **永不**静音)、`scriptTimeoutMs`、`scriptMaxOutputBytes`、`handoffLevel`(枚举 `basic` / `strict`,默认 `basic`;交接门灰度——`basic` 只验存在/非空/回报六要素,`strict` 加结构/版本/成对/agents-log)、`hookRewriteContent`(v18.62.5 全量审计-性能与安全 P0-2 定默认值;v18.76.0 · R1 改**载体**:默认关闭 = 只产出一行标记经 `decision.additionalContexts` 送达,**不建议**改写——改写会误伤时间戳/订单 ID 等被硬模式误判的合法文本,且改写走 `decision.content` 替换工具结果正文)、`hookMaxBlockChars`(v18.62.5 P2-2 修复:H2 监听器对单个 text 块的脱敏上限,默认 `262144` = 256 KB;超此大小的块**跳过改写**仅注入 `too-large-for-hook` 标记,避免在不可控体积上同步占用「原文 + 脱敏副本」两份内存——超限内容用 `lunheng_ethics_sanitize` 工具分页处理)。**只有前两键有 env 等价物**:`scriptTimeoutMs` / `scriptMaxOutputBytes` / `handoffLevel` / `hookRewriteContent` / `hookMaxBlockChars` 五者**仅 Config,无 env 路径**(v18.18.1 更正:本行长期写「四个开关」漏 `handoffLevel`;同批对外文档另有一处把 `handoffLevel` 误称为存在 `LUNHENG_HANDOFF_LEVEL` env
|
|
27
|
+
| 可调参数(`export const Config`,v18.2.6 起) | 入口导出 standard-schema 形态的 `Config`(**零宿主依赖**——刻意不 import `@deepseek-ai/schemastery`,见 `lib/index.js` 头注释)。**七个开关**:`allowMechanismEdit`(等价 `LUNHENG_ALLOW_MECH_EDIT=1`)、`quiet`(等价 `LUNHENG_QUIET=1`,只静音 info 级状态行,warn **永不**静音)、`scriptTimeoutMs`、`scriptMaxOutputBytes`、`handoffLevel`(枚举 `basic` / `strict`,默认 `basic`;交接门灰度——`basic` 只验存在/非空/回报六要素,`strict` 加结构/版本/成对/agents-log)、`hookRewriteContent`(v18.62.5 全量审计-性能与安全 P0-2 定默认值;v18.76.0 · R1 改**载体**:默认关闭 = 只产出一行标记经 `decision.additionalContexts` 送达,**不建议**改写——改写会误伤时间戳/订单 ID 等被硬模式误判的合法文本,且改写走 `decision.content` 替换工具结果正文)、`hookMaxBlockChars`(v18.62.5 P2-2 修复:H2 监听器对单个 text 块的脱敏上限,默认 `262144` = 256 KB;超此大小的块**跳过改写**仅注入 `too-large-for-hook` 标记,避免在不可控体积上同步占用「原文 + 脱敏副本」两份内存——超限内容用 `lunheng_ethics_sanitize` 工具分页处理)。**只有前两键有 env 等价物**:`scriptTimeoutMs` / `scriptMaxOutputBytes` / `handoffLevel` / `hookRewriteContent` / `hookMaxBlockChars` 五者**仅 Config,无 env 路径**(v18.18.1 更正:本行长期写「四个开关」漏 `handoffLevel`;同批对外文档另有一处把 `handoffLevel` 误称为存在 `LUNHENG_HANDOFF_LEVEL` env 镜像,一并更正——**`lib/` 入口面(插件运行期)的 env 读取点共四处**:`LUNHENG_QUIET` 与 `LUNHENG_ALLOW_MECH_EDIT`(均在 `lib/index.js`),以及 `DSH_HOME` 与 `AGENTS_HOME`(`lib/guard.js` 的 `mirrorRoots()`)。**后两者是安全相关面**:它们被用来把「同名技能的用户级落点」并入受保护根(rank 400 / 500),即 `$DSH_HOME/skills/<技能名>` 与 `$AGENTS_HOME/skills/<技能名>`——设了它,guard 的**受保护根集合会变大**;未设则按「不登记」处理(环境变量为空时该分支整体不执行,该落点不会被加进受保护根)。**口径边界(v18.78.1 全量审计 · 批 5 更正)**:本句原写「全库 env 读取点只有 …两处」,按实测(`Select-String -Path lib/*.js -Pattern 'process\.env\.'`)**漏列了 guard 的两处**,且「全库」一词过宽——`cordis.patch.yml` 另有 3 处 `disabled:` 行级门控读 `LUNHENG_TIERING` 与三档 `*_PROVIDER` / `*_MODEL`(**加载期**求值,见下方「加载期执行」行),随包与仓库脚本另读 `GITHUB_ACTIONS` / `DSH_HOME` / `RUN_DIR` 等(不属「插件入口面」这一口径)。**非法配置在加载期响亮失败**(Cordis 抛 ValidationError),不会静默回落到默认值;`--dump-config` 可见。env 是**操作者开关**,Config 是**部署开关**(profile 补丁)。 |
|
|
28
28
|
| 加载期执行 | `cordis.patch.yml` 含 **6 处 `!!js` 表达式** = **3 处 `disabled:`(三段分档工具行的行级门控,读 `LUNHENG_TIERING` 与三档 `*_PROVIDER` / `*_MODEL`)** + **3 处 `agentOptions:`(各自读本档 `LUNHENG_<档>_PROVIDER` / `_MODEL`,未设则返回 `undefined`)**。计数口径:`^\s*[A-Za-z]+:\s*!!js` 的 YAML 值行(`Select-String cordis.patch.yml -Pattern '^\s*[A-Za-z]+:\s*!!js'` → 6 行)。它们由 DSH 宿主进程在**加载期以完整 Node 权限**求值(`disabled` 由 loader 的 `disabledOf()` 求值,`@deepseek-ai/cordis-plugin-loader/src/config/entry.ts:104-107`),**发生在 agent 沙箱与审批关卡之前**——安装本包即等于允许这些表达式在每次启动时执行。(v18.2.6 更正:旧版本节与 patch 注释只写「3 处」,**漏算 3 处 `disabled`**,等于把加载期执行面**少报一半**。)另:v18.2.6 起三段分档行改为「**默认不装载**」——未设任何 `LUNHENG_*` 时三行不挂载(不再每会话白付 3 份与内置 `subagent` 同义的工具 schema)。 |
|
|
29
29
|
| 允许的表达式内容 | 仅 `process.env.*` 与全局 `Object.assign`。(v18.0.0 起技能目录不再由 patch 求值挂载,故 `baseUrl` / `URL` / `decodeURIComponent` / `process.platform` 已不再需要——表达式面比 v17.0.0 **更窄**。) |
|
|
30
30
|
| 禁止的表达式内容(CI 红线,`consistency-check.mjs` 规则 ⑭) | `getBuiltinModule` / `child_process` / `require(` / `import(` / `eval(` / `new Function` / `node:` / `fs.` |
|
package/cordis.patch.yml
CHANGED
package/docs/architecture.md
CHANGED
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
## 审计 G0-G14 + M 门
|
|
29
29
|
|
|
30
|
-
G0 覆盖度 / G0.5 视角一致性 / G1 分级核验(C 级 100% web_search 实测)/ G2 数据溯源 / G2.5 案例核验 / G3 逻辑 / G4 格式 / G4-2 文末四节 / G5 规范 / G6 论据自标 / G7 原创性 / G8 成品度 / G9 时序 / G10 一致性 / G11 时效 / G12 信任级别一致性 / G13 AI 使用披露 / G14 中文 AI 痕迹闸(8
|
|
30
|
+
G0 覆盖度 / G0.5 视角一致性 / G1 分级核验(C 级 100% web_search 实测)/ G2 数据溯源 / G2.5 案例核验 / G3 逻辑 / G4 格式 / G4-2 文末四节 / G5 规范 / G6 论据自标 / G7 原创性 / G8 成品度 / G9 时序 / G10 一致性 / G11 时效 / G12 信任级别一致性 / G13 AI 使用披露 / G14 中文 AI 痕迹闸(8 类检测维度;Phase 4.6 串行)。
|
|
31
31
|
|
|
32
|
-
终检前主控跑 **M 门**(`references/_shared/M-Gate-Algorithm.md
|
|
32
|
+
终检前主控跑 **M 门**(`references/_shared/M-Gate-Algorithm.md`):**总 25 项 = 机检 24 项(M-Form 11 项 + M-Exist 11 项 + M-Integrity-1 + M-Fact-1)+ 人工 1 项(M-Integrity-2)**,LLM 兜底执行,产出 `final/M-Gate-Report.json`,exit 0 才交付。
|
|
33
33
|
|
|
34
34
|
## 原创性保证
|
|
35
35
|
|
package/docs/installation.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# ⚠️ **务必钉版本**:不写 `@<版本>` 时,装到哪个版本取决于本机包管理器**当时**的解析状态。
|
|
10
10
|
# 实测过一次:同一条命令装到 **18.15.0**,而 registry 上的 `latest` 已是 18.20.4 —— 差了五个小版本,
|
|
11
11
|
# 且按下面流程走下去**没有任何一步能让人察觉**。版本真源只有一处:`npm view lunheng-article-pipeline version`。
|
|
12
|
-
dsh plugin --profile <profile> add lunheng-article-pipeline@18.78.
|
|
12
|
+
dsh plugin --profile <profile> add lunheng-article-pipeline@18.78.2
|
|
13
13
|
|
|
14
14
|
# 1b) **核对装到的版本**(钉了版本也值得跑一次——它读的是 profile 里**实际落盘**的 package.json)
|
|
15
15
|
node -e "console.log(require('<DSH_HOME>/profiles/<profile>/node_modules/lunheng-article-pipeline/package.json').version)"
|
|
@@ -90,7 +90,7 @@ dsh --profile <profile>
|
|
|
90
90
|
|
|
91
91
|
- 不设任何 `LUNHENG_*`:三档行**不装载**,派发用内置 `subagent`(继承会话模型,安全默认);设了 `off` 同样不装载。
|
|
92
92
|
- 模型在挂载期用 `!!js` 求值一次,改环境变量后**必须重启 dsh** 才生效。
|
|
93
|
-
- **v2.5.2-dsh.4
|
|
93
|
+
- **v2.5.2-dsh.4 修订:两个字段各自独立**(`cordis.patch.yml` 三行 `agentOptions` 只做 `Object.assign({}, p ? {provider:p} : {}, m ? {model:m} : {})`)——**只设 PROVIDER = 只换 provider,模型仍继承父会话**;只设 MODEL 同理只换模型。**实现里不存在「档位默认模型」**(未设即无 `model` 键;`references/_shared/模型路由.md` 明禁写死厂商默认值)——任何模型配置都能安全装预设。
|
|
94
94
|
- provider 名须是你 dsh 已注册的 LLM provider(查 `settings.yaml` 的 `agent-default-model.provider`)。
|
|
95
95
|
- 完整说明见 `examples/preset/README.md`。
|
|
96
96
|
|
package/docs/introduction.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **论衡(lunheng-article-pipeline)** 是一个多 Agent 深度长文生产流水线,DeepSeek Harness(dsh)bundle 插件。它不是让一个 AI 直接写文章,而是让一支 **9 个 AI 角色组成的"论文生产小队"** 按既定协议协作:定题 → 三线并行检索 → 分析 → 写作 → 批判 → 审计 → 审稿 → 终检。每一步都有明确产出物、交接报告与质量闸门,最终交付**有证据底座、有反方论证、有独立审计、有人工核验节点**的文章。
|
|
4
4
|
|
|
5
|
-
> 适用:公众号深度长文、研究报告、学术论文、商业评论、行业分析——任何"要站得住脚"的长内容。当前版本 **v18.78.
|
|
5
|
+
> 适用:公众号深度长文、研究报告、学术论文、商业评论、行业分析——任何"要站得住脚"的长内容。当前版本 **v18.78.2**(DSH 独立版本)。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
└─ T8 终检(主控亲完成)── M 门(机检 24 项 + 人工 1 项 = 总 25 项)+ 定稿 + 证据包 + 交付说明
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
> **v2.3.0 角色编号重构 + v2.4.0 加 T9**:编号 = 流水线 Phase 顺序——T1-T3 检索 / T4-T5 加工 / T6-T9 防御。T8 终检**有角色卡**(`references/agents/08-终检-finalizer.md`),但**执行者 = 主控本人、不 spawn 子代理**——确保「最后一关」不外包;T9
|
|
40
|
+
> **v2.3.0 角色编号重构 + v2.4.0 加 T9**:编号 = 流水线 Phase 顺序——T1-T3 检索 / T4-T5 加工 / T6-T9 防御。T8 终检**有角色卡**(`references/agents/08-终检-finalizer.md`),但**执行者 = 主控本人、不 spawn 子代理**——确保「最后一关」不外包;T9 同行评审是投稿前的「预演审稿人」,**启用与否按 `references/_shared/文类档案.md`**(`academic-cn/-hum/-case` 必选不可关、`lit-review` 可选、**其余默认不选**)。
|
|
41
41
|
|
|
42
42
|
**六个主阶段(Phase 0–5,各自带子阶段)**:**Phase 0 定题 → Phase 1 并行检索(含 1.5 补检索)→ Phase 2 分析(含 2.5 大纲确认)→ Phase 3 写作(含 3.5 洞察补充、3.6 批判)→ Phase 4 审计(含 4.2 修订回环:**A 轨 ≤2 轮纠错 + B 轨至多 +1 深化 + G 环 1-2 轮**(v18.75.0 新立,G14 终闸 Warning/Fail 的修订独立记账、不占 B 轨;详见 `references/glossary.md` §修订回环三环制);4.5 配图 → 4.6 G14 终闸(串行)→ 4.7 审稿)→ Phase 5 终检**(v18.75.0:T8 在 T9 之后),中间穿插 **T2.5 / T7.5 两道完整性门**(主控 checkpoint,不绕过交接直接派发)与 **4 个人在环节点**(定题 / 大纲 / 洞察补充 / 终稿)。
|
|
43
43
|
|
|
@@ -69,7 +69,7 @@ Phase 1 一次性并行派出 **T1 文献 ∥ T2 数据 ∥ T3 案例** 三个
|
|
|
69
69
|
|
|
70
70
|
审计打回 → **独立写手**修订(主控不代笔)→ 复核,**最多 2 轮**(指审计阶段独立预算;前序的 v1→v2 主人洞察、v2→v3 批判反馈不计入),仍不过走 Acknowledged Limitations 模式诚实交付。事实类错误(P1-D)由主控 T8 亲修慢活快改,结构性错误(P1-A/B/C)必须重启独立写手。
|
|
71
71
|
|
|
72
|
-
终检前主控跑 **M 门**——LLM 兜底执行的机械化终检:**机检 24 项**逐项机械判定(M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 佐证;另有 1 项主控人工门 M-Integrity-2,合计 **总 25 项**),由 `node scripts/m-gate-check.mjs` 执行(v2.5.2-dsh.0 起统一为单文件算法;**数量的唯一真源 = `SKILL.md` 与 `references/_shared/M-Gate-Algorithm.md`**):
|
|
72
|
+
终检前主控跑 **M 门**——LLM 兜底执行的机械化终检:**机检 24 项**逐项机械判定(M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 + M-Fact-1 佐证;另有 1 项主控人工门 M-Integrity-2,合计 **总 25 项**),由 `node scripts/m-gate-check.mjs` 执行(v2.5.2-dsh.0 起统一为单文件算法;**数量的唯一真源 = `SKILL.md` 与 `references/_shared/M-Gate-Algorithm.md`**):
|
|
73
73
|
|
|
74
74
|
- **M-Form 11 项**:引用标注完整性 / 文末四节存在性 / 临时编号残留 / 角色元数据泄露 / 过程语言残留 / 信任级别标注完整性 / 文末节标题白名单纯净 / 三角验证覆盖率 / **图件闭环([图N] ↔ final/图件/ ↔ 图上数字,v2.5.2-dsh.16 加)** / **索引段完整性(索引 ↔ 正文条目,v2.5.2-dsh.17 加)** / **素材按需加载闭环(正文引用 ⊆ 加载留痕,v2.5.2-dsh.17 加)**;
|
|
75
75
|
- **M-Exist 11 项**:文末四节双向 diff / 证据包文件完整性 / 信任级别一致性 / **审计条目闭环(P0/P1 任务书 ↔ 复核报告,v2.5.2-dsh.17 加)** / **阶段闸门记录表(T2.5/T7.5 表单,v2.5.2-dsh.17 加)** / **审稿报告与期刊匹配可复算(v2.5.2-dsh.17 加)** / **交付说明 12 固定字段齐备(v2.5.2-dsh.17 加)** / **批判报告覆盖 C1-C7(v2.5.2-dsh.17 加)** / **审计报告覆盖 G0-G14 且结论带实据(v2.5.2-dsh.17 加)** / **大纲 §11 精简段六要素(v2.5.2-dsh.17 加)**;
|
|
@@ -91,12 +91,12 @@ Phase 1 一次性并行派出 **T1 文献 ∥ T2 数据 ∥ T3 案例** 三个
|
|
|
91
91
|
|
|
92
92
|
- **v2.3.0 角色编号重构**:T3 案例检索归入三线并行,T8 终检由主控亲完成——编号 = Phase 顺序,流水线语义对齐。
|
|
93
93
|
- **T6 批判伙伴 C1-C7**:写手出稿后、审计前,独立角色从反方攻击论证——C1 核心论点可攻击性 / C2 论证链薄弱环(含**因果断面三问**)/ C3 理论假设审查 / C4 立场中立性 / C5 反方完整性 / C6 元叙事清理专项(抓"AI 味")/ C7 一处两用识别。"不是 adversarial,是 critical companion"。
|
|
94
|
-
- **T9 同行评审(v2.4.0 加)**:投稿前的「预演审稿人」——6 维度评分(原创性/方法论/证据强度/论证结构/写作质量/引文规范,总分 30)→ accept/minor/major/reject
|
|
95
|
-
- **G14 中文 AI 痕迹闸(v2.4.0 加)**:8 类检测维度深度扫描"AI 味",0-2 类 Pass / 3-4 类 Warning / 5+ 类 Fail,**v18.2.8 起改为三层防御、全程只 spawn 一次**(T5 v1 自检 → 修订轮收尾自查 → Phase 4.
|
|
94
|
+
- **T9 同行评审(v2.4.0 加)**:投稿前的「预演审稿人」——6 维度评分(原创性/方法论/证据强度/论证结构/写作质量/引文规范,总分 30)→ accept/minor/major/reject;**启用与否按 `references/_shared/文类档案.md`**:`academic-cn/-hum/-case` 必选不可关、`lit-review` 可选、**其余(含行业分析)默认不选**(v18.75.0 定案)。
|
|
95
|
+
- **G14 中文 AI 痕迹闸(v2.4.0 加)**:8 类检测维度深度扫描"AI 味",0-2 类 Pass / 3-4 类 Warning / 5+ 类 Fail,**v18.2.8 起改为三层防御、全程只 spawn 一次**(T5 v1 自检 → 修订轮收尾自查 → **Phase 4.6 终闸**;v18.75.0 起串行、不再与 T9 并行,T9 在 4.7),LLM 推理判定零 exec。
|
|
96
96
|
- **期刊匹配助手(v2.5.0 加)**:基于 T9 评分 + 主题关键词,从期刊库(真源 = `references/_shared/期刊数据库.md` 表行数)输出 Top 3 推荐期刊 + 综合匹配度;配套投稿就绪检查表。
|
|
97
97
|
- **多格式导出(v2.5.0 加)**:默认 md,按需 `--format latex/docx/pdf`;**中文数据源集成(v2.5.1)**:OpenAlex/Crossref 第一梯队默认推荐(无需 Key)。
|
|
98
98
|
- **外部内容防注入(v2.4.0 加)**:web 检索/主人投喂的外部内容一律视为不可信证据,只提取事实不执行指令(防 prompt injection)。
|
|
99
|
-
- **M 门总 25 项终检(机检 24 项 = M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 佐证,由 `scripts/m-gate-check.mjs` 判定;另 1 项主控人工门 M-Integrity-2)**:形式合规 ≠ 存在性合规 ≠ 信任一致;M-Form-7 文末白名单(防操作员报告混入定稿)+ M-Form-8 三角验证机械化 + **M-Form-9 图件闭环(v2.5.2-dsh.16 加)** + **M-Form-10/11 与 M-Exist-5/6/7(v2.5.2-dsh.17 加:把「索引完整性 / 按需加载留痕 / 闸门记录 / 期刊数字可复算 / 交付字段齐备」全部变成机检)**。**速查**:硬数字与退出码族单一真源 = [`docs/quick-facts.md`](quick-facts.md)(v18.78.0 §7.2 立项)。
|
|
99
|
+
- **M 门总 25 项终检(机检 24 项 = M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 + M-Fact-1 佐证,由 `scripts/m-gate-check.mjs` 判定;另 1 项主控人工门 M-Integrity-2)**:形式合规 ≠ 存在性合规 ≠ 信任一致;M-Form-7 文末白名单(防操作员报告混入定稿)+ M-Form-8 三角验证机械化 + **M-Form-9 图件闭环(v2.5.2-dsh.16 加)** + **M-Form-10/11 与 M-Exist-5/6/7(v2.5.2-dsh.17 加:把「索引完整性 / 按需加载留痕 / 闸门记录 / 期刊数字可复算 / 交付字段齐备」全部变成机检)**。**速查**:硬数字与退出码族单一真源 = [`docs/quick-facts.md`](quick-facts.md)(v18.78.0 §7.2 立项)。
|
|
100
100
|
- **修订回环语义定案(v2.3.7-dsh.8)→ 三环制(v18.75.0 新立 G 环,v18.77.0 P-4 命名统一)**:≤2 轮是**审计阶段独立预算**(A 轨),不吞掉主人洞察轮(v2)与批判反馈轮(v3,主控触发轮 = B 轨至多 +1 深化);**G 环(v18.75.0 新立,独立额度、不占 B 轨)**——G14 终闸 Warning/Fail 触发:3-4 类 → 1 轮 / 5+ 类 → 2 轮,主控裁定,收敛条件 = 重跑 G14 至 Pass;第 2 轮仍 Fail → 报告主人手工润色,不得以 Acknowledged Limitations 放行。修订轮强制独立写手、主控不代笔(P1-D 事实类除外,T8 亲修)。**术语指针(v18.78.0 §7.4 统一落地)**:三环制 A 轨 / B 轨 / G 环命名单一真源 = `references/glossary.md` §十二.1(与 §十二.2「修订回环命名」行同源)。
|
|
101
101
|
- **反哺机制**:每单跑完 T7 自动产反哺报告沉淀可复用规则,主人批准后 merge 回角色卡——插件本身持续进化(如"回顾报道年份必交叉核验"规则就来自实战教训)。
|
|
102
102
|
|
|
@@ -170,6 +170,7 @@ dsh plugin --profile web add lunheng-article-pipeline
|
|
|
170
170
|
|
|
171
171
|
| 版本 | 内容 |
|
|
172
172
|
|---|---|
|
|
173
|
+
| **v18.78.1** | **论衡插件文档全量审计-v18.78.0 落地批**(主人 2026-10-06 授权「依次全部修订」):14 处 P-问题(P0×3 + P1×5 + P2×2 + P3×3)全部修订 + 30 处版本点位同步;M 门口径统一「机检 24 项 + 人工 1 项 = 总 25 项」;新增一致性规则 ㉜(CHANGELOG 新段 ↔ 本节 §实战验证段对账)+ 速查卡 `docs/quick-facts.md` |
|
|
173
174
|
| **v18.78.0** | 反哺报告核实批(先核实、后落地):新增 1 条机检判据(M-Form-11 ④ 已跳过 ∩ 引用)、改正 1 条复算公式(M-Exist-6 期刊匹配公式四项式)、扩 1 条分片发现(`sources-index`),**30 条中 12 条成立落地/18 条驳回**(含 F4/F21 实据与产物相反的驳回);`audits/论衡插件文档全量审计-v18.78.0.md` 留 14 处 P-问题记录 |
|
|
174
175
|
| **v18.77.1** | 维护性微调 + 字数渲染链路对齐;与 v18.78.0 同批合发(CHANGELOG §18.78.0 段详述) |
|
|
175
176
|
| **v18.77.0** | **文档与运行-审计 v1 批落地批**(合并 v18.76.0 全量架构审计修订批):13 处 P-* 收口——P-2 [🔴] T8 终检职责边界 + 主控亲跑四条路径 / P-3 [🔴] T9 `academic-*` 通配 → `academic-cn/-hum/-case` 特指(与 `_shared/文类档案.md` 表 1:1 对齐)/ P-4 [🟠] 修订回环三环制命名(全库禁用 'A/B/C 三类' / '0/1/2/超 2 轮' 替代命名)/ P-6 [🟠] M 门 25 项拆分表述 / P-7 [🟠] Phase 4.5 / 4.6 / 4.7 三套描述 / P-9 [🟡] T9 三视角决策树 / P-11 [🟡] 工具面"分档预设"三处复述 / P-12 [🟡] 派发话术格式硬约束同步 + 一致性规则 ㉛ 新增;五语 README 句式瘦身 |
|
|
@@ -205,7 +206,7 @@ dsh plugin --profile web add lunheng-article-pipeline
|
|
|
205
206
|
## 获取方式
|
|
206
207
|
|
|
207
208
|
- **GitHub(DSH bundle)**:https://github.com/zuoyunlai/lunheng-article-pipeline-dsh
|
|
208
|
-
- **npm**:`lunheng-article-pipeline@dsh`(dist-tag `dsh` = 最新 DSH 迭代版);锁定具体版本可写 `@18.78.
|
|
209
|
+
- **npm**:`lunheng-article-pipeline@dsh`(dist-tag `dsh` = 最新 DSH 迭代版);锁定具体版本可写 `@18.78.2`
|
|
209
210
|
- **历史版本线(独立化前)**:https://github.com/zuoyunlai/lunheng-article-pipeline
|
|
210
211
|
|
|
211
212
|
---
|
package/docs/troubleshooting.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 故障排查(troubleshooting)
|
|
2
2
|
|
|
3
|
-
> 版本:v18.78.
|
|
3
|
+
> 版本:v18.78.2(DSH 原生插件;发布日期见 CHANGELOG 对应版本段——**此处刻意不写死日期**。v18.62.4 更正:旧文写「发布于 2026-09-25」而该版本段实际为 2026-10-01,且日期点位无任何机检覆盖)
|
|
4
4
|
|
|
5
5
|
安装/验证失败时按「症状 → 原因 → 处置」对照。
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
```sh
|
|
18
18
|
# 1. 在 profile 里声明 bundle 依赖(DSH 读 dsh.bundle.patch 找到 cordis.patch.yml 加载)
|
|
19
19
|
dsh plugin --profile web add lunheng-article-pipeline@dsh # 推荐:跟随最新 DSH 迭代版
|
|
20
|
-
# 锁定具体版本:dsh plugin --profile web add lunheng-article-pipeline@18.78.
|
|
20
|
+
# 锁定具体版本:dsh plugin --profile web add lunheng-article-pipeline@18.78.2
|
|
21
21
|
|
|
22
22
|
# 2. (可选,但要让三档工具真的挂上就必做)设三档 subagent 工具的 provider/model 环境变量
|
|
23
23
|
# v18.2.6 起:不设任何变量 = 三档行**根本不装载**(不再是「装载但全继承」)
|
package/lib/ethics-sanitize.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
//
|
|
12
12
|
// 为什么**不写盘**(安全性设计,关键):
|
|
13
13
|
// · 该工具处理的是**最敏感**的输入(访谈逐字稿 / 田野笔记)。一个会写盘的工具,其写盘目标
|
|
14
|
-
// 由调用方给定 → 与「只读工具」族的既有声明(`SECURITY.md
|
|
14
|
+
// 由调用方给定 → 与「只读工具」族的既有声明(`SECURITY.md`「注册四个**只读**工具」)冲突;
|
|
15
15
|
// · 本工具改为**返回脱敏后的文本**,由主控用自身 `write` 工具决定落盘位置。这样:
|
|
16
16
|
// ① 族属性不变(仍是只读);② 落盘位置由主控显式决定,不经工具入参注入。
|
|
17
17
|
//
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
// 本实现的取舍是「**宁可多报待复核,不静默漏报**」:拿不准的进 `reviewFlags` 由人复核。
|
|
23
23
|
// · **本工具不是双盲评审的充分条件**。它降低泄露面,不构成合规保证。
|
|
24
24
|
import { readFileSync, existsSync, statSync } from 'node:fs'
|
|
25
|
-
import { join } from 'node:path'
|
|
25
|
+
import { join, resolve } from 'node:path'
|
|
26
26
|
|
|
27
27
|
/** 受控模式。none = 原样返回(显式声明「未脱敏」);basic = 默认;strict = 地名泛化到上级。 */
|
|
28
28
|
export const MODES = Object.freeze(['none', 'basic', 'strict'])
|
|
@@ -89,12 +89,15 @@ const SENT = '\uE000'
|
|
|
89
89
|
* v18.69.0(批 6-A · P2 修复):按 mtime 指纹缓存——H2 钩子启动期读一次是对的,但工具侧每次
|
|
90
90
|
* execute 都重读 3 个词表文件,高并发 parallel 工具下重复磁盘 IO。缓存键 = skillRoot + 三文件
|
|
91
91
|
* 的 mtimeMs 指纹(词表变了自动失效,不变则零重读)。
|
|
92
|
+
* ⚠️ v18.78.1 全量审计 · 批 5(B10)更正:上面这句声明此前**与实现不符**——实现只拼了 `f + ':' + mtimeMs`,
|
|
93
|
+
* `skillRoot`/`dir` 从不进指纹,于是两个根只要 mtime 相同(同毫秒整、或都缺失 → 全 MISSING)
|
|
94
|
+
* 就会静默共用同一份词表。现已把规范化后的 `dir` 拼在指纹最前,声明与实现一致。
|
|
92
95
|
*/
|
|
93
96
|
let dictCache = null
|
|
94
97
|
export function loadDicts(skillRoot) {
|
|
95
98
|
const dir = join(skillRoot, 'references', 'dicts')
|
|
96
99
|
const DICT_FILES = ['中文姓氏.txt', '人名排除词.txt', '中国行政区划.txt']
|
|
97
|
-
let fingerprint = ''
|
|
100
|
+
let fingerprint = resolve(dir) + '|'
|
|
98
101
|
for (const f of DICT_FILES) {
|
|
99
102
|
try { fingerprint += f + ':' + statSync(join(dir, f)).mtimeMs + ';' } catch { fingerprint += f + ':MISSING;' }
|
|
100
103
|
}
|
|
@@ -230,11 +233,18 @@ export function sanitize(text, opts = {}) {
|
|
|
230
233
|
const re = new RegExp(names.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g')
|
|
231
234
|
out = out.replace(re, (m) => {
|
|
232
235
|
const parent = dicts.places.get(m) || m
|
|
233
|
-
|
|
234
|
-
// strict 泛化到上级;**省级本身保持原样**——省级粒度不足以识别个体,
|
|
236
|
+
// strict 泛化到上级;**省级本身保持原样**(有意设计)——省级粒度不足以识别个体,
|
|
235
237
|
// 替换成「广东某地」是制造假精度(真实数据是「广东省」而非「广东省的某地」)。
|
|
236
238
|
const final = mode !== 'strict' ? '[地名-REDACTED]' : (parent === m ? m : `${parent}某地`)
|
|
237
|
-
|
|
239
|
+
// v18.78.1 全量审计 · 批 5(脱敏虚报替换数):**只有真的换了才计数/入表**。旧实现无条件 `counts.place++`,
|
|
240
|
+
// 并把 `{ from:'北京市', to:'北京市' }` 也 push 进 replacements,于是 strict 下 summary
|
|
241
|
+
// 报「地名 1」而正文一字未动(探针实测:counts.place=3、replacements 含两条 from===to)。
|
|
242
|
+
// 本字段的语义是「发生了替换」= from ≠ to;省级「保持原样」既已在上一行声明为有意设计,
|
|
243
|
+
// 就不该在计数里冒充一次替换(消费方据 summary 判断「替换了几处」,虚报即误导)。
|
|
244
|
+
if (final !== m) {
|
|
245
|
+
counts.place++
|
|
246
|
+
if (replacements.length < maxList) replacements.push({ type: 'place', label: '地名', from: m, to: final })
|
|
247
|
+
}
|
|
238
248
|
const token = `${SENT}${sentMap.size}${SENT}`
|
|
239
249
|
sentMap.set(token, final)
|
|
240
250
|
return token
|
package/lib/guard.js
CHANGED
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
// → 现改为:**对「会话工作区」与「进程 cwd」两个基准都判**(取并集 = 只收紧不放宽),
|
|
25
25
|
// 会话工作区从 `execution.agent.session.header.cwd` 取,与 fs 工具同源。
|
|
26
26
|
// ② **路径拼写变体**:`e:/…`(小写盘符)、`\\?\E:\…`(长路径前缀)旧实现按字符串前缀比较 → 放行。
|
|
27
|
-
// → 现统一 `canon()`:剥长路径前缀、盘符大写、`realpath` 解析软链接/junction
|
|
27
|
+
// → 现统一 `canon()`:剥长路径前缀、盘符大写、`realpath` 解析软链接/junction、比较时**仅 Windows**
|
|
28
|
+
// 忽略大小写(v18.78.1 全量审计 · 批 5 加平台门,见 canonicalPath 内注与 `lib/run-path-fence.mjs` 同族写法)。
|
|
28
29
|
// ③ **参数形态漏检**:旧 `writtenPath()` 只对**数组**递归,不递归普通对象 → `{edits:{file:{file_path}}}`
|
|
29
30
|
// 这类二层嵌套放行;apply_patch 类工具的路径藏在**补丁文本**里,旧实现完全看不到。
|
|
30
31
|
// → 现改为**深度遍历**(对象/数组,带深度上限)+ 从补丁/正文类字段里提取 `*** Update File:` /
|
|
@@ -71,6 +72,15 @@ const CONTENT_KEYS = new Set([
|
|
|
71
72
|
])
|
|
72
73
|
/** 需要从「文本载荷」里抽路径的键名(补丁/diff 类工具的路径藏在正文里)。 */
|
|
73
74
|
const PAYLOAD_KEYS = new Set(['patch', 'input', 'diff', 'difftext', 'patchtext', 'payload'])
|
|
75
|
+
/** 载荷键判据:`PAYLOAD_KEYS` 全名命中,或键名含 `patch`/`diff` 子串。
|
|
76
|
+
*
|
|
77
|
+
* v18.78.1 全量审计 · 批 5(B9):抽成函数是因为它有两个消费点——① 补丁文本抽取;② 「无候选 → 是否 warn」的
|
|
78
|
+
* `allContent` 判据。`input` 同时在 `CONTENT_KEYS`(内容键)与 `PAYLOAD_KEYS`(载荷键)里,
|
|
79
|
+
* 属**双重身份**:只按 `CONTENT_KEYS` 判会把「参数只有 `input` 一个键」误判成「纯内容参数」
|
|
80
|
+
* 而抑制告警。载荷键**可能把路径藏在文本里**,故它不算「无路径意图」的证据。 */
|
|
81
|
+
const isPayloadKeyName = (lower) =>
|
|
82
|
+
PAYLOAD_KEYS.has(lower) || lower.includes('patch') || lower.includes('diff')
|
|
83
|
+
|
|
74
84
|
/** 补丁文本里的路径形态:apply_patch(`*** Update File: x`)与 unified diff(`+++ b/x` / `--- a/x`)。 */
|
|
75
85
|
const PATCH_PATH_RES = [
|
|
76
86
|
// v18.16.0(B-3 反哺):原 `(?:Update|Add|Delete|Move to)\s+File:` 把 `*** Move to: x`(重命名语法)
|
|
@@ -109,7 +119,7 @@ function realpathBest(p) {
|
|
|
109
119
|
/**
|
|
110
120
|
* 把任意路径写法归一到「可比较」的绝对路径:
|
|
111
121
|
* 剥 Windows 长路径前缀(`\\?\` / `\\?\UNC\`)→ 相对路径按 base 解析 → 盘符大写 →
|
|
112
|
-
* realpath(解软链接/junction/8.3 短名)→ 统一分隔符 →
|
|
122
|
+
* realpath(解软链接/junction/8.3 短名)→ 统一分隔符 → **仅 Windows** 小写(POSIX 路径大小写敏感)。
|
|
113
123
|
* @param raw - 原始路径字符串(可能是相对路径、含 `..`、含长路径前缀)。
|
|
114
124
|
* @param base - 相对路径的解析基准(会话工作区或进程 cwd)。
|
|
115
125
|
* @returns 归一后的比较键;无法解析(空串/非字符串)返回 null。
|
|
@@ -126,7 +136,11 @@ export function canonicalPath(raw, base) {
|
|
|
126
136
|
s = s.replace(/^([a-z]):/, (_, d) => `${d.toUpperCase()}:`)
|
|
127
137
|
s = realpathBest(s)
|
|
128
138
|
s = s.replace(/^([a-z]):/, (_, d) => `${d.toUpperCase()}:`)
|
|
129
|
-
|
|
139
|
+
// v18.78.1 全量审计 · 批 5(P3 · 路径归一平台门):大小写归一**只在 Windows** 做。原实现无条件 `toLowerCase()`,
|
|
140
|
+
// 与同族 `lib/run-path-fence.mjs:23` 的 `norm()`(`process.platform === 'win32' ? … : s`)不一致——
|
|
141
|
+
// POSIX 路径**大小写敏感**,两侧都压低会把「与被保护根仅差大小写的**真实路径**」误判为命中
|
|
142
|
+
// (假否决:guard 的契约是「宁松勿误伤」,假否决同样是违契约)。Windows 保持原行为。
|
|
143
|
+
return process.platform === 'win32' ? s.toLowerCase() : s
|
|
130
144
|
}
|
|
131
145
|
|
|
132
146
|
/** 收集「可能是被写路径」的字符串:先按已知键名取,再深度遍历兜底;补丁类字段另抽路径。 */
|
|
@@ -163,10 +177,14 @@ function writtenPaths(args, depth = 0, out = []) {
|
|
|
163
177
|
const knownPathKey = PATH_KEYS.some((p) => p.toLowerCase() === lower)
|
|
164
178
|
if (knownPathKey) {
|
|
165
179
|
out.push(v.trim())
|
|
166
|
-
} else if (isNumericKey
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
180
|
+
} else if (isNumericKey) {
|
|
181
|
+
// 数字键位参:与**键名形态同等**处理(v18.78.1 全量审计 · 批 5 · P3「数字键相对路径」)。
|
|
182
|
+
// 原实现只收 `isAbsolute(v)` 的值,于是 `{"0": "lib/guard.js"}`(**相对**路径)既不进候选、
|
|
183
|
+
// 也不进任何兜底分支 → 静默放行,与文件头 P1-1 ①「数字键位参已收掉」的声明不符
|
|
184
|
+
// (探针实测:`numeric key 0 + RELATIVE` → ALLOW)。
|
|
185
|
+
// 现一律入候选:相对路径由调用点按「会话工作区 + 进程 cwd」两个基准解析后判定,解析不到
|
|
186
|
+
// 受保护根即放行——符合 guard「只收紧不放宽」语义(误伤条件苛刻:候选文本须恰好解析到受保护根内)。
|
|
187
|
+
// 边界(如实):位置参约定里被当作**内容**的那一位也会成为候选字符串,代价 = 一次路径比较。
|
|
170
188
|
out.push(v.trim())
|
|
171
189
|
} else if (
|
|
172
190
|
// v18.16.0(B-4 反哺):原 `PAYLOAD_KEYS.has(lower)` 仅命中 6 个全名;常见变体如
|
|
@@ -177,7 +195,7 @@ function writtenPaths(args, depth = 0, out = []) {
|
|
|
177
195
|
// 恰好对该修复点名的 `patchContent` / `patchText` / `diffText` **全部失效**(只有
|
|
178
196
|
// `patch_text` 这类带分隔符的才命中)。现改纯 `includes` 子串判定——键名含 `patch`/`diff`
|
|
179
197
|
// 本就是弱命名约定,宁松勿误伤(误判代价 = 多扫一遍补丁文本,无假否决)。
|
|
180
|
-
|
|
198
|
+
isPayloadKeyName(lower)
|
|
181
199
|
) {
|
|
182
200
|
for (const re of PATCH_PATH_RES) {
|
|
183
201
|
re.lastIndex = 0
|
|
@@ -187,8 +205,14 @@ function writtenPaths(args, depth = 0, out = []) {
|
|
|
187
205
|
out.push(raw.trim())
|
|
188
206
|
}
|
|
189
207
|
}
|
|
208
|
+
// v18.78.1 全量审计 · 批 5(B9 修复 · 与补丁文本抽取**解耦**):载荷键命中后原本直接落到本分支尾,
|
|
209
|
+
// 紧随其后的「顶层 + 绝对路径」兜底分支被 `else` 串**结构性跳过** → `{patch: '<绝对路径>'}`
|
|
210
|
+
// (无补丁语法)只 warn 不判;`{input: '<绝对路径>'}` 更因 `input` 同时在 CONTENT_KEYS 里
|
|
211
|
+
// 连 warn 都被抑制(探针实测:零告警的 ALLOW)。补丁文本抽取与「值本身就是绝对路径」
|
|
212
|
+
// 是**两件事**,故在此独立补一次兜底,不再依赖后面的 else 分支(不再用 else 串)。
|
|
213
|
+
if (depth === 0 && isAbsolute(v.trim())) out.push(v.trim())
|
|
190
214
|
}
|
|
191
|
-
// 顶层兜底:键名不在 PATH_KEYS
|
|
215
|
+
// 顶层兜底:键名不在 PATH_KEYS、不是数字键、不是载荷键;值为绝对路径;
|
|
192
216
|
// 且键名不在「内容类键」白名单 → 视为可疑路径候选(防御性收紧)。
|
|
193
217
|
// 边界:「内容类键」白名单(CONTENT_KEYS)显式声明**不能**被判定为路径的键名集合,
|
|
194
218
|
// 把 `content`/`text`/`old_string`/`new_string`/`url`/`source` 等常见内容键排除;
|
|
@@ -310,9 +334,17 @@ export function installMechanismGuard(ctx, { mechanismRoots, skillName, mirrorSk
|
|
|
310
334
|
// 出候选键)时才 warn。`{content:'xxx', mode:'w'}` 这类纯内容参数**不**让判「可疑绕过」——它们
|
|
311
335
|
// 没有路径是因为**不需要**(如 `write` 走 `data:` 形式、或宿主在另一参数通道带路径)。
|
|
312
336
|
// 判据:参数键中存在 ∉ `CONTENT_KEYS`(不区分大小写)即视为「有路径意图」。
|
|
337
|
+
// v18.78.1 全量审计 · 批 5(B9):**载荷键不算「纯内容」**——`input` 同时在 `CONTENT_KEYS`(内容键)与
|
|
338
|
+
// `PAYLOAD_KEYS`(载荷键)里,属双重身份:只按 `CONTENT_KEYS` 判会让 `{input: …}` 这类
|
|
339
|
+
// 调用的告警被抑制(探针实测:`key=input + 纯绝对路径` → 零告警 ALLOW)。
|
|
340
|
+
// 为什么选「在本判据里排除载荷键」而不是「把 `input` 移出 `CONTENT_KEYS`」:
|
|
341
|
+
// `input` 作为内容键的语义是真的(很多工具的 input 就是正文),它「可能把路径藏在文本里」
|
|
342
|
+
// 是**另一维**属性;在**这一个**判据里按「是否可能藏路径」重新定权,比改写全局白名单语义
|
|
343
|
+
// 更小、更可回滚。两法在**候选收集**上的结果相同,差别只在本判据。
|
|
313
344
|
const args = execution?.arguments
|
|
314
345
|
const allContent = args && typeof args === 'object' && Object.keys(args).length > 0
|
|
315
|
-
&& Object.keys(args).every((k) =>
|
|
346
|
+
&& Object.keys(args).every((k) =>
|
|
347
|
+
(CONTENT_KEYS.has(k) || CONTENT_KEYS.has(k.toLowerCase())) && !isPayloadKeyName(k.toLowerCase()))
|
|
316
348
|
const hasArgs = args && (typeof args === 'object' ? Object.keys(args).length > 0 : true)
|
|
317
349
|
if (hasArgs && !allContent) {
|
|
318
350
|
try { report?.('warn', '· 论衡机制文件写保护:写工具 `' + name + '` 未识别出候选路径——可能为键名/工具名变体绕过(v18.62.5 §P1-1),按「无候选 → 不否决」放行。改进动议请写入 audits/反哺报告-vN.md,或在 lib/guard.js 的 WRITE_TOOLS/PATH_KEYS 加项。') } catch { /* report 不可用时不二次抛 */ }
|
package/lib/index.js
CHANGED
|
@@ -366,7 +366,10 @@ export function apply(ctx, config) {
|
|
|
366
366
|
// ——该消息会被 host 落进会话日志,原样回吐 PII 会重演 R4。
|
|
367
367
|
const decided = (await next()) ?? { kind: 'accept' }
|
|
368
368
|
try {
|
|
369
|
-
|
|
369
|
+
// v18.78.1 全量审计 · 批 5(P3 · H2 工具名大小写):与同包 `lib/guard.js` 的写工具名判定同口径(那里已
|
|
370
|
+
// `.toLowerCase()`)。不加 lower 时 `Read` / `READ` / `WEB_SEARCH` / `Subagent` 全部
|
|
371
|
+
// 被判成「非材料类工具」→ **静默漏脱敏**(探针实测:四者 ethicsSanitized 全为 no)。
|
|
372
|
+
const name = String(exec?.name || '').toLowerCase()
|
|
370
373
|
if (!/^(read|web_|subagent)/.test(name)) return decided
|
|
371
374
|
const blocks = Array.isArray(result?.content) ? result.content : null
|
|
372
375
|
if (!blocks) return decided
|
|
@@ -577,8 +580,14 @@ export function apply(ctx, config) {
|
|
|
577
580
|
const dH4 = ctx.on('system-prompt/assemble', async (assembly, _context, next) => {
|
|
578
581
|
const r = await next()
|
|
579
582
|
try {
|
|
580
|
-
|
|
581
|
-
|
|
583
|
+
// v18.78.1 全量审计 · 批 5(P3 · H4 兜底):`next()` 返回 `undefined`(或非对象)时,`{...r}` = `{}`,
|
|
584
|
+
// 会把装配结果的 contexts / tools / variables(**含模型选择**)整体抹掉——探针实测
|
|
585
|
+
// `next() -> undefined` 时返回值键只剩 `['sections']`,contexts/variables 全丢。
|
|
586
|
+
// 与同文件 H2(`:367` 的 `?? { kind: 'accept' }`)同口径:现退回**入参 assembly** 作底,
|
|
587
|
+
// 再在其上追加论衡段(下游没给结果 = 没人改过装配结果,基线就是入参本身)。
|
|
588
|
+
const base = (r && typeof r === 'object') ? r : (assembly && typeof assembly === 'object' ? assembly : {})
|
|
589
|
+
const sections = Array.isArray(base.sections) ? base.sections : []
|
|
590
|
+
return { ...base, sections: [...sections, { name: 'lunheng', text: buildPromptTail() }] }
|
|
582
591
|
} catch { return r }
|
|
583
592
|
})
|
|
584
593
|
if (!alive) { try { dH4?.() } catch { /* 已卸载 */ } return }
|
package/lib/tools.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
// 论衡原生工具(C 组 · v18.1.0
|
|
1
|
+
// 论衡原生工具(C 组 · v18.1.0):把四个**只读**原生工具暴露给宿主——三个是随包机检脚本的薄包装
|
|
2
|
+
// (`lunheng_m_gate` / `lunheng_char_count` / `lunheng_handoff_check`),第四个 `lunheng_ethics_sanitize`
|
|
3
|
+
// 是 `lib/ethics-sanitize.js` 的**纯函数**(不派生任何子进程,见该文件头注释与 SECURITY.md)。
|
|
4
|
+
// ⚠️ v18.78.1 全量审计 · 批 5 更正:本行原写「两个**只读**机检脚本」(v18.1.0 时只有两个)——此后新增了
|
|
5
|
+
// `lunheng_handoff_check`(随包脚本)与 `lunheng_ethics_sanitize`(纯函数),数字未跟。
|
|
6
|
+
// 数字真源 = 本文件里经 `tools.register` 注册的 `defineTool` 调用点数(现为 4;机械门见
|
|
7
|
+
// `tests/docs-facts.test.mjs` 的对外声明面派生与 `tests/entry.test.mjs` 的「应注册 … 四个工具」断言)。
|
|
8
|
+
// ⚠️ 本注释刻意**不**复刻那个调用的完整字面形态:`docs-facts` 用正则在本文件源码里派生工具集,
|
|
9
|
+
// 注释里照着写会被派生成一个**幻影工具名**(本批实测踩到过一次,C-1 因此变红)。
|
|
2
10
|
//
|
|
3
11
|
// 为什么(第三方审计 C-1,官方依据):
|
|
4
12
|
// · `docs/cookbook/adding-a-tool.md:45`「**Declare and return one canonical JSON value** …
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lunheng-article-pipeline",
|
|
3
|
-
"version": "18.78.
|
|
3
|
+
"version": "18.78.2",
|
|
4
4
|
"description": "论衡(lunheng-article-pipeline)— 多 Agent 深度长文流水线技能包(DeepSeek Harness 原生插件):定题→并行检索(文献/数据/案例)→分析→大纲人在环确认→写作→批判→审计→审稿→修订→配图→终检交付,9 个独立角色 T1-T9 互不可替代(文献/数据/案例/分析/写作/批判/审计/终检/审稿),主控 = T0 调度 + T8 终检亲执行(T8 独立角色,执行者主控担任,不 spawn),T9 审稿可选默认选中学术必选,三角验证 + M 机械化硬门 + F 失败模式防御 + G14 中文 AI 痕迹闸 + 期刊匹配助手,用 dsh subagent 子代理编排。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
> 版本:v18.78.
|
|
1
|
+
> 版本:v18.78.2(DSH bundle 插件)
|
|
2
2
|
|
|
3
|
-
# 论衡快速开始指南(v18.78.
|
|
3
|
+
# 论衡快速开始指南(v18.78.2)
|
|
4
4
|
|
|
5
5
|
> **v2.3.0 升级(2026-08-21)**:角色编号重构(教训 #116)—— T6 案例检索 → T3 案例检索(三方并行检索员连贯 T1∥T2∥T3),T3-T8 顺延 + T7/T8 交换位置(终检 → T8 主控亲完成、批判 → T6 独立早期攻击、审计 → T7 形式审查)。新增 Phase 3.6 批判(T6 攻击 v2 含主人洞察)。
|
|
6
6
|
>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
> 版本:v18.78.2(DSH bundle 插件)
|
|
2
|
+
|
|
1
3
|
# 论衡(lunheng-article-pipeline)— 多 Agent 深度长文流水线
|
|
2
4
|
|
|
3
|
-
> **DSH 原生插件(v18.78.
|
|
5
|
+
> **DSH 原生插件(v18.78.2)**:本仓库为 DSH bundle 技能包(`package.json` 的 `main` → `lib/index.js` 注册本技能 + `dsh.bundle.patch` → `cordis.patch.yml` 叠加三档 subagent 工具);结构性差异见 `SKILL.md` 的「🔧 DSH 环境说明」章节。
|
|
4
6
|
|
|
5
7
|
把一篇深度文章 / 论文的生产拆成 **9 个独立角色 T1-T9 + 6 个阶段**(v2.5.2-dsh.8 语义定案:T1-T9 互不可替代;Phase 1 为 T1 文献 ∥ T2 数据 ∥ T3 案例 三检索员三方真并行互不干涉,T3 任何量级必 spawn 含 0 条空卡协议;T6 批判伙伴 + T7 审计 + **T8 终检独立角色由主控 T0 亲执行** + T9 同行评审T9 启用按 `_shared/文类档案.md`,v2.3.0 角色编号重构 + v2.4.0 加 T9),用 DSH 的 `subagent` 子代理编排,产出有**证据底座、反方论证、独立审计、人工核验节点**的交付物。
|
|
6
8
|
|