Critical Path Partners forensic scheduling MCP

13 ferramentas para análise forense de atrasos no Primavera P6 — janelas AACE (29R-03 MIP 3.3), verificações de integridade DCMA-14, Monte Carlo SRA com maturidade AACE 122R-22 QRAMM, fragnet TIA (MIP 3.7), as-built colapsado (MIP 3.8) e livro-razão de evidências do workbench de reivindicações. Mecanismo CPM de código aberto (MIT) em github.com/danafitkowski/cpp-cpm-engine. Metodologia divulgada conforme Daubert. Calendários de feriados para 66 jurisdições. Hash de topologia SHA-256 em cada saída.

Documentação

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

Um mecanismo CPM de código aberto com metodologia alinhada à AACE e uma divulgação Daubert publicada. Código aberto. Alinhado à AACE. Divulgação Daubert. 1.345 testes unitários JS, além de paridade JS/Python em 2465 de 2539 comparações de validação cruzada enumeradas; as 74 restantes não são comparadas porque nenhum dos mecanismos emite o campo em uma atividade concluída (ver DAUBERT.md §3.1).

Uso voltado para tribunais: combine este mecanismo com a disciplina de aplicação analítica em FORENSIC_USE_SOP.md, a cadeia de verificação em VERIFY_RELEASE.md, os recibos por versão em release-evidence/ e a estrutura de comparação de campo-nível P6 em validation/p6-comparison/. NÃO cite o README em um relatório voltado para tribunais — cite os documentos listados em DAUBERT.md e FORENSIC_USE_SOP.md §Emparelhamento obrigatório.

Mantido pela Critical Path Partners — uma consultoria de cronograma forense.


Início rápido

O pacote npm está defasado em relação a este repositório. O npm latest é 2.9.19, publicado em 2026-05-17 — esse é o número que o selo npm acima exibe, e nada foi publicado no npm desde então, enquanto todas as versões posteriores foram lançadas aqui como tags git. npm install cpp-cpm-engine portanto não fornece o mecanismo descrito pelo DAUBERT.md, pelos pacotes release-evidence/ ou por qualquer referência de versão nestes documentos. Instale a partir da tag git:

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

O mecanismo tem zero dependências de runtime, então um clone é tudo o que ele precisa. Este é o mesmo caminho de instalação que VERIFY_RELEASE.md fornece a um perito adversário.

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

É isso. Passagem direta, passagem reversa, folga total, folga livre, aritmética de calendário, matemática de datas convencional P6, feriados multi-jurisdicionais — tudo feito.


Por que este mecanismo?

Capacidadecpm-engine
Código abertosim
Rótulos de método canônicos AACE (29R-03 / 49R-06 / 52R-06)sim
Divulgação Daubert / FRE 702 (embutida DAUBERT.md)sim
Paridade bit-idêntica JS-Python na superfície CPM enumeradasim
Hash de impressão digital de topologia (SHA-256, sinal de detecção de cópia)sim
Dinâmica de atraso cinemática (pré-publicação, somente JS)sim
Atualização bayesiana com pooling hierárquico (pré-publicação, somente JS)sim
66 conjuntos de regras de feriados padrão (multi-jurisdicional; padrões alinhados à estrutura, não certificados legalmente — ver docs/jurisdictions.md)sim
Licença MITsim

(Comparação de fornecedores removida no ciclo de auditoria v2.9.33. Comparações contra ferramentas CPM comerciais específicas devem ser fornecidas por um revisor independente, não pelo mantenedor do mecanismo.)

A matemática do mecanismo é uma commodity. O que sustenta uma análise de cronograma forense é o fluxo de trabalho, a disciplina metodológica e a postura de divulgação Daubert — não a passagem direta em si. A Critical Path Partners disponibiliza o mecanismo como código aberto para que qualquer acadêmico, qualquer cronista forense autônomo, qualquer cronista interno de contratante possa construir sobre uma base transparente e citável.


O que você pode construir

  • Primitivas de análise de atraso forense — passagem direta/reversa CPM que suporta análises sob AACE 29R-03 MIPs 3.3 (janelas), 3.6/3.7 (TIA prospectiva de base única / múltiplas bases) e 3.8 (as-built colapsado). O mecanismo fornece a matemática CPM; implementações completas de métodos (seleção de período, integração de fragnet, reconstrução as-built) vivem no conjunto de habilidades forenses CPP — este mecanismo OSS é o núcleo matemático sobre o qual eles constroem, não o método completo.
  • Pacotes de reivindicação — pacotes EOT de submissão do proprietário com carta de apresentação, anexos, registros de mitigação
  • Divulgações Daubert — relatórios FRCP 26(a)(2)(B), declarações metodológicas de quatro pilares FRE 702/707
  • Primitivas de risco de cronograma — estimativa posterior bayesiana (computeBayesianUpdate); CPM por iteração (runCPM) adequado como loop interno para wrappers de Monte Carlo construídos sobre este mecanismo. Monte Carlo completo / pontuação QRAMM vive no conjunto de habilidades forenses CPP (schedule-risk-analysis), construído sobre esta primitiva.
  • Saúde do cronograma — avaliação DCMA-14, nota automática A-F, diff linha de base vs. atual
  • Calendários multi-jurisdicionais — 66 conjuntos de regras de feriados padrão (CA-FED + 13 províncias/territórios, US-FED + 50 estados + DC). Estes são padrões alinhados à estrutura suficientes para matemática de datas de propósito geral — ver docs/jurisdictions.md para a tabela de referência por jurisdição e orientação de verificação de uso forense. Eles não são calendários certificados legalmente; para uso forense, substitua pelo calendário contratual do projeto via opts.calendar.

Alinhamento AACE

O mecanismo implementa a matemática por trás destas Práticas Recomendadas AACE:

RPTítuloRótulos de método emitidos
29R-03Análise de Cronograma ForenseMIP 3.3 / 3.6 / 3.7 / 3.8
49R-06Identificação do Caminho CríticoLPM, TFM, MFP
52R-06Análise Prospectiva de Impacto de TempoMIP 3.6 (Base Única) / MIP 3.7 (Múltiplas Bases)
122R-22Modelo de Maturidade de Análise de Risco Quantitativo (QRAMM)(superfície de selo)
PPG #20 (2ª Ed 2024)Guia de Prática de Análise de Cronograma Forense(aceitação geral)

Os rótulos de método são emitidos em result.manifest.methodology — exatamente as strings que revisores pares AACE e peritos adversários esperam.


Proveniência verificável

Cada computação emite um manifesto:

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',
}

Além disso, para proveniência forense, cada entrada carrega um hash de topologia 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 é a impressão digital de topologia de rede do mecanismo. Sinal de conluio em licitações, sinal de manipulação retroativa e sinal de detecção de cópia entre XERs dependem todos dele. É também a base que permite que a advocacia adversária verifique a integridade de topologia de uma análise CPP post-hoc — eles podem recalcular o hash a partir do mesmo XER e confirmar que a rede de atividades/relacionamentos não foi alterada entre a submissão e a revisão.


Paridade JavaScript - Python

O mecanismo tem um irmão Python (_cpp_common/scripts/cpm.py) usado por todas as habilidades forenses CPP. As duas implementações são mantidas bit-idênticas via validação 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.

Além de um teste de estresse com XER real de 282 atividades que relata 0 discrepâncias. Esse XER é um único arquivo de referência não público, não é commitado, e a execução não é reproduzível independentemente a partir deste repositório (ver DAUBERT.md §2).

Isso significa que uma análise forense executada em JavaScript (navegador, Node) produz os mesmos números que uma executada em Python (habilidade de preparação de reivindicações, servidor MCP, pipeline em lote). Cada entrega CPP carrega o mesmo manifesto, independentemente de qual superfície o produziu.


Verificação independente

A validação cruzada do mesmo autor é honesta sobre seu limite: ambas as implementações JS e Python são mantidas aqui. Para fechar a objeção Daubert de "sem testes independentes", o mecanismo acompanha um harness de reprodução de terceiros com um 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

O mecanismo tem zero dependências npm, então a reprodução requer apenas Node 18+ e Python 3.10+. O arquivo de testemunha contém:

  • SHA-256 do mecanismo + SHA-256 da referência Python
  • SHA do commit + ref git + URL do workflow (em CI)
  • Contagens de teste: testes unitários aprovados/reprovados, fixtures + verificações de validação cruzada, status de regressão de citações
  • Timestamp + versão do Node + plataforma
  • Veredito (PASS/FAIL)

Compare sua testemunha gerada localmente contra a testemunha assinada por CI (publicada em cada push como artefato de workflow + assinada via Sigstore actions/attest-build-provenance). SHA-256s bit-idênticos + contagens de aprovação correspondentes em um clone limpo = reprodução de terceiros confirmada.

Verifique uma atestação de CI assinada:

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

Veja DAUBERT.md §3.1 — Verificação Independente para o enquadramento Daubert completo.


Uso em produção

A configuração do cliente para o servidor MCP hospedado (Cline, Cursor, Claude Code, Claude Desktop) está em llms-install.md. O mecanismo roda ao vivo em mcp.criticalpathpartners.ca — experimente no seu navegador. O mesmo arquivo cpm-engine.js é servido pela rede e embutido inline em cada relatório que a CPP produz.

O conjunto forense CPP (análise-de-atraso-forense, preparação-de-reivindicações, bancada-de-reivindicações, análise-de-impacto-de-tempo, análise-de-risco-de-cronograma, as-built-colapsado, análise-de-contra-reivindicação) consome este mecanismo — o port JS para navegador/MCP, o irmão Python para pipelines em lote.


Citação

Se você usar este mecanismo em trabalho acadêmico ou relatórios de perito, cite:

Fitkowski, D. (2026). cpm-engine: Um mecanismo de método de caminho crítico de código aberto com rótulos de método canônicos AACE e uma divulgação Daubert publicada. Critical Path Partners. Versão 2.9.49. https://github.com/danafitkowski/cpp-cpm-engine

Citações de algoritmos estão em docs/citations.md. Todas as citações foram verificadas contra fontes primárias.


Licença

MIT — veja LICENSE.

Você pode usar este mecanismo em consultoria forense comercial, em pesquisa acadêmica, no seu próprio produto de cronograma, em relatórios de perito protocolados em tribunal. Apenas mantenha o aviso de direitos autorais. Nenhum suporte está implícito; nenhuma garantia é fornecida. Você é responsável pelas conclusões que tirar com o mecanismo. Uma divulgação Daubert está embutida (DAUBERT.md) — você pode usá-la como ponto de partida para seu próprio relatório FRCP 26(a)(2)(B).


Notas de versão

v2.9.12 (2026-05-16) — Onda de correções matemáticas do mecanismo Rodada 9. ~30 defeitos matemáticos substanciais fechados em quatro grupos: T1 tratamento de restrições (clamp LF retrocedido MS_Start, precedência de actual_start sobre restrições do lado ES conforme semântica de passagem direta P6, fixação de actual_start Monte Carlo Seção D, alertas de tarefas INFO descartadas, WARNs de restrição não reconhecida / incompleta, aliases CS_MANSTART/CS_MANFINISH, alertas violadas+aplicadas SNLT/FNLT/MS_Start Seção D); T2 aritmética de calendário/lag (Folga Livre ciente de calendário no link vinculante, _countWorkDaysBetween assinado, FF negativo preservado, guarda de estouro dateToNum, rejeição de lag não finito, WARN de calendário inválido com fallback, divulgação de viés de direção SUB_DAY_LAG_ROUNDED); T3 em andamento + reais (remaining_duration lógica retida P6, fixação LS=ES retrocedida para em andamento, guarda EF>=ES Seção C, OoS enumera cada predecessor, ALERT de órfão hammock, duration_working_days hammock, WARN de tipo de tarefa não reconhecido); T4 paridade Python (backport R8A-1, slot secundário ALAP, gate ES direto). 792 testes unitários / 416 verificações de validação cruzada / verificação PASS. Veja CHANGELOG.md para o índice completo de correções T1-T4.

v2.9.11 (2026-05-16) — Onda de correções matemáticas do mecanismo Rodada 8 R8A. Quatro caminhos de resposta errada silenciosa T1 fechados: actual_finish sem actual_start não colapsa mais ES para EF; lags fracionários de sub-dia emitem ALERT SUB_DAY_LAG_ROUNDED; Folga Livre FF / SF usa o calendário do sucessor; clamps de restrição Seção D emitem WARN constraint-skipped quando opts.projectStart está ausente.

v2.9.10 (2026-05-16) — Endurecimento Rodadas 7-8. Infraestrutura de verificação independente (CI público em 9 combinações SO × Node, JSONs de testemunha assinados por Sigstore, reprodução local de um comando via npm run verify) lançada como versão marcada. Matemática do mecanismo bit-idêntica à v2.9.9; esta é uma versão de docs + infra. Veja DAUBERT.md §3.1 e o novo §10 Roadmap.

Veja CHANGELOG.md para o histórico completo de versões até v2.9.49.


Contribuindo

Consulte CONTRIBUTING.md. A correção forense é imposta — cada commit deve passar por 1.345 testes unitários e pelo harness de validação cruzada, no qual 2.465 de 2.539 comparações definidas são executadas e são bit-idênticas com 0 falhas em 99 fixtures (as 74 restantes são puladas em vez de comparadas — 37 ff_signed, 37 ff_signed_working_days, todas em atividades concluídas onde nenhum dos dois motores emite o campo), além das portas de regressão de citação, regressão de truncamento e regressão de desvio de versão (todas conectadas a npm run test:all e npm run verify). Novas citações exigem URLs verificadas por WebSearch. Nenhum nome de caso fabricado. Nenhuma narrativa gerada por LLM nos caminhos principais do motor.


Repositórios complementares

Dois repositórios complementares são públicos:

  • cpp-xer-parser — o parser canônico do Primavera P6 XER. O motor consome sua saída de análise como a camada canônica XER → objeto JS; cpp-xer-parser não tem dependência deste motor.
  • cpp-critical-path-validator — validação de caminho crítico e avaliação DCMA-14. Opcionalmente consome este motor para a verificação cruzada LPM; degrada graciosamente quando ausente.

Habilidades adicionais da CPP (análise de atraso forense, preparação de reivindicações, bancada de reivindicações, análise de impacto de tempo, as-built colapsado, análise de contra-reivindicações, análise de risco de cronograma) são privadas; entre em contato com a Critical Path Partners para acesso.


Nota estratégica

A CPP é uma consultoria de agendamento forense. O motor é de código aberto como uma escolha deliberada de postura: a matemática do CPM é uma commodity revisada por pares e com décadas de existência (Kelley & Walker 1959, Kahn 1962, Tarjan 1972); o fluxo de trabalho, a disciplina metodológica e a postura de divulgação Daubert são onde o valor forense reside. Abrir o código da camada matemática significa que qualquer acadêmico, perito solo, agendador interno de contratante ou revisor independente tem uma base transparente e citável para inspecionar, modificar ou construir.

Se você enviar algo construído sobre este motor, adoraríamos saber: danafitkowski@gmail.com.