@mutmutco/codex-plugin 4.6.29 → 4.6.30

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mmi",
3
- "version": "4.6.29",
3
+ "version": "4.6.30",
4
4
  "mmiCompat": "4.x",
5
5
  "description": "MMI workflow skills and org gates delivery.",
6
6
  "author": {
package/cli/dist/main.cjs CHANGED
@@ -28248,10 +28248,10 @@ var rollout_plan_default = {
28248
28248
  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)."
28249
28249
  },
28250
28250
  baseline: {
28251
- version: "4.6.29",
28252
- tag: "v4.6.29",
28253
- commit: "36e01a038f52",
28254
- npm: "@mutmutco/cli@4.6.29"
28251
+ version: "4.6.30",
28252
+ tag: "v4.6.30",
28253
+ commit: "52569fa5c01e",
28254
+ npm: "@mutmutco/cli@4.6.30"
28255
28255
  },
28256
28256
  exitCriterion: "fleet-n-of-n",
28257
28257
  hubOnlyShortcut: "forbidden",
@@ -28268,14 +28268,14 @@ var rollout_plan_default = {
28268
28268
  repo: "mutmutco/mmi-hub",
28269
28269
  role: "canary",
28270
28270
  schedule: "train",
28271
- v3Target: "v4.6.29"
28271
+ v3Target: "v4.6.30"
28272
28272
  }
28273
28273
  ],
28274
28274
  rollbackTrigger: "Any red inside the post-contract soak window: `devops train gate` FAIL attributable to the v4 doors, Hub endpoint health probe failure, a pre-v4 client admitted instead of receiving actionable HTTP 426, or npm consumer install/doctor failure on the v4-only dist.",
28275
28275
  rollback: {
28276
28276
  independent: true,
28277
- mechanism: "npm dist-tag latest -> 4.6.29 and redeploy the Hub Lambda from tag v4.6.29 (36e01a038f52); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
28278
- v3Target: "v4.6.29 (@mutmutco/cli@4.6.29, tag commit 36e01a038f52 \u2014 last known-good release carrying the repo-index v4-only contract)"
28277
+ mechanism: "npm dist-tag latest -> 4.6.30 and redeploy the Hub Lambda from tag v4.6.30 (52569fa5c01e); installed clients repair via `mmi-cli doctor`. No other cohort is touched.",
28278
+ v3Target: "v4.6.30 (@mutmutco/cli@4.6.30, tag commit 52569fa5c01e \u2014 last known-good release carrying the repo-index v4-only contract)"
28279
28279
  }
28280
28280
  },
28281
28281
  {
@@ -39363,8 +39363,9 @@ function blessedHubActionPins(constants = gate_budget_exports) {
39363
39363
  }
39364
39364
  return pins;
39365
39365
  }
39366
+ var PIN_COMMIT_FORMAT = "commit-format:runbook-unaffected";
39366
39367
  function pinTableDigest(pins) {
39367
- return (0, import_node_crypto11.createHash)("sha1").update([...pins].map(([a, s]) => `${a}@${s}`).sort().join("\n")).digest("hex");
39368
+ return (0, import_node_crypto11.createHash)("sha1").update([PIN_COMMIT_FORMAT, ...[...pins].map(([a, s]) => `${a}@${s}`).sort()].join("\n")).digest("hex");
39368
39369
  }
39369
39370
  var HUB_ACTION_USE = /^(\s*-?\s*uses:\s*['"]?mutmutco\/mmi-hub\/\.github\/actions\/)([\w.-]+)@([^\s'"#]+)([^\n]*)$/i;
39370
39371
  function staleHubActionPins(body, pins = blessedHubActionPins()) {
@@ -39484,7 +39485,9 @@ async function runPinTick(input) {
39484
39485
  if (!next.changes.length) continue;
39485
39486
  lines2.push(...next.changes.map((c) => `- \`${path2}:${c.line}\` ${c.action}: \`${c.from.slice(0, 12)}\` \u2192 \`${c.to.slice(0, 12)}\``));
39486
39487
  const tmp = (0, import_node_path29.join)((0, import_node_os17.tmpdir)(), `mmi-pin-propagate-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}.json`);
39487
- const put = { message: `ci: pin MMI-Hub actions in ${path2} to the blessed SHAs`, content: encodeGitHubContents(next.body), branch };
39488
+ const put = { message: `ci: pin MMI-Hub actions in ${path2} to the blessed SHAs
39489
+
39490
+ Runbook-Unaffected: SHA-only MMI-Hub action pin move; no workflow step changes`, content: encodeGitHubContents(next.body), branch };
39488
39491
  if (file.sha) put.sha = file.sha;
39489
39492
  (0, import_node_fs32.writeFileSync)(tmp, JSON.stringify(put), "utf8");
39490
39493
  try {
@@ -42451,9 +42454,19 @@ async function runPrLandOnce(prNumber, options, deps) {
42451
42454
  }
42452
42455
  }
42453
42456
  }
42454
- const checksWaitError = (checksWait) => {
42457
+ const isConflicting = (state) => state.mergeStateStatus === "DIRTY" || state.mergeable === "CONFLICTING";
42458
+ const conflictError = () => `pr land #${prNumber}: branch conflicts with base \u2014 merge origin/development into the branch (never rebase a pushed branch), rebuild any checked-in artifacts, then push before landing${hasQueue ? `; ${prQueueReadHint(prNumber, repo)}` : ""}`;
42459
+ const readPrState = async () => {
42460
+ const state = await deps.readPrState(prNumber, repo);
42461
+ if (!isConflicting(state)) return state;
42462
+ await (deps.sleep ?? ((ms) => new Promise((resolve8) => setTimeout(resolve8, ms))))(PR_HEAD_UPDATE_API_READ_DELAY_MS);
42463
+ return deps.readPrState(prNumber, repo);
42464
+ };
42465
+ let prState;
42466
+ const checksWaitError = async (checksWait) => {
42455
42467
  if (checksWait.status === "conflicting") {
42456
- return `checks-wait conflicting: ${checksWait.reason ?? "PR is conflicting with the base branch"}`;
42468
+ prState = await readPrState();
42469
+ return isConflicting(prState) ? conflictError() : void 0;
42457
42470
  }
42458
42471
  if (checksWait.status === "failure" || checksWait.status === "timeout" || checksWait.status === "rate-limited") {
42459
42472
  return `checks-wait ${checksWait.status}${checksWait.detail ? `: ${checksWait.detail}` : ""}`;
@@ -42461,11 +42474,11 @@ async function runPrLandOnce(prNumber, options, deps) {
42461
42474
  return void 0;
42462
42475
  };
42463
42476
  base.checksWait = await deps.waitForChecks(prNumber, repo);
42464
- const waitError = checksWaitError(base.checksWait);
42465
- if (waitError) return { ...base, error: hasQueue ? `${waitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : waitError };
42477
+ const waitError = await checksWaitError(base.checksWait);
42478
+ if (waitError) return { ...base, error: hasQueue && base.checksWait.status !== "conflicting" ? `${waitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : waitError };
42466
42479
  const driftAfterChecks = await headDrift("after checks");
42467
42480
  if (driftAfterChecks) return driftAfterChecks;
42468
- let prState = await deps.readPrState(prNumber, repo);
42481
+ prState = prState ?? await readPrState();
42469
42482
  if (!hasQueue && pinned && prState.mergeStateStatus === "BEHIND") {
42470
42483
  return {
42471
42484
  ...base,
@@ -42480,16 +42493,11 @@ async function runPrLandOnce(prNumber, options, deps) {
42480
42493
  return { ...base, error: `pr land #${prNumber}: ${e.message}` };
42481
42494
  }
42482
42495
  base.checksWait = await deps.waitForChecks(prNumber, repo);
42483
- const reWaitError = checksWaitError(base.checksWait);
42484
- if (reWaitError) return { ...base, error: hasQueue ? `${reWaitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : reWaitError };
42485
- prState = await deps.readPrState(prNumber, repo);
42486
- }
42487
- if (prState.mergeStateStatus === "DIRTY" || prState.mergeable === "CONFLICTING") {
42488
- return {
42489
- ...base,
42490
- error: `pr land #${prNumber}: branch conflicts with base \u2014 rebase/merge development, rebuild any checked-in artifacts, then re-push before landing${hasQueue ? `; ${prQueueReadHint(prNumber, repo)}` : ""}`
42491
- };
42496
+ const reWaitError = await checksWaitError(base.checksWait);
42497
+ if (reWaitError) return { ...base, error: hasQueue && base.checksWait.status !== "conflicting" ? `${reWaitError} \u2014 ${prQueueReadHint(prNumber, repo)}` : reWaitError };
42498
+ prState = await readPrState();
42492
42499
  }
42500
+ if (isConflicting(prState)) return { ...base, error: conflictError() };
42493
42501
  if (hasQueue && !deps.enqueueQueue) throw new Error("queue-only enqueue adapter unavailable; no merge dispatched");
42494
42502
  const merge = await mergeAutoWithTransientRetry(prNumber, repo, hasQueue ? { ...deps, mergeAuto: (pr, target) => deps.enqueueQueue(pr, target, pinned) } : deps);
42495
42503
  base.mergeStatus = merge.mergeStatus;
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/cli",
3
- "version": "4.6.29",
3
+ "version": "4.6.30",
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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mutmutco/codex-plugin",
3
- "version": "4.6.29",
3
+ "version": "4.6.30",
4
4
  "description": "MMI workflow skills and org gates delivery.",
5
5
  "author": {
6
6
  "name": "MMI Future",
@@ -1,2 +1,2 @@
1
- In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
1
+ In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: run `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` instead (a lead-only cut needs `--suite-solo --owner-go`). On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync. A suite member never asks for, proposes or prompts an rc, release or hotfix — the suite orchestrator is the only voice that brings a cut to Jervaise, so a member session states what landed and stops instead of offering a cut.
2
2
 
@@ -1,4 +1,4 @@
1
- In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: the suite path is `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` (a lead-only cut needs `--suite-solo --owner-go`). `--owner-go` records Jervaise's explicit go for that one cut; it is never the agent's own flag. Never pass it on your own authority: a held train or a stale MM-Work cut (`suite abandon --owner-go`, then `suite rcand --owner-go`) is handed to the suite orchestrator with that exact command sequence, and runs only after the owner says go. On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync.
1
+ In the suite lead (MM-Work) a plain rcand, release or hotfix refuses: the suite path is `mmi-cli devops suite rcand --owner-go` or `mmi-cli devops suite release --owner-go` (a lead-only cut needs `--suite-solo --owner-go`). `--owner-go` records Jervaise's explicit go for that one cut; it is never the agent's own flag. Never pass it on your own authority: a held train or a stale MM-Work cut (`suite abandon --owner-go`, then `suite rcand --owner-go`) is handed to the suite orchestrator with that exact command sequence, and runs only after the owner says go. On your own, run only the read-only previews `mmi-cli devops suite rcand --dry-run` and `mmi-cli devops suite hotfix <member> --dry-run`; `suite release` and `suite abandon` have no dry-run, so never run them yourself. A real suite rcand, release, hotfix or abandon runs only on the owner's go, executed by the owner or the suite orchestrator. A suite member cannot run standalone rcand, release or hotfix: cut from the suite lead; only a backward-compatible solo backend release/hotfix with explicit owner approval may pass `--suite-solo --owner-go`, and its MM-Work development pin PR must land before the suite is in sync. A suite member never asks for, proposes or prompts an rc, release or hotfix — the suite orchestrator is the only voice that brings a cut to Jervaise, so a member session states what landed and stops instead of offering a cut.
2
2
 
3
3
  Support sessions (MMI-Hub, Jerv-Hub, Jerv-JervCode) are not suite members and hold standing owner authorization (2026-10-25) to cut and ship releases at their discretion during suite runs without repeated per-release approval, and under the owner's 2026-11-01 ruling each support session strives during a suite run to finish its own board and cut a patch release for landed-but-unreleased merges so suite members pick the update up in that run instead of waiting for a later cut, keeping all standard release preflight, gate, and verification checks.
4
4