Compare
PMO as Code vs traditional PPM.
We make strong claims and show our work, including the rows where traditional approaches still hold.
PPM = Project & Portfolio Management (tools like MS Project, Planview, Clarity, Smartsheet).
Traditional PPMPMO as Code
Status deck (weekly, manual)→Audit result, posted on every PR
RAG self-reported by the PM→Deterministic checks decide pass/fail
Approval email chain→A required check + a merged PR
Charter in Word, v47_FINAL.docx→charter.md, versioned, schema-validated
RAID log in Excel, shared drive→Risk register in Git, reviewed by PR
Requirements drifting across 6 docs→One traceability graph, checked in CI
"Who approved this?" means an email search→git log + the merged PR reviewer
PM headcount for the reporting layer→One docassert run per pull request
Human signature required (regulatory)≈A required reviewer, recorded in Git
Tool-trained PMs, high switching cost→Any compliant tool, vendor-neutral standard
PMO as Code wins Context-dependent
Where as-code wins clearly.
It wins wherever stale data costs more than learning YAML, which in practice means portfolios beyond about five projects, organisations where audit and traceability matter, and teams already working in Git.
Engineering-led orgs
Git is already the source of truth for code. Extending it to the portfolio is a small step for a team that already lives there.
Regulated industries
An audit trail in Git records who changed what, when, and who approved it, and it satisfies most audit requirements better than email threads can.
Where traditional gates still belong.
Some decisions require a named individual's sign-off: a legal filing, a board resolution, a contractual milestone payment. PMO as Code accommodates them by requiring a named reviewer on the pull request, recorded in the Git history. That is a stronger record than an approval email nobody can find later.
Our position
Gates move from the default to the documented exception. When a signature is genuinely required, it becomes a required reviewer inside the audit trail instead of an email chain outside it.