OH MY PM v0.5.3
OH MY PM v0.5.3
Documentation and architecture truth release. It changes no product code and
adds no user-facing capability.
Documentation authority was real but implicit. Two arrays inside
tools/validate-doc-truth.mjs decided which documents were checked for
present-tense claims and which were exempt as point-in-time records. That worked,
but the classification was knowable only by reading validator source: nothing
could enumerate it, a newly added document silently defaulted to
unclassified-and-unchecked, and a document that had been replaced could still be
linked from an active index as though it were current guidance.
This release makes that classification explicit, machine-readable, exhaustive,
and enforced.
Everything you can observe as a user is unchanged from v0.5.2. No migration is
required.
Release lineage
| Latest published stable, and immutable base | v0.5.2 |
| v0.5.0 | superseded, unpublished source candidate — there is no v0.5.0 tag or release |
| v0.5.3 | prepared; not yet published |
No existing release tag is moved, replaced, recreated, or deleted. Merging the
v0.5.3 pull request publishes nothing.
Problem statement
Before this release the repository could not answer, mechanically, the question
"is this document current truth?" Three specific failures followed from that:
- Unclassified documents were unchecked. A document not listed in the
validator'sACTIVE_DOCSarray was exempt from every current-state guard, so
it could claim a stale version, a wrong tool count, or an unimplemented
capability indefinitely without failing the build. - Nothing verified the package map was complete.
docs/architecture.mdis
the authoritative map of workspace packages, and it silently omitted a real
one (@oh-my-pm/examples), so a reader would conclude that package was not
part of the system. - Superseded documents could be linked as normative. Marking a document
replaced only matters if current documents stop pointing at it.
Documentation truth model
docs/manifest.json is the authoritative classification contract. Every tracked
Markdown document that describes the product is listed exactly once, with four
fields:
| Field | Meaning |
|---|---|
status |
active, historical, superseded, or release-record |
authority |
normative (citable as current truth) or informative |
appliesTo |
the version or release line the document speaks for; current for active |
replacement |
the path that supersedes it, or null |
A fifth field, concern, names what a document is authoritative about. It is
what makes duplicate authority detectable: two active, normative documents
claiming the same concern give a reader two candidate truths and no rule for
choosing between them.
Test fixtures under examples/fixtures/**, issue templates, and the PR template
are explicitly excluded — they are input data and scaffolding, not documentation
about the product.
tools/docs-manifest.mjs is the single loader over the contract, so
validate-doc-truth and docs-inventory agree by construction rather than by
restating the same lists.
Architecture corrections
Two active-documentation claims were factually wrong and are corrected:
README.mddescribed the repository as "the new v2 line." It is not. The
repository ships av0.xline —v0.1.0throughv0.5.2— and there is no
v2.xtarget. The rebuild that produced this architecture is history, not a
pending migration. The section now states the real release line and links
version.jsonand the roadmap.docs/architecture.mdomitted@oh-my-pm/examples. It is now documented
with its real role: a development-only composition harness that wires the real
packages together so each documented composition is exercised by a test. It is
the one workspace package outside the release dependency surface — the bundler
deploys none of its code, though itsfixtures/markdown-project/tree is
copied in as the sample project the installed qualification analyzes.
Both corrections were found by the new guards, not by inspection.
Validator improvements
pnpm validate:docs derives its active and historical sets from the manifest
instead of restating them, and gains four guards:
| Guard | Fails when |
|---|---|
| Nonexistent package | an active document names an @oh-my-pm/* package that is not a workspace package |
| Incomplete package map | docs/architecture.md omits a real workspace package |
| Superseded document linked | an active, normative document Markdown-links a document classified superseded |
| Duplicate authority | two active, normative documents declare the same concern |
Plus full classification coverage: every tracked Markdown document must be
classified or explicitly excluded, so a new document cannot default to unchecked.
Both package expectations derive from pnpm-workspace.yaml, so adding or
removing a package moves them automatically and neither can go stale.
The manifest itself is structurally validated: unknown status/authority
values, a superseded entry without a replacement, a replacement that does
not resolve, a classified file that no longer exists, a path classified twice,
and an active entry that declares a replacement are all defects.
Documentation inventory tooling
pnpm docs:inventory # human-readable report
pnpm docs:inventory --json # machine-readable
pnpm docs:inventory:check # exit non-zero on any defect (wired into pnpm validate)It reports active normative, active informative, historical, superseded, release
records, broken replacements, classified-but-missing files, and unclassified
documents. Deterministic (entries sorted, so output is stable and diffable),
offline, and read-only.
Historical preservation policy
Historical claims that were true at publication time are not rewritten to
satisfy present-tense validators. The correct fix for a stale-looking historical
statement is classification, not editing.
CHANGELOG.md is the concrete case. Its v0.2.0 entry states that "the four
shims remain validated byte-for-byte," which was accurate before v0.5 introduced
the canonical ohmypm family and made the installed count eight. Classifying the
changelog as a release-record rather than an active document is what keeps that
entry intact; treating it as active would have made the shim-count guard demand
its rewrite, destroying exactly the release evidence it exists to preserve.
No file under docs/releases/**, docs/v0.3/**, docs/v0.4/**, or
docs/architecture/** is modified by this release.
User-visible behavior statement
None. No command, flag, output format, exit code, MCP tool, MCP schema, tool
order, annotation, Project Brain schema, Project Memory store format, or
installed layout changes. The twelve read-only MCP tools, zero write tools, seven
memory subcommands, Project Brain schema 1, and store format 2 are all
unchanged.
Migration statement
No migration. Installing v0.5.3 over v0.5.2 requires no action, and a v0.5.2
Project Memory store is read and written identically.
Compatibility statement
- Canonical commands
ohmypm,ohmypm-mcp,ohmypm-install— unchanged. - Deprecated aliases
oh-my-pm,oh-my-pm-mcp,oh-my-pm-install— retained,
still warn on stderr only, no removal scheduled. - MCP tool inventory and order — unchanged.
- Generated TypeScript and Rust contracts — unchanged.
- Release archive names, bundle profile, and installed layout — unchanged.
Validation evidence
pnpm build OK
pnpm quality OK (lint, format, rustfmt, clippy)
pnpm test OK (unit, release, rust)
pnpm validate OK (public, structure, boundaries, contracts,
version, commands, references, docs,
docs inventory)
pnpm mcp:smoke OK
pnpm release:preview -- --apply OK
pnpm release:check OK
pnpm release:archives:preview OK
pnpm release:archives:check OK
pnpm release:archives:repro OK
pnpm release:install:check OK
The seventeen mutation tests in tools/docs-manifest.test.mjs each introduce one
contradiction into a disposable git fixture and assert the validator rejects it
with that guard's specific message, then assert the unmutated fixture passes. A
guard never observed failing is not evidence that it matches anything.
Known limitations
concernis declared, not inferred. Duplicate authority is detected only
when two documents claim the sameconcernstring; two documents that overlap
in substance while declaring different concerns are not detected. Naming the
concern is a maintainer judgement.- The superseded-link guard covers Markdown inline links only. A bare path in
prose is intentionally not treated as a live link, so a document that mentions
a superseded path without linking it is not flagged. - The package-map guard checks presence, not accuracy. It proves every real
package is named indocs/architecture.md; it does not verify the prose about
each package is correct. - The provider contract enum remains wider than the supported set.
PROVIDER_ID_VALUESlists seven providers while onlylocalandgithubare
registered and allowed. This is the intentional forward-looking superset
recorded as F-DUP-2 in the v0.2 stabilization audit, gated by the runtime
allow-list. It is documentation-visible only in a historical document and is
not changed here.
What remains for v0.5.4
v0.5.3 establishes documentation truth. v0.5.4 addresses repository and contract
consistency:
- an authoritative package catalog with role, ownership, and dependency rules per
workspace; - a verified, cycle-free package dependency model;
- a shared
ApplicationResult<T>envelope at the application boundary; - normalized source descriptors and provenance contracts;
- a unified
Diagnosticmodel and a repository-wide error taxonomy, consolidating
today's per-use-case structures inapplication/src/errors.tsand
application/src/provider-diagnostics.ts; - CLI exit-code and MCP error mapping made explicit and tested;
- semantic parity tests proving CLI and MCP consume the same application result.
Neither release implements the omp command migration, a Dashboard, new
providers, cloud sync, telemetry, accounts, GitHub mutation, or an HTTP MCP
transport.