Critical Path Partners forensic scheduling MCP

13 herramientas para análisis forense de retrasos en Primavera P6 — ventanas AACE (29R-03 MIP 3.3), controles de salud DCMA-14, Monte Carlo SRA con madurez AACE 122R-22 QRAMM, fragnet TIA (MIP 3.7), colapsado construido (MIP 3.8) y libro de evidencia de banco de trabajo de reclamaciones. Motor CPM de código abierto (MIT) en github.com/danafitkowski/cpp-cpm-engine. Metodología divulgada según Daubert. Calendarios festivos de 66 jurisdicciones. Hash de topología SHA-256 en cada salida.

Documentación

cpm-engine

npm version license: MIT tests: 1345 passing crossval: JS↔Python 2465/2539 coverage: 94% verify Daubert: disclosed AACE: 29R--03 / 49R--06 / 52R--06

Un motor CPM de código abierto con metodología alineada con AACE y una divulgación Daubert publicada. Código abierto. Alineado con AACE. Divulgación Daubert. 1,345 pruebas unitarias JS, más paridad JS/Python en 2465 de 2539 comparaciones de validación cruzada enumeradas; las 74 restantes no se comparan porque ningún motor emite el campo en una actividad completada (ver DAUBERT.md §3.1).

Uso orientado a tribunales: combine este motor con la disciplina de aplicación analítica en FORENSIC_USE_SOP.md, la cadena de verificación en VERIFY_RELEASE.md, los recibos por versión en release-evidence/ y el marco de comparación de P6 a nivel de campo en validation/p6-comparison/. NO cite el README en un informe orientado a tribunales — cite los documentos enumerados en DAUBERT.md y FORENSIC_USE_SOP.md §Emparejamiento requerido.

Mantenido por Critical Path Partners — una consultoría de programación forense.


Inicio rápido

El paquete npm está desactualizado con respecto a este repositorio. npm latest es 2.9.19, publicado el 2026-05-17 — ese es el número que muestra la insignia npm anterior, y no se ha publicado nada en npm desde entonces, mientras que cada versión posterior se ha lanzado aquí como una etiqueta git. npm install cpp-cpm-engine por lo tanto no le brinda el motor descrito por DAUBERT.md, por los paquetes release-evidence/, ni por ninguna referencia de versión en estos documentos. Instale desde la etiqueta git:

git clone https://github.com/danafitkowski/cpp-cpm-engine.git
cd cpp-cpm-engine
git checkout v2.9.49

El motor tiene cero dependencias de tiempo de ejecución, por lo que un clon es todo lo que necesita. Esta es la misma ruta de instalación que VERIFY_RELEASE.md le da a un experto de la parte contraria.

const E = require('./cpm-engine.js');

const result = E.computeCPM(
    [
        { code: 'A', duration_days: 5, early_start: '2026-01-05', clndr_id: 'MF' },
        { code: 'B', duration_days: 3, clndr_id: 'MF' },
        { code: 'C', duration_days: 4, clndr_id: 'MF' },
    ],
    [
        { from_code: 'A', to_code: 'B', type: 'FS', lag_days: 0 },
        { from_code: 'B', to_code: 'C', type: 'FS', lag_days: 0 },
    ],
    {
        dataDate: '2026-01-05',
        calMap: { MF: { work_days: [1, 2, 3, 4, 5], holidays: [] } },
    }
);

console.log('Project finish:', result.projectFinish);     // 2026-01-21
console.log('Critical path:', result.criticalCodesArray); // ['A', 'B', 'C']
console.log('Engine version:', result.manifest.engine_version); // 2.9.49

Eso es todo. Pase hacia adelante, pase hacia atrás, flotante total, flotante libre, aritmética de calendario, matemática de fechas convencional P6, días festivos multi-jurisdiccionales — todo hecho.


¿Por qué este motor?

Capacidadcpm-engine
Código abiertosí
Etiquetas de método canónico AACE (29R-03 / 49R-06 / 52R-06)sí
Divulgación Daubert / FRE 702 (integrada DAUBERT.md)sí
Paridad bit-idéntica JS-Python en la superficie CPM enumeradasí
Hash de huella de topología (SHA-256, señal de detección de copia)sí
Dinámica de retraso cinemática (pre-publicación, solo JS)sí
Actualización bayesiana con agrupación jerárquica (pre-publicación, solo JS)sí
66 conjuntos de reglas de días festivos predeterminados (multi-jurisdiccional; valores predeterminados alineados con el marco, no certificados legalmente — ver docs/jurisdictions.md)sí
Licencia MITsí

(Comparación de proveedores eliminada en el ciclo de auditoría v2.9.33. Las comparaciones contra herramientas CPM comerciales específicas deben ser proporcionadas por un revisor independiente, no por el mantenedor del motor.)

La matemática del motor es un producto básico. Lo que respalda un análisis de programación forense es el flujo de trabajo, la disciplina metodológica y la postura de divulgación Daubert — no el pase hacia adelante en sí. Critical Path Partners publica el motor como código abierto para que cualquier académico, cualquier programador forense independiente, cualquier programador interno de un contratista pueda construir sobre una base transparente y citable.


Lo que puede construir

  • Primitivas de análisis de retraso forense — pase CPM hacia adelante/hacia atrás que admite análisis bajo AACE 29R-03 MIPs 3.3 (ventanas), 3.6/3.7 (TIA prospectivo de base única / base múltiple) y 3.8 (as-built colapsado). El motor proporciona la matemática CPM; las implementaciones completas del método (selección de período, integración de fragnet, reconstrucción as-built) viven en el conjunto de habilidades forenses CPP — este motor OSS es el núcleo matemático sobre el que construyen, no el método completo.
  • Paquetes de reclamos — paquetes EOT de presentación del propietario con carta de presentación, anexos, registros de mitigación
  • Divulgaciones Daubert — informes FRCP 26(a)(2)(B), declaraciones metodológicas de cuatro puntos FRE 702/707
  • Primitivas de riesgo de programación — estimación posterior bayesiana (computeBayesianUpdate); CPM por iteración (runCPM) adecuado como bucle interno para envoltorios de Monte Carlo construidos sobre este motor. La puntuación completa de Monte Carlo / QRAMM vive en el conjunto de habilidades forenses CPP (schedule-risk-analysis), construido sobre esta primitiva.
  • Salud de la programación — evaluación DCMA-14, calificación automática A-F, diferencia entre línea base y actual
  • Calendarios multi-jurisdiccionales — 66 conjuntos de reglas de días festivos predeterminados (CA-FED + 13 provincias/territorios, US-FED + 50 estados + DC). Estos son valores predeterminados alineados con el marco suficientes para matemática de fechas de propósito general — ver docs/jurisdictions.md para la tabla de referencia por jurisdicción y la guía de verificación de uso forense. No son calendarios certificados legalmente; para uso forense, anule con el calendario contractual del proyecto a través de opts.calendar.

Alineación con AACE

El motor implementa la matemática detrás de estas Prácticas Recomendadas de AACE:

RPTítuloEtiquetas de método emitidas
29R-03Análisis de Programación ForenseMIP 3.3 / 3.6 / 3.7 / 3.8
49R-06Identificación de la Ruta CríticaLPM, TFM, MFP
52R-06Análisis de Impacto de Tiempo ProspectivoMIP 3.6 (Base Única) / MIP 3.7 (Base Múltiple)
122R-22Modelo de Madurez de Análisis de Riesgo Cuantitativo (QRAMM)(superficie de insignia)
PPG #20 (2ª Ed 2024)Guía de Práctica de Análisis de Programación Forense(aceptación general)

Las etiquetas de método se emiten en result.manifest.methodology — exactamente las cadenas que los revisores pares de AACE y los expertos de la parte contraria esperan.


Procedencia verificable

Cada cálculo emite un manifiesto:

result.manifest = {
    engine_version: '2.9.49',
    method_id: 'computeCPM',
    activity_count: 3,
    relationship_count: 2,
    data_date: '2026-01-05',
    calendar_count: 1,
    computed_at: '2026-05-10T14:32:01.847Z',
}

Además, para la procedencia forense, cada entrada lleva un hash de topología SHA-256:

const hash = E.computeTopologyHash(activities, relationships);
console.log(hash.topology_hash);  // 64-char hex over canonical (code, duration, sorted preds + types + lags)
// Two XERs with identical hashes have IDENTICAL CANONICALIZED TOPOLOGY under the hashed-field
// set (activity codes, durations, predecessor links + types + lags). NOT a forensic-equivalence
// statement — different calendars, resources, WBS, names, or constraints can still produce
// different schedules under the same hash. The hash is a signal, not a schedule-equivalence proof.

Esta es la huella de topología de red del motor. La señal de colusión en ofertas, la señal de manipulación retroactiva y la señal de detección de copia entre XER dependen de ella. También es la base que permite a la parte contraria verificar la integridad a nivel de topología de un análisis CPP de forma posterior — pueden recalcular el hash desde el mismo XER y confirmar que la red de actividades/relaciones no fue alterada entre la presentación y la revisión.


Paridad JavaScript - Python

El motor tiene un hermano Python (_cpp_common/scripts/cpm.py) utilizado por cada habilidad forense CPP. Las dos implementaciones se mantienen bit-idénticas mediante validación cruzada:

npm run crossval
# 99 fixtures, 2465 checks executed, 0 deviations, measured 2026-09-27.
# A further 74 comparisons on the enumerated surface (2539 total) are skipped rather than failed by the harness field guards, all on ff_signed / ff_signed_working_days on completed activities, where NEITHER engine emits the field.

Además, una prueba de estrés con un XER real de 282 actividades reporta 0 discrepancias. Ese XER es un único archivo de referencia no público, no está comprometido, y la ejecución no es reproducible de forma independiente desde este repositorio (ver DAUBERT.md §2).

Esto significa que un análisis forense ejecutado en JavaScript (navegador, Node) produce los mismos números que uno ejecutado en Python (habilidad de preparación de reclamos, servidor MCP, canal de procesamiento por lotes). Cada entregable CPP lleva el mismo manifiesto independientemente de qué superficie lo produjo.


Verificación independiente

La validación cruzada del mismo autor es honesta sobre su límite: ambas implementaciones JS y Python se mantienen aquí. Para cerrar la objeción Daubert de "sin pruebas independientes", el motor incluye un mecanismo de reproducción de terceros con un solo comando:

git clone https://github.com/danafitkowski/cpp-cpm-engine
cd cpp-cpm-engine
git checkout <commit-sha>     # the SHA cited in the disclosure
npm run verify                # runs unit + crossval + citation tests
# → attestations/latest.json   ← machine-readable witness file

El motor tiene cero dependencias npm, por lo que la reproducción solo requiere Node 18+ y Python 3.10+. El archivo de testigo contiene:

  • SHA-256 del motor + SHA-256 de referencia Python
  • SHA del commit + ref git + URL del flujo de trabajo (en CI)
  • Conteos de pruebas: unitarias aprobadas/fallidas, fixtures de validación cruzada + comprobaciones, estado de regresión de citas
  • Marca de tiempo + versión de Node + plataforma
  • Veredicto (PASS/FAIL)

Compare su testigo generado localmente contra el testigo firmado por CI (publicado en cada push como artefacto de flujo de trabajo + firmado Sigstore a través de actions/attest-build-provenance). SHA-256 bit-idénticos + conteos de aprobación coincidentes en un clon limpio = reproducción de terceros confirmada.

Verifique una atestación CI firmada:

gh attestation verify attestations/latest.json --owner danafitkowski

Ver DAUBERT.md §3.1 — Verificación Independiente para el marco Daubert completo.


Uso en producción

La configuración del cliente para el servidor MCP alojado (Cline, Cursor, Claude Code, Claude Desktop) está en llms-install.md. El motor se ejecuta en vivo en mcp.criticalpathpartners.ca — pruébelo en su navegador. El mismo archivo cpm-engine.js se sirve a través de la red y se incrusta en línea en cada informe que CPP produce.

El conjunto forense CPP (análisis-de-retraso-forense, preparación-de-reclamos, banco-de-trabajo-de-reclamos, análisis-de-impacto-de-tiempo, análisis-de-riesgo-de-programación, as-built-colapsado, análisis-de-contra-reclamos) consume este motor — el puerto JS para navegador/MCP, el hermano Python para canalizaciones por lotes.


Cita

Si utiliza este motor en trabajo académico o informes de peritos, cite:

Fitkowski, D. (2026). cpm-engine: Un motor de método de ruta crítica de código abierto con etiquetas de método canónico AACE y una divulgación Daubert publicada. Critical Path Partners. Versión 2.9.49. https://github.com/danafitkowski/cpp-cpm-engine

Las citas de algoritmos están en docs/citations.md. Todas las citas han sido verificadas contra fuentes primarias.


Licencia

MIT — ver LICENSE.

Puede usar este motor en consultoría forense comercial, en investigación académica, en su propio producto de programación, en informes de peritos presentados ante tribunales. Solo conserve el aviso de derechos de autor. No se implica soporte; no se proporciona garantía. Usted es responsable de las conclusiones que extraiga con el motor. Se incluye una divulgación Daubert (DAUBERT.md) — puede usarla como punto de partida para su propio informe FRCP 26(a)(2)(B).


Notas de versión

v2.9.12 (2026-05-16) — Ola de correcciones matemáticas del motor Ronda 9. ~30 defectos matemáticos sustanciales cerrados en cuatro categorías: T1 manejo de restricciones (clamp LF de inicio MS_Start, precedencia de actual_start sobre restricciones del lado ES según semántica de pase hacia adelante P6, fijación de actual_start en Monte Carlo Sección D, alertas de tareas INFO descartadas, WARNs de restricción no reconocida / incompleta, alias CS_MANSTART/CS_MANFINISH, alertas SNLT/FNLT/MS_Start violadas+aplicadas en Sección D); T2 aritmética de calendario/retraso (flotante libre consciente del calendario en enlace vinculante, _countWorkDaysBetween con signo, FF negativo preservado, guardia de desbordamiento dateToNum, rechazo de retraso no finito, WARN de calendario inválido con respaldo, divulgación de sesgo de dirección SUB_DAY_LAG_ROUNDED); T3 en progreso + reales (remaining_duration lógica retenida P6, fijación LS=ES hacia atrás para en progreso, guardia EF>=ES Sección C, OoS enumera cada predecesor, ALERTA de hammock huérfano, hammock duration_working_days, WARN de tipo de tarea no reconocido); T4 paridad Python (backport R8A-1, ranura secundaria ALAP, compuerta ES hacia adelante). 792 pruebas unitarias / 416 comprobaciones de validación cruzada / verificación PASS. Ver CHANGELOG.md para el índice completo de correcciones T1-T4.

v2.9.11 (2026-05-16) — Ola de correcciones matemáticas del motor Ronda 8 R8A. Cuatro rutas de respuesta incorrecta silenciosa T1 cerradas: actual_finish sin actual_start ya no colapsa ES a EF; los retrasos fraccionarios de sub-día emiten ALERTA SUB_DAY_LAG_ROUNDED; FF / SF Flotante Libre usa el calendario del sucesor; los clamps de restricción de la Sección D emiten WARN constraint-skipped cuando falta opts.projectStart.

v2.9.10 (2026-05-16) — Endurecimiento Rondas 7-8. Infraestructura de verificación independiente (CI público en 9 combinaciones de SO × Node, JSON de testigo firmados Sigstore, reproducción local de un comando a través de npm run verify) se lanza como una versión etiquetada. Matemática del motor bit-idéntica a v2.9.9; esa es una versión de documentación + infraestructura. Ver DAUBERT.md §3.1 y la nueva §10 Hoja de ruta.

Ver CHANGELOG.md para el historial completo de versiones hasta v2.9.49.


Contribuciones

See CONTRIBUTING.md. La corrección forense está garantizada: cada commit debe pasar 1,345 pruebas unitarias y el arnés de validación cruzada, en el cual 2465 de 2539 comparaciones definidas se ejecutan y son bit-idénticas con 0 fallos en 99 fixtures (las 74 restantes se omiten en lugar de compararse — 37 ff_signed, 37 ff_signed_working_days, todas en actividades completadas donde ningún motor emite el campo), además de las compuertas de regresión de citas, regresión de truncamiento y regresión de deriva de versiones (todas integradas en npm run test:all y npm run verify). Las nuevas citas requieren URLs verificadas por WebSearch. Sin nombres de casos fabricados. Sin narrativas generadas por LLM en las rutas principales del motor.


Repositorios complementarios

Dos repositorios complementarios son públicos:

  • cpp-xer-parser — el analizador canónico de Primavera P6 XER. El motor consume su salida de análisis como la capa canónica XER → objeto JS; cpp-xer-parser no tiene dependencia de este motor.
  • cpp-critical-path-validator — validación de ruta crítica y evaluación DCMA-14. Opcionalmente consume este motor para la verificación cruzada de LPM; se degrada con elegancia cuando está ausente.

Las habilidades adicionales de CPP (forensic-delay-analysis, claims-preparation, claim-workbench, time-impact-analysis, collapsed-as-built, counter-claim-analysis, schedule-risk-analysis) son privadas; contacta a Critical Path Partners para obtener acceso.


Nota estratégica

CPP es una consultoría de programación forense. El motor es de código abierto como una postura deliberada: las matemáticas de CPM son un producto básico revisado por pares de décadas de antigüedad (Kelley & Walker 1959, Kahn 1962, Tarjan 1972); el flujo de trabajo, la disciplina metodológica y la postura de divulgación Daubert son donde reside el valor forense. Abrir el código de la capa matemática significa que cualquier académico, forense independiente, programador interno de un contratista o revisor independiente tiene una base transparente y citable para inspeccionar, modificar o construir sobre ella.

Si envías algo construido sobre este motor, nos encantaría saberlo: danafitkowski@gmail.com.