refactor: hard-fork GSD -> MSD (Make Software Done)

Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD
across contents and paths, upstream package/repo coordinates -> @golem15/msd-core
and golem15com/msd-core. Deep links into upstream history, sibling upstream
packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is.

Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line,
package/plugin identity, regenerated lockfile, install-tree fixtures, derived
registries and benchmark baseline; migration checksum baseline re-locked
(MSD keeps its own install state, so no install had applied the old sums);
sort-order and regex-escaped expectations in tests adjusted.
This commit is contained in:
Jakub Zych
2026-10-06 01:47:40 +02:00
parent fe069b2a56
commit a9a7a328e6
2763 changed files with 78465 additions and 78434 deletions

View File

@@ -20,7 +20,7 @@
* "has_work": "true"|"false",
* "matrix": {
* "include": [
* { "name": "<module>", "mutate": "gsd-core/bin/lib/<module>.cjs", "tests": "<space-joined test files>" },
* { "name": "<module>", "mutate": "msd-core/bin/lib/<module>.cjs", "tests": "<space-joined test files>" },
* ...
* ]
* }
@@ -123,7 +123,7 @@ const TARGET_MUTATION_SCORE = 80;
// exists on disk.
//
// SIGNAL: a test file that directly `require()`s a covered module's built
// artifact (`gsd-core/bin/lib/<name>.cjs`) is declaring, by that require, that
// artifact (`msd-core/bin/lib/<name>.cjs`) is declaring, by that require, that
// it constrains that module. That signal alone is far too broad to feed a
// per-mutant re-run budget: measured directly (no filter) against this tree,
// config-schema alone picks up 22 files most of this repo's spawn-heavy
@@ -136,7 +136,7 @@ const TARGET_MUTATION_SCORE = 80;
//
// NARROWING RULE: a file is auto-derived into a module's shard only when BOTH
// hold:
// 1. it directly requires that module's `gsd-core/bin/lib/<name>.cjs`, and
// 1. it directly requires that module's `msd-core/bin/lib/<name>.cjs`, and
// 2. its own filename starts with the module's name followed by `.` or `-`
// (i.e. `<name>.test.cjs`, `<name>.unit.test.cjs`, `<name>.property.test.cjs`,
// `<name>-anything.test.cjs`) — the file DECLARES itself, by its own name,
@@ -177,8 +177,8 @@ let _testRequireCache = null;
/**
* Scan every `tests/*.test.cjs` file once and cache, per covered module name,
* which files directly `require('gsd-core/bin/lib/<name>.cjs')` (or a relative
* equivalent — `../gsd-core/bin/lib/<name>` etc. — the require path always
* which files directly `require('msd-core/bin/lib/<name>.cjs')` (or a relative
* equivalent — `../msd-core/bin/lib/<name>` etc. — the require path always
* ends in the literal segment matched below). Pure w.r.t. process lifetime;
* the tests/ directory does not change while this process runs.
*
@@ -186,7 +186,7 @@ let _testRequireCache = null;
*/
function scanTestRequires() {
if (_testRequireCache) return _testRequireCache;
const REQUIRE_RE = /require\(\s*['"](?:[./]*)?gsd-core\/bin\/lib\/([a-zA-Z0-9_-]+)(?:\.cjs)?['"]\s*\)/g;
const REQUIRE_RE = /require\(\s*['"](?:[./]*)?msd-core\/bin\/lib\/([a-zA-Z0-9_-]+)(?:\.cjs)?['"]\s*\)/g;
const cache = new Map();
let entries;
try {
@@ -315,7 +315,7 @@ function computeModuleTests(moduleName, entry) {
// local run without CI cross-check.
const COVERED = {
'context-utilization': {
cjs: 'gsd-core/bin/lib/context-utilization.cjs',
cjs: 'msd-core/bin/lib/context-utilization.cjs',
// Derived: context-utilization.property.test.cjs (pre-existing) +
// context-utilization.test.cjs (piece-2 derivation find: it directly requires and
// matches the naming rule, but was never hand-added to the old literal list —
@@ -339,7 +339,7 @@ const COVERED = {
// — both genuinely constrain context-composer.cjs (the ladder was relocated INTO it), so
// both are declared via extraTests rather than silently missing from the derivation.
'context-composer': {
cjs: 'gsd-core/bin/lib/context-composer.cjs',
cjs: 'msd-core/bin/lib/context-composer.cjs',
extraTests: [
'prompt-budget-parity.test.cjs',
'prompt-budget.unit.test.cjs',
@@ -349,7 +349,7 @@ const COVERED = {
minScore: 78,
},
'prompt-budget': {
cjs: 'gsd-core/bin/lib/prompt-budget.cjs',
cjs: 'msd-core/bin/lib/prompt-budget.cjs',
// Derived: property + unit (pre-existing) plus two piece-2 derivation finds that
// directly require prompt-budget.cjs and match the naming rule but were never in the
// old hand list — prompt-budget-parity.test.cjs and prompt-budget.test.cjs. Measured
@@ -364,7 +364,7 @@ const COVERED = {
minScore: 87,
},
frontmatter: {
cjs: 'gsd-core/bin/lib/frontmatter.cjs',
cjs: 'msd-core/bin/lib/frontmatter.cjs',
// extraTests: files that genuinely constrain frontmatter.cjs but do not match the
// "frontmatter*" naming rule, so the derivation cannot find them on its own —
// each earns its slot on evidence, not blanket inclusion (verified no two duplicate
@@ -384,7 +384,7 @@ const COVERED = {
// excludeTests: files the derivation WOULD auto-include (require frontmatter.cjs
// directly AND match the "frontmatter*" naming rule) but are deliberately withheld:
// - frontmatter-cli.test.cjs: 778-line CLI-integration file, 39 subprocess-spawn
// references (spawnSync/execFileSync/runGsdTools) — the same #2790
// references (spawnSync/execFileSync/runMsdTools) — the same #2790
// planning-inspect.test.cjs shape (a `node --test <file>` invocation Stryker's
// command runner re-runs whole, once per mutant, at whatever its slowest spawn
// case costs). Never measured in a shard; excluded up front on the same evidence
@@ -396,7 +396,7 @@ const COVERED = {
// for #3881) projected to ~96 of the shard's 140-minute total. Its two
// genuinely-unique assertion classes — anchor-alias-bomb refusal (billion-laughs
// -style anchor/alias expansion must be rejected, not expanded) and the B1/B2
// block-scalar assertions (parsing commands/gsd/add-tests.md must not invent a
// block-scalar assertions (parsing commands/msd/add-tests.md must not invent a
// phantom "Example" key) — were relocated verbatim into
// feat-3881-yaml-parser-consequences.test.cjs (already in this shard via
// extraTests above) rather than deleted, so the mutants they kill stay killed.
@@ -437,11 +437,11 @@ const COVERED = {
// (e.g. graphify-auto-update.slow.test.cjs) that merely load config-schema as a fixture
// dependency of something else under test.
'adr-parser': {
cjs: 'gsd-core/bin/lib/adr-parser.cjs',
cjs: 'msd-core/bin/lib/adr-parser.cjs',
minScore: 68,
},
'config-schema': {
cjs: 'gsd-core/bin/lib/config-schema.cjs',
cjs: 'msd-core/bin/lib/config-schema.cjs',
// CI 54.55% timeout-free (18 killed / 0 timeout / 33 total) 2026-06-14;
// local was 69.7% — timeout inflation. Floor = 54 - 2 margin.
// CI run 33012034388 (2026-08-25, #3881 ratchet): measured 75.51%. Floor =
@@ -449,13 +449,13 @@ const COVERED = {
minScore: 74,
},
'active-workstream-store': {
cjs: 'gsd-core/bin/lib/active-workstream-store.cjs',
cjs: 'msd-core/bin/lib/active-workstream-store.cjs',
// CI run 33012034388 (2026-08-25, #3881 ratchet): measured 87.42%. Floor =
// floor(87.42) - 1 = 86.
minScore: 86,
},
'core-utils': {
cjs: 'gsd-core/bin/lib/core-utils.cjs',
cjs: 'msd-core/bin/lib/core-utils.cjs',
minScore: 75, // measured 77.52% (2026-06-14, issue #1187); floor = 77 - 2
},
// planning-inspect / plan-document / planning-command-router: net-new modules
@@ -467,7 +467,7 @@ const COVERED = {
// integration file were CANCELLED at the workflow's 15-minute cap —
// "Mutation testing 4% (elapsed: ~3m, remaining: ~1h 19m) 27/640 tested".
// tests/planning-inspect.test.cjs is INTEGRATION-shaped (91 cases, most
// spawning a `gsd-tools` child process via `runGsdTools`); Stryker's command
// spawning a `msd-tools` child process via `runMsdTools`); Stryker's command
// runner treats the whole `node --test <file>` invocation as ONE test costing
// whatever the slowest case costs (measured ~20s), and re-runs that entire
// file once per mutant — 640 mutants x 20s cannot finish in 15 minutes.
@@ -492,7 +492,7 @@ const COVERED = {
// All three shards point at tests/planning-inspect.unit.test.cjs (in-process,
// spawn-free, ~0.3s dry run), not tests/planning-inspect.test.cjs — that is
// what made measurement possible at all. The integration file spawns a
// subprocess per case via runGsdTools; Stryker's command runner treats the
// subprocess per case via runMsdTools; Stryker's command runner treats the
// whole `node --test <file>` invocation as one test costing whatever the
// slowest case costs (measured ~20s), and re-runs that entire file once per
// mutant, so 640 mutants x 20s could not finish inside the 15-minute shard
@@ -505,7 +505,7 @@ const COVERED = {
// otherwise auto-include it and reproduce the exact 15-minute-cap cancellation the
// comment above documents.
'planning-inspect': {
cjs: 'gsd-core/bin/lib/planning-inspect.cjs',
cjs: 'msd-core/bin/lib/planning-inspect.cjs',
excludeTests: ['planning-inspect.test.cjs'],
minScore: 56,
},
@@ -514,12 +514,12 @@ const COVERED = {
// #2790 extracted them alongside), so the naming-rule derivation finds nothing — same
// cross-cutting shape as context-composer above. Declared via extraTests.
'plan-document': {
cjs: 'gsd-core/bin/lib/plan-document.cjs',
cjs: 'msd-core/bin/lib/plan-document.cjs',
extraTests: ['planning-inspect.unit.test.cjs'],
minScore: 75,
},
'planning-command-router': {
cjs: 'gsd-core/bin/lib/planning-command-router.cjs',
cjs: 'msd-core/bin/lib/planning-command-router.cjs',
extraTests: ['planning-inspect.unit.test.cjs'],
minScore: 94,
},
@@ -531,7 +531,7 @@ const COVERED = {
//
// Same #2790 precedent as planning-inspect above: this shard points at a
// dedicated tests/model-catalog.unit.test.cjs, NOT tests/model-resolver.test.cjs
// — that integration file uses runGsdTools heavily and would hit the same
// — that integration file uses runMsdTools heavily and would hit the same
// 15-minute shard-cap cancellation #2790 documented (a `node --test <file>`
// invocation is ONE test costing whatever its slowest case costs, re-run
// per mutant). tests/model-catalog.unit.test.cjs is spawn-free, in-process,
@@ -573,7 +573,7 @@ const COVERED = {
// The floor MUST come from a CI shard, never a local run — same rule as every other
// entry in this file.
'model-catalog': {
cjs: 'gsd-core/bin/lib/model-catalog.cjs',
cjs: 'msd-core/bin/lib/model-catalog.cjs',
minScore: 74,
},
// state-contract: net-new module from #3227. Without this entry the
@@ -583,8 +583,8 @@ const COVERED = {
//
// Same #2790 precedent as planning-inspect / model-catalog above: this
// shard points at tests/state-contract.unit.test.cjs, NOT
// tests/state-contract.test.cjs — the latter spawns a `gsd-tools` child
// process per case via runGsdTools, and Stryker's command runner treats
// tests/state-contract.test.cjs — the latter spawns a `msd-tools` child
// process per case via runMsdTools, and Stryker's command runner treats
// the whole `node --test <file>` invocation as ONE test costing whatever
// its slowest case costs, re-run once per mutant, so it cannot finish
// inside the 15-minute shard cap. tests/state-contract.unit.test.cjs is
@@ -608,7 +608,7 @@ const COVERED = {
// but is the same spawn-heavy integration shape as planning-inspect.test.cjs (446 lines,
// 16 subprocess-spawn references) — excluded explicitly rather than left to fall through.
'state-contract': {
cjs: 'gsd-core/bin/lib/state-contract.cjs',
cjs: 'msd-core/bin/lib/state-contract.cjs',
excludeTests: ['state-contract.test.cjs'],
minScore: 65,
},