# dsh-autotier

> 🧊 **CONGELADO — 2026-10-31. Modo mantenimiento.** Sin nuevas funciones; solo correcciones de seguridad y dependencias.

## Estado de mantenimiento: 🧊 CONGELADO

Congelado el 2026-10-31 en modo mantenimiento. El paquete sigue instalable; solo se prevén correcciones de seguridad y dependencias.


[![Gitee](https://img.shields.io/badge/Gitee-mirror-c71d23?logo=gitee)](https://gitee.com/perrylink/dsh-autotier)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
[![DSH plugin](https://img.shields.io/badge/dsh--plugin-✅-green)](https://github.com/topics/dsh-plugin)
[![dsh-doctor](https://raw.githubusercontent.com/PerryLink/dsh-plugin-doctor/main/badges/PerryLink__dsh-autotier.svg)](https://github.com/PerryLink/dsh-plugin-doctor#verified-徽章)
[![DSH Market](https://raw.githubusercontent.com/2BingLing/dsh-market/master/assets/readme/badge-listed-en.svg)](https://dsh.market/)
[![Node](https://img.shields.io/badge/node-%5E22.19.0%20%7C%7C%20%3E%3D24.0.0-brightgreen.svg)](#)
[![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-autotier/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-autotier/actions)
[![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-autotier?label=version)](https://github.com/PerryLink/dsh-autotier/releases)
[![dshfind](https://dshfind.com/api/badge/PerryLink/dsh-autotier?metric=downloads&lang=es)](https://dshfind.com/es/plugins/PerryLink/dsh-autotier?ref=badge)

[English](README.md) | [简体中文](README-zh.md) | **Español** | [Português](README-pt.md) | [हिन्दी](README-hi.md)

```sh
dsh plugin --profile <name> add dsh-autotier
```


Enrutamiento automático por niveles de modelo para DeepSeek Harness: entra una
instrucción del usuario y sale una decisión de nivel — sin cambiar de modelo a
mano.

La intención compleja (arquitectura, planificación, depuración, ingeniería de
varios pasos) se planifica en el nivel **strong** y luego se implementa en el
nivel **cheap**. La intención simple (preguntas, recuperación, tareas por lotes,
trabajo diario) se diseña e implementa directamente en el nivel **cheap**.
Mientras el nivel cheap ejecuta, las llamadas de herramienta de alto riesgo son
denegadas por un guard determinista, y los fallos repetidos escalan al nivel
strong con un TTL de retorno.

- **Repositorio oficial**: <https://github.com/PerryLink/dsh-autotier>
- **npm**: `dsh-autotier` (nombre simple, sin scope)


**📖 Base de conocimiento del ecosistema** — datos medidos, no marketing: [guía de desarrollo · datos de selección · criterios de mantenimiento](https://perrylink.github.io/dsh-plugin-guide/).

<!-- star-cta -->
## Instalación y desinstalación

**Canal npm**

```bash
npm i -g dsh1024
dsh1024 plugin --profile web add dsh-autotier
```

**Canal git**

```bash
git clone https://github.com/PerryLink/dsh-autotier.git
cd dsh-autotier && pnpm install && pnpm run build
dsh plugin --profile web add .
```

**Sección de prompt opcional en el preset.** El router funciona sin ella. Para
que el modelo sepa en qué nivel corre, añade una fila a *tu* preset
(`docs/preset-row.md` tiene el bloque exacto):

```yaml
- insert:
    - id: autotier-prompt
      name: '@deepseek-ai/dsh-system-prompt'
      # sections: [...]  — véase docs/preset-row.md
```

**Desinstalación**

```bash
dsh plugin --profile web remove dsh-autotier
```

La fila, su namespace de settings, su comando, sus herramientas y sus listeners
se eliminan con el plugin; no se escribe nada fuera del documento de settings.

## ⭐ 如果它帮到了你

Este plugin forma parte de la [familia de plugins DSH](https://github.com/PerryLink) (más de 40, todos Apache-2.0). Si te resulta útil, **dale una estrella**: no desbloquea nada, pero ayuda a que la siguiente persona lo encuentre antes.

*English:* part of a 95 plugin family for DeepSeek Harness. If it is useful, **a star helps the next person find it** — nothing is gated behind it.

## What is dsh-autotier?

Canal npm

Canal git

![Diagrama de flujo de dsh-autotier: llamada → plugin → resultado.](docs/assets/dsh-autotier-flow.svg)

*Resumen del flujo: llamada → plugin → resultado. Los ejemplos siguientes usan la superficie de comandos real.*


*La misma ejecución, animada.*

## Compatibilidad

| Harness | Estado |
|---|---|
| `@deepseek-ai/dsh` `0.1.2-rc.1` | ya no compatible; esa línea es anterior al contrato `SettingsForms` al que apunta ahora el plugin |
| `@deepseek-ai/dsh` `0.1.5-rc.2` | ya no compatible; el contrato `settings.register` / `settings/updated` que expone fue eliminado aguas arriba |
| `@deepseek-ai/dsh` `0.1.6-alpha.2` | ya no compatible; la misma eliminación, primera línea con `SettingsForms` |
| `@deepseek-ai/dsh` `0.1.7-rc.2` | **requerida**; verificada contra el checkout correspondiente (`typecheck`) y los paquetes publicados (`typecheck:ci`, 214 pruebas) |
| `@deepseek-ai/cordis` `^4.0.3`, `@deepseek-ai/cosmokit` `^1.8.4`, `@deepseek-ai/schemastery` `^3.18.3` | base de peers |

Los rangos de peers nombran las cuatro líneas publicadas (`>=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0`), porque un rango cuyo único comparador de prerelease
está en una tupla anterior no admite un alpha posterior. Se refrescan por ola.
El rango declarado es deliberadamente más amplio que el verificado: documenta lo
que acepta el manifiesto, no lo que se ha probado.

**Esta versión es una adaptación rompiente.** El host de la generación `0.1.6`
eliminó la costura de *provider* de settings sobre la que se construyó este
plugin: el paquete `@deepseek-ai/dsh-settings-file` ya no existe,
`ctx.settings` es ahora `SettingsForms` (un proyector schema→formulario, sin
`register`), y `settings/updated` tampoco existe. Ninguna superficie compartida
permite que un plugin observe el documento de ajustes de otro, así que ninguna
versión de este plugin puede soportar ambos contratos a la vez. La configuración
fluye ahora por el mecanismo de configuración volátil del host; el **modo de
enrutado por sesión** —el ajuste que realmente cambia el comportamiento en
tiempo de ejecución— no cambia.

El plugin vive solo en el plano host y no necesita un preset propio: la fila host
se aplica a todas las sesiones. Una sección de prompt en *tu* preset es opcional
y solo hace visibles las decisiones al modelo (véase [Instalación y desinstalación](#instalación-y-desinstalación)).

## Qué obtienes

- **Puerta de intención** — cada turno se clasifica con señales deterministas
  (texto del mensaje, nombres de herramientas, presencia de imágenes, longitud de
  la conversación). La capa de reglas decide sin gastar tokens cuando tiene
  confianza; solo un turno de baja confianza llama al modelo juez barato, y
  nunca dentro del cooldown.
- **Aterrizaje en el seam oficial** — la decisión se aplica en la waterfall
  `agent/request` devolviendo una terna provider/model/effort de reemplazo. Los
  escalares de muestreo ya elegidos por la sesión (`temperature`, `maxTokens`,
  `stop`) se conservan.
- **Traspaso a modo plan** — una instrucción compleja entra en modo plan en el
  nivel strong; al salir vuelve al nivel cheap para implementar.
- **Guard de alto riesgo** — durante la ejecución cheap, los comandos
  destructivos (`rm -rf`, `sudo`, `mkfs`, `git push --force`, escritura de
  ficheros de credenciales, …) se deniegan con un mensaje correctivo que pide
  escalar.
- **Escalado por fallos** — los fallos repetidos (opcionalmente con la misma
  firma) elevan el nivel durante un TTL; un fallo de modelo/ruta recorre la
  cadena de fallback configurada.
- **Válvulas manuales** — `/tier auto|strong|cheap|off` y las herramientas
  `tier_status` / `tier_route`. Ajustar `routingMode: delegated` (o `/tier off`)
  detiene el enrutamiento para una sesión que debe conservar su propio modelo.
- **Servicio `ctx.autotier`** — una superficie de lectura (`status`) más la
  waterfall de veto `autotier/route` y el evento `autotier/tier-changed`, para
  que otros plugins observen o anulen una decisión.

## Inicio rápido

```sh
dsh plugin --profile web add github:PerryLink/dsh-autotier
```

```bash
npm i -g dsh1024
dsh1024 plugin --profile web add dsh-autotier
```

Luego inicia (o reinicia) el harness. La fila se añade a tu
`cordis.patch.yml`; el enrutamiento empieza en el siguiente turno.

### Ejemplos

Son los puntos de entrada reales; instala y llama a uno.

#### Ejemplo detallado

**Comando**

~~~sh
tier_route
~~~

**Entrada**

~~~json
{ "text": "Plan the migration of the storage layer end to end" }
~~~

**Salida**

~~~text
{
  "tier": "strong",
  "scenario": "planning",
  "confidence": 0.97,
  "fingerprint": "planning|0|0",
  "reason": "explicit planning intent"
}
~~~

*Observado en `README.md:248 (Tools & surfaces); tests/tools.spec.ts:96-109; src/tools.ts:80`*

#### Rama de fallo

**Entrada**

~~~text
resolveConfig({ tiers: { cheap: { provider: 'deepseek-official', model: 'deepseek-v4-pro', effort: 'high', followSession: false } } })
~~~

**Salida**

~~~text
Error: dsh-autotier: config.tiers strong and cheap resolve to the same landing (deepseek-official/deepseek-v4-pro@high); tiering would be a no-op
~~~

*Observado en `plugins/dsh-autotier/src/config.ts:377-386; plugins/dsh-autotier/tests/config.spec.ts:87-92; plugins/dsh-autotier/README.md:208-209`*

#### Ejemplos breves

- `tier_status`
- `tier_route`

## Configuración

Cada clave se valida al cargar; un valor inválido falla de forma ruidosa en vez
de desactivar el enrutamiento en silencio. El `cordis.patch.yml` de este
repositorio documenta las mismas claves en línea.

| Clave | Por defecto | Significado |
|---|---|---|
| `tiers.strong.provider` | `deepseek-official` | Provider del nivel de planificación/revisión. |
| `tiers.strong.model` | `deepseek-v4-pro` | Id de catálogo del modelo strong. |
| `tiers.strong.effort` | `high` | Vocabulario del adaptador `off` \| `low` \| `high` \| `max`. |
| `tiers.strong.followSession` | `false` | `false` = el effort de este nivel anula el de la sesión. |
| `tiers.strong.fallback` | `[]` | Aterrizajes provider/model ordenados si el nivel no está disponible. |
| `tiers.cheap.provider` | `deepseek-official` | Provider del nivel de implementación. |
| `tiers.cheap.model` | `deepseek-flash` | Id de catálogo del modelo cheap. |
| `tiers.cheap.effort` | `low` | Vocabulario del adaptador `off` \| `low` \| `high` \| `max`. |
| `tiers.cheap.followSession` | `true` | `true` = hereda el effort de la sesión y gana la elección explícita. |
| `tiers.cheap.fallback` | `[]` | Aterrizajes provider/model ordenados si el nivel no está disponible. |
| `tiers.vision.provider` | `deepseek-official` | Provider para turnos con imágenes. |
| `tiers.vision.model` | `deepseek-flash` | El único modelo del catálogo con modalidad de imagen. |
| `intent.ruleThreshold` | `0.7` | Confianza a partir de la cual la capa de reglas decide sola. |
| `intent.attemptBand.enabled` | `false` | Empezar la banda media en cheap y escalar ante una señal. |
| `intent.attemptBand.tauLow` | `0.45` | Límite inferior de la banda attempt-first. |
| `intent.hysteresis.toStrong` | `0.8` | Puntuación que cambia un turno cheap a strong. |
| `intent.hysteresis.toCheap` | `0.6` | Puntuación por debajo de la cual un turno strong vuelve a cheap. |
| `intent.rules` | `[]` | Tabla declarativa de reglas (`when.patterns` / `when.tools` / `when.cwd`, `tier`, `priority`). |
| `intent.judge.enabled` | `true` | Permitir el juez de baja confianza. |
| `intent.judge.model` | `''` | Id del modelo juez; vacío = primer modelo del catálogo que contenga `flash`. |
| `intent.judge.temperature` | `0` | Temperatura de muestreo del juez. |
| `intent.judge.maxTokens` | `16` | Límite de salida del juez (responde con una palabra). |
| `intent.judge.cooldownMs` | `30000` | Separación mínima entre dos llamadas al juez. |
| `intent.judge.timeoutMs` | `2000` | Tiempo límite de la llamada al juez. |
| `intent.judge.unavailableSkip` | `2` | Fallos consecutivos tras los que el turno omite al juez. |
| `intent.scenarios` | todos `true` | Interruptores por escenario: `coding`, `review`, `planning`, `retrieval`, `batch`, `daily`, `longText`, `multimodal`. |
| `intent.costMode` | `balanced` | Arbitraje en la ambigüedad: `cost-first` \| `quality-first` \| `balanced`. |
| `guard.enabled` | `true` | Activar el guard determinista de alto riesgo. |
| `guard.tiers` | `[cheap]` | Niveles que el guard protege. |
| `guard.whitelist` | `[]` | Comandos, herramientas o prefijos de ruta que nunca disparan el guard. |
| `guard.protectedPaths` | `['.dsh','AGENTS.md','package.json','.github/workflows']` | Superficies de automodificación que fuerzan revisión strong. |
| `guard.interopDefend` | `auto` | Relación con `dsh-defend`: `auto` audita la convivencia, `none` calla. |
| `escalation.threshold` | `2` | Fallos dentro de la ventana que elevan el nivel. |
| `escalation.windowMs` | `60000` | Ventana de conteo de fallos. |
| `escalation.ttlMs` | `180000` | Cuánto dura un escalado. |
| `escalation.fallbackTtlMs` | `300000` | TTL usado tras tomar un aterrizaje de fallback. |
| `escalation.signature` | `true` | Contar recurrencias de la misma firma en vez de cada fallo. |
| `routingMode` | `auto` | `auto` \| `strong` \| `cheap` \| `delegated` \| `off`. |

Todas las claves también se pueden editar en caliente desde la tarjeta del
plugin en la página Plugins: el Host valida el valor nuevo contra el schema y lo
confirma con `loader/volatile-update`, y este plugin vuelve a juzgar toda la
configuración con el mismo juez de campos cruzados que usa al montar. Un valor
que viole un requisito cruzado (dos tiers aterrizando en la misma ruta, un par de
histéresis que no frena el parpadeo, una regla sin pattern ni tool) deja la
última política válida enrutando en lugar de instalar algo inenrutable.

`routingMode` es la única clave que **no** es en caliente: es el valor por
defecto de la composición, y el interruptor en tiempo de ejecución es la
anulación por sesión que escriben `/tier`, la píldora del compositor y el
selector de la tarjeta. Hacerla en caliente también daría a un mismo
comportamiento dos dueños.

## Herramientas y superficies

| Superficie | Tipo | Propósito |
|---|---|---|
| `/tier` | comando | `auto` \| `strong` \| `cheap` \| `off` \| `status`; anulación por sesión. |
| `tier_status` | herramienta | Nivel actual, modo, TTL de escalado y estado del guard. |
| `tier_route` | herramienta | Enruta una intención en seco, sin enviar petición. |
| `ctx.autotier` | servicio | Superficie `status()` para otros plugins. |
| `autotier/route` | evento serial | Terceros pueden vetar el nivel propuesto. |
| `autotier/tier-changed` | evento emit | Observabilidad cuando cambia el nivel efectivo. |

## Permisos y datos

- **Ficheros** — el plugin no lee ningún fichero ni escribe ninguno. La
  configuración es del Host: un valor guardado en la página Plugins lo persiste
  el Host en el parche del perfil activo, y este plugin solo lee la instantánea
  viva que se le entrega.
- **Red** — el único tráfico saliente es la llamada al juez, que pasa por la ruta
  normal de `ctx.llm` y el provider configurado.
- **Registro de sesión** — el plugin no añade eventos de sesión propios. El rastro
  de enrutamiento es el logger del plugin más el evento vivo
  `autotier/tier-changed`; el único añadido es el `plan/mode` de reserva cuando el
  servicio de modo plan no está disponible. Los tipos de evento propios son
  fail-closed desde `0.1.2-alpha.1`, así que no se escribe ningún registro
  duradero del plugin.
- **Secretos** — este plugin no lee, registra ni almacena credenciales.

## Límites de seguridad

- El guard es **defensa en profundidad**, no una sandbox. Deniega los patrones que
  conoce en el nivel cheap y nunca debilita `dsh-defend`, el servicio de
  aprobación ni la política de sandbox. Mantenlos activos.
- El guard solo protege los niveles de `guard.tiers` (cheap por defecto). Un turno
  strong no se bloquea por diseño: el modelo strong es el revisor.
- Si el guard mismo lanza, la llamada se escala a strong en lugar de permitirse —
  un guard roto no debe convertirse en una puerta abierta.
- `/tier off` desactiva el enrutamiento por completo; el harness se comporta
  exactamente como antes de instalar el plugin.

## Limitaciones conocidas

- La capa de reglas es determinista y por tanto finita: una frase nueva para una
  petición compleja puede empezar en cheap y escalar solo tras un fallo o una
  denegación del guard. La llamada al juez cubre el medio de baja confianza.
- El escalado es por agente y en memoria; un reinicio del harness vuelve a `auto`.
- Cambiar de nivel reinicia la caché de prompt del provider para esa petición, así
  que las sesiones muy activas pueden ver un pequeño coste de fallo de caché en el
  turno de cambio; los umbrales de histéresis existen para que eso sea raro.
- El plugin enruta peticiones de conversación. La compactación y la generación de
  títulos son seams separados del host; alinea sus propios ajustes de modelo con
  el nivel cheap si quieres el mismo perfil de coste (`docs/supporting-lanes.md`).
- `followSession: true` en el nivel cheap significa que una elección explícita de
  modelo en la sesión gana; en ese caso el nivel cheap no puede imponer el suyo.
- **La tarjeta de Settings y la píldora del compositor llegaron en 0.2.0.** La
  tarjeta (modo de enrutamiento, aterrizajes de nivel, catálogo de modelos) vive en
  la sección Plugins y la píldora cicla el modo de la sesión desde el compositor.
- **Un modelo elegido en la GUI no se detecta automáticamente.** Usa
  `routingMode: delegated` o `/tier off` para detener el enrutamiento.
- **Las posteriores por huella viven en memoria** y se reinician al reiniciar.
- **La banda media attempt-first llega desactivada** hasta que exista el corpus
  de calibración (v0.2).

## Desarrollo

```bash
pnpm install
pnpm run typecheck      # contra las caras de tipo del checkout local del harness
pnpm run typecheck:ci   # contra las caras publicadas 0.1.7-rc.2 (lo que ejecuta CI)
pnpm test
pnpm run build
pnpm run verify:self-contained
pnpm run verify:artifacts
pnpm pack
```

`pnpm run build` emite `lib/types` (declaraciones tsc) y `lib/index.js` (bundle
tsdown). Las pruebas usan directamente los paquetes host publicados — `Context`
real, servicios reales de session/tools/commands/settings — más una composición
real del Loader sobre un `cordis.yml` temporal.

## Temas

`dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `router`,
`model-tier`, `cost`, `auto`.

## Contribuidores

PerryLink. Issues y pull requests en
<https://github.com/PerryLink/dsh-autotier/issues>.

## Licencia

Apache-2.0. Véase [LICENSE](./LICENSE) y
[THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md).

## Interoperabilidad con otros plugins de DSH

Verificado contra **DSH `0.2.0-rc.2`** (el runtime para el que se publica este README) y el conjunto de plugins con más estrellas sondeado el 2026-10-05.

Este plugin **no interfiere** con otros plugins, incluidos los de más estrellas:

- **Sin colisión de nombres de herramienta.** Todas las herramientas llevan espacio de nombres; ninguna ocupa un nombre desnudo ya perteneciente a una herramienta incluida u otro plugin.
- **Sin colisión de clave de servicio.** Solo provee `autotier`; esa clave no es una costura incluida ni la provee ningún plugin de más estrellas.
- **Sin colisión de slot.** No registra ninguna clave de slot de cliente, así que no disputa un asiento `shadows-shipped-ui`.
- **Sin colisión de ruta HTTP.** No registra ningún prefijo `webServer`.
- **Sin colisión en la capa de patch.** El patch del bundle solo hace `insert` de su propia fila; nunca sobrescribe el `config` de una fila incluida.
- **Sin mutación global.** No parchea prototipos, ni reescribe `process.env`, ni reemplaza el dispatcher global de fetch.

**Los listeners de eventos compartidos no interfieren por construcción.** Observa los eventos sensibles al orden `agent/created`, `agent/request`, `agent/request-error`, `tools/pre-execute` con `ctx.on()` — el registro de difusión de Cordis, donde cada listener se ejecuta y ninguno puede dejar sin turno a otro. **Todos los listeners aquí delegan por `next()`**, así que la cadena nunca se cortocircuita:
  - `agent/request` — also used by `dsh-agent-teams` (1923★), which short-circuits by throwing without calling `next()`.
  - `tools/pre-execute` — also used by `cc-safety-net` (1576★).

Evidencia estática: `dsh-plugin-doctor` K10–K13 dan `pass` en todas las comprobaciones de este repositorio.

## PerryLink DSH Plugin Family

Este proyecto forma parte de la familia de plugins de DeepSeek Harness de [PerryLink](https://github.com/PerryLink). El registro permanece plegado abajo para que cada README conserve una primera pantalla corta; expándelo para ver cada fila y su estado.

<details>
<summary>Expandir todos los plugins</summary>

| Plugin | Estado |
|---|---|
| **[dsh-aqua-input-check](https://github.com/PerryLink/dsh-aqua-input-check)** |  |
| **[dsh-archive-check](https://github.com/PerryLink/dsh-archive-check)** |  |
| **[dsh-auto-review](https://github.com/PerryLink/dsh-auto-review)** |  |
| **[dsh-autotier](https://github.com/PerryLink/dsh-autotier)** |  |
| **[dsh-bid-ca-precheck](https://github.com/PerryLink/dsh-bid-ca-precheck)** |  |
| **[dsh-bid-qual-check](https://github.com/PerryLink/dsh-bid-qual-check)** |  |
| **[dsh-cert-mcp](https://github.com/PerryLink/dsh-cert-mcp)** |  |
| **[dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind)** |  |
| **[dsh-click](https://github.com/PerryLink/dsh-click)** |  |
| **[dsh-composer-history](https://github.com/PerryLink/dsh-composer-history)** |  |
| **[dsh-contract-stance](https://github.com/PerryLink/dsh-contract-stance)** |  |
| **[dsh-customs-doc-check](https://github.com/PerryLink/dsh-customs-doc-check)** |  |
| **[dsh-data-quality](https://github.com/PerryLink/dsh-data-quality)** |  |
| **[dsh-demurrage-ledger](https://github.com/PerryLink/dsh-demurrage-ledger)** |  |
| **[dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck)** |  |
| **[dsh-drill-script-check](https://github.com/PerryLink/dsh-drill-script-check)** |  |
| **[dsh-eia-guide-check](https://github.com/PerryLink/dsh-eia-guide-check)** |  |
| **[dsh-emergency-plan](https://github.com/PerryLink/dsh-emergency-plan)** |  |
| **[dsh-essay-rubric-check](https://github.com/PerryLink/dsh-essay-rubric-check)** |  |
| **[dsh-evidence-check](https://github.com/PerryLink/dsh-evidence-check)** |  |
| **[dsh-export-ctl-check](https://github.com/PerryLink/dsh-export-ctl-check)** |  |
| **[dsh-fast](https://github.com/PerryLink/dsh-fast)** |  |
| **[dsh-fmea-table-check](https://github.com/PerryLink/dsh-fmea-table-check)** |  |
| **[dsh-forecast-penalty](https://github.com/PerryLink/dsh-forecast-penalty)** |  |
| **[dsh-fund-research](https://github.com/PerryLink/dsh-fund-research)** |  |
| **[dsh-github](https://github.com/PerryLink/dsh-github)** |  |
| **[dsh-gongwen-flow-check](https://github.com/PerryLink/dsh-gongwen-flow-check)** |  |
| **[dsh-gongwen-word-check](https://github.com/PerryLink/dsh-gongwen-word-check)** |  |
| **[dsh-guard-plan-qc](https://github.com/PerryLink/dsh-guard-plan-qc)** |  |
| **[dsh-hazchem-check](https://github.com/PerryLink/dsh-hazchem-check)** |  |
| **[dsh-hazplan-check](https://github.com/PerryLink/dsh-hazplan-check)** |  |
| **[dsh-hidden-risk-map](https://github.com/PerryLink/dsh-hidden-risk-map)** |  |
| **[dsh-hs-classify](https://github.com/PerryLink/dsh-hs-classify)** |  |
| **[dsh-icd-rule-check](https://github.com/PerryLink/dsh-icd-rule-check)** |  |
| **[dsh-industry-research](https://github.com/PerryLink/dsh-industry-research)** |  |
| **[dsh-lawcite-adapter](https://github.com/PerryLink/dsh-lawcite-adapter)** |  |
| **[dsh-laya](https://github.com/PerryLink/dsh-laya)** |  |
| **[dsh-lc-doc-check](https://github.com/PerryLink/dsh-lc-doc-check)** |  |
| **[dsh-learning-gap-check](https://github.com/PerryLink/dsh-learning-gap-check)** |  |
| **[dsh-library](https://github.com/PerryLink/dsh-library)** |  |
| **[dsh-local-ai](https://github.com/PerryLink/dsh-local-ai)** |  |
| **[dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions)** |  |
| **[dsh-mask](https://github.com/PerryLink/dsh-mask)** |  |
| **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** |  |
| **[dsh-medrec-qc](https://github.com/PerryLink/dsh-medrec-qc)** |  |
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** |  |
| **[dsh-nsfc-form-check](https://github.com/PerryLink/dsh-nsfc-form-check)** |  |
| **[dsh-nurse-record-check](https://github.com/PerryLink/dsh-nurse-record-check)** |  |
| **[dsh-observe](https://github.com/PerryLink/dsh-observe)** |  |
| **[dsh-origin-rvc-check](https://github.com/PerryLink/dsh-origin-rvc-check)** |  |
| **[dsh-ota-review-check](https://github.com/PerryLink/dsh-ota-review-check)** |  |
| **[dsh-output-styles](https://github.com/PerryLink/dsh-output-styles)** |  |
| **[dsh-paper-doc-adapter](https://github.com/PerryLink/dsh-paper-doc-adapter)** |  |
| **[dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules)** |  |
| **[dsh-permit-report-check](https://github.com/PerryLink/dsh-permit-report-check)** |  |
| **[dsh-pipeline-check](https://github.com/PerryLink/dsh-pipeline-check)** |  |
| **[dsh-pleading-draft](https://github.com/PerryLink/dsh-pleading-draft)** |  |
| **[dsh-plugin-doctor](https://github.com/PerryLink/dsh-plugin-doctor)** |  |
| **[dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide)** |  |
| **[dsh-plugin-kit](https://github.com/PerryLink/dsh-plugin-kit)** |  |
| **[dsh-plugin-upgrade](https://github.com/PerryLink/dsh-plugin-upgrade)** |  |
| **[dsh-policy-brief-draft](https://github.com/PerryLink/dsh-policy-brief-draft)** |  |
| **[dsh-power-loss-split](https://github.com/PerryLink/dsh-power-loss-split)** |  |
| **[dsh-power-ticket-check](https://github.com/PerryLink/dsh-power-ticket-check)** |  |
| **[dsh-ppap-check](https://github.com/PerryLink/dsh-ppap-check)** |  |
| **[dsh-protest-deadline](https://github.com/PerryLink/dsh-protest-deadline)** |  |
| **[dsh-railway-window](https://github.com/PerryLink/dsh-railway-window)** |  |
| **[dsh-repair-order-qc](https://github.com/PerryLink/dsh-repair-order-qc)** |  |
| **[dsh-research-report](https://github.com/PerryLink/dsh-research-report)** |  |
| **[dsh-review-reply-check](https://github.com/PerryLink/dsh-review-reply-check)** |  |
| **[dsh-rulefile-check](https://github.com/PerryLink/dsh-rulefile-check)** |  |
| **[dsh-safety-brief-check](https://github.com/PerryLink/dsh-safety-brief-check)** |  |
| **[dsh-score](https://github.com/PerryLink/dsh-score)** |  |
| **[dsh-session-sync](https://github.com/PerryLink/dsh-session-sync)** |  |
| **[dsh-site-log-check](https://github.com/PerryLink/dsh-site-log-check)** |  |
| **[dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security)** |  |
| **[dsh-soe-decision-check](https://github.com/PerryLink/dsh-soe-decision-check)** |  |
| **[dsh-soilwater-check](https://github.com/PerryLink/dsh-soilwater-check)** |  |
| **[dsh-sop-sync-check](https://github.com/PerryLink/dsh-sop-sync-check)** |  |
| **[dsh-spc-gbt-adapter](https://github.com/PerryLink/dsh-spc-gbt-adapter)** |  |
| **[dsh-talk](https://github.com/PerryLink/dsh-talk)** |  |
| **[dsh-tender-extract](https://github.com/PerryLink/dsh-tender-extract)** |  |
| **[dsh-tender-matrix](https://github.com/PerryLink/dsh-tender-matrix)** |  |
| **[dsh-test-drive](https://github.com/PerryLink/dsh-test-drive)** |  |
| **[dsh-ticktick](https://github.com/PerryLink/dsh-ticktick)** |  |
| **[dsh-translate](https://github.com/PerryLink/dsh-translate)** |  |
| **[dsh-warranty-calc](https://github.com/PerryLink/dsh-warranty-calc)** |  |
| **[dsh-budget](https://github.com/PerryLink/dsh-budget)** | 🧊 CONGELADO — ver el README del repositorio |
| **[dsh-claude-move](https://github.com/PerryLink/dsh-claude-move)** | 🧊 CONGELADO — ver el README del repositorio |
| **[dsh-defend](https://github.com/PerryLink/dsh-defend)** | 🧊 CONGELADO — ver el README del repositorio |
| **[dsh-draw](https://github.com/PerryLink/dsh-draw)** | 🧊 CONGELADO — ver el README del repositorio |
| **[dsh-reach](https://github.com/PerryLink/dsh-reach)** | 🧊 CONGELADO — ver el README del repositorio |
| **[dsh-background-agents](https://github.com/PerryLink/dsh-background-agents)** | 🚫 RETIRADO — ver el README del repositorio |
| **[dsh-session-pin](https://github.com/PerryLink/dsh-session-pin)** | 🚫 RETIRADO — ver el README del repositorio |
| **[dsh-team-rooms](https://github.com/PerryLink/dsh-team-rooms)** | 🚫 RETIRADO — ver el README del repositorio |

</details>
