lunheng-article-pipeline 18.2.4 → 18.2.6

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 (84) hide show
  1. package/README.es.md +15 -12
  2. package/README.hi.md +15 -12
  3. package/README.md +16 -13
  4. package/README.pt.md +15 -12
  5. package/README.zh.md +16 -13
  6. package/SECURITY.md +10 -6
  7. package/cordis.patch.yml +25 -6
  8. package/docs/faq.md +4 -2
  9. package/docs/installation.md +35 -2
  10. package/docs/introduction.md +6 -6
  11. package/docs/troubleshooting.md +8 -6
  12. package/docs/usage.md +4 -3
  13. package/examples/preset/README.md +29 -22
  14. package/examples/preset/preset.yml +1 -1
  15. package/lib/commands.js +12 -4
  16. package/lib/guard.js +170 -33
  17. package/lib/index.js +141 -21
  18. package/lib/tools.js +76 -20
  19. package/package.json +9 -3
  20. package/skills/lunheng-article-pipeline/AGENTS.md +16 -14
  21. package/skills/lunheng-article-pipeline/QUICKSTART.md +6 -6
  22. package/skills/lunheng-article-pipeline/README.md +2 -2
  23. package/skills/lunheng-article-pipeline/SKILL.md +19 -17
  24. package/skills/lunheng-article-pipeline/references/_shared/DSH-/351/233/206/346/210/220/346/226/271/346/241/210.md +11 -7
  25. package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm-appendix.md +109 -125
  26. package/skills/lunheng-article-pipeline/references/_shared/M-Gate-Algorithm.md +26 -26
  27. package/skills/lunheng-article-pipeline/references/_shared/audit-checklist-quickref.md +2 -2
  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/255/227/346/225/260/345/210/244/345/256/232/350/241/250.md +7 -2
  33. 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
  34. package/skills/lunheng-article-pipeline/references/_shared//346/234/237/345/210/212/346/225/260/346/215/256/345/272/223.md +1 -1
  35. package/skills/lunheng-article-pipeline/references/_shared//346/234/272/346/243/200/347/241/254/346/240/274/345/274/217.md +3 -0
  36. package/skills/lunheng-article-pipeline/references/_shared//346/250/241/345/236/213/350/267/257/347/224/261.md +1 -1
  37. 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 +12 -5
  38. package/skills/lunheng-article-pipeline/references/agents/00-/344/270/273/346/216/247-coordinator.md +2 -2
  39. 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 +4 -4
  40. 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
  41. 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
  42. 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
  43. package/skills/lunheng-article-pipeline/references/agents/04-/345/210/206/346/236/220-analyst.md +4 -1
  44. package/skills/lunheng-article-pipeline/references/agents/05-/345/206/231/344/275/234-writer.md +18 -6
  45. package/skills/lunheng-article-pipeline/references/agents/06-/346/211/271/345/210/244-critical-companion.md +3 -3
  46. package/skills/lunheng-article-pipeline/references/agents/07-/345/256/241/350/256/241-auditor.md +1 -1
  47. package/skills/lunheng-article-pipeline/references/agents/08-/347/273/210/346/243/200-finalizer.md +3 -3
  48. package/skills/lunheng-article-pipeline/references/agents/09-/345/256/241/347/250/277-peer-reviewer.md +4 -4
  49. package/skills/lunheng-article-pipeline/references/checkers//344/270/255/346/226/207AI/347/227/225/350/277/271-checker.md +22 -9
  50. package/skills/lunheng-article-pipeline/references/deliverables.md +5 -7
  51. package/skills/lunheng-article-pipeline/references/gates/14-/344/270/255/346/226/207AI/347/227/225/350/277/271-gate.md +12 -6
  52. package/skills/lunheng-article-pipeline/references/glossary.md +6 -4
  53. package/skills/lunheng-article-pipeline/references/pipeline-readme.md +20 -11
  54. package/skills/lunheng-article-pipeline/references/templates/AI-/344/275/277/347/224/250/345/243/260/346/230/216-template.md +1 -1
  55. package/skills/lunheng-article-pipeline/references/templates/G14/346/243/200/346/265/213/346/212/245/345/221/212-template.md +1 -1
  56. package/skills/lunheng-article-pipeline/references/templates/status-template-lite.md +2 -0
  57. package/skills/lunheng-article-pipeline/references/templates/status-template.md +4 -4
  58. package/skills/lunheng-article-pipeline/references/templates/style-baseline-template.md +1 -1
  59. 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
  60. package/skills/lunheng-article-pipeline/references/templates//344/270/273/344/272/272/347/241/256/350/256/244-template.md +1 -1
  61. package/skills/lunheng-article-pipeline/references/templates//344/272/244/344/273/230/350/257/264/346/230/216-template.md +10 -3
  62. package/skills/lunheng-article-pipeline/references/templates//344/273/273/345/212/241/347/256/200/346/212/245-template.md +1 -1
  63. package/skills/lunheng-article-pipeline/references/templates//344/277/256/350/256/242/350/257/264/346/230/216-template-full.md +1 -1
  64. package/skills/lunheng-article-pipeline/references/templates//345/261/200/351/231/220/346/200/247-template.md +2 -2
  65. 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
  66. 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
  67. 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
  68. 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
  69. package/skills/lunheng-article-pipeline/references/templates//351/227/270/351/227/250/350/256/260/345/275/225-template.md +7 -3
  70. package/skills/lunheng-article-pipeline/scripts/_lib/cli-args.mjs +90 -0
  71. package/skills/lunheng-article-pipeline/scripts/_lib/destructive-write.mjs +122 -0
  72. package/skills/lunheng-article-pipeline/scripts/_lib/han.mjs +12 -3
  73. package/skills/lunheng-article-pipeline/scripts/_lib/sections.mjs +76 -0
  74. package/skills/lunheng-article-pipeline/scripts/_lib/trust.mjs +42 -6
  75. package/skills/lunheng-article-pipeline/scripts/apply-diff.mjs +266 -0
  76. package/skills/lunheng-article-pipeline/scripts/build-evidence-bundle.mjs +102 -20
  77. package/skills/lunheng-article-pipeline/scripts/consistency-check.mjs +226 -25
  78. package/skills/lunheng-article-pipeline/scripts/count-chars.mjs +37 -30
  79. package/skills/lunheng-article-pipeline/scripts/final-check.mjs +56 -5
  80. package/skills/lunheng-article-pipeline/scripts/m-gate-check.mjs +376 -51
  81. package/skills/lunheng-article-pipeline/scripts/md2html.mjs +44 -5
  82. package/skills/lunheng-article-pipeline/scripts/normalize-trust-level.mjs +12 -1
  83. package/skills/lunheng-article-pipeline/scripts/token-cost.mjs +27 -0
  84. package/docs/token-optimization-plan.md +0 -128
package/README.es.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lunheng (lunheng-article-pipeline) — pipeline multiagente para textos largos
2
2
 
3
- > 版本:v18.2.4(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
3
+ > 版本:v18.2.6(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
 
@@ -41,6 +41,7 @@ Regla práctica: pregunte si la evidencia ya está **publicada**. Si lo está, L
41
41
  | Borradores | Versiones sucesivas con limpieza de huellas de IA, cada una de un redactor independiente |
42
42
  | Informes | Informe crítico (C1–C7), auditoría (G0–G14), revisión por pares (6 dimensiones + revistas) |
43
43
  | Entregables finales | `final/定稿.md`, figuras, paquete probatorio, notas de entrega, informe de la puerta M |
44
+ | Integración con DSH (instalación como bundle) | Dos herramientas **de solo lectura**: `lunheng_m_gate` (precomprobación mecánica de la puerta M) y `lunheng_char_count` (recuento de caracteres chinos); si su sesión no las expone, invoque los mismos scripts con `pwsh` como antes (misma fuente de verdad). Comando humano `/lunheng-status` (lee `run/<proyecto>/status.md`; no genera mensajes de modelo). **Protección de escritura de los archivos de mecanismo**: un guard global rechaza las llamadas de herramientas tipo `write`/`edit` dirigidas al paquete de la skill, de modo que una sesión no puede reescribir en silencio las reglas de la propia pipeline. Límite declarado sin adornos: el guard solo ve **llamadas de herramientas**; `pwsh` y cualquier subproceso **no pasan por esta puerta**; la excepción del propietario es `LUNHENG_ALLOW_MECH_EDIT=1` (o `config: { allowMechanismEdit: true }`). El **Config** del plugin (interruptor de despliegue, en la fila de este plugin de su perfil) cubre `quiet`, `allowMechanismEdit`, `scriptTimeoutMs` y `scriptMaxOutputBytes` — las mismas palancas que las variables `LUNHENG_QUIET` / `LUNHENG_ALLOW_MECH_EDIT`, pero versionadas con el perfil y revisables; una **config inválida falla ruidosamente en la carga** en lugar de volver en silencio a los valores por defecto. |
44
45
 
45
46
  ## Pipeline overview
46
47
 
@@ -67,16 +68,16 @@ Fase 5 Verificación T8 (lo ejecuta el coordinador) → texto final, paquete p
67
68
  ```text
68
69
  lunheng-article-pipeline/ # el paquete es el repositorio
69
70
  ├── package.json # declara main (lib/index.js) + dsh.bundle.patch
70
- ├── cordis.patch.yml # capa bundle: inserta las 3 herramientas subagent por nivel
71
- ├── lib/index.js # entrada del plugin: registra la skill vía ctx.skills
71
+ ├── cordis.patch.yml # capa bundle: fila de autorregistro + 3 herramientas subagent por nivel (solo se montan si define LUNHENG_*)
72
+ ├── lib/index.js # entrada del plugin: skill + herramientas de solo lectura + guard de escritura + /lunheng-status
72
73
  ├── skills/lunheng-article-pipeline/ # el cuerpo de la skill (un directorio)
73
74
  │ ├── SKILL.md # entrada de la skill (roles, puertas, límites de ejecución)
74
75
  │ ├── AGENTS.md # manual del operador
75
76
  │ ├── QUICKSTART.md # inicio en cinco minutos
76
77
  │ ├── README.md # readme de la skill (chino)
77
78
  │ ├── references/ # 9 fichas de rol, plantillas, algoritmos de puerta, base de revistas
78
- │ └── scripts/ # 11 scripts .mjs de verificación sin dependencias
79
- ├── scripts/ # puertas del repositorio: superficie de empaquetado + higiene
79
+ │ └── scripts/ # scripts .mjs de verificación sin dependencias (recuento: véase la línea de lista blanca de la skill)
80
+ ├── scripts/ # puertas del repositorio: superficie de empaquetado + higiene + humo del paquete
80
81
  ├── tests/ # suites node --test (scripts + humo de la entrada)
81
82
  ├── docs/ # instalación, uso, arquitectura, faq, resolución de problemas
82
83
  ├── examples/preset/ # notas de niveles de modelo y guía de instalación
@@ -87,7 +88,7 @@ lunheng-article-pipeline/ # el paquete es el repositorio
87
88
 
88
89
  La entrada del plugin registra `skills/lunheng-article-pipeline/SKILL.md` como skill con `resourceBase` apuntando a ese directorio, de modo que `references/**` y `scripts/**` se resuelven relativos a él desde cualquier directorio de trabajo.
89
90
 
90
- La capa patch hace dos cosas: **inserta una fila para este paquete** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — esa fila es la que hace que el loader importe `lib/index.js`, que es lo que registra la skill — e inserta las tres herramientas subagent por nivel. **Esa fila es portante**: sin ella la entrada nunca se importa y la skill no aparece (defecto de v18.0.0, corregido en 18.0.1; vigilado por `tests/bundle-contract.test.mjs`).
91
+ La capa patch hace dos cosas: **inserta una fila para este paquete** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — esa fila es la que hace que el loader importe `lib/index.js`, que es lo que registra la skill — e inserta las tres herramientas subagent por nivel, que **no se montan por defecto** (defina cualquier `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_{PROVIDER,MODEL}` o `LUNHENG_TIERING=on` para montarlas; `off` para forzar que no se monten). **Esa fila es portante**: sin ella la entrada nunca se importa y la skill no aparece (defecto de v18.0.0, corregido en 18.0.1; vigilado por `tests/bundle-contract.test.mjs`).
91
92
 
92
93
  ### Documentation
93
94
 
@@ -108,14 +109,14 @@ La capa patch hace dos cosas: **inserta una fila para este paquete** (`- id: lun
108
109
  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).
109
110
 
110
111
  ```sh
111
- git tag v18.2.4 && git push origin v18.2.4 # un tag por push (GitHub: >3 tags en un push no dispara workflow)
112
+ git tag v18.2.6 && git push origin v18.2.6 # un tag por push (GitHub: >3 tags en un push no dispara workflow)
112
113
  # publish.yml ejecuta: puerta 1 consistencia → puerta 2 empaquetado → puerta 3 higiene → puerta 4 humo del paquete → tests
113
114
  # → tag/versión iguales → guarda de idempotencia → OIDC publish --provenance --tag dsh → auditoría posterior
114
115
  ```
115
116
 
116
117
  ## Install
117
118
 
118
- **Como bundle** (recomendado; la entrada registra la skill y la capa patch activa los niveles):
119
+ **Como bundle** (recomendado; la entrada registra la skill + las capacidades del grupo C, y la capa patch *puede* montar las herramientas por nivel — **desactivadas por defecto**, véase [Model routing](#model-routing)):
119
120
 
120
121
  ```sh
121
122
  dsh plugin --profile web add lunheng-article-pipeline
@@ -149,11 +150,11 @@ Un directorio simple no declara `dsh.bundle`, así que `dsh plugin add` solo lo
149
150
  dsh plugin --profile <profile> remove lunheng-article-pipeline
150
151
  ```
151
152
 
152
- Al desinstalar desaparecen las 3 filas `- insert:` y la skill registrada por la entrada, sin residuos. Si además copió el directorio de la skill en una raíz de skills, bórrelo aparte.
153
+ Al desinstalar desaparecen las 4 filas `- insert:` (la de autorregistro y las tres de nivel) y la skill registrada por la entrada, sin residuos. Si además copió el directorio de la skill en una raíz de skills, bórrelo aparte.
153
154
 
154
155
  ## Model routing
155
156
 
156
- DSH enruta modelos mediante `settings.yaml`; `subagent` hereda el modelo de la sesión, de modo que una configuración de un solo modelo funciona sin ajustes. Para escalonar por rol, el bundle instala tres herramientas por nivel:
157
+ DSH enruta modelos mediante `settings.yaml`; `subagent` hereda el modelo de la sesión, de modo que una configuración de un solo modelo funciona sin ajustes. Para escalonar por rol, el bundle puede montar tres herramientas por nivel, **desactivadas por defecto** (mientras todos los niveles heredan son idénticas al `subagent` integrado, así que montarlas sin condición costaría tres esquemas de herramienta por sesión a cambio de nada):
157
158
 
158
159
  | Herramienta | Roles | Capacidad |
159
160
  |---|---|---|
@@ -161,7 +162,7 @@ DSH enruta modelos mediante `settings.yaml`; `subagent` hereda el modelo de la s
161
162
  | `subagent_strong` | T4 análisis / T5 redacción | Razonamiento fuerte |
162
163
  | `subagent_audit` | T6 crítica / T7 auditoría / T9 revisión / detector G14 | Máximo nivel, sin degradar por coste |
163
164
 
164
- Sobrescriba con `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` y `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL`: proveedor y modelo son campos independientes (cruzar proveedores exige ambos) y `LUNHENG_TIERING=off` devuelve los tres niveles a la herencia. Cuando una herramienta de nivel no está montada, el envío recae en `subagent`. Véase `examples/preset/README.md` y `docs/installation.md`.
165
+ Sobrescriba con `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` y `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL`: **definir cualquiera de ellas también monta las tres filas** (una configuración escalonada ya existente sigue funcionando igual). Proveedor y modelo son campos independientes (cruzar proveedores exige ambos); `LUNHENG_TIERING=on` monta las filas sin fijar ningún modelo (útil para comprobar que son visibles) y `LUNHENG_TIERING=off` devuelve los tres niveles a la herencia y las desmonta. Cuando una herramienta de nivel no está montada, el envío recae en el `subagent` integrado. Véase `examples/preset/README.md` y `docs/installation.md`.
165
166
 
166
167
  ## Data and external services
167
168
 
@@ -180,12 +181,14 @@ El coordinador debe divulgar estos envíos y obtener consentimiento explícito e
180
181
  | Artículo | Escala | Resultado |
181
182
  |---|---|---|
182
183
  | Consistencia de marca (2026-08) | ~7900 caracteres, 15 fuentes + 54 datos | Paquete probatorio; 8 hallazgos cerrados |
183
- | Paradoja de originalidad (2026-08) | ~9500 caracteres, 12 fuentes + 34 datos + 6 casos | 4 rondas de revisión, nota A-, publicado |
184
+ | Paradoja de originalidad (2026-08) | ~9500 caracteres, 12 fuentes + 34 datos + 6 casos | 4 rondas de revisión en total a lo largo de la ejecución, nota A-, publicado |
184
185
  | Aislamiento del campo docente (2026-08) | ~12000 caracteres, 18 fuentes + 47 datos + 9 casos | Auditoría ronda 2 aprobada |
185
186
  | Escritura estudiantil con IA generativa (2026-08) | ~2000 caracteres, 12 fuentes + 26 datos | Búsqueda triple paralela; puerta M exit 0 |
186
187
  | Caso de la col china con formaldehído (2026-08) | ~4200 caracteres, 12 fuentes + 29 datos + 4 casos | Puerta M exit 0; 6 reglas incorporadas |
187
188
  | Artículo sobre noción e idea (2026-09) | ~6280 caracteres, 18 fuentes + 15 datos, 0 casos | 2 rondas de auditoría, 23/30 revisión menor, P0 real = 0 |
188
189
 
190
+ > **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».
191
+
189
192
  ## Known limitations
190
193
 
191
194
  - **Prioridad del chino.** Prompts de rol, entregables, nombres de archivo y flujos están en chino por defecto.
package/README.hi.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # लुन्हेंग (lunheng-article-pipeline) — बहु-एजेंट दीर्घ-लेख पाइपलाइन
2
2
 
3
- > 版本:v18.2.4(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
3
+ > 版本:v18.2.6(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
 
@@ -41,6 +41,7 @@
41
41
  | प्रारूप | क्रमिक संस्करण, AI-चिह्न सफ़ाई सहित, प्रत्येक स्वतंत्र लेखक से |
42
42
  | रिपोर्ट | समालोचना (C1–C7), लेखा-परीक्षा (G0–G14), सहकर्मी समीक्षा (6 आयाम + पत्रिकाएँ) |
43
43
  | अंतिम उपज | `final/定稿.md`, चित्र, प्रमाण-पुंज, वितरण टिप्पणियाँ, M-द्वार रिपोर्ट |
44
+ | DSH एकीकरण (bundle स्थापना पर) | दो **केवल-पठन** उपकरण — `lunheng_m_gate` (M-द्वार यांत्रिक पूर्व-जाँच) और `lunheng_char_count` (शुद्ध चीनी अक्षर गणना); सूची में न हों तो पहले की तरह `pwsh` से वही स्क्रिप्ट चलाएँ (एक ही स्रोत)। मानव आदेश `/lunheng-status` (`run/<परियोजना>/status.md` पढ़ता है; मॉडल संदेश नहीं बनाता)। **तंत्र-फ़ाइल लेखन सुरक्षा**: वैश्विक guard स्किल पैकेज को लक्षित `write`/`edit` प्रकार की उपकरण-कॉल अस्वीकार करता है, अतः सत्र चुपचाप पाइपलाइन के अपने नियम नहीं बदल सकता। **सीमा स्पष्ट रूप से**: guard केवल **उपकरण-कॉल** देखता है — `pwsh`/उप-प्रक्रियाएँ **इस द्वार से नहीं गुज़रतीं**; स्वामी की छूट `LUNHENG_ALLOW_MECH_EDIT=1` (या `config: { allowMechanismEdit: true }`) है। प्लगइन **Config** (परिनियोजन स्विच, आपकी profile में इस प्लगइन की पंक्ति पर) `quiet`, `allowMechanismEdit`, `scriptTimeoutMs`, `scriptMaxOutputBytes` कवर करता है — वही नियंत्रण जो `LUNHENG_QUIET` / `LUNHENG_ALLOW_MECH_EDIT` env देते हैं, पर profile के साथ संस्करणित और समीक्षायोग्य; **अवैध config लोड के समय ज़ोरदार विफल होता है**, चुपचाप डिफ़ॉल्ट पर नहीं लौटता। |
44
45
 
45
46
  ## Pipeline overview
46
47
 
@@ -67,16 +68,16 @@
67
68
  ```text
68
69
  lunheng-article-pipeline/ # पैकेज ही रिपॉज़िटरी है
69
70
  ├── package.json # main (lib/index.js) + dsh.bundle.patch घोषित करता है
70
- ├── cordis.patch.yml # बंडल परत: 3 स्तरीय subagent उपकरण जोड़ती है
71
- ├── lib/index.js # प्लगइन प्रवेश: ctx.skills से स्किल पंजीकृत करता है
71
+ ├── cordis.patch.yml # बंडल परत: स्व-पंजीकरण पंक्ति + 3 स्तरीय subagent उपकरण (LUNHENG_* सेट होने पर ही लदते हैं)
72
+ ├── lib/index.js # प्लगइन प्रवेश: स्किल + केवल-पठन उपकरण + तंत्र-लेखन गार्ड + /lunheng-status
72
73
  ├── skills/lunheng-article-pipeline/ # स्किल का मुख्य भाग (एक निर्देशिका)
73
74
  │ ├── SKILL.md # स्किल प्रवेश (भूमिकाएँ, द्वार, निष्पादन सीमाएँ)
74
75
  │ ├── AGENTS.md # संचालक पुस्तिका
75
76
  │ ├── QUICKSTART.md # पाँच मिनट में आरंभ
76
77
  │ ├── README.md # स्किल-स्तरीय रीडमी (चीनी)
77
78
  │ ├── references/ # 9 भूमिका कार्ड, टेम्पलेट, द्वार-एल्गोरिद्म, पत्रिका-कोश
78
- │ └── scripts/ # 11 निर्भरता-रहित .mjs सत्यापन स्क्रिप्ट
79
- ├── scripts/ # रिपॉज़िटरी द्वार: पैकेजिंग सतह + यांत्रिक स्वच्छता
79
+ │ └── scripts/ # निर्भरता-रहित .mjs सत्यापन स्क्रिप्ट (संख्या: स्किल की श्वेतसूची पंक्ति देखें)
80
+ ├── scripts/ # रिपॉज़िटरी द्वार: पैकेजिंग सतह + यांत्रिक स्वच्छता + पैकेज स्मोक
80
81
  ├── tests/ # node --test सूट (स्क्रिप्ट + प्रवेश स्मोक)
81
82
  ├── docs/ # स्थापना, उपयोग, संरचना, faq, समस्या-निवारण
82
83
  ├── examples/preset/ # मॉडल-स्तर नोट्स और स्थापना मार्गदर्शिका
@@ -87,7 +88,7 @@ lunheng-article-pipeline/ # पैकेज ही रिपॉ
87
88
 
88
89
  प्लगइन प्रवेश `skills/lunheng-article-pipeline/SKILL.md` को स्किल के रूप में पंजीकृत करता है और `resourceBase` उसी निर्देशिका की ओर इंगित करता है, अतः `references/**` और `scripts/**` किसी भी कार्य-निर्देशिका से उसके सापेक्ष हल होते हैं।
89
90
 
90
- patch परत दो काम करती है: **इस पैकेज के लिए एक पंक्ति जोड़ती है** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — यही पंक्ति loader को `lib/index.js` आयात करने पर बाध्य करती है, और वही स्किल पंजीकृत करता है — तथा तीन स्तरीय subagent उपकरण जोड़ती है। **यह पंक्ति भार-वाहक है**: इसके बिना प्रवेश कभी आयात नहीं होता और स्किल दिखती नहीं (v18.0.0 का दोष, 18.0.1 में ठीक; `tests/bundle-contract.test.mjs` द्वारा सुरक्षित)।
91
+ patch परत दो काम करती है: **इस पैकेज के लिए एक पंक्ति जोड़ती है** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — यही पंक्ति loader को `lib/index.js` आयात करने पर बाध्य करती है, और वही स्किल पंजीकृत करता है — तथा तीन स्तरीय subagent उपकरण जोड़ती है, जो **डिफ़ॉल्ट रूप से नहीं लदते** (कोई भी `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_{PROVIDER,MODEL}` या `LUNHENG_TIERING=on` सेट करने पर लदते हैं, `off` पर बलपूर्वक अनलोड)। **यह पंक्ति भार-वाहक है**: इसके बिना प्रवेश कभी आयात नहीं होता और स्किल दिखती नहीं (v18.0.0 का दोष, 18.0.1 में ठीक; `tests/bundle-contract.test.mjs` द्वारा सुरक्षित)।
91
92
 
92
93
  ### Documentation
93
94
 
@@ -108,14 +109,14 @@ patch परत दो काम करती है: **इस पैकेज
108
109
  संस्करण **केवल tag से** प्रकाशित होते हैं; स्थानीय `npm publish` वर्जित है (यह CI द्वारों और OIDC provenance को दरकिनार करता है, और npm संस्करण कभी अधिलेखित नहीं हो सकता)।
109
110
 
110
111
  ```sh
111
- git tag v18.2.4 && git push origin v18.2.4 # एक बार में एक ही tag (GitHub: >3 tag एक push में कोई workflow नहीं चलाता)
112
+ git tag v18.2.6 && git push origin v18.2.6 # एक बार में एक ही tag (GitHub: >3 tag एक push में कोई workflow नहीं चलाता)
112
113
  # publish.yml क्रम: द्वार 1 सुसंगति → द्वार 2 पैकेजिंग → द्वार 3 स्वच्छता → द्वार 4 पैकेज स्मोक → स्क्रिप्ट परीक्षण
113
114
  # → tag/संस्करण समानता → idempotency गार्ड → OIDC publish --provenance --tag dsh → प्रकाशन-पश्चात लेखा-परीक्षा
114
115
  ```
115
116
 
116
117
  ## Install
117
118
 
118
- **बंडल के रूप में** (अनुशंसित; प्रवेश स्किल पंजीकृत करता है और patch परत स्तर सक्रिय करती है):
119
+ **बंडल के रूप में** (अनुशंसित; प्रवेश स्किल + C-समूह क्षमताएँ पंजीकृत करता है, और patch परत स्तरीय साधन **लाद सकती है** — डिफ़ॉल्ट रूप से लदे नहीं, देखें [Model routing](#model-routing)):
119
120
 
120
121
  ```sh
121
122
  dsh plugin --profile web add lunheng-article-pipeline
@@ -149,11 +150,11 @@ dsh --profile web --dump-config # "# == lunheng-article-pipeline" परत
149
150
  dsh plugin --profile <profile> remove lunheng-article-pipeline
150
151
  ```
151
152
 
152
- विस्थापन पर `cordis.patch.yml` की 3 `- insert:` पंक्तियाँ और प्रवेश द्वारा पंजीकृत स्किल — दोनों हट जाती हैं, कोई अवशेष नहीं। यदि आपने स्किल निर्देशिका किसी स्किल-मूल में भी प्रतिलिपि की थी, तो उसे अलग से हटाएँ।
153
+ विस्थापन पर `cordis.patch.yml` की 4 `- insert:` पंक्तियाँ (स्व-पंजीकरण + तीन स्तरीय) और प्रवेश द्वारा पंजीकृत स्किल — दोनों हट जाती हैं, कोई अवशेष नहीं। यदि आपने स्किल निर्देशिका किसी स्किल-मूल में भी प्रतिलिपि की थी, तो उसे अलग से हटाएँ।
153
154
 
154
155
  ## Model routing
155
156
 
156
- DSH में मॉडल मार्ग `settings.yaml` तय करता है; `subagent` सत्र-मॉडल विरासत में लेता है, अतः एकल-मॉडल विन्यास बिना सेटिंग चलता है। भूमिका-अनुसार स्तरीकरण हेतु बंडल तीन स्तरीय साधन स्थापित करता है:
157
+ DSH में मॉडल मार्ग `settings.yaml` तय करता है; `subagent` सत्र-मॉडल विरासत में लेता है, अतः एकल-मॉडल विन्यास बिना सेटिंग चलता है। भूमिका-अनुसार स्तरीकरण हेतु बंडल तीन स्तरीय साधन लाद सकता है — **डिफ़ॉल्ट रूप से बंद** (जब सभी स्तर विरासत में हों तो वे अंतर्निहित `subagent` के पूर्णतः समान हैं, अतः बिना शर्त लादना प्रति-सत्र तीन उपकरण-स्कीमा व्यर्थ व्यय करता है):
157
158
 
158
159
  | साधन | भूमिकाएँ | क्षमता |
159
160
  |---|---|---|
@@ -161,7 +162,7 @@ DSH में मॉडल मार्ग `settings.yaml` तय करता
161
162
  | `subagent_strong` | T4 विश्लेषण / T5 लेखन | प्रबल तर्कण |
162
163
  | `subagent_audit` | T6 समालोचना / T7 लेखा-परीक्षा / T9 समीक्षा / G14 संसूचक | शीर्ष स्तर, लागत घटाकर नहीं |
163
164
 
164
- `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` और `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL` से अधिलेखन करें: प्रदाता और मॉडल स्वतंत्र क्षेत्र हैं (प्रदाता बदलने पर दोनों आवश्यक), और `LUNHENG_TIERING=off` तीनों स्तरों को विरासत पर लौटा देता है। स्तर-साधन अनुपलब्ध हो तो प्रेषण `subagent` पर लौटता है। देखें `examples/preset/README.md` और `docs/installation.md`।
165
+ `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` और `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL` से अधिलेखन करें: **इनमें से कोई भी सेट करने पर तीनों पंक्तियाँ भी लद जाती हैं** (मौजूदा स्तरीकरण विन्यास जैसा था वैसा ही काम करता रहता है)। प्रदाता और मॉडल स्वतंत्र क्षेत्र हैं (प्रदाता बदलने पर दोनों आवश्यक); `LUNHENG_TIERING=on` बिना कोई मॉडल तय किए पंक्तियाँ लादता है (दृश्यता जाँचने हेतु उपयोगी), और `LUNHENG_TIERING=off` तीनों स्तरों को विरासत पर लौटाकर उन्हें अनलोड कर देता है। स्तर-साधन अनुपलब्ध हो तो प्रेषण अंतर्निहित `subagent` पर लौटता है। देखें `examples/preset/README.md` और `docs/installation.md`।
165
166
 
166
167
  ## Data and external services
167
168
 
@@ -180,12 +181,14 @@ DSH में मॉडल मार्ग `settings.yaml` तय करता
180
181
  | लेख | परिमाण | परिणाम |
181
182
  |---|---|---|
182
183
  | ब्रांड-संगति लेख (2026-08) | ~7900 अक्षर, 15 स्रोत + 54 आँकड़े | प्रमाण-पुंज; 8 निष्कर्ष बंद |
183
- | मौलिकता-विरोधाभास लेख (2026-08) | ~9500 अक्षर, 12 स्रोत + 34 आँकड़े + 6 प्रकरण | 4 संशोधन चक्र, A- श्रेणी, प्रकाशित |
184
+ | मौलिकता-विरोधाभास लेख (2026-08) | ~9500 अक्षर, 12 स्रोत + 34 आँकड़े + 6 प्रकरण | पूरे चक्र में कुल 4 संशोधन चक्र, A- श्रेणी, प्रकाशित |
184
185
  | शिक्षक-क्षेत्र पत्र (2026-08) | ~12000 अक्षर, 18 स्रोत + 47 आँकड़े + 9 प्रकरण | लेखा-परीक्षा चक्र 2 उत्तीर्ण |
185
186
  | जनरेटिव AI छात्र-लेखन टिप्पणी (2026-08) | ~2000 अक्षर, 12 स्रोत + 26 आँकड़े | त्रि-दिशा समानांतर खोज; M-द्वार exit 0 |
186
187
  | फ़ॉर्मेल्डिहाइड बंदगोभी लेख (2026-08) | ~4200 अक्षर, 12 स्रोत + 29 आँकड़े + 4 प्रकरण | M-द्वार exit 0; 6 नियम समाहित |
187
188
  | संकल्पना और आदर्श-विचार पत्र (2026-09) | ~6280 अक्षर, 18 स्रोत + 15 आँकड़े, 0 प्रकरण | 2 लेखा-परीक्षा चक्र, 23/30 लघु संशोधन, वास्तविक P0 = 0 |
188
189
 
190
+ > **यह तालिका कैसे पढ़ें (दो मानदंड जो आसानी से मिल जाते हैं)**: ① «संशोधन चक्र» उस **पूरे चक्र के सभी लेखक-पास** गिनता है (चरण 3.5 → v2, T6 समालोचना-सुधार, G14 चक्र, लेखा-परीक्षा लूप), जबकि पाइपलाइन की अपनी सीमा (**≤2 चक्र**) केवल **चरण 4.2 के लेखा-परीक्षा लूप** पर लागू होती है — दोनों संख्याएँ एक ही बात नहीं नापतीं; ② परिणाम **प्रत्येक चक्र के समय दर्ज ऐतिहासिक मान हैं, उस समय के स्क्रिप्ट संस्करण के साथ** — वर्तमान स्क्रिप्ट से पुनरुत्पाद्य नहीं। संग्रहीत परियोजनाओं पर आज पैकेज की स्क्रिप्ट चलाने पर, उदाहरणार्थ, फ़ॉर्मेल्डिहाइड बंदगोभी लेख `exit 2` तथा 5 P0 (M-Form-6/10, M-Exist-7/9, M-Integrity-1) देता है: उनमें से तीन द्वार उस चक्र के **बाद** जोड़े गए थे। इस तालिका को «तब पाइपलाइन ने क्या उत्पादित किया» के रूप में पढ़ें, «वर्तमान द्वार-समूह इन परियोजनाओं को उत्तीर्ण करता है» के रूप में नहीं।
191
+
189
192
  ## Known limitations
190
193
 
191
194
  - **चीनी प्राथमिकता।** भूमिका-प्रॉम्प्ट, उपज, फ़ाइल-नाम और प्रवाह डिफ़ॉल्ट रूप से चीनी में हैं।
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.2.4(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
5
+ > 版本:v18.2.6(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
6
6
 
7
7
  > A DeepSeek Harness (DSH) bundle that registers one on-demand agent skill. The skill turns long-form production — academic papers, industry analysis, business commentary, and long-form articles — into a **9-role pipeline with a human in the loop**.
8
8
 
@@ -41,6 +41,7 @@ Rule of thumb: ask whether the evidence is already **published**. If yes, Lunhen
41
41
  | Drafts | Successive versions with AI-trace cleanup, each independent writer run |
42
42
  | Review reports | Critical report (C1–C7), audit report (G0–G14), peer-review report (6 dimensions + journal matching), AI-trace report |
43
43
  | Final deliverables | `final/定稿.md`, figures, evidence bundle, delivery notes, M-gate report |
44
+ | DSH integration (bundle install) | Two **read-only** tools — `lunheng_m_gate` (M-gate mechanical pre-check) and `lunheng_char_count` (pure Chinese-character count); if your session does not expose them, call the same scripts with `pwsh` as before (same source of truth). Human command `/lunheng-status` (reads `run/<project>/status.md`; produces no model message). **Mechanism-file write protection**: a global guard rejects `write`/`edit`-style tool calls that target the skill package, so a session cannot quietly rewrite the pipeline's own rules. Boundary, stated plainly: the guard only sees **tool calls** — `pwsh` and any subprocess are **not** behind this gate; the owner's escape hatch is `LUNHENG_ALLOW_MECH_EDIT=1` (or `config: { allowMechanismEdit: true }`). Plugin **Config** (deployment switch, this plugin's row in your profile) covers `quiet`, `allowMechanismEdit`, `scriptTimeoutMs` and `scriptMaxOutputBytes` — the same knobs as the `LUNHENG_QUIET` / `LUNHENG_ALLOW_MECH_EDIT` env vars, but reviewable in the profile; an **invalid config fails loudly at load time** instead of silently falling back to defaults. |
44
45
 
45
46
  ## Pipeline overview
46
47
 
@@ -67,16 +68,16 @@ Phase 5 Finalize T8 finalizer (run by the coordinator) → final draft, evi
67
68
  ```text
68
69
  lunheng-article-pipeline/ # the package is the repository
69
70
  ├── package.json # declares main (lib/index.js) + dsh.bundle.patch
70
- ├── cordis.patch.yml # bundle layer: inserts the 3 model-tier subagent tools
71
- ├── lib/index.js # plugin entry: registers the skill through ctx.skills
71
+ ├── cordis.patch.yml # bundle layer: self-register row + 3 model-tier subagent tools (mounted only when LUNHENG_* is set)
72
+ ├── lib/index.js # plugin entry: skill + read-only tools + mechanism write guard + /lunheng-status
72
73
  ├── skills/lunheng-article-pipeline/ # the skill body (one directory)
73
74
  │ ├── SKILL.md # skill entry (roles, gates, execution boundaries)
74
75
  │ ├── AGENTS.md # operator manual
75
76
  │ ├── QUICKSTART.md # five-minute start
76
77
  │ ├── README.md # skill-level readme (Chinese)
77
78
  │ ├── references/ # 9 role cards, templates, shared gate algorithms, journal database
78
- │ └── scripts/ # 11 zero-dependency .mjs verification scripts
79
- ├── scripts/ # repository gates: packaging surface + mechanical hygiene
79
+ │ └── scripts/ # zero-dependency .mjs verification scripts (count: see the skill's whitelist line)
80
+ ├── scripts/ # repository gates: packaging surface + mechanical hygiene + pack smoke
80
81
  ├── tests/ # node --test suites (scripts + plugin entry smoke)
81
82
  ├── docs/ # installation, usage, architecture, faq, troubleshooting
82
83
  ├── examples/preset/ # model-tier notes and install guide
@@ -87,7 +88,7 @@ lunheng-article-pipeline/ # the package is the repository
87
88
 
88
89
  The plugin entry registers `skills/lunheng-article-pipeline/SKILL.md` as a skill whose `resourceBase` is that directory, so `references/**` and `scripts/**` resolve relative to it from any working directory.
89
90
 
90
- The patch layer does two things: it **inserts one row for this package** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — that row is what makes the loader import `lib/index.js`, which is what registers the skill — and it inserts the three model-tier subagent tools. **That self row is load-bearing**: without it the entry is never imported and no skill appears (the v18.0.0 defect fixed in 18.0.1; guarded by `tests/bundle-contract.test.mjs`).
91
+ The patch layer does two things: it **inserts one row for this package** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — that row is what makes the loader import `lib/index.js`, which is what registers the skill — and it inserts the three model-tier subagent tools, which are **not mounted by default** (set any `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_{PROVIDER,MODEL}` or `LUNHENG_TIERING=on` to mount them, `off` to force them off). **That self row is load-bearing**: without it the entry is never imported and no skill appears (the v18.0.0 defect fixed in 18.0.1; guarded by `tests/bundle-contract.test.mjs`).
91
92
 
92
93
  ### Documentation
93
94
 
@@ -108,14 +109,14 @@ The patch layer does two things: it **inserts one row for this package** (`- id:
108
109
  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).
109
110
 
110
111
  ```sh
111
- git tag v18.2.4 && git push origin v18.2.4 # push one tag at a time (GitHub: >3 tags in one push triggers no workflow)
112
+ git tag v18.2.6 && git push origin v18.2.6 # push one tag at a time (GitHub: >3 tags in one push triggers no workflow)
112
113
  # publish.yml then runs gate 1 consistency → gate 2 packaging surface → gate 3 hygiene → gate 4 pack smoke → script tests
113
114
  # → tag/version equality → idempotency guard → OIDC publish --provenance --tag dsh → post-publish audit
114
115
  ```
115
116
 
116
117
  ## Install
117
118
 
118
- **As a bundle** (recommended; the entry registers the skill and the patch layer activates the model tiers):
119
+ **As a bundle** (recommended; the entry registers the skill + the C-group capabilities, and the patch layer *can* mount the model-tier tools — off by default, see [Model routing](#model-routing)):
119
120
 
120
121
  ```sh
121
122
  dsh plugin --profile web add lunheng-article-pipeline
@@ -149,11 +150,11 @@ A plain directory carries no `dsh.bundle` declaration, so `dsh plugin add` insta
149
150
  dsh plugin --profile <profile> remove lunheng-article-pipeline
150
151
  ```
151
152
 
152
- Removing the bundle removes the 3 `- insert:` rows and the skill registered by the entry, leaving no residue. If you also copied the skill directory into a skill root, delete that copy separately.
153
+ Removing the bundle removes the 4 `- insert:` rows (the self-register row + the three tier rows) and the skill registered by the entry, leaving no residue. If you also copied the skill directory into a skill root, delete that copy separately.
153
154
 
154
155
  ## Model routing
155
156
 
156
- DSH routes models through `settings.yaml`; `subagent` inherits the session model, so a single-model setup works with no configuration. To tier by role, the bundle installs three tiered tools:
157
+ DSH routes models through `settings.yaml`; `subagent` inherits the session model, so a single-model setup works with no configuration. To tier by role, the bundle can mount three tiered tools — **off by default** (they are identical to the built-in `subagent` while every tier inherits, so mounting them unconditionally would cost three tool schemas per session for nothing):
157
158
 
158
159
  | Tool | Roles | Capability |
159
160
  |---|---|---|
@@ -161,7 +162,7 @@ DSH routes models through `settings.yaml`; `subagent` inherits the session model
161
162
  | `subagent_strong` | T4 analyst / T5 writer | Strong reasoning |
162
163
  | `subagent_audit` | T6 critical / T7 auditor / T9 reviewer / G14 detector | Top tier, no downgrade for cost |
163
164
 
164
- Override with `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` and `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL`. Provider and model are independent fields; crossing providers requires both. `LUNHENG_TIERING=off` forces every tier back to inheritance. When a tier tool is not mounted, dispatch falls back to `subagent`. See `examples/preset/README.md` and `docs/installation.md`.
165
+ Override with `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` and `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL` — **setting any of them also mounts the three rows** (so an existing tiered setup keeps working unchanged). Provider and model are independent fields; crossing providers requires both. `LUNHENG_TIERING=on` mounts the rows without pinning any model (useful to check they are visible); `LUNHENG_TIERING=off` forces all three tiers back to inheritance and unmounts them. When a tier tool is not mounted, dispatch falls back to the built-in `subagent`. See `examples/preset/README.md` and `docs/installation.md`.
165
166
 
166
167
  ## Data and external services
167
168
 
@@ -180,13 +181,15 @@ The coordinator must disclose these and obtain explicit consent at Phase 0. For
180
181
  | Article | Scale | Key outcome |
181
182
  |---|---|---|
182
183
  | Brand-consistency article (2026-08) | ~7900 chars, 15 sources + 54 data points | Evidence bundle; 8 audit findings closed |
183
- | Originality-paradox article (2026-08) | ~9500 chars, 12 sources + 34 data + 6 cases | 4 revision rounds, A- grade, published |
184
+ | Originality-paradox article (2026-08) | ~9500 chars, 12 sources + 34 data + 6 cases | 4 revision rounds in total across the run, A- grade, published |
184
185
  | Teacher-field isolation paper (2026-08) | ~12000 chars, 18 sources + 47 data + 9 cases | Audit round 2 passed; first consistency audit |
185
186
  | Generative-AI student writing commentary (2026-08) | ~2000 chars, 12 sources + 26 data | Three-way parallel retrieval; M-gate exit 0 |
186
187
  | Formaldehyde cabbage article (2026-08) | ~4200 chars, 12 sources + 29 data + 4 cases | M-gate exit 0; 6 back-feed rules merged |
187
188
  | 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 |
188
189
 
189
- Local gates: `node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`, `node scripts/plugin-surface-check.mjs`, `node scripts/repo-hygiene-check.mjs`, `node --test "tests/**/*.test.mjs"`.
190
+ > **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".
191
+
192
+ Local gates: `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"`.
190
193
 
191
194
  ## Known limitations
192
195
 
package/README.pt.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Lunheng (lunheng-article-pipeline) — pipeline multiagente para textos longos
2
2
 
3
- > 版本:v18.2.4(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
3
+ > 版本:v18.2.6(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
 
@@ -41,6 +41,7 @@ Regra prática: pergunte se a evidência já está **publicada**. Se estiver, Lu
41
41
  | Rascunhos | Versões sucessivas com limpeza de vestígios de IA, cada uma de um redator independente |
42
42
  | Relatórios | Relatório crítico (C1–C7), auditoria (G0–G14), revisão por pares (6 dimensões + periódicos) |
43
43
  | Entregáveis finais | `final/定稿.md`, figuras, pacote probatório, notas de entrega, relatório do portão M |
44
+ | Integração com o DSH (instalação como bundle) | Duas ferramentas **somente leitura**: `lunheng_m_gate` (pré-checagem mecânica do portão M) e `lunheng_char_count` (contagem de caracteres chineses); se a sua sessão não as expõe, chame os mesmos scripts com `pwsh` como antes (mesma fonte de verdade). Comando humano `/lunheng-status` (lê `run/<projeto>/status.md`; não gera mensagens de modelo). **Proteção de escrita dos arquivos de mecanismo**: um guard global recusa chamadas de ferramentas do tipo `write`/`edit` dirigidas ao pacote da skill, de modo que uma sessão não pode reescrever em silêncio as regras da própria pipeline. Limite declarado sem rodeios: o guard só vê **chamadas de ferramentas**; `pwsh` e qualquer subprocesso **não passam por este portão**; a exceção do proprietário é `LUNHENG_ALLOW_MECH_EDIT=1` (ou `config: { allowMechanismEdit: true }`). O **Config** do plugin (chave de implantação, na linha deste plugin do seu perfil) cobre `quiet`, `allowMechanismEdit`, `scriptTimeoutMs` e `scriptMaxOutputBytes` — os mesmos controles das variáveis `LUNHENG_QUIET` / `LUNHENG_ALLOW_MECH_EDIT`, mas versionados com o perfil e revisáveis; uma **config inválida falha ruidosamente no carregamento** em vez de voltar em silêncio aos padrões. |
44
45
 
45
46
  ## Pipeline overview
46
47
 
@@ -67,16 +68,16 @@ Fase 5 Verificação T8 (executada pelo coordenador) → texto final, pacote
67
68
  ```text
68
69
  lunheng-article-pipeline/ # o pacote é o repositório
69
70
  ├── package.json # declara main (lib/index.js) + dsh.bundle.patch
70
- ├── cordis.patch.yml # camada bundle: insere as 3 ferramentas subagent por nível
71
- ├── lib/index.js # entrada do plugin: registra a skill via ctx.skills
71
+ ├── cordis.patch.yml # camada bundle: linha de autorregistro + 3 ferramentas subagent por nível (só são montadas se definir LUNHENG_*)
72
+ ├── lib/index.js # entrada do plugin: skill + ferramentas somente leitura + guard de escrita + /lunheng-status
72
73
  ├── skills/lunheng-article-pipeline/ # o corpo da skill (um diretório)
73
74
  │ ├── SKILL.md # entrada da skill (papéis, portões, limites de execução)
74
75
  │ ├── AGENTS.md # manual do operador
75
76
  │ ├── QUICKSTART.md # início em cinco minutos
76
77
  │ ├── README.md # readme da skill (chinês)
77
78
  │ ├── references/ # 9 fichas de papel, modelos, algoritmos de portão, base de periódicos
78
- │ └── scripts/ # 11 scripts .mjs de verificação sem dependências
79
- ├── scripts/ # portões do repositório: superfície de empacotamento + higiene
79
+ │ └── scripts/ # scripts .mjs de verificação sem dependências (contagem: ver a linha de lista branca da skill)
80
+ ├── scripts/ # portões do repositório: superfície de empacotamento + higiene + fumaça do pacote
80
81
  ├── tests/ # suítes node --test (scripts + fumaça da entrada)
81
82
  ├── docs/ # instalação, uso, arquitetura, faq, solução de problemas
82
83
  ├── examples/preset/ # notas de níveis de modelo e guia de instalação
@@ -87,7 +88,7 @@ lunheng-article-pipeline/ # o pacote é o repositório
87
88
 
88
89
  A entrada do plugin registra `skills/lunheng-article-pipeline/SKILL.md` como skill com `resourceBase` apontando para esse diretório, então `references/**` e `scripts/**` resolvem-se relativos a ele a partir de qualquer diretório de trabalho.
89
90
 
90
- A camada patch faz duas coisas: **insere uma linha para este pacote** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — é essa linha que faz o loader importar `lib/index.js`, que é o que registra a skill — e insere as três ferramentas subagent por nível. **Essa linha é estrutural**: sem ela a entrada nunca é importada e a skill não aparece (defeito da v18.0.0, corrigido na 18.0.1; vigiado por `tests/bundle-contract.test.mjs`).
91
+ A camada patch faz duas coisas: **insere uma linha para este pacote** (`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`) — é essa linha que faz o loader importar `lib/index.js`, que é o que registra a skill — e insere as três ferramentas subagent por nível, que **não são montadas por padrão** (defina qualquer `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_{PROVIDER,MODEL}` ou `LUNHENG_TIERING=on` para montá-las; `off` para forçar que não sejam montadas). **Essa linha é estrutural**: sem ela a entrada nunca é importada e a skill não aparece (defeito da v18.0.0, corrigido na 18.0.1; vigiado por `tests/bundle-contract.test.mjs`).
91
92
 
92
93
  ### Documentation
93
94
 
@@ -108,14 +109,14 @@ A camada patch faz duas coisas: **insere uma linha para este pacote** (`- id: lu
108
109
  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).
109
110
 
110
111
  ```sh
111
- git tag v18.2.4 && git push origin v18.2.4 # uma tag por push (GitHub: >3 tags em um push não dispara workflow)
112
+ git tag v18.2.6 && git push origin v18.2.6 # uma tag por push (GitHub: >3 tags em um push não dispara workflow)
112
113
  # 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
113
114
  # → tag/versão iguais → guarda de idempotência → OIDC publish --provenance --tag dsh → auditoria posterior
114
115
  ```
115
116
 
116
117
  ## Install
117
118
 
118
- **Como bundle** (recomendado; a entrada registra a skill e a camada patch ativa os níveis):
119
+ **Como bundle** (recomendado; a entrada registra a skill + as capacidades do grupo C, e a camada patch *pode* montar as ferramentas por nível — **desligadas por padrão**, veja [Model routing](#model-routing)):
119
120
 
120
121
  ```sh
121
122
  dsh plugin --profile web add lunheng-article-pipeline
@@ -149,11 +150,11 @@ Um diretório simples não declara `dsh.bundle`, então `dsh plugin add` apenas
149
150
  dsh plugin --profile <profile> remove lunheng-article-pipeline
150
151
  ```
151
152
 
152
- Ao desinstalar, as 3 linhas `- insert:` e a skill registrada pela entrada desaparecem, sem resíduos. Se você também copiou o diretório da skill para uma raiz de skills, apague essa cópia separadamente.
153
+ Ao desinstalar, as 4 linhas `- insert:` (a de autorregistro e as três de nível) e a skill registrada pela entrada desaparecem, sem resíduos. Se você também copiou o diretório da skill para uma raiz de skills, apague essa cópia separadamente.
153
154
 
154
155
  ## Model routing
155
156
 
156
- O DSH roteia modelos por `settings.yaml`; `subagent` herda o modelo da sessão, então uma configuração de modelo único funciona sem ajustes. Para escalonar por papel, o bundle instala três ferramentas por nível:
157
+ O DSH roteia modelos por `settings.yaml`; `subagent` herda o modelo da sessão, então uma configuração de modelo único funciona sem ajustes. Para escalonar por papel, o bundle pode montar três ferramentas por nível — **desligadas por padrão** (enquanto todos os níveis herdam, elas são idênticas ao `subagent` embutido, então montá-las sem condição custaria três esquemas de ferramenta por sessão em troca de nada):
157
158
 
158
159
  | Ferramenta | Papéis | Capacidade |
159
160
  |---|---|---|
@@ -161,7 +162,7 @@ O DSH roteia modelos por `settings.yaml`; `subagent` herda o modelo da sessão,
161
162
  | `subagent_strong` | T4 análise / T5 redação | Raciocínio forte |
162
163
  | `subagent_audit` | T6 crítica / T7 auditoria / T9 revisão / detector G14 | Nível máximo, sem degradar por custo |
163
164
 
164
- Substitua com `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` e `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL`: provedor e modelo são campos independentes (cruzar provedores exige ambos) e `LUNHENG_TIERING=off` devolve os três níveis à herança. Quando uma ferramenta de nível não está montada, o despacho recai em `subagent`. Veja `examples/preset/README.md` e `docs/installation.md`.
165
+ Substitua com `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` e `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL`: **definir qualquer uma delas também monta as três linhas** (uma configuração escalonada já existente continua funcionando igual). Provedor e modelo são campos independentes (cruzar provedores exige ambos); `LUNHENG_TIERING=on` monta as linhas sem fixar nenhum modelo (útil para conferir se estão visíveis) e `LUNHENG_TIERING=off` devolve os três níveis à herança e as desmonta. Quando uma ferramenta de nível não está montada, o despacho recai no `subagent` embutido. Veja `examples/preset/README.md` e `docs/installation.md`.
165
166
 
166
167
  ## Data and external services
167
168
 
@@ -180,12 +181,14 @@ O coordenador deve divulgar esses envios e obter consentimento explícito na fas
180
181
  | Artigo | Escala | Resultado |
181
182
  |---|---|---|
182
183
  | Consistência de marca (2026-08) | ~7900 caracteres, 15 fontes + 54 dados | Pacote probatório; 8 achados encerrados |
183
- | Paradoxo da originalidade (2026-08) | ~9500 caracteres, 12 fontes + 34 dados + 6 casos | 4 rodadas de revisão, nota A-, publicado |
184
+ | Paradoxo da originalidade (2026-08) | ~9500 caracteres, 12 fontes + 34 dados + 6 casos | 4 rodadas de revisão no total ao longo da execução, nota A-, publicado |
184
185
  | Isolamento do campo docente (2026-08) | ~12000 caracteres, 18 fontes + 47 dados + 9 casos | Auditoria rodada 2 aprovada |
185
186
  | Escrita estudantil com IA generativa (2026-08) | ~2000 caracteres, 12 fontes + 26 dados | Busca tripla paralela; portão M exit 0 |
186
187
  | Caso do repolho com formaldeído (2026-08) | ~4200 caracteres, 12 fontes + 29 dados + 4 casos | Portão M exit 0; 6 regras incorporadas |
187
188
  | Artigo sobre noção e ideia (2026-09) | ~6280 caracteres, 18 fontes + 15 dados, 0 casos | 2 rodadas de auditoria, 23/30 revisão menor, P0 real = 0 |
188
189
 
190
+ > **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».
191
+
189
192
  ## Known limitations
190
193
 
191
194
  - **Prioridade do chinês.** Prompts de papel, entregáveis, nomes de arquivo e fluxos são em chinês por padrão.
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.2.4(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
5
+ > 版本:v18.2.6(DSH bundle:package.json + cordis.patch.yml + lib/index.js)
6
6
 
7
7
  > 一个 DeepSeek Harness(DSH)bundle 插件,注册一个按需加载的 agent 技能。它把深度长文的生产——学术论文、行业分析、商业评论、公众号深文——变成**带人在环节点的 9 角色流水线**。
8
8
 
@@ -41,6 +41,7 @@
41
41
  | 初稿 | 逐版递进,含中文 AI 痕迹清理,每轮由独立写手执行 |
42
42
  | 审阅报告 | 批判报告(C1–C7)、审计报告(G0–G14)、审稿报告(6 维度 + 期刊匹配)、AI 痕迹报告 |
43
43
  | 终交付 | `final/定稿.md`、图件、证据包、交付说明、M 门报告 |
44
+ | DSH 集成(bundle 安装时) | 两个**只读**工具 `lunheng_m_gate`(M 门机械预检)与 `lunheng_char_count`(纯汉字数)——清单里没有就照旧用 `pwsh` 调同名脚本(同源)。人类命令 `/lunheng-status`(读 `run/<项目>/status.md`,**不产生模型消息**)。**机制文件写保护**:全局 guard 否决指向技能包内的 `write`/`edit` 类工具调用,会话无法悄悄改写流水线自己的规则。**边界如实声明**:guard 只看**工具调用**——`pwsh`/子进程**不经此门**;主人授权例外走 `LUNHENG_ALLOW_MECH_EDIT=1`(或本插件行 `config: { allowMechanismEdit: true }`)。插件 **Config**(部署开关,写在你 profile 的本插件行上)覆盖 `quiet` / `allowMechanismEdit` / `scriptTimeoutMs` / `scriptMaxOutputBytes`——与 `LUNHENG_QUIET` / `LUNHENG_ALLOW_MECH_EDIT` 同义、但随 profile 走且可 review;**非法配置在加载期响亮失败**,不静默回落默认值。 |
44
45
 
45
46
  ## Pipeline overview
46
47
 
@@ -67,16 +68,16 @@ Phase 5 终检 T8 终检(主控执行)→ 定稿、证据包、交付
67
68
  ```text
68
69
  lunheng-article-pipeline/ # 包即仓库
69
70
  ├── package.json # 声明 main(lib/index.js)+ dsh.bundle.patch
70
- ├── cordis.patch.yml # bundle 层:叠加 3 档 subagent 工具
71
- ├── lib/index.js # 插件入口:通过 ctx.skills 注册技能
71
+ ├── cordis.patch.yml # bundle 层:本包自注册行 + 3 档 subagent 工具(设了 LUNHENG_* 才装载)
72
+ ├── lib/index.js # 插件入口:注册技能 + 只读工具 + 机制写保护 + /lunheng-status
72
73
  ├── skills/lunheng-article-pipeline/ # 技能本体(一个目录)
73
74
  │ ├── SKILL.md # 技能入口(角色 / 闸门 / 执行能力边界)
74
75
  │ ├── AGENTS.md # 操作手册
75
76
  │ ├── QUICKSTART.md # 5 分钟快速开始
76
77
  │ ├── README.md # 技能级说明(中文)
77
78
  │ ├── references/ # 9 张角色卡、模板、共享闸门算法、期刊数据库
78
- │ └── scripts/ # 11 个零依赖 .mjs 机械校验脚本
79
- ├── scripts/ # 仓库门:打包面 + 机械卫生
79
+ │ └── scripts/ # 零依赖 .mjs 机械校验脚本(数量真源 = 技能白名单行)
80
+ ├── scripts/ # 仓库门:打包面 + 机械卫生 + 打包产物冒烟
80
81
  ├── tests/ # node --test 回归(脚本 + 插件入口冒烟)
81
82
  ├── docs/ # 安装 / 使用 / 架构 / FAQ / 排障
82
83
  ├── examples/preset/ # 分档说明与安装指南
@@ -87,7 +88,7 @@ lunheng-article-pipeline/ # 包即仓库
87
88
 
88
89
  插件入口把 `skills/lunheng-article-pipeline/SKILL.md` 注册为技能,其 `resourceBase` 指向该目录——因此 `references/**` 与 `scripts/**` 的相对引用在任意工作目录下都能解析。
89
90
 
90
- patch 层做两件事:**插入一行本包自注册行**(`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`)——loader 靠这一行按包名 import `lib/index.js`,技能才注册得上——以及插入三档分档 subagent 工具。**这一行是承重的**:缺了它入口永远不会被 import、技能不会出现(v18.0.0 的缺陷,18.0.1 修复;由 `tests/bundle-contract.test.mjs` 机械防守)。
91
+ patch 层做两件事:**插入一行本包自注册行**(`- id: lunheng-article-pipeline` / `name: lunheng-article-pipeline`)——loader 靠这一行按包名 import `lib/index.js`,技能才注册得上——以及插入三档分档 subagent 工具,后者**默认不装载**(设任一档 `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_{PROVIDER,MODEL}` 或 `LUNHENG_TIERING=on` 才装载,`off` 强制不装载)。**这一行是承重的**:缺了它入口永远不会被 import、技能不会出现(v18.0.0 的缺陷,18.0.1 修复;由 `tests/bundle-contract.test.mjs` 机械防守)。
91
92
 
92
93
  ### Documentation
93
94
 
@@ -108,14 +109,14 @@ patch 层做两件事:**插入一行本包自注册行**(`- id: lunheng-arti
108
109
  **只推 tag 发布,禁止本地 `npm publish`**(本地直发会绕过 CI 三道门与 OIDC 来源证明,且 npm 版本不可覆盖)。
109
110
 
110
111
  ```sh
111
- git tag v18.2.4 && git push origin v18.2.4 # 一次只推 1 个 tag(GitHub:单次 push >3 个 tag 不触发任何 workflow)
112
+ git tag v18.2.6 && git push origin v18.2.6 # 一次只推 1 个 tag(GitHub:单次 push >3 个 tag 不触发任何 workflow)
112
113
  # publish.yml 依次跑:门 1 一致性 → 门 2 打包面 → 门 3 机械卫生 → 门 4 打包产物冒烟 → 脚本回归测试
113
114
  # → tag/版本一致校验 → 幂等守卫 → OIDC 发布 --provenance --tag dsh → 发布后审计
114
115
  ```
115
116
 
116
117
  ## Install
117
118
 
118
- **方式一:作为 bundle 安装**(推荐;入口注册技能,patch 层激活分档工具)
119
+ **方式一:作为 bundle 安装**(推荐;入口注册技能 + C 组能力,patch 层**可**装载分档工具——默认不装,见 [Model routing](#model-routing))
119
120
 
120
121
  ```sh
121
122
  dsh plugin --profile web add lunheng-article-pipeline
@@ -149,11 +150,11 @@ dsh --profile web --dump-config # 应出现 "# == lunheng-article-pipeline"
149
150
  dsh plugin --profile <profile> remove lunheng-article-pipeline
150
151
  ```
151
152
 
152
- 卸载后 `cordis.patch.yml` 的 3 段 `- insert:` 与入口注册的技能一并消失,不留残余行。若曾手工把技能目录拷到技能根(`.dsh/skills/` 或 `.agents/skills/`),需另行删除该目录。
153
+ 卸载后 `cordis.patch.yml` 的 4 段 `- insert:`(自注册行 + 三档工具行)与入口注册的技能一并消失,不留残余行。若曾手工把技能目录拷到技能根(`.dsh/skills/` 或 `.agents/skills/`),需另行删除该目录。
153
154
 
154
155
  ## Model routing
155
156
 
156
- DSH 通过 `settings.yaml` 路由模型;`subagent` 继承会话模型,因此**单模型零配置**即可跑。要按角色分档时,bundle 会装入三档工具:
157
+ DSH 通过 `settings.yaml` 路由模型;`subagent` 继承会话模型,因此**单模型零配置**即可跑。要按角色分档时,bundle 可装入三档工具——**默认不装载**(三档全继承时它们与内置 `subagent` 完全同义,无条件装载等于每会话白付 3 份工具 schema):
157
158
 
158
159
  | 工具 | 角色 | 能力定位 |
159
160
  |---|---|---|
@@ -161,7 +162,7 @@ DSH 通过 `settings.yaml` 路由模型;`subagent` 继承会话模型,因此
161
162
  | `subagent_strong` | T4 分析 / T5 写作 | 推理强 |
162
163
  | `subagent_audit` | T6 批判 / T7 审计 / T9 审稿 / G14 检测 | 顶配防漏判 |
163
164
 
164
- 用 `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` 与 `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL` 覆盖:provider 与 model 是**独立字段**,跨 provider 时才需同时给;`LUNHENG_TIERING=off` 一键让三档全部退回继承。某档工具未挂载时,派发自动回退 `subagent`。详见 `examples/preset/README.md` 与 `docs/installation.md`。
165
+ 用 `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_PROVIDER` 与 `LUNHENG_{RETRIEVAL,STRONG,AUDIT}_MODEL` 覆盖——**设任一档即同时装载三行**(既有的分档配置行为不变):provider 与 model 是**独立字段**,跨 provider 时才需同时给;`LUNHENG_TIERING=on` 可在不指定模型的情况下只把三行挂上(用于确认工具是否可见),`LUNHENG_TIERING=off` 一键让三档全部退回继承并卸载三行。某档工具未挂载时,派发自动回退内置 `subagent`。详见 `examples/preset/README.md` 与 `docs/installation.md`。
165
166
 
166
167
  ## Data and external services
167
168
 
@@ -180,13 +181,15 @@ DSH 通过 `settings.yaml` 路由模型;`subagent` 继承会话模型,因此
180
181
  | 文章 | 规模 | 关键结果 |
181
182
  |---|---|---|
182
183
  | 品牌一致性文章(2026-08) | 约 7900 字,15 条文献 + 54 条数据 | 证据包齐备;8 项审计问题全部关闭 |
183
- | 原创性悖论文章(2026-08) | 约 9500 字,12 文献 + 34 数据 + 6 案例 | 4 轮修订,A- 评级,已发表 |
184
+ | 原创性悖论文章(2026-08) | 约 9500 字,12 文献 + 34 数据 + 6 案例 | 全程共 4 轮修订,A- 评级,已发表 |
184
185
  | 教师场域隔离论文(2026-08) | 约 12000 字,18 文献 + 47 数据 + 9 案例 | 审计第 2 轮通过;首次一致性审计 |
185
186
  | 生成式 AI 学生写作评论(2026-08) | 约 2000 字,12 文献 + 26 数据 | 三方并行检索;M 门 exit 0 |
186
187
  | 甲醛白菜文章(2026-08) | 约 4200 字,12 文献 + 29 数据 + 4 案例 | M 门 exit 0;并入 6 条反哺规则 |
187
188
  | 观念与理念哲学论文(2026-09) | 约 6280 字,18 文献 + 15 数据,0 案例 | 2 轮审计,23/30 minor revision,M 门真 P0 = 0 |
188
189
 
189
- 本地四道门:`node skills/lunheng-article-pipeline/scripts/consistency-check.mjs`、`node scripts/plugin-surface-check.mjs`、`node scripts/repo-hygiene-check.mjs`、`node --test "tests/**/*.test.mjs"`。
190
+ > **本表怎么读(两种容易混的口径)**:① 「修订轮数」数的是**那一次跑的全部写手过稿**(Phase 3.5 → v2、T6 批判修订、G14 轮、审计回环),而流水线自己的上限 **≤2 轮**只约束 **Phase 4.2 的审计回环**——两个数字量的不是一回事;② 表内结论是**当时那一次跑的历史值(配当时的脚本版本)**,用**当前脚本无法复现**:今天拿随包脚本重跑归档项目,甲醛白菜文章会得到 `exit 2` 与 5 个 P0(M-Form-6/10、M-Exist-7/9、M-Integrity-1),因为其中三项门是**那篇文章之后**才加的。请把本表读成「当时产出了什么」,而不是「当前门集能过这些项目」。
191
+
192
+ 本地四道门 + 回归测试:`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"`。
190
193
 
191
194
  ## Known limitations
192
195