Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ All notable changes to the `pm` plugin, mirroring [CHANGELOG.md](https://github.

---

<Update label="0.25.0" description="2026-07-30">
### Added

- **`rules-target` — a read-only query printing the absolute path of the file the resolved platform's rules block belongs in**, walking that platform's first-match-wins chain. It deliberately does _not_ record a platform: a query must not mutate state the way `write-rules` does.
It exists so tooling around pm never has to mirror `PLATFORM_RULES_CHAIN`. `evals/observe.py` hardcoded `CLAUDE.md`, which 0.24.0 quietly turned into a _second_ platform seam — once the engine began writing a per-platform target, the observer reported `rules_block_present: false` for any platform whose block lands elsewhere. That is a confident wrong answer, and it would have surfaced on the first Hermes or Codex run as a parity failure that is not real. Copying the chain into Python was rejected: a second copy of platform knowledge only _moves_ the drift instead of removing it.
</Update>

<Update label="0.24.0" description="2026-07-30">
### Added

Expand All @@ -16,8 +23,7 @@ All notable changes to the `pm` plugin, mirroring [CHANGELOG.md](https://github.

### Changed

- **The test suite is now `scripts/test/*.test.mjs` (11 files) instead of one `scripts/conductor.test.mjs`, so it runs in parallel.** Contributor-facing: the command is `node --test scripts/test/*.test.mjs`. Measured rather than guessed — one engine spawn costs ~73ms and the suite makes 676 of them, so ~49s was pure `node` startup, serialized in a single file on a 16-core machine; `node --test` parallelizes across _files_ only. The split is verbatim, verified by test-name-set equality (255 → 255). Note `node --test scripts/test` (a directory) does **not** work — Node treats the argument as a module to execute and dies with `MODULE_NOT_FOUND` while reporting "1 test".
**How much faster depends entirely on free cores, so treat any single headline number with salt.** Measured on this project: an otherwise-idle 16-core workstation went ~118s → ~46s (2.6×), but the _same_ machine under load (~12) went ~146s → ~122s — only 1.2×, because parallel execution is exactly what suffers when cores are already contended. On CI, whole-workflow time went from ~52–58s to ~38–48s (~1.3×). On a busy laptop or a few-core runner, expect the low end.
- **The test suite is now `scripts/test/*.test.mjs` (11 files) instead of one `scripts/conductor.test.mjs`, so it runs in parallel.** Contributor-facing: the command is `node --test scripts/test/*.test.mjs`. Measured rather than guessed — one engine spawn costs ~73ms and the suite makes 676 of them, so ~49s was pure `node` startup, serialized in a single file on a 16-core machine; `node --test` parallelizes across _files_ only. The split is verbatim, verified by test-name-set equality (255 → 255). Note `node --test scripts/test` (a directory) does **not** work — Node treats the argument as a module to execute and dies with `MODULE_NOT_FOUND` while reporting "1 test". **How much faster depends entirely on free cores, so treat any single headline number with salt.** Measured on this project: an otherwise-idle 16-core workstation went ~118s → ~46s (2.6×), but the _same_ machine under load (~12) went ~146s → ~122s — only 1.2×, because parallel execution is exactly what suffers when cores are already contended. On CI, whole-workflow time went from ~52–58s to ~38–48s (~1.3×). On a busy laptop or a few-core runner, expect the low end.
- **`.githooks/pre-commit` now aborts if the suite runs fewer tests than are declared.** The glob makes a partial-suite pass possible in a way the single file never did: if a file stops matching, everything still goes green, just on a subset. The hook cross-checks the runner's count against `grep -Hc '^test('` across the files — self-maintaining, with no constant to bump as tests are added.

### Fixed
Expand Down
4 changes: 2 additions & 2 deletions introduction.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ These aren't benchmarks — they're real figures pulled mechanically from PM's o

| Metric | Value |
| --- | --- |
| Releases shipped end-to-end (spec → build → test → changelog → release) | **38** |
| Tests in the engine | **282** |
| Releases shipped end-to-end (spec → build → test → changelog → release) | **39** |
| Tests in the engine | **287** |
| Lines of engine code (`scripts/conductor.mjs` \+ `scripts/lib/*.mjs`) | **~2,900** |
| External dependencies | **0** |

Expand Down