lunheng-article-pipeline 18.78.0 → 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.
Files changed (102) hide show
  1. package/README-es.md +7 -3
  2. package/README-hi.md +7 -3
  3. package/README-pt.md +7 -3
  4. package/README-zh.md +8 -4
  5. package/README.md +9 -3
  6. package/SECURITY.md +2 -2
  7. package/cordis.patch.yml +1 -1
  8. package/docs/architecture.md +2 -2
  9. package/docs/installation.md +2 -2
  10. package/docs/introduction.md +52 -19
  11. package/docs/troubleshooting.md +3 -3
  12. package/docs/usage.md +2 -2
  13. package/examples/preset/README.md +1 -1
  14. package/lib/ethics-sanitize.js +16 -6
  15. package/lib/guard.js +42 -10
  16. package/lib/index.js +12 -3
  17. package/lib/tools.js +9 -1
  18. package/package.json +1 -1
  19. package/skills/lunheng-article-pipeline/AGENTS.md +5 -3
  20. package/skills/lunheng-article-pipeline/QUICKSTART.md +4 -4
  21. package/skills/lunheng-article-pipeline/README.md +4 -2
  22. package/skills/lunheng-article-pipeline/SKILL.md +7 -7
  23. package/skills/lunheng-article-pipeline/references/_shared/DSH-/351/233/206/346/210/220/346/226/271/346/241/210.md +2 -2
  24. package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm-appendix.md +1 -0
  25. package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm.md +1 -1
  26. package/skills/lunheng-article-pipeline/references/_shared/audit-checklist-quickref.md +1 -1
  27. package/skills/lunheng-article-pipeline/references/_shared/auto_cite-integration.md +1 -1
  28. package/skills/lunheng-article-pipeline/references/_shared/degraded-scenarios.md +1 -1
  29. package/skills/lunheng-article-pipeline/references/_shared/failure-modes.md +1 -1
  30. package/skills/lunheng-article-pipeline/references/_shared/format-export.md +1 -1
  31. 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
  32. 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
  33. 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
  34. package/skills/lunheng-article-pipeline/references/_shared//345/274/225/347/224/250/346/240/274/345/274/217.md +2 -0
  35. package/skills/lunheng-article-pipeline/references/_shared//346/226/207/347/261/273/346/241/243/346/241/210.md +1 -1
  36. 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
  37. 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
  38. 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
  39. package/skills/lunheng-article-pipeline/references/_shared//346/235/220/346/226/231/346/221/204/345/217/226.md +1 -1
  40. 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
  41. package/skills/lunheng-article-pipeline/references/_shared//346/250/241/345/236/213/350/267/257/347/224/261.md +1 -1
  42. 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
  43. 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
  44. package/skills/lunheng-article-pipeline/references/agents/00-/344/270/273/346/216/247-coordinator.md +2 -2
  45. 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
  46. 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
  47. 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
  48. 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
  49. package/skills/lunheng-article-pipeline/references/agents/04-/345/210/206/346/236/220-analyst.md +1 -1
  50. package/skills/lunheng-article-pipeline/references/agents/05-/345/206/231/344/275/234-writer.md +4 -4
  51. package/skills/lunheng-article-pipeline/references/agents/06-/346/211/271/345/210/244-critical-companion.md +1 -1
  52. package/skills/lunheng-article-pipeline/references/agents/07-/345/256/241/350/256/241-auditor.md +1 -1
  53. package/skills/lunheng-article-pipeline/references/agents/08-/347/273/210/346/243/200-finalizer.md +2 -2
  54. package/skills/lunheng-article-pipeline/references/agents/09-/345/256/241/347/250/277-peer-reviewer.md +1 -1
  55. package/skills/lunheng-article-pipeline/references/case-studies.md +3 -1
  56. package/skills/lunheng-article-pipeline/references/checkers//344/270/255/346/226/207AI/347/227/225/350/277/271-checker.md +2 -2
  57. package/skills/lunheng-article-pipeline/references/checkers//345/217/257/350/257/273/346/200/247-checker.md +5 -2
  58. package/skills/lunheng-article-pipeline/references/deliverables.md +1 -1
  59. package/skills/lunheng-article-pipeline/references/dispatch-cards.md +3 -1
  60. package/skills/lunheng-article-pipeline/references/errors.md +2 -0
  61. package/skills/lunheng-article-pipeline/references/gates/14-/344/270/255/346/226/207AI/347/227/225/350/277/271-gate.md +1 -1
  62. 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
  63. package/skills/lunheng-article-pipeline/references/glossary.md +5 -4
  64. package/skills/lunheng-article-pipeline/references/maintainers.md +20 -20
  65. package/skills/lunheng-article-pipeline/references/memory/lessons.md +2 -0
  66. package/skills/lunheng-article-pipeline/references/operations.md +2 -0
  67. package/skills/lunheng-article-pipeline/references/pipeline-readme.md +3 -5
  68. package/skills/lunheng-article-pipeline/references/templates/AI-/344/275/277/347/224/250/345/243/260/346/230/216-template.md +1 -1
  69. 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
  70. 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
  71. package/skills/lunheng-article-pipeline/references/templates/G14/346/243/200/346/265/213/346/212/245/345/221/212-template.md +1 -1
  72. package/skills/lunheng-article-pipeline/references/templates/auto_cite-/350/241/245/345/205/205-template.md +1 -1
  73. package/skills/lunheng-article-pipeline/references/templates/status-template-lite.md +1 -1
  74. package/skills/lunheng-article-pipeline/references/templates/status-template.md +2 -2
  75. package/skills/lunheng-article-pipeline/references/templates/style-baseline-template.md +1 -1
  76. 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
  77. package/skills/lunheng-article-pipeline/references/templates//344/270/273/344/272/272/347/241/256/350/256/244-template.md +1 -1
  78. package/skills/lunheng-article-pipeline/references/templates//344/272/244/344/273/230/350/257/264/346/230/216-template.md +1 -1
  79. package/skills/lunheng-article-pipeline/references/templates//344/273/273/345/212/241/347/256/200/346/212/245-template-lite.md +1 -1
  80. package/skills/lunheng-article-pipeline/references/templates//344/273/273/345/212/241/347/256/200/346/212/245-template.md +2 -2
  81. 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
  82. package/skills/lunheng-article-pipeline/references/templates//344/277/256/350/256/242/350/257/264/346/230/216-template-full.md +1 -1
  83. package/skills/lunheng-article-pipeline/references/templates//345/261/200/351/231/220/346/200/247-template.md +1 -1
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. package/skills/lunheng-article-pipeline/references/templates//351/227/270/351/227/250/350/256/260/345/275/225-template.md +1 -1
  90. package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/content-rules.mjs +58 -4
  91. package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/docs-version-rules.mjs +26 -0
  92. package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/repo-surface-rules.mjs +88 -7
  93. package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/rule-registry.mjs +66 -0
  94. package/skills/lunheng-article-pipeline/scripts/_lib/cc-rules/truth-source.mjs +39 -0
  95. package/skills/lunheng-article-pipeline/scripts/_lib/mgate-gates/gate-count.mjs +46 -0
  96. package/skills/lunheng-article-pipeline/scripts/_lib/mgate-gates/mexist-gates.mjs +37 -7
  97. package/skills/lunheng-article-pipeline/scripts/build-evidence-bundle.mjs +22 -4
  98. package/skills/lunheng-article-pipeline/scripts/consistency-check.mjs +55 -25
  99. package/skills/lunheng-article-pipeline/scripts/handoff-check.mjs +6 -0
  100. package/skills/lunheng-commands/SKILL.md +2 -2
  101. package/skills/lunheng-commands/scripts/history-cli.mjs +1 -1
  102. 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.0(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
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 Revisión T9 revisión por pares + puerta G14 de huellas de IA (en paralelo); figuras
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.0 && git push origin v18.78.0 # un tag por push (GitHub: >3 tags en un push no dispara workflow)
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
  ```
@@ -196,6 +198,8 @@ El coordinador debe divulgar estos envíos y obtener consentimiento explícito e
196
198
 
197
199
  > **Cómo leer esta tabla (dos criterios que se confunden con facilidad)**: ① «rondas de revisión» cuenta **todas las pasadas del redactor en esa ejecución** (fase 3.5 → v2, correcciones de la crítica T6, rondas G14, bucle de auditoría), mientras que el límite propio de la pipeline (**≤2 rondas**) se aplica **solo al bucle de auditoría de la fase 4.2**: los dos números no miden lo mismo; ② los resultados son **valores históricos registrados en el momento de cada ejecución, con la versión de scripts de entonces** — no son reproducibles con los scripts actuales. Volver a ejecutar los scripts del paquete sobre los proyectos archivados da hoy, por ejemplo, el artículo de la col china con formaldehído en `exit 2` con 5 P0 (M-Form-6/10, M-Exist-7/9, M-Integrity-1): tres de esas puertas se añadieron **después** de aquella ejecución. Lea la tabla como «lo que la pipeline produjo entonces», no como «el conjunto de puertas actual aprueba estos proyectos».
198
200
 
201
+ > **Referencias cruzadas (lote de auditoría documental v18.78.0 §7.2)**: análisis detallado de los 6 casos representativos de esta tabla en [`docs/introduction.md` §实战验证](../lunheng-article-pipeline-dsh/docs/introduction.md) (caso del repollo chino con formaldehído ~4200 caracteres v2.3.7-dsh.8 + 6 casos del período v18.x); campos completos y rutas de productos para casos v2.x en [`references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md) §instantánea histórica. **Tarjeta rápida para recién llegados (lote v18.78.0 §7.2)**: números duros (versión / roles / fases / puertas / scripts / comandos / familia de códigos de salida) fuente única = [`docs/quick-facts.md`](../lunheng-article-pipeline-dsh/docs/quick-facts.md).
202
+
199
203
  Puertas locales (**solo fuentes del repositorio** — el paquete npm **no incluye** `scripts/` ni `tests/`, por lo que los comandos siguientes no se pueden ejecutar en una instalación desde el paquete; dentro del paquete puede ejecutar el conjunto equivalente sobre el tarball recién descargado con `pack-smoke`): `node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`, `node scripts/plugin-surface-check.mjs`, `node scripts/repo-hygiene-check.mjs`, `node scripts/pack-smoke.mjs`, `node --test "tests/**/*.test.mjs"`.
200
204
 
201
205
  ## Known limitations
package/README-hi.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # लुन्हेंग (lunheng-article-pipeline) — बहु-एजेंट दीर्घ-लेख पाइपलाइन
2
2
 
3
- > 版本:v18.78.0(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
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 समीक्षा T9 सहकर्मी समीक्षा + G14 AI-चिह्न द्वार (समानांतर); चित्र
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.0 && git push origin v18.78.0 # एक बार में एक ही tag (GitHub: >3 tag एक push में कोई workflow नहीं चलाता)
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
  ```
@@ -196,6 +198,8 @@ DSH में मॉडल मार्ग `settings.yaml` तय करता
196
198
 
197
199
  > **यह तालिका कैसे पढ़ें (दो मानदंड जो आसानी से मिल जाते हैं)**: ① «संशोधन चक्र» उस **पूरे चक्र के सभी लेखक-पास** गिनता है (चरण 3.5 → v2, T6 समालोचना-सुधार, G14 चक्र, लेखा-परीक्षा लूप), जबकि पाइपलाइन की अपनी सीमा (**≤2 चक्र**) केवल **चरण 4.2 के लेखा-परीक्षा लूप** पर लागू होती है — दोनों संख्याएँ एक ही बात नहीं नापतीं; ② परिणाम **प्रत्येक चक्र के समय दर्ज ऐतिहासिक मान हैं, उस समय के स्क्रिप्ट संस्करण के साथ** — वर्तमान स्क्रिप्ट से पुनरुत्पाद्य नहीं। संग्रहीत परियोजनाओं पर आज पैकेज की स्क्रिप्ट चलाने पर, उदाहरणार्थ, फ़ॉर्मेल्डिहाइड बंदगोभी लेख `exit 2` तथा 5 P0 (M-Form-6/10, M-Exist-7/9, M-Integrity-1) देता है: उनमें से तीन द्वार उस चक्र के **बाद** जोड़े गए थे। इस तालिका को «तब पाइपलाइन ने क्या उत्पादित किया» के रूप में पढ़ें, «वर्तमान द्वार-समूह इन परियोजनाओं को उत्तीर्ण करता है» के रूप में नहीं।
198
200
 
201
+ > **पारस्परिक संदर्भ (व18.78.0 दस्तावेज़ ऑडिट बैच §7.2)**: इस तालिका के 6 प्रतिनिधि मामलों का गहन विश्लेषण [`docs/introduction.md` §实战验证](../lunheng-article-pipeline-dsh/docs/introduction.md) में (फ़ॉर्मेल्डिहाइड बंदगोभी मामला ~4200 अक्षर v2.3.7-dsh.8 + v18.x अवधि के 6 मामले); v2.x मामलों के लिए पूर्ण फ़ील्ड और उत्पाद पथ [`references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md) §ऐतिहासिक स्नैपशॉट में। **नवागंतुकों के लिए त्वरित कार्ड (व18.78.0 बैच §7.2)**: कठोर संख्याएँ (संस्करण / भूमिकाएँ / चरण / द्वार / स्क्रिप्ट / आदेश / निकास कोड परिवार) एकल स्रोत = [`docs/quick-facts.md`](../lunheng-article-pipeline-dsh/docs/quick-facts.md).
202
+
199
203
  स्थानीय द्वार (**केवल स्रोत रिपॉज़िटरी** — npm पैकेज में `scripts/` या `tests/` **शामिल नहीं** हैं, इसलिए नीचे दिए आदेश पैकेज-इंस्टॉल रूप में नहीं चलेंगे; पैकेज के भीतर आप `pack-smoke` से नए डाउनलोड किए tarball पर समतुल्य जाँच चला सकते हैं): `node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`, `node scripts/plugin-surface-check.mjs`, `node scripts/repo-hygiene-check.mjs`, `node scripts/pack-smoke.mjs`, `node --test "tests/**/*.test.mjs"`.
200
204
 
201
205
  ## Known limitations
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.0(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
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 Revisão T9 revisão por pares + portão G14 de vestígios de IA (em paralelo); figuras
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.0 && git push origin v18.78.0 # uma tag por push (GitHub: >3 tags em um push não dispara workflow)
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
  ```
@@ -196,6 +198,8 @@ O coordenador deve divulgar esses envios e obter consentimento explícito na fas
196
198
 
197
199
  > **Como ler esta tabela (dois critérios que se confundem facilmente)**: ① «rodadas de revisão» conta **todas as passagens do redator naquela execução** (fase 3.5 → v2, correções da crítica T6, rodadas G14, laço de auditoria), enquanto o limite da própria pipeline (**≤2 rodadas**) vale **apenas para o laço de auditoria da fase 4.2** — os dois números não medem a mesma coisa; ② os resultados são **valores históricos registrados no momento de cada execução, com a versão de scripts daquela época** — não são reproduzíveis com os scripts atuais. Reexecutar hoje os scripts do pacote sobre os projetos arquivados devolve, por exemplo, o artigo do repolho com formaldeído em `exit 2` com 5 P0 (M-Form-6/10, M-Exist-7/9, M-Integrity-1): três desses portões foram acrescentados **depois** daquela execução. Leia a tabela como «o que a pipeline produziu então», não como «o conjunto de portões atual aprova estes projetos».
198
200
 
201
+ > **Referências cruzadas (lote de auditoria documental v18.78.0 §7.2)**: análise aprofundada dos 6 casos representativos desta tabela em [`docs/introduction.md` §实战验证](../lunheng-article-pipeline-dsh/docs/introduction.md) (caso do repolho chinês com formaldeído ~4200 caracteres v2.3.7-dsh.8 + 6 casos do período v18.x); campos completos e caminhos de produtos para casos v2.x em [`references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md) §instantâneo histórico. **Cartão rápido para novatos (lote v18.78.0 §7.2)**: números concretos (versão / papéis / fases / portas / scripts / comandos / família de códigos de saída) fonte única = [`docs/quick-facts.md`](../lunheng-article-pipeline-dsh/docs/quick-facts.md).
202
+
199
203
  Portões locais (**somente fontes do repositório** — o pacote npm **não inclui** `scripts/` nem `tests/`, portanto os comandos abaixo não rodam numa instalação a partir do pacote; dentro do pacote você pode rodar o conjunto equivalente no tarball recém-baixado via `pack-smoke`): `node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`, `node scripts/plugin-surface-check.mjs`, `node scripts/repo-hygiene-check.mjs`, `node scripts/pack-smoke.mjs`, `node --test "tests/**/*.test.mjs"`.
200
204
 
201
205
  ## Known limitations
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.0(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
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,12 +57,16 @@ 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 审稿 T9 同行评审 + G14 中文 AI 痕迹闸(并行);配图
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
  ```
64
66
 
65
- **三角证据底座**(`[L]` + `[D]` + `[C]`)——每条论断都要能映射到文献、数据与(事件类论断)案例证据。**独立审计**——审计员不改稿,只报告。**四道人在环节点**——Phase 0 / 2.5 / 3.5 / 5。
67
+ **三角证据底座**(**同义「三角验证」**;与英文 README L70 "Triangular evidence base" 同义;单一术语真源 = `skills/lunheng-article-pipeline/references/glossary.md` §十二.1)(`[L]` + `[D]` + `[C]`)——每条论断都要能映射到文献、数据与(事件类论断)案例证据。**独立审计**——审计员不改稿,只报告。**四道人在环节点**——Phase 0 / 2.5 / 3.5 / 5。
68
+
69
+ > **实战案例互引(v18.78.0 §7.2 双文档互引落地)**:本仓库实战案例的事实表(**字数 / 资源 / 审计结果 / 关键结论**)见英文 [`README.md` 顶部 Verification status 表](../lunheng-article-pipeline-dsh/README.md#verification-status)(**单一真源**);v2.x 与 v18.x 期间的深入剖析见 [`docs/introduction.md` §实战验证](../lunheng-article-pipeline-dsh/docs/introduction.md) 与 [`skills/lunheng-article-pipeline/references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md)。**新主人口径**(v18.78.0 §7.2 立项):硬数字(版本 / 角色 / 阶段 / 闸门 / 脚本 / 命令 / 退出码族)单一真源 = [`docs/quick-facts.md`](../lunheng-article-pipeline-dsh/docs/quick-facts.md)。
66
70
 
67
71
  ## Repository layout
68
72
 
@@ -115,7 +119,7 @@ patch 层做两件事:**插入一行本包自注册行**(`- id: lunheng-arti
115
119
  **只推 tag 发布,禁止本地 `npm publish`**(本地直发会绕过 CI 三道门与 OIDC 来源证明,且 npm 版本不可覆盖)。
116
120
 
117
121
  ```sh
118
- git tag v18.78.0 && git push origin v18.78.0 # 一次只推 1 个 tag(GitHub:单次 push >3 个 tag 不触发任何 workflow)
122
+ git tag v18.78.2 && git push origin v18.78.2 # 一次只推 1 个 tag(GitHub:单次 push >3 个 tag 不触发任何 workflow)
119
123
  # publish.yml 依次跑:门 1 一致性 → 门 2 打包面 → 门 3 机械卫生 → 门 4 打包产物冒烟 → 脚本回归测试
120
124
  # → tag/版本一致校验 → 幂等守卫 → OIDC 发布 --provenance --tag dsh → 发布后审计
121
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.0(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
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 Review T9 peer review + G14 Chinese AI-trace gate (in parallel); figures
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.0 && git push origin v18.78.0 # push one tag at a time (GitHub: >3 tags in one push triggers no workflow)
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
  ```
@@ -199,6 +201,10 @@ The coordinator must disclose these and obtain explicit consent at Phase 0. For
199
201
  | Formaldehyde cabbage article (2026-08) | ~4200 chars, 12 sources + 29 data + 4 cases | M-gate exit 0; 6 back-feed rules merged |
200
202
  | Notion vs. idea philosophy paper (2026-09) | ~6280 chars, 18 sources + 15 data, 0 cases | 2 audit rounds, 23/30 minor revision, M-gate true P0 = 0 |
201
203
 
204
+ > **本表互引**:本表 6 案例的代表性深入剖析见 [`docs/introduction.md` §实战验证](../lunheng-article-pipeline-dsh/docs/introduction.md)(**甲醛白菜事件 ~4200 字 v2.3.7-dsh.8** 全流程详解 + v18.x 期间 6 案例一览);v2.x 完整字段与产物路径见 [`references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md) §历史快照。
205
+ >
206
+ > **新主人口径(v18.78.0 §7.2 立项)**:硬数字(版本 / 角色 / 阶段 / 闸门 / 脚本 / 命令 / 退出码族)单一真源 = [`docs/quick-facts.md`](../lunheng-article-pipeline-dsh/docs/quick-facts.md),本表不再复述。
207
+
202
208
  > **How to read this table (two calibers that are easy to mix up)**: ① "revision rounds" counts **all writer passes in that run** (Phase 3.5 → v2, critique/T6 fixes, G14 rounds, audit loop) — the pipeline's own cap of **≤2 rounds** applies to the **Phase 4.2 audit loop alone**, so the two numbers measure different things; ② the outcomes are **historical values recorded at the time of each run, with that run's script version** — they are not reproducible with the current scripts. Re-running the packaged scripts on the archived projects today yields e.g. the formaldehyde cabbage article at `exit 2` with 5 P0 (M-Form-6/10, M-Exist-7/9, M-Integrity-1): three of those gates were added **after** that run. Read this table as "what the pipeline produced then", not as "the current gate set passes these projects".
203
209
 
204
210
  Local gates (repository sources only — the npm package ships no `scripts/` or `tests/`; the command below runs the equivalent set on a freshly downloaded tarball via `pack-smoke`): `node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`, `node scripts/plugin-surface-check.mjs`, `node scripts/repo-hygiene-check.mjs`, `node scripts/pack-smoke.mjs`, `node --test "tests/**/*.test.mjs"`.
package/SECURITY.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 安全策略(SECURITY)
2
2
 
3
- > 版本:v18.78.0(DSH 原生插件)
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 镜像,一并更正——全库 env 读取点只有 `LUNHENG_QUIET` 与 `LUNHENG_ALLOW_MECH_EDIT` 两处)。**非法配置在加载期响亮失败**(Cordis 抛 ValidationError),不会静默回落到默认值;`--dump-config` 可见。env 是**操作者开关**,Config 是**部署开关**(profile 补丁)。 |
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
@@ -1,4 +1,4 @@
1
- # lunheng-article-pipeline bundle patch(DSH 原生插件 v18.78.0)
1
+ # lunheng-article-pipeline bundle patch(DSH 原生插件 v18.78.2)
2
2
  #
3
3
  # 本文件用 DSH cordis-plugin-include 的 `- insert:` 列表语法在 standard 组合树之上叠加 4 行:
4
4
  # 1. **本包入口(自注册行)**:`name: lunheng-article-pipeline` → loader 按包名解析到
@@ -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 类检测维度,与 T6 并行)。
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`):M-Form 11 项 + M-Exist 11 项 + M-Integrity 2 项,LLM 兜底执行,产出 `final/M-Gate-Report.json`,exit 0 才交付。
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
 
@@ -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.0
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 修订:未设 `LUNHENG_*_PROVIDER` 的档不覆盖模型(继承父会话)——任何模型配置都能安全装预设**;设了 PROVIDER 未设 MODEL 才用档位默认模型(retrieval=deepseek-v4-flash / strong·audit=deepseek-v4-pro)。
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
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **论衡(lunheng-article-pipeline)** 是一个多 Agent 深度长文生产流水线,DeepSeek Harness(dsh)bundle 插件。它不是让一个 AI 直接写文章,而是让一支 **9 个 AI 角色组成的"论文生产小队"** 按既定协议协作:定题 → 三线并行检索 → 分析 → 写作 → 批判 → 审计 → 审稿 → 终检。每一步都有明确产出物、交接报告与质量闸门,最终交付**有证据底座、有反方论证、有独立审计、有人工核验节点**的文章。
4
4
 
5
- > 适用:公众号深度长文、研究报告、学术论文、商业评论、行业分析——任何"要站得住脚"的长内容。当前版本 **v18.78.0**(DSH 独立版本)。
5
+ > 适用:公众号深度长文、研究报告、学术论文、商业评论、行业分析——任何"要站得住脚"的长内容。当前版本 **v18.78.2**(DSH 独立版本)。
6
6
 
7
7
  ---
8
8
 
@@ -34,12 +34,12 @@
34
34
  ├─ T6 批判伙伴 ── 批判报告(C1-C7 反方攻击,轻量档可跳过)
35
35
  ├─ T7 审计员 ── 审计报告(G0-G14 全项,只审不改)
36
36
  ├─ T9 审稿人 ── 审稿报告(6 维度评分 + 期刊匹配 Top 3,可选)
37
- └─ T8 终检(主控亲完成)── M 门(机械 24 项 + 人工 1 项)+ 定稿 + 证据包 + 交付说明
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
- **六个主阶段(Phase 0–5,各自带子阶段)**:**Phase 0 定题 → Phase 1 并行检索(含 1.5 补检索)→ Phase 2 分析(含 2.5 大纲确认)→ Phase 3 写作(含 3.5 洞察补充、3.6 批判)→ Phase 4 审计(含 4.2 修订回环:≤2 轮纠错 + 至多 +1 深化;4.5 审稿)→ Phase 5 终检**,中间穿插 **T2.5 / T7.5 两道完整性门**(主控 checkpoint,不绕过交接直接派发)与 **4 个人在环节点**(定题 / 大纲 / 洞察补充 / 终稿)。
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
 
44
44
  > **口径说明(v18.18.6)**:本行旧标为 **7**,而紧随其后的箭头序列有 **8** 项、全库其余位置(`README*` ×5 / `docs/usage.md` / `skills/lunheng-article-pipeline/README.md`)一律标 **6**,三处互不相容。真源 = 「Phase 0–5 六个**主**阶段」(`tests/docs-facts.test.mjs` 从五语 README 的概览块按整数前缀派生,现已有门约束)——1.5 / 2.5 / 3.5 / 3.6 / 4.2 / 4.5 是**子**阶段,不计入主阶段数。本次按真源收敛。
45
45
 
@@ -55,6 +55,8 @@ Phase 1 一次性并行派出 **T1 文献 ∥ T2 数据 ∥ T3 案例** 三个
55
55
  - **T3 任何量级必 spawn**:即使主题"无需案例",也走「0 条空卡协议」——显式声明无案例需求、输出空卡,保证流程可审计,不留下"到底查没查案例"的模糊地带;
56
56
  - **强相关性铁律**:每条材料必答「它支撑哪个论点」,答不出不收;数量封顶(50-70 条),宁缺毋滥。
57
57
 
58
+ > **术语指针(v18.78.0 §7.4 统一落地)**:「三角验证」与「三角证据底座」同义——单一术语真源 = `references/glossary.md` §十二.1(v18.78.0 文档全量审计 §3.2 / §7.4 落地)。
59
+
58
60
  ### ② 独立审计闭环(G0-G14 + M 门)
59
61
 
60
62
  审计员 **只审不改**、与写手完全分离,执行 **G0-G14** 全项检查:
@@ -67,7 +69,7 @@ Phase 1 一次性并行派出 **T1 文献 ∥ T2 数据 ∥ T3 案例** 三个
67
69
 
68
70
  审计打回 → **独立写手**修订(主控不代笔)→ 复核,**最多 2 轮**(指审计阶段独立预算;前序的 v1→v2 主人洞察、v2→v3 批判反馈不计入),仍不过走 Acknowledged Limitations 模式诚实交付。事实类错误(P1-D)由主控 T8 亲修慢活快改,结构性错误(P1-A/B/C)必须重启独立写手。
69
71
 
70
- 终检前主控跑 **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`**):
71
73
 
72
74
  - **M-Form 11 项**:引用标注完整性 / 文末四节存在性 / 临时编号残留 / 角色元数据泄露 / 过程语言残留 / 信任级别标注完整性 / 文末节标题白名单纯净 / 三角验证覆盖率 / **图件闭环([图N] ↔ final/图件/ ↔ 图上数字,v2.5.2-dsh.16 加)** / **索引段完整性(索引 ↔ 正文条目,v2.5.2-dsh.17 加)** / **素材按需加载闭环(正文引用 ⊆ 加载留痕,v2.5.2-dsh.17 加)**;
73
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 加)**;
@@ -89,13 +91,13 @@ Phase 1 一次性并行派出 **T1 文献 ∥ T2 数据 ∥ T3 案例** 三个
89
91
 
90
92
  - **v2.3.0 角色编号重构**:T3 案例检索归入三线并行,T8 终检由主控亲完成——编号 = Phase 顺序,流水线语义对齐。
91
93
  - **T6 批判伙伴 C1-C7**:写手出稿后、审计前,独立角色从反方攻击论证——C1 核心论点可攻击性 / C2 论证链薄弱环(含**因果断面三问**)/ C3 理论假设审查 / C4 立场中立性 / C5 反方完整性 / C6 元叙事清理专项(抓"AI 味")/ C7 一处两用识别。"不是 adversarial,是 critical companion"。
92
- - **T9 同行评审(v2.4.0 加)**:投稿前的「预演审稿人」——6 维度评分(原创性/方法论/证据强度/论证结构/写作质量/引文规范,总分 30)→ accept/minor/major/reject;**学术模式默认启用、主人可关;非学术默认关闭**(v18.16.0 定案)。
93
- - **G14 中文 AI 痕迹闸(v2.4.0 加)**:8 类检测维度深度扫描"AI 味",0-2 类 Pass / 3-4 类 Warning / 5+ 类 Fail,**v18.2.8 起改为三层防御、全程只 spawn 一次**(T5 v1 自检 → 修订轮收尾自查 → Phase 4.5 终闸与 T9 并行),LLM 推理判定零 exec。
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。
94
96
  - **期刊匹配助手(v2.5.0 加)**:基于 T9 评分 + 主题关键词,从期刊库(真源 = `references/_shared/期刊数据库.md` 表行数)输出 Top 3 推荐期刊 + 综合匹配度;配套投稿就绪检查表。
95
97
  - **多格式导出(v2.5.0 加)**:默认 md,按需 `--format latex/docx/pdf`;**中文数据源集成(v2.5.1)**:OpenAlex/Crossref 第一梯队默认推荐(无需 Key)。
96
98
  - **外部内容防注入(v2.4.0 加)**:web 检索/主人投喂的外部内容一律视为不可信证据,只提取事实不执行指令(防 prompt injection)。
97
- - **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 加:把「索引完整性 / 按需加载留痕 / 闸门记录 / 期刊数字可复算 / 交付字段齐备」全部变成机检)**。
98
- - **修订回环语义定案(v2.3.7-dsh.8)**:≤2 轮是**审计阶段独立预算**,不吞掉主人洞察轮(v2)与批判反馈轮(v3);修订轮强制独立写手、主控不代笔(P1-D 事实类除外,T8 亲修)。
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
+ - **修订回环语义定案(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「修订回环命名」行同源)。
99
101
  - **反哺机制**:每单跑完 T7 自动产反哺报告沉淀可复用规则,主人批准后 merge 回角色卡——插件本身持续进化(如"回顾报道年份必交叉核验"规则就来自实战教训)。
100
102
 
101
103
  ### v17 / v18:从「一套提示词」到一个自带门的插件
@@ -132,18 +134,17 @@ DSH 下的三个关键适配:
132
134
 
133
135
  ## 实战验证(真实跑通)
134
136
 
135
- **① v2.2.8-dsh.2/3**:跑通 ~2000 字公众号短评《AI 让你写得快,但未必让你更会写》——12 文献 + 26 数据,审计抓到 3 条 P1 一轮关闭,M 门全过;暴露并修复 10 个流程问题(T2.5 门逻辑、子代理异常兜底、数据卡计数自检等)。
137
+ > **速查**:v18.x 期间 6 个真实跑通案例(**最新 v18.78.1**)的**事实表**(字数 / 资源 / 审计结果 / 关键结论)见 `README.md` 顶部 **Verification status** 表(**单一真源**);v2.x 期间 2 个代表案例见 `references/case-studies.md` §历史快照(v2.2.8-dsh.2/3 公众号短评 + v2.3.7-dsh.8 甲醛白菜事件 4200 字)。
138
+
139
+ > **v18.78.1 落地批(2026-10-06)**:本批 bump 包含 21 处点位同步 + docs/quick-facts.md 新增速查卡 + glossary §12.1 「三角验证 = 三角证据底座」合并声明 + §7.1 立规则 ㉜ 落地(CHANGELOG ↔ introduction §实战验证段对账;WAIVER=实战滞后 豁免)+ 5 语 README 双文档互引 + 实战案例段压缩 + §7.5 文档归档机制声明(刻意不建 archive 目录)。完整审计批 = `audits/论衡插件文档全量审计-v18.78.0.md`;决策路由 = `audits/决策-2026-10-06-文档全量审计-v18.78.0-修订路由-续.md`。
140
+ >
141
+ > **本节只点两段最具代表性的实战**——一段 v2.x「教学案例」、一段 v18.x「科研案例」,展示流水线真实产出形态。完整案例清单 + 教训沉淀见上面指针。
136
142
 
137
- **② v2.3.7-dsh.8 全流程(2026-08,甲醛白菜事件)**:~4200 字公众号深度长文,主题为实时食品安全事件(2026-08-22 康保县甲醛白菜曝光):
143
+ **① v2.3.7-dsh.8 全流程(2026-08,甲醛白菜事件)**:~4200 字公众号深度长文,主题为实时食品安全事件(2026-08-22 康保县甲醛白菜曝光)——12 文献 + 8 先行者 / 29 数据 / 4 案例;三角验证 5 核心论点全部 [L]+[D]+[C] 三齐;T6 批判抓到「剂量层数量级断言与天然本底 1-90 mg/kg 冲突」P0 → 写手加固 4 处;T7 审计两轮(首轮打回 3 项 P1-D,主控 T8 亲修全关);**M 门 25 项全过 exit 0**;沉淀 6 条可复用规则(含「回顾报道年份必交叉核验」)。**教学意义**:流水线最难的「实时突发事件 + 高时效数据」跑通的全流程案例——三角验证 + 反方论证 + 审计打回修订三件套的协同。完整字段与产物路径见 `references/case-studies.md` §甲醛白菜。
138
144
 
139
- - **检索**:12 文献(WHO/IARC/EPA 毒理文献 + Lancet/Food Control 学术研究)+ 8 先行者 / 29 数据 / 4 案例(康保 2026、广州 2012、毒牛百叶判例、毒生姜 2013);
140
- - **三角验证**:5 核心论点全部 [L]+[D]+[C] 三齐;
141
- - **T6 批判 C1-C7**:5 论点可攻击性 高 2/中 2/低 1,抓到「剂量层数量级断言与天然本底 1-90 mg/kg 冲突」的逻辑断裂(P0 级修订项)→ 写手按批判清单加固 4 处;
142
- - **T7 审计两轮**:第 1 轮打回 3 项 P1-D(回顾报道年份跨源冲突、口径说明被当官方原文、AI 声明内部代号泄漏)→ 主控 T8 亲修全关 → 第 2 轮通过;
143
- - **M 门 25 项全过 exit 0**,交付定稿 + 证据包 8 文件 + M-Gate-Report + 交付说明;
144
- - **反哺**:沉淀 6 条可复用规则(含"回顾报道年份必交叉核验"),主人批准后 merge 回 T0/T2/T5 角色卡 + 教训 #142-#144 写入教训库。
145
+ **② v18.x 期间实战(详见 README Verification status 表)**:6 个真实跑通案例覆盖 2026-08 ~ 2026-09 期间,类型从公众号短评(~2000 字)到学术深度文(~12000 字)均有,含「甲醛白菜 ~4200 字」与「Notion vs. idea 哲学论文 ~6280 字」两个具代表性案例。**⚠️ 历史口径声明**:「修订轮」数 = 该 run 的全部写手轮次(含 Phase 3.5 洞察 → v2、批判/T6 修订、G14 轮、审计打回);**Phase 4.2 审计打回 ≤2 轮是子集上限**——两者量纲不同,不可混读;**v18.18.x 起跑通的产物再用当前脚本重跑**会因 M 门新增项(如 M-Form-9/10/11、M-Exist-7)报历史 P0,**视为历史快照、不为交付参考**。
145
146
 
146
- 全程零编造、引用闭环 47↔47、[D14] 数据缺口按纪律零引用、低信任数据全程限定词、科学边界诚实(致癌性/天然本底/经口证据并列呈现)。
147
+ > **定位增强(v18.78.0 §7.2 双文档互引落地)**:本节「② v18.x 期间实战」指向的 README 验证表具体行号锚点(**单一真源 README.md L195-200**)——Generative-AI 学生写作 ~2000 字 / Formaldehyde cabbage ~4200 字 / Notion vs. idea ~6280 字 等案例的「字数 / 资源 / 关键结论」三字段对应 L195-200 表格行;逐字段对账请用锚点跳转。
147
148
 
148
149
  ---
149
150
 
@@ -169,6 +170,15 @@ dsh plugin --profile web add lunheng-article-pipeline
169
170
 
170
171
  | 版本 | 内容 |
171
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` |
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-问题记录 |
175
+ | **v18.77.1** | 维护性微调 + 字数渲染链路对齐;与 v18.78.0 同批合发(CHANGELOG §18.78.0 段详述) |
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 句式瘦身 |
177
+ | **v18.76.0** | **v18.75.1 全量架构审计落地批**:R1 [🔴 P0] H2 监听器真宿主下整体静默失效修复(命中摘要改走 `decision.additionalContexts`,结构化 `ethicsSanitized` 仍挂返回值)/ R2 [🟠] 删除 H7 `agent/request` 监听器(payload 缺判别键恒空转)/ R3 [🟠] host-contract-probe.mjs 产物探针落地 + `ci.yml` 挂 `lockfile-frozen` 作业 / R4 [🟡] lunheng_ethics_sanitize render 不打印原文 / R5 Q4 Q6 顺带(publish.yml no-write-check 包裹 + STRICT_WARN=1);新增一致性规则 ㉚(lib/** 剥注释后不得出现当前包版本字面量) |
178
+ | **v18.75.1** | **字体栈批**(F-19 结案):模板字体栈由「`apple-system` / `PingFang SC` / `Noto Serif CJK SC` / `Source Han Serif SC` / serif」(本机 4 个全落空)改为「`Source Han Serif SC` / `Noto Serif CJK SC` / `STZhongsong` / `STSong` / `SimSun` / serif」;`md2html.mjs` 正文栈同步同源,**图件与正文实际生效族一致**;`operations.md` §图件字体栈整节重写 |
179
+ | **v18.75.0** | **相位与修订环口径统一批**(主人 2026-10-04 批准):① **新立 G 环**(G14 终闸 Warning/Fail 的修订**不占 A 轨 ≤2 轮、也不占 B 轨至多 +1**;3-4 类 → 1 轮 / 5+ 类 → 2 轮,主控裁定,收敛条件 = 重跑 G14 至 Pass;第 2 轮仍 Fail → 报告主人手工润色,不得以 Acknowledged Limitations 放行);② **相位重排**:G14 提为 **Phase 4.6(串行、唯一一次 spawn)**、T9 落到 **Phase 4.7**、**Phase 5 = T8(在 T9 之后)**;③ **文类分档**(`academic-*` 必选不可关 / `lit-review` 可选 / 其余「默认选中」→「默认不选」);④ **判定时点后移**到「各来源全部出结论之后、T8 终检之前」 |
180
+ | **v18.66.0 – v18.74.0** | 中段微调批:`cite-format.mjs` 落地 / `journal-fit.mjs` 反向工程 / `quality-score.mjs` 合规分 / `_lib/svg.mjs` `checkGrid` 网格自检 / `refresh-gates.mjs` 指纹刷新 / `apply-diff.mjs` 段级 diff / `disproofs-check.mjs` 负知识账本 / `self-check.mjs` 随包完整性自检 / 中文 AI 痕迹闸全套修复 |
181
+ | **v18.61.0 – v18.65.0** | DSH 能力面扩展:H1 工具并发 / H2 材料自动脱敏(伦理脱敏 v18.60.1 落地)/ H4 prompt 追加 / H6 三档模型路由;`M-Exist-5/6/7/8/9/10/11` 与 `M-Fact-1` 逐项落地;`handoff-check.mjs` exit `20/21/22` 收报验收独立命名空间 |
172
182
  | **v18.18.x** | 第二轮外部独立全量审计(56 项 · 六家族)机械化收口:文档事实绑结构真源、随包脚本执行面清单从源码派生、退出码静态解析收紧、扫描集纳入未跟踪文件、禁止裸行号引用改按符号引用、CHANGELOG 版本段结构门 ⑬(抓「版本段被合并」)|
173
183
  | **v18.13.0 – v18.16.0** | 跨梯队「仍未做」清单最终清算(28 项逐条回代码实测)/修 CI 抓出的 `.bak` 回收 flaky/「差集 + 反向核验」固化为收口批固定动作/门与守卫自身可信度收口(A 批)+ 对外声明与发布面收口(B 批)|
174
184
  | **v18.11.0 – v18.12.3** | 全量审计 68 项八梯队收口(写盘安全 / 门自身可信度 / 口径收口 / 围栏感知 / 合规稿可达)+ 反哺报告 v1+v2 十八条处置;`md2html` 被拒改 `exit 40`;`M-Exist-5` 判战略门留痕、`M-Exist-2` 复算证据包 `manifest.json`(sha256);CI 转绿(`ci.yml` 的 dsh pin 升到 `0.1.7-rc.2`)|
@@ -196,11 +206,34 @@ dsh plugin --profile web add lunheng-article-pipeline
196
206
  ## 获取方式
197
207
 
198
208
  - **GitHub(DSH bundle)**:https://github.com/zuoyunlai/lunheng-article-pipeline-dsh
199
- - **npm**:`lunheng-article-pipeline@dsh`(dist-tag `dsh` = 最新 DSH 迭代版);锁定具体版本可写 `@18.78.0`
209
+ - **npm**:`lunheng-article-pipeline@dsh`(dist-tag `dsh` = 最新 DSH 迭代版);锁定具体版本可写 `@18.78.2`
200
210
  - **历史版本线(独立化前)**:https://github.com/zuoyunlai/lunheng-article-pipeline
201
211
 
202
212
  ---
203
213
 
214
+ ## 📋 版本元信息(v18.78.1 文档全量审计落地标记)
215
+
216
+ > **本节由 2026-10-06 文档全量审计批新增**——为新人首屏提供文档-真源-决策档的快速锚点。
217
+ >
218
+ > **本档锚定 = v18.78.1**(`package.json#version`);**文档-代码同步 = ✅**(`consistency-check.mjs` exit 0,含 v18.78.0 §7.1 立项的 ㉜ 新门——CHANGELOG ↔ introduction §实战验证段对账)。
219
+
220
+ | 项 | 单一真源 | 本档章节指针 |
221
+ |---|---|---|
222
+ | 硬数字(版本 / 角色 / 阶段 / 闸门 / 脚本 / 命令 / 退出码族) | [`docs/quick-facts.md`](quick-facts.md) | §实战验证段 / §核心设计 / §M 门段 |
223
+ | 概念(9 角色 / 三环制 / G 清单 / F 模式 / 三角验证 等) | [`skills/lunheng-article-pipeline/references/glossary.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/glossary.md) | §修订回环段 / §独立审计闭环 / §能力演进段 |
224
+ | 流水线协议(Phase 0-5 + 派发话术) | [`skills/lunheng-article-pipeline/references/pipeline-readme.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/pipeline-readme.md) | §核心设计段 / §修订回环段 |
225
+ | M 门算法(25 项总 / 真源 / 复算) | [`skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm.md) | §独立审计闭环 / §M 门段 |
226
+ | T9 启用决策树(文类档案) | [`skills/lunheng-article-pipeline/references/_shared/文类档案.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/_shared/文类档案.md) | §能力演进段 |
227
+ | 排错(exit code / 闸门报错) | [`docs/troubleshooting.md`](troubleshooting.md) | §M 门段 / §独立审计闭环 |
228
+ | 实战案例(v18.x + 历史 v2.x) | [`README.md` 顶部 Verification status 表](../lunheng-article-pipeline-dsh/README.md) + [`skills/lunheng-article-pipeline/references/case-studies.md`](../lunheng-article-pipeline-dsh/skills/lunheng-article-pipeline/references/case-studies.md) | §实战验证段 |
229
+ | 五语 README(en/zh/es/pt/hi) | `README.md` / `README-zh.md` / `README-es.md` / `README-pt.md` / `README-hi.md`(顶部均含 🌐 语言切换器行) | §获取方式 + §实战验证段互引 |
230
+
231
+ > **本档变更机制**:按 AGENTS.md §机制文件写保护,本档属「**机制文件**」——agent 默认禁写;改进动议只写 `audits/反哺报告-vN.md`,由主人在 host shell 手工 apply。**v18.78.0 §7.1 立规则 ㉜** 已把「CHANGELOG 新段位 ↔ §实战验证段对账」机械化——后续主人 bump 章节时 ㉜ 会主动提示。
232
+ >
233
+ > **本批文档全量审计批落地路径**:审计报告 = `audits/论衡插件文档全量审计-v18.78.0.md`;决策路由(含 §7.1 规则 ㉜ 实现路径 + §7.5 归档判据)= `audits/决策-2026-10-06-文档全量审计-v18.78.0-修订路由-续.md`。
234
+
235
+ ---
236
+
204
237
  ## 结语
205
238
 
206
239
  论衡把「写一篇好文章」这件看似靠才华的事,拆解成了一套**可复制、可审计、可交接**的工程流程:证据底座防幻觉,三角验证防堆砌,反方论证防单边,先行者检索防重复,批判伙伴磨论证,独立审计防质量漂移,M 门机械终检防侥幸,人在环防跑偏。
@@ -1,6 +1,6 @@
1
1
  # 故障排查(troubleshooting)
2
2
 
3
- > 版本:v18.78.0(DSH 原生插件;发布日期见 CHANGELOG 对应版本段——**此处刻意不写死日期**。v18.62.4 更正:旧文写「发布于 2026-09-25」而该版本段实际为 2026-10-01,且日期点位无任何机检覆盖)
3
+ > 版本:v18.78.2(DSH 原生插件;发布日期见 CHANGELOG 对应版本段——**此处刻意不写死日期**。v18.62.4 更正:旧文写「发布于 2026-09-25」而该版本段实际为 2026-10-01,且日期点位无任何机检覆盖)
4
4
 
5
5
  安装/验证失败时按「症状 → 原因 → 处置」对照。
6
6
 
@@ -182,7 +182,7 @@ node --test "tests/**/*.test.mjs" # 随包脚
182
182
 
183
183
  ## 16. 新增机检项报了错怎么看(M-Form-10/11 与 M-Exist-5/6/7,v2.5.2-dsh.17)
184
184
 
185
- M 门现为 **24 项**(**机械 24 项**由 `scripts/m-gate-check.mjs` 判定:M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 + M-Fact-1 佐证;另 **1 项主控人工门** M-Integrity-2)。脚本实测 `total = 23`。v2.5.2-dsh.17 新增 4 项,报错含义与修法:
185
+ **机检 24 项**(M-Form 1-11 + M-Exist 1-11 + M-Integrity-1 + M-Fact-1 佐证;由 `scripts/m-gate-check.mjs` 判定,**脚本实测 `total = 24`**)+ **人工 1 项** M-Integrity-2(跨文件判断,T8 亲做)= **M 门总 25 项**。v18.61.1 口径收口,v2.5.2-dsh.17 新增 4 项,报错含义与修法:
186
186
 
187
187
  | 项 | 报错样例 | 含义与修法 |
188
188
  |---|---|---|
@@ -206,7 +206,7 @@ M 门现为 **24 项**(**机械 24 项**由 `scripts/m-gate-check.mjs` 判定
206
206
  | **M-Exist-10** 大纲 §11 精简段 | `大纲缺「写手版精简段」标题` | T4 按 `templates/…` 在本文件**末尾**写 §11;缺标题时 T5 只能回退整读大纲(50K 上下文) |
207
207
  | | `缺 4 个要素:反方规划要点,字数预算,禁做项,承重墙清单` | §11 六要素:论证主线 / 论点-论据映射表 / 反方规划要点 / 字数预算(含数字)/ 禁做项 / 承重墙清单;缺 ≥3 → P0 |
208
208
  | | `未见「论点-论据映射表」真表格` | 映射表要真表格(表头含「论点」+ 行内含素材编号),不能只写「论点 → 论据」 |
209
- | **M-Exist-6** 审稿建议(v2.5.2-dsh.17 加) | `1/1 条建议无定位` | T9 的「给作者的具体修改建议」每条都要带 `§章节` / 段落 / 行号 / 素材编号,否则 T5 无法照做 |
209
+ | **M-Exist-6 子检查:建议定位性**(v2.5.2-dsh.17 起收在 M-Exist-6 函数内,**非独立 gate**) | `1/1 条建议无定位` | T9 的「给作者的具体修改建议」每条都要带 `§章节` / 段落 / 行号 / 素材编号,否则 T5 无法照做 |
210
210
  | | `修订说明未提及审稿意见` | 发生过修订轮就必须在 `drafts/修订说明-vN.md` 里回应审稿意见(防「建议提了没人接」) |
211
211
 
212
212
  - **触发条件**:M-Form-11 / M-Exist-7 在对应产物缺失时记 **N/A(不算失败)**;M-Exist-5 仅在项目已进入 Phase 4(有 `audits/审计报告-vN.md`)时才硬判;M-Exist-6 仅在存在审稿报告时才判——**不会因为「没启用 T9」而判 M 门不过**。
package/docs/usage.md CHANGED
@@ -13,8 +13,8 @@
13
13
  | 3 写作 | T5 写手 | `drafts/初稿-v1.md` |
14
14
  | 3.6 批判 | T6 批判伙伴(C1-C7 反方攻击,轻量档可跳过) | `analysis/批判报告-vN.md` |
15
15
  | 4 审计 | T7 审计员(G0-G14,只审不改) | `audits/审计报告-vN.md` |
16
- | 4.2 修订 | 写手修订 ≤2 轮(独立写手执行) | `修订说明` + `v2/v3` |
17
- | 4.5 审稿 | T9 同行评审(可选,学术/行业分析默认开)+ G14 中文 AI 痕迹闸 | `audits/审稿报告-vN.md` + `G14-检测报告-vN.md` |
16
+ | 4.2 修订(A 轨 ≤2 轮 + B 轨 至多 +1 + G 环 1-2 轮) | 写手修订 ≤2 轮(独立写手执行);G14 终闸 Warning/Fail 触发 G 环独立修订;详见 `references/glossary.md` §修订回环三环制 | `修订说明` + `v2/v3` |
17
+ | 4.5 审稿 | T9 同行评审(启用按 `references/_shared/文类档案.md`:`academic-cn`/`-hum`/`-case` 必选不可关;`lit-review` 可选;其余默认不选)+ G14 中文 AI 痕迹闸 | `audits/审稿报告-vN.md` + `G14-检测报告-vN.md` |
18
18
  | 5 终检 | 主控 M 门终检(T7.5 完整性门通过后;M-Form 11 / M-Exist 11 / M-Integrity 2 / M-Fact 1) | `final/定稿.md` + 图件 + 证据包 + 交付说明 |
19
19
 
20
20
  ## 项目目录结构
@@ -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.0
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 起:不设任何变量 = 三档行**根本不装载**(不再是「装载但全继承」)
@@ -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
- counts.place++
234
- // strict 泛化到上级;**省级本身保持原样**——省级粒度不足以识别个体,
236
+ // strict 泛化到上级;**省级本身保持原样**(有意设计)——省级粒度不足以识别个体,
235
237
  // 替换成「广东某地」是制造假精度(真实数据是「广东省」而非「广东省的某地」)。
236
238
  const final = mode !== 'strict' ? '[地名-REDACTED]' : (parent === m ? m : `${parent}某地`)
237
- if (replacements.length < maxList) replacements.push({ type: 'place', label: '地名', from: m, to: final })
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