Qué se decidió
Segunda pieza del escalón grande (tras la partición de los function hooks de s315): el doctor del harness, harness/method-doctor.ps1, mezclaba lo transversal (repo del método al día, plugins activos, paridad de reglas, Python, hooks de git, Biblioteca viva, simulacro) con lo que presupone pertenecer al equipo CreaRack (identidad edu/dani/txell, plugins de equipo, token y publicación al rollup, repos de la organización). El plan v7 (public/supercontext/doctor-split/PLAN_DOCTOR_SPLIT.md, tres paneles fríos, 29 objeciones) lo APROBÓ Edu en s317 con dos decisiones: el núcleo se queda en harness/ y -NoExtensions es modo genérico de verdad. Se ejecutó en s318.
Qué se hizo
| Pieza | Dónde | Qué |
|---|---|---|
| Núcleo genérico | harness/method-doctor.ps1 | Capas A-E, G, H en cualquier repo de cualquier perfil. Parámetros nuevos -NoExtensions (sin extensiones y capa B al suelo fijo) y -UserClaude <dir> (pruebas contra una copia; excluye -Repair). Descubre extensiones por declaración y las carga por dot-source en try/catch con sello de completitud: declarada y ausente, o cargada a medias, = issue high de la capa extension, se descarta lo que fijó y no se publica |
| Extensión de equipo | plugins/crearack/harness/doctor-crearack.ps1 (declarada en plugin.json → doctorExtension) | Identidad, team-plugins.txt, plugin v1 retirado, capa F, publicador al rollup, patrón de la org para el barrido de hooks, remotos que “declaran Biblioteca”, scope team del simulacro. Escribe solo seis variables $script:Ext*; la última línea es el sello |
| Fuente única de plugins | harness/method-plugins.txt | Qué plugins del método lleva el perfil; la leen el instalador (habilita) y el núcleo (vigila). Suelo fijo method + method-hooks escrito en ambos; vacío o sin suelo = aviso + critical, nunca verde falso. Decidir qué perfil lleva crearack* es editar este fichero |
| Simulacro | harness/gate_selftest.py --scope generic,team | generic = hooks fuera de plugins/crearack/; hook ausente se salta, no falla |
| Skills | /method:doctor (plugin method 3.5.0) · /crearack:method-doctor puntero (plugin crearack 2.3.0) | iniciar-proyecto manda /method:doctor en el proyecto nuevo |
Commits en claude-method: 5017a08 (parámetros + reordenación, JSON idéntico) y f96628f (extensión, fuente única, skills, guía). Tag de marcha atrás pre-doctor-split-2026-09-09; snapshot en claude-backups/edu/harness-snapshots/2026-09-09-pre-doctor-split.
Qué cambia para los tres perfiles
Nada observable: los tres siguen llevando los cuatro plugins (method-plugins.txt los lista) y el doctor imprime el mismo veredicto, ahora con el sello “extensión: crearack”. Lo que se gana: el doctor sirve en un perfil sin crearack (perfil general, otro equipo, un proyecto del Iniciador), y el código de equipo vive en su plugin, como los function hooks.
Verificado (PC de Edu, 09-09-2026)
- Paridad: JSON del doctor en Pro, estado real y sembrado (regla alterada, marcador sin
report_url, token vacío), idéntico antes y después tras el push; las 36 llamadasAdd-Issuedel script viejo están todas en núcleo + extensión. - Núcleo solo:
-NoExtensionsno acusa de equipo (sin issue de token), no acusa a FableCities de marcador ausente, y el barrido de hooks pasa de 6 repos a 3 (solo adoptados). - Extensión: token vacío,
crearack-hooksfuera deenabledPlugins, plugin inventado enteam-plugins.txt,crearackfuera deenabledPlugins→ en cada caso solo el issue esperado; la extensión carga por lista aunque el plugin no esté habilitado (el caso de s177). - Arranque:
session-start.ps1en Pro, FableCities y claude-method imprime el veredicto con el sello;returna mitad, error de sintaxis y fichero renombrado dan su issueextension, perfil genérico y sin publicar. - Rollup:
eduverde conf96628fel mismo día.dani/txell: verdes conf96628fel 09-09 tras reiniciar la estación (C4 hecha), reconfirmados el 10-09 con9d9449e. Plan cerrado el 10-09; las piezas siguientes van al grill del “harness al perfil general”.
Trampas cazadas al ejecutar
- En PowerShell los nombres de variable no distinguen mayúsculas: en el ámbito de un script
$extPublisheres la misma variable que$script:ExtPublisher. Una copia local inicializada a$nullborró el publicador y el rollup dejó de recibir; se cazó por el efecto (la hora del rollup no avanzaba). Las copias del núcleo llevan prefijocore. "$var:"dentro de una cadena se lee como variable con ámbito:${var}:.claude plugin validateadmite el campodoctorExtensioncon aviso de “campo desconocido, se ignora al cargar”: es lo esperado, lo lee el doctor, no Claude Code.
Piezas siguientes (anotadas, sin fecha)
Mover reject_powershell_herestring.py y guarda_modelo_subagentes.py al plugin method (hoy scope team); partir session-start.ps1 en genérico/equipo. Apuesta #20 en WAGERS.md (vence 09-10-2026).