deepcheck parseArgs 'normaliza' la frontera de args con casts as sin validar | Atribución ADR-0011 incorrecta (0011 aplica solo a DB/API, no a narrowings as string[] de CLI args; no son as any). Casts de frontera, no defecto | 2026-07-13 | re-validar si cambia knowledge/adr/0011-*.md o packages/deepcheck/src parseArgs |
| loadSnapshot castea JSON arbitrario de un path del usuario a Snapshot sin validar forma | Mecánicamente cierto (JSON.parse as Snapshot, path de CLI) pero severity/encuadre "defect" no aplica: es artefacto interno del propio flujo, no frontera no confiable con daño accionable | 2026-07-13 | re-validar si el snapshot pasa a leerse de fuente externa o su forma se usa sin normalizar |
| Los hooks degradados asumen un backstop de CI que devground nunca instala ("CI valida secretos") | Bajo la lente de CORRECTITUD el hook hace lo que su diseño documentado dice; la premisa del backstop es de diseño/política, no un bug de comportamiento | 2026-07-13 | re-validar si cambia husky-config/hooks/*.sh o la doc de degradación |
Gate orquestación: allowlist de git commit no cubre mensajes multilínea o con ;/&/` | ` (heredoc siempre denegado) | Mecanismo verificado (una línea→allow; ;/` | `/heredoc→deny) pero mischaracteriza el impacto: el deny es fail-safe (deniega de más, no de menos) y el orquestador tiene otros caminos |
| dreaming resolveProject: root inexistente → readdirSync(root) lanza ENOENT crudo enmascarando el mensaje amistoso | Mecanismo cierto (gather.ts:36) pero neutralizado en este flujo: el trigger ("--root con typo") no es el camino normal y el default de --project ya falla antes con su propio problema | 2026-07-13 | re-validar si cambia packages/dreaming/src/lib/gather.ts:36 o el orden de validación de root |
| devground-adr: subcomando desconocido imprime usage y sale con exit 0 (misuse como éxito) | Code-accurate (adr-new.js:55-58 exit 0) pero la razón de daño no aplica a este flujo: es un helper interno de docs, no un gate de CI ni escribe estado destructivo | 2026-07-13 | re-validar si adr-new.js pasa a usarse en scripts que dependan del exit code |
| renderReport (dev-metrics) tiene 181 líneas — 2.3x el umbral de ADR-0010, la función más larga del núcleo | Conteo correcto (report.ts:21-220) pero ignora las salvaguardas del propio ADR-0010: ~80 es señal warn no error, y el cuerpo es render declarativo (template de salida), el caso que el ADR exime | 2026-07-13 | re-validar si renderReport agrega lógica de control (no solo render) o crece mucho más |
| @devground/sdd: "Existing files are never overwritten" no tiene test (gate.test.sh no toca setup.js) | copyDirGuarded (setup.js:29-50) implementa la garantía correctamente (if existsSync → skip); es deuda de cobertura, no defecto. OJO: NO extender esta absolución a agents-md/husky, que SÍ sobreescriben (hallazgos activos) | 2026-07-13 | re-validar si cambia packages/sdd/setup.js o se añade test de sobreescritura |
| parseTranscriptLine castea a TranscriptRecord asumiendo campos numéricos sumados sin verificar tipo | En addUsage (transcript.ts:98-101) ?? cubre null/undefined; para que el daño (concatenación "05") ocurra el campo tendría que ser string en el .jsonl, que Claude Code nunca escribe. No explotable en el corpus real | 2026-07-13 | re-validar si el formato de transcript cambia o se ingiere .jsonl de fuente no-Claude-Code |
| El gate de cobertura de CI solo está activo para packages/cli (dev-metrics y sdd fuera) | Hechos correctos (solo cli define test:coverage) pero descartado como hallazgo: es política de CI/deuda de gate, no un defecto de código con daño observable; dev-metrics re-exporta el preset sin ratchet y sdd ni usa vitest por diseño | 2026-07-13 | re-validar si ADR-0025/0012 exigen el gate para todo el núcleo o cambia la config de CI |
README raíz promete un script prepare que ningún installer del CLI escribe | Grep mal acotado a packages/cli/src/. La promesa SÍ se cumple (husky lo escribe vía binario). NOTA: distinto del hallazgo activo de devground/setup.js:62-66, que SÍ clobbea un prepare preexistente | 2026-07-13 | re-validar si cambia README.md o packages/cli/src/installers/husky.ts |
readPackageJson/detectFramework castean con as en frontera (invocando ADR-0011) | El cast NO viola ADR-0011 (alcance DB/API). La falta de validación de FORMA sí es defecto real y está activa como hallazgo (qa-edge en devground/setup.js) — esta supresión cubre solo la atribución al ADR | 2026-07-13 | re-validar si cambia knowledge/adr/0011-*.md o utils/package-json.ts |
| run() ejecuta execSync con string interpolado (inyectable) / addDevDependency sink latente | Factualmente correcto pero NO explotable: inputs son listas estáticas internas o el nombre del PM detectado, no datos no confiables | 2026-07-13 | re-validar si exec.ts o package-json.ts empiezan a interpolar input de usuario |
| El manifest / response.tools del prompt se castean sin validar (index.ts) | Ciertos a nivel sintáctico pero la atribución de riesgo no aplica: son artefactos internos controlados, no frontera no confiable | 2026-07-13 | re-validar si el manifest o el prompt pasan a leerse de fuente externa |
| package-json.ts: addDevDependency/getInstallCmd sin test; index.ts sin test de orquestación | Falta de test, no fix; getInstallCmd es lógicamente correcto. OJO: las guardas de exit code y el default no-TTV SÍ están promovidas a hallazgos aud-tests por ser ruta crítica | 2026-07-13 | re-validar si se agrega/quita cobertura sobre index.ts o utils/package-json.ts |
| La action es async pero se invoca con program.parse() síncrono → unhandled rejection | Mecanismo verificado pero sin evidencia de daño observable accionable en este flujo | 2026-07-13 | re-validar si cambia index.ts (parse/parseAsync) o se añade lógica async tras el prompt |