@mutmutco/cli 3.108.0 → 3.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/main.cjs +30 -12
  2. package/package.json +1 -1
package/dist/main.cjs CHANGED
@@ -15339,6 +15339,9 @@ async function branchesMergedIntoBase(remote) {
15339
15339
  }
15340
15340
 
15341
15341
  // ../infra/src/version-gate.ts
15342
+ function isDeclaredNonFleetProject(project2) {
15343
+ return String(project2.projectClass ?? "").trim().toLowerCase() === "third-party";
15344
+ }
15342
15345
  var HUB_REPO2 = "mutmutco/mmi-hub";
15343
15346
  var NO_RELEASE_UNKNOWN = "no published GitHub Release";
15344
15347
  var NO_VERSION_LOCK_PREFIX = "no distribution-bom.json or package.json version lock at ";
@@ -15428,7 +15431,12 @@ function buildCanaryClasses(rows, resultByRepo) {
15428
15431
  function evaluateFleetLockstepGate(rows, evaluatedAt, unclassifiedProjectsInput = []) {
15429
15432
  const results = rows.map(classifyRow);
15430
15433
  const resultByRepo = new Map(results.map((r) => [r.repo, r]));
15431
- const unclassifiedProjects = unclassifiedProjectsInput.map((p) => ({
15434
+ const nonFleetProjects = unclassifiedProjectsInput.filter(isDeclaredNonFleetProject).map((p) => ({
15435
+ slug: p.slug,
15436
+ name: p.name,
15437
+ reason: `registered project ${p.slug} (${p.name}) declares class third-party and carries no repository \u2014 operated, not shipped, so it has no release that could conform`
15438
+ }));
15439
+ const unclassifiedProjects = unclassifiedProjectsInput.filter((p) => !isDeclaredNonFleetProject(p)).map((p) => ({
15432
15440
  slug: p.slug,
15433
15441
  name: p.name,
15434
15442
  reason: `registered project ${p.slug} (${p.name}) has no valid registered repository \u2014 unclassifiable fleet membership the N-of-N cannot place, drift or clear`
@@ -15458,6 +15466,7 @@ function evaluateFleetLockstepGate(rows, evaluatedAt, unclassifiedProjectsInput
15458
15466
  drift,
15459
15467
  unknowns,
15460
15468
  unclassifiedProjects,
15469
+ nonFleetProjects,
15461
15470
  canaryClasses: buildCanaryClasses(rows, resultByRepo),
15462
15471
  hubOnly,
15463
15472
  repos: results,
@@ -15609,10 +15618,10 @@ var rollout_plan_default = {
15609
15618
  note: "The v4.0.0 stamp happens at cut time (D6e #4463); until then the candidate is the origin/development head artifacts (built cli/dist + npm pack), identity proven by dist content hash (D6a)."
15610
15619
  },
15611
15620
  baseline: {
15612
- version: "3.107.4",
15613
- tag: "v3.107.4",
15614
- commit: "91d322bf32b3",
15615
- npm: "@mutmutco/cli@3.107.4"
15621
+ version: "3.110.0",
15622
+ tag: "v3.110.0",
15623
+ commit: "6417e1ccdaf4",
15624
+ npm: "@mutmutco/cli@3.110.0"
15616
15625
  },
15617
15626
  exitCriterion: "fleet-n-of-n",
15618
15627
  hubOnlyShortcut: "forbidden",
@@ -15629,14 +15638,14 @@ var rollout_plan_default = {
15629
15638
  repo: "mutmutco/mmi-hub",
15630
15639
  role: "canary",
15631
15640
  schedule: "train",
15632
- v3Target: "v3.107.4"
15641
+ v3Target: "v3.110.0"
15633
15642
  }
15634
15643
  ],
15635
15644
  rollbackTrigger: "Any red inside the post-cut soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a v3 client refused while the compat window must still admit it (SUPPORTED_MINOR_WINDOW=2, MIN_CLIENT_VERSION 0.0.0 \u2014 D6a), or npm consumer install/doctor failure on the v4 dist.",
15636
15645
  rollback: {
15637
15646
  independent: true,
15638
- mechanism: "npm dist-tag latest -> 3.107.4 and redeploy the Hub Lambda from tag v3.107.4 (91d322bf32b3); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15639
- v3Target: "v3.107.4 (@mutmutco/cli@3.107.4, tag commit 91d322bf32b3 \u2014 the preserved latest-v3 distribution, D6b)"
15647
+ mechanism: "npm dist-tag latest -> 3.110.0 and redeploy the Hub Lambda from tag v3.110.0 (6417e1ccdaf4); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
15648
+ v3Target: "v3.110.0 (@mutmutco/cli@3.110.0, tag commit 6417e1ccdaf4 \u2014 the preserved latest-v3 distribution, D6b)"
15640
15649
  }
15641
15650
  },
15642
15651
  {
@@ -16915,7 +16924,8 @@ function buildFleetTrackInventory(projects, releaseProbes, pluginProbes, generat
16915
16924
  anomalies.push({
16916
16925
  kind: "project-without-repo",
16917
16926
  slug: String(project2.slug ?? "?"),
16918
- name: String(project2.name ?? project2.slug ?? "?")
16927
+ name: String(project2.name ?? project2.slug ?? "?"),
16928
+ projectClass: project2.class == null ? null : String(project2.class)
16919
16929
  });
16920
16930
  }
16921
16931
  for (const repo of repos2) {
@@ -17060,7 +17070,7 @@ async function runFleetLockstepGate(deps = defaultFleetTrackInventoryDeps(true))
17060
17070
  inventory.generatedAt,
17061
17071
  // A registered project with no valid repo produces no inventory row (#4685); fold each anomaly
17062
17072
  // into the denominator as an explicit unknown so a repo-less project can never vanish from N-of-N.
17063
- inventory.anomalies.map((a) => ({ slug: a.slug, name: a.name }))
17073
+ inventory.anomalies.map((a) => ({ slug: a.slug, name: a.name, projectClass: a.projectClass }))
17064
17074
  );
17065
17075
  }
17066
17076
  function fleetGateConformanceEvidence(result) {
@@ -17103,6 +17113,10 @@ function formatFleetLockstepGate(result) {
17103
17113
  lines.push("", `unclassifiable registered projects (${result.unclassifiedProjects.length}):`);
17104
17114
  for (const project2 of result.unclassifiedProjects) lines.push(` ? ${project2.reason}`);
17105
17115
  }
17116
+ if (result.nonFleetProjects.length) {
17117
+ lines.push("", `registered projects outside the fleet (${result.nonFleetProjects.length}):`);
17118
+ for (const project2 of result.nonFleetProjects) lines.push(` - ${project2.reason}`);
17119
+ }
17106
17120
  lines.push("", "canary classes by deploy model (canary -> cohort):");
17107
17121
  for (const cls of result.canaryClasses) {
17108
17122
  lines.push(
@@ -22374,6 +22388,7 @@ var WRITE_PROBE_CONCURRENCY = 8;
22374
22388
  var CLAIM_CONCURRENCY = 5;
22375
22389
  var BOARD_ACTIVE_READ_MAX_PAGES = 100;
22376
22390
  var BOARD_PROJECTION_STALE_MS = 24 * 60 * 6e4;
22391
+ var BOARD_PROJECTION_RECONCILE_STALE_MS = 3 * 60 * 6e4;
22377
22392
  var BOARD_PROJECTION_TIMEOUT_MS = 8e3;
22378
22393
  var execFileP4 = (file, args, options = {}) => (
22379
22394
  // encoding 'utf8' guarantees string output at runtime; the cast pins the type (promisify's
@@ -22822,7 +22837,10 @@ function projectionFreshness(row, now) {
22822
22837
  projectedAgeMs,
22823
22838
  sourceTimestamp: row.watermark.sourceTimestamp,
22824
22839
  sourceAgeMs,
22825
- health: row.watermark.health === "stale" || sourceAgeMs > BOARD_PROJECTION_STALE_MS ? "stale" : "fresh"
22840
+ // #4774: health must agree with BOTH ages a caller can see on the source line — a projection whose
22841
+ // rebuild (projectedAt) went stale is exactly as unreliable as one whose source events did, even
22842
+ // while recent webhook activity keeps sourceAgeMs looking fresh.
22843
+ health: row.watermark.health === "stale" || sourceAgeMs > BOARD_PROJECTION_STALE_MS || projectedAgeMs > BOARD_PROJECTION_RECONCILE_STALE_MS ? "stale" : "fresh"
22826
22844
  };
22827
22845
  }
22828
22846
  function renderBoardSource(report) {
@@ -37298,7 +37316,7 @@ var surfaces_default = {
37298
37316
  {
37299
37317
  command: "npm",
37300
37318
  args: ["--prefix", "cli", "run", "build"],
37301
- inputs: ["cli/src", "cli/build.mjs", "cli/package.json", "cli/README.md", "cli/tsconfig.json"],
37319
+ inputs: ["cli/src", "cli/build.mjs", "cli/package.json", "cli/README.md", "cli/tsconfig.json", "infra/rollout-plan.json"],
37302
37320
  outputs: ["cli/dist/index.cjs", "cli/dist/main.cjs"]
37303
37321
  }
37304
37322
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "3.108.0",
3
+ "version": "3.110.0",
4
4
  "description": "MMI Future CLI — the org dev toolbox and shared cross-IDE engine for every registry-declared MMI coding surface.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",