@mutmutco/codex-plugin 4.5.209 → 4.5.211
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.
- package/.codex-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +455 -313
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/board/SKILL.md +7 -4
- package/skills/bootstrap/seeds/gate.template.yml +2 -2
- package/skills/bootstrap/seeds/runbook-unaffected.json +2 -2
- package/skills/bootstrap/seeds/suite-gate.template.yml +1 -1
- package/skills/bootstrap/seeds/suite-guide.template.md +1 -1
- package/skills/epic/SKILL.md +2 -2
- package/skills/hotfix/SKILL.md +6 -4
- package/skills/mmi-help/SKILL.md +1 -2
- package/skills/org-guide/SKILL.md +3 -2
- package/skills/org-guide/references/work-and-releases.md +53 -9
- package/skills/rcand/SKILL.md +3 -3
- package/skills/rcand/recovery.md +1 -1
- package/skills/release/SKILL.md +3 -3
- package/skills/release/recovery.md +1 -1
- package/skills/release/verification.md +6 -6
package/cli/package.json
CHANGED
package/package.json
CHANGED
package/skills/board/SKILL.md
CHANGED
|
@@ -21,6 +21,8 @@ accepts an incomplete board. The CLI partitions rows into **Yours**, **Free to c
|
|
|
21
21
|
stamps (4 hours without work) hold nothing. Partition rules, stamp details and `--out` rationale:
|
|
22
22
|
[reference.md](reference.md).
|
|
23
23
|
|
|
24
|
+
Read single issues/PRs with `MMI_ACTOR=app mmi-cli devops read issue view <n> --repo <owner/repo> --json <fields>` (or `issue list`, `pr view`, `run view`) and filter the JSON locally: under the App pool, gh `--jq`/`-q`/`--template`/`--web` are refused.
|
|
25
|
+
|
|
24
26
|
## Step 2 — render it
|
|
25
27
|
|
|
26
28
|
Plain markdown, never a fenced block. Flat `-` lists under bold heads, never `##` headings, never tables.
|
|
@@ -56,12 +58,13 @@ Present the plan — batch count, issue count, one line per batch naming its sha
|
|
|
56
58
|
mmi-cli oracle board claim <ref> <ref> <ref> --json
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
Announce issue/PR counts; refresh `mmi-cli oracle board read` this session and select ordinary claims from **Free to claim**. Read every result: failures exit nonzero. On conflict, do not blindly retry: refresh, pick another candidate or coordinate a handoff; `--force` only for an owner-authorized intentional takeover. Run writes separately, never `;`; dependent follow-ups use `&&`.
|
|
62
|
+
|
|
63
|
+
Follow printed owner rulings; record new ones with `mmi-cli oracle issue decision`. One concurrent worktree per batch: [reference.md](reference.md).
|
|
61
64
|
|
|
62
|
-
|
|
65
|
+
With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629).
|
|
63
66
|
|
|
64
|
-
|
|
67
|
+
A fresh mmi worktree has no `.jerv/`: run `mkdir -p .jerv/tmp` before writing scratch files there (PR bodies, batches) or listing it.
|
|
65
68
|
|
|
66
69
|
## Step 5 — land one PR per batch
|
|
67
70
|
|
|
@@ -29,7 +29,7 @@ name: gate
|
|
|
29
29
|
# checks ruleset on main cannot be silently skipped by a future bootstrap (#4113).
|
|
30
30
|
# GATE_BUDGET_SHA is rendered by the CLI from its blessed run-with-budget pin — not an operator knob.
|
|
31
31
|
# GATE_RUNNER_SHA pins the org runner-checkout / runner-node-toolchain actions (#5610).
|
|
32
|
-
# #
|
|
32
|
+
# #8911 supersedes #8671: existing self-hosted capacity only; no hosted fallback.
|
|
33
33
|
on:
|
|
34
34
|
pull_request:
|
|
35
35
|
merge_group:
|
|
@@ -63,7 +63,7 @@ jobs:
|
|
|
63
63
|
# that runs the full job; main must never become skippable via bootstrap vars alone while the
|
|
64
64
|
# org ruleset still requires `gate` on main.
|
|
65
65
|
if: ${{ github.event_name != 'push' || github.ref_name == '{{GATE_FULL_RUN_BRANCH}}' || github.ref_name == 'main' || github.ref_type == 'tag' }}
|
|
66
|
-
runs-on:
|
|
66
|
+
runs-on: [self-hosted, linux, x64, mmi-live]
|
|
67
67
|
defaults:
|
|
68
68
|
run: { working-directory: {{GATE_WORKDIR}} }{{GATE_SERVICES_YAML}}
|
|
69
69
|
steps:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
".github/workflows/agent-pr.yml": {
|
|
3
|
-
"blob": "
|
|
4
|
-
"reason": "runs-on
|
|
3
|
+
"blob": "fb6185c6da068daeec869034ee028fb00ef0b849",
|
|
4
|
+
"reason": "runs-on only: hosted-fallback expression replaced by the literal self-hosted tuple it already resolved to (#8911); job logic and operator steps unchanged"
|
|
5
5
|
},
|
|
6
6
|
"scripts/next-version.mjs": {
|
|
7
7
|
"blob": "2c1985b59edc779695479559074e7654c1574a11",
|
|
@@ -16,7 +16,7 @@ permissions:
|
|
|
16
16
|
packages: read
|
|
17
17
|
jobs:
|
|
18
18
|
gate:
|
|
19
|
-
runs-on:
|
|
19
|
+
runs-on: [self-hosted, linux, x64, mmi-live]
|
|
20
20
|
timeout-minutes: 10
|
|
21
21
|
steps:
|
|
22
22
|
# #8206: keep a fresh successful tag gate; promote the exact development verdict, not a ref.
|
|
@@ -147,7 +147,7 @@ Front-load Impeccable before any UI or MM Artifact authoring: `impeccable contex
|
|
|
147
147
|
|
|
148
148
|
Impeccable v4.7.0 (engine v0.1.16) workflow; CLI verbs and agent playbooks are distinct:
|
|
149
149
|
|
|
150
|
-
1. Boot once with `impeccable context --target <path>`. Use the `init` playbook for durable PRODUCT.md context, `document` for DESIGN.md + `.impeccable/design.json`, `impeccable doctor --json` to report drift, and `extract` to identify reuse. Read `reference/craft-floor.md` immediately before UI edits and `reference/operate.md` for task-oriented app UI. Extract through the existing kit; only the Design Lead can authorize kit changes.
|
|
150
|
+
1. Boot once with `impeccable context --target <path>`. Use the `init` playbook for durable PRODUCT.md context, `document` for DESIGN.md + `.impeccable/design.json`, `impeccable doctor --json` to report drift, and `extract` to identify reuse. Read `reference/craft-floor.md` immediately before UI edits and `reference/operate.md` for task-oriented app UI. Extract through the existing kit; only the Design Lead can authorize kit changes. The Impeccable CLI is the installed script at `~/.agents/skills/impeccable/scripts/impeccable` (or bare `impeccable` on `PATH`); no Impeccable CLI package is published on npm, so never run `npx @impeccable-style/cli ...` (it 404s) or chain `npx` guesses into git/bootstrap commands (#8885).
|
|
151
151
|
2. Run `impeccable hooks on`: shared `.impeccable/config.json` enables hooks; private overrides/consent live in gitignored `.impeccable/config.local.json`. Tier 1 scans mechanical issues per edit; Tier 2 runs a deep scan at turn-end `Stop` on supported hosts. Hook support is host-specific: verify `hooks status`; hosts without automatic hooks must run the manual detector. `impeccable detect --json <target>` exits **0 clean / 2 findings**; crashes or malformed output are failures, not clean passes. Source scans need markup files/directories, not CSS-only targets.
|
|
152
152
|
3. Use the dual-subagent `critique` playbook, persisting through `critique-storage`, and `audit` (accessibility, performance, theming, responsive design, implementation integrity; five dimensions scored 0–4, **20 points** total). Keep independent design judgment separate from detector evidence; disclose degraded runs and unavailable checks. Still inspect the live result.
|
|
153
153
|
4. Select applicable refinement/enhancement/fix playbooks, not every playbook blindly: `polish`, `bolder`, `quieter`, `distill`, `harden`, `onboard`, `layout`, `typeset`, `colorize`, `animate`, `delight`, `overdrive`, `clarify`, `adapt`, `optimize` (15 names in v4.7.0).
|
package/skills/epic/SKILL.md
CHANGED
|
@@ -29,7 +29,7 @@ Inspect existing children first:
|
|
|
29
29
|
mmi-cli oracle issue children <owner/repo#N>
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Write a JSON array, one object per child, to `.jerv/tmp/epic-<parentNumber>-children.json` (unique per epic; a leftover batch from another epic collides with the new rows):
|
|
32
|
+
Write a JSON array, one object per child, to `.jerv/tmp/epic-<parentNumber>-children.json` (unique per epic; a leftover batch from another epic collides with the new rows). A fresh mmi worktree has no `.jerv/`; run `mkdir -p .jerv/tmp` first:
|
|
33
33
|
|
|
34
34
|
```json
|
|
35
35
|
[
|
|
@@ -70,7 +70,7 @@ This JSON is the placement authority: every intended child must be linked and on
|
|
|
70
70
|
mmi-cli oracle issue link-child <parent> <child>
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
Each child is now a parallel item: one worktree + PR each. On Windows set `git config core.longpaths true` on the main checkout before the first `git worktree add`. When linked worktrees share a clone, serialize `git branch -m` and other ref renames (or retry serially on `.tmp-renamed-log`). **When the last child merges, close the umbrella** (board `Done` follows).
|
|
73
|
+
Each child is now a parallel item: one worktree + PR each. With several task lanes in one session, pass `worktree: <the mmi-worktrees/<Repo>/<issue>-<slug> path jerv_worktree_create reported>` to `jerv_worktree_exec` / `jerv_worktree_land` every time; they refuse to guess (#5629). On Windows set `git config core.longpaths true` on the main checkout before the first `git worktree add`. When linked worktrees share a clone, serialize `git branch -m` and other ref renames (or retry serially on `.tmp-renamed-log`). **When the last child merges, close the umbrella** (board `Done` follows).
|
|
74
74
|
|
|
75
75
|
Never free-type children with raw `gh issue create`: the batch path carries validation, board attach and structured output.
|
|
76
76
|
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -29,6 +29,8 @@ mmi-cli devops train doctor --lane hotfix --heal --json
|
|
|
29
29
|
|
|
30
30
|
Parse stdout only; never `2>&1`. `ready` false → stop and quote every blocker's `code` and `remedy`; an unread origin is never green. Findings carry `code`, `severity`, `source`, `remedy`, `anchor`.
|
|
31
31
|
|
|
32
|
+
Piping `mmi-cli devops api get` into a JSON parser: a refusal exits 1 with empty stdout, so guard both: `out=$(MMI_ACTOR=app mmi-cli devops api get <path>) && [ -n "$out" ] && printf '%s' "$out" | node -e '…'`. One job's metadata: read the allowlisted `repos/{owner}/{repo}/actions/runs/{id}/jobs` and filter `jobs[]` by `id`; `actions/jobs/{id}` is refused (only its `/logs`, with `--out`).
|
|
33
|
+
|
|
32
34
|
## Apply
|
|
33
35
|
|
|
34
36
|
From the primary checkout.
|
|
@@ -56,12 +58,12 @@ MMI-Hub adds `--announce-summary-file "$f"`: a fresh 3–6 line neutral summary,
|
|
|
56
58
|
|
|
57
59
|
Read receipts, not the exit code (`1` = follow-up failed after tag; pending exits `0`):
|
|
58
60
|
|
|
59
|
-
- `runs[]`: watch each non-success: `
|
|
61
|
+
- `runs[]`: watch each non-success: `mmi-cli devops read run watch <run-id> --repo {owner}/{repo} --exit-status --interval 60`; failed-job logs: `mmi-cli devops read run log <run-id> --repo {owner}/{repo} --failed --tail 200`. `deploy.yml`, `publish.yml`, `tenant-deploy.yml`, `jerv-gateway` are deploy/publish verdicts; a `gate` run is ordinary CI.
|
|
60
62
|
- `foldStatus`/`foldNote`: land the fold PR by true merge (Merge floor).
|
|
61
63
|
- `announceNote`, `verifyNote`, `checkout`, `localSync`, `ledger`: pending or failed = unresolved.
|
|
62
64
|
- `localInstall` (MMI-Hub): via `mmi-hub update`, never `npm i -g`.
|
|
63
65
|
|
|
64
|
-
`
|
|
66
|
+
`tag_name` from `mmi-cli devops api get repos/{owner}/{repo}/releases/latest` must equal the tag, on `origin/main`. Use typed reads, never raw `gh` reads or formatter flags the App pool refuses; filter their JSON stdout in a pipe, never via a `tmp/` file.
|
|
65
67
|
|
|
66
68
|
## Recovery
|
|
67
69
|
|
|
@@ -71,8 +73,8 @@ On any failure or interruption, read [recovery.md](recovery.md).
|
|
|
71
73
|
|
|
72
74
|
- **Never squash-merge a tagged commit (#3167).** A squash re-mints the SHA and orphans the tag, so tag-anchored checks mis-read. Any merge that carries an already-tagged commit — the `main → development` roll-forward, an alignment PR, a hotfix fold PR — lands as a true merge: `mmi-cli devops pr merge <number> --auto --merge` (or `--wait --merge`); `--wait` alone still squashes. The hotfix main-base PR itself may squash: its tag lands after, on the merged `main` HEAD, and the `-x` trailer must survive the squash message.
|
|
73
75
|
- **A refused train is a stop, never a license to finish by hand.** Every fail-closed halt — doctor blocker, authority probe, coverage guard, untolerated conflict, required checks, stray tag, ledger — ends the run. Fix the cause on `development` through a normal PR and rerun the train; never hand-resolve on `main`, hand-cherry-pick, bare-push a train branch, ack to save time, or bypass a check.
|
|
74
|
-
- **
|
|
75
|
-
- **One train
|
|
76
|
+
- **Probe the latest Release tag, not branches or stale local tags (#2734).** Queue: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json`; gh rejects `mergeQueueEntry`.
|
|
77
|
+
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
76
78
|
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
77
79
|
|
|
78
80
|
## Report
|
package/skills/mmi-help/SKILL.md
CHANGED
|
@@ -20,8 +20,7 @@ Print a friendly, human-readable **MMI help** card of at most 180 words:
|
|
|
20
20
|
files or personal agent instructions, and approved MMI release workflows.
|
|
21
21
|
4. Name the org-guide skill for details, board, secrets, and release for common tasks, and
|
|
22
22
|
brand when a company document, report, deck, or artifact needs the house identity. Note that
|
|
23
|
-
org-guide
|
|
24
|
-
`@mutmutco/mmwork-ds`, front-loaded Impeccable v4.7.0, and system-first autolearn.
|
|
23
|
+
org-guide carries the MM Open Design System Bible; handoffs cite it by path, never restate it.
|
|
25
24
|
Render invocation syntax for the current host only, using the forms above with the skill name
|
|
26
25
|
substituted. If the host is unknown, use plain skill names rather than guessing.
|
|
27
26
|
|
|
@@ -23,6 +23,8 @@ the [MMI help skill](../mmi-help/SKILL.md).
|
|
|
23
23
|
and respect a decline; see [tooling bug reports](references/work-and-releases.md#report-mmi-tooling-bugs).
|
|
24
24
|
- Read the registry for release tracks, domains, and OAuth. Use MMI provisioning and release
|
|
25
25
|
workflows, never parallel deployment or credential paths.
|
|
26
|
+
- Verify canonical/Git-resolved support scripts; use absolute script/target/source paths, never sibling guesses
|
|
27
|
+
([invocation rules](references/work-and-releases.md#shared-support-script-invocation)).
|
|
26
28
|
- Design work follows the [MM Open Design System Bible](references/work-and-releases.md#the-mm-open-design-system-bible-8837-8839):
|
|
27
29
|
never patch broken shared tools with one-off `tmp/` scripts; fix them at source, record a learning
|
|
28
30
|
note, and update memory.
|
|
@@ -40,5 +42,4 @@ the [MMI help skill](../mmi-help/SKILL.md).
|
|
|
40
42
|
| Build an MM-Work module | not bundled — [MM-Work module guide](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md) in `@mutmutco/mmwork-ds` |
|
|
41
43
|
| Produce company-facing documents in the MM brand | not bundled — the MM-Strategy MCP serves the brand kit (`mm_brand_guide`); strategists install `@mutmutco/strategy` |
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
installed plugin release; resolve current values and flags through the live CLI, not this guide.
|
|
45
|
+
Bundled MMI guidance matches the installed plugin, not Jerv/JervCode. Resolve current values and flags through the live CLI.
|
|
@@ -13,10 +13,16 @@ Reading or discussing the board is read-only until the developer authorizes work
|
|
|
13
13
|
Claim approved work with `mmi-cli oracle board claim <issue>`, then prepare an isolated task
|
|
14
14
|
workspace through the host. Preserve other developers' work.
|
|
15
15
|
|
|
16
|
-
MMI
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
Use host worktrees and MMI cleanup; no personal Jerv is required. Report skill misfires to Hub
|
|
17
|
+
with `mmi-cli learning skill-lesson --skill <name> --title <summary> --body-file <path>`.
|
|
18
|
+
Under the App pool,
|
|
19
|
+
`--jq`/`-q`/`--template`/`--web` are refused: use
|
|
20
|
+
`MMI_ACTOR=app mmi-cli devops read issue view <id> --repo <owner/repo> --json comments`
|
|
21
|
+
(or `pr`/`run view` with their fields); filter returned JSON locally.
|
|
22
|
+
For run logs, never native `gh run view --log`/`--log-failed`: use
|
|
23
|
+
`MMI_ACTOR=app mmi-cli devops read run log <runId> --repo <owner/repo> [--failed | --job <name>] [--tail N]`.
|
|
24
|
+
A refused command writes no output, so a `> file` redirect leaves it empty or missing: read the
|
|
25
|
+
refusal, then rerun the typed form.
|
|
20
26
|
|
|
21
27
|
Read the issue, implementation, callers, and repository policy before editing.
|
|
22
28
|
Run `mmi-cli tests policy --base <comparison-base>` to determine required checks against your target
|
|
@@ -36,10 +42,10 @@ Functional browser journeys remain opt-in `workflow_dispatch`-only, never design
|
|
|
36
42
|
|
|
37
43
|
## The MM Open Design System Bible (#8837, #8839)
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
and
|
|
45
|
+
Every agent doing UI, design, document or MM Artifact work reads this first: Part 1 builds the
|
|
46
|
+
system, Part 2 improves it, Part 3 governs A/B choosing, Part 4 gates kit changes on visual A/B.
|
|
47
|
+
Handoff and workaround notes cite this section by path and add only the task's own deviation,
|
|
48
|
+
failure and action, never a restatement; new owner rulings are still recorded verbatim.
|
|
43
49
|
|
|
44
50
|
### Part 1 — The five pillars of the MM Open Design System
|
|
45
51
|
|
|
@@ -82,6 +88,14 @@ Four owner decisions (2026-10-25T15:35:52Z):
|
|
|
82
88
|
|
|
83
89
|
Impeccable **v4.7.0 / engine v0.1.16** details:
|
|
84
90
|
|
|
91
|
+
- Impeccable is invoked as the installed script at `~/.agents/skills/impeccable/scripts/impeccable` or
|
|
92
|
+
bare `impeccable` on `PATH` — no Impeccable CLI is published on npm, so never run
|
|
93
|
+
`npx @impeccable-style/cli ...` (it 404s) or chain `npx` guesses into git/bootstrap commands (#8885).
|
|
94
|
+
Refresh the local kit cache with `node "<absolute-MM-Work-root>/scripts/sync-design-system.mjs" "<absolute-MM-Work-root>/packages/mmwork-ds/source"`
|
|
95
|
+
(the source argument is required, #8887); resolve and verify the checkout as described under
|
|
96
|
+
[shared support-script invocation](#shared-support-script-invocation). A local `npm ci` against `npm.pkg.github.com` that returns
|
|
97
|
+
`E401` needs auth: `NODE_AUTH_TOKEN=$(gh auth token) npm ci --prefix module`, or adopt credential-free
|
|
98
|
+
with `mmi-cli devops packages adopt-export` (`docs/Guides/package-adopt-export.md`, #8886).
|
|
85
99
|
- Boot once: `impeccable context --target <path>`; `init` captures PRODUCT.md, `document` maintains
|
|
86
100
|
`DESIGN.md` and its `design.json` sidecar, `impeccable doctor --json` reports drift, and `extract`
|
|
87
101
|
identifies reusable candidates (kit additions still need the Design Lead). Read
|
|
@@ -125,7 +139,37 @@ Craft essentials every agent applies (owner, 2026-10-25, #8839):
|
|
|
125
139
|
- **Verify the SSR pre-rendered HTML.** `impeccable detect --json` is blind on an unrendered
|
|
126
140
|
`<div id="root"></div>` file, so verify the output of `review.mjs <folder> --standalone --open`,
|
|
127
141
|
which pre-renders the board into `#root` first. An empty `#root`, missing fonts or an unrendered
|
|
128
|
-
detector run is a failed check, not a pass.
|
|
142
|
+
detector run is a failed check, not a pass. For one page-spec module, run
|
|
143
|
+
`node scripts/design-pack-render.mjs --page-spec <spec.mjs>` (it SSR-renders `renderPage(ctx)` per
|
|
144
|
+
theme mode and runs `impeccable detect --json` on the HTML), or `node artifacts/review/review.mjs
|
|
145
|
+
<folder> --standalone` for a pack; never hand-roll an inline `node -e` SSR script, which evaluates
|
|
146
|
+
as CommonJS and fails on the spec's ESM `import` lines (#8876).
|
|
147
|
+
|
|
148
|
+
### Shared support-script invocation
|
|
149
|
+
|
|
150
|
+
Resolve shared support tools from their **known canonical checkout**, not the caller's module/worktree
|
|
151
|
+
layout (#8890). Never guess `../../MMI-Hub/scripts/kit-adopt.mjs`: that can resolve to the
|
|
152
|
+
`mmi-worktrees/MMI-Hub` container, not a checkout, or to a sibling branch without the script.
|
|
153
|
+
|
|
154
|
+
1. Start with a known absolute MMI-Hub checkout/worktree path supplied by repository or host metadata.
|
|
155
|
+
If only a Hub task worktree is known, use `git -C "<known-Hub-worktree>" rev-parse --path-format=absolute --git-common-dir`
|
|
156
|
+
and `git -C "<known-Hub-worktree>" worktree list --porcelain` to identify its canonical/main checkout.
|
|
157
|
+
Git metadata is repository-specific: a module's common directory cannot locate MMI-Hub. If no Hub
|
|
158
|
+
checkout is known, ask for it; do not scan drive roots or traverse arbitrary parents.
|
|
159
|
+
2. Verify the selected checkout's identity with `git -C "<absolute-Hub-root>" remote get-url origin`
|
|
160
|
+
(must identify `mutmutco/MMI-Hub`) and verify `"<absolute-Hub-root>/scripts/kit-adopt.mjs"` exists as
|
|
161
|
+
a file before invocation. If missing, stop and resolve the correct checkout/version; do not retry
|
|
162
|
+
sibling guesses or create a replacement script.
|
|
163
|
+
3. Resolve each target/source independently to its intended absolute path. Invoke Node with separate,
|
|
164
|
+
quoted arguments, for example:
|
|
165
|
+
`node "<absolute-Hub-root>/scripts/kit-adopt.mjs" --local-dir "<absolute-module-root>" --version <kit-version>`.
|
|
166
|
+
For cache refresh, verify `<absolute-MM-Work-root>/scripts/sync-design-system.mjs`, then
|
|
167
|
+
pass both the absolute script path and absolute `packages/mmwork-ds/source` path as shown above.
|
|
168
|
+
These are path patterns, not literal host paths; keep machine-specific roots out of bundled docs.
|
|
169
|
+
|
|
170
|
+
Verify paths before chaining unrelated operations such as a board claim. Path resolution grants no
|
|
171
|
+
new authority: use only the tool mode and target already authorized; never replay a successful claim
|
|
172
|
+
just because a later script failed to load.
|
|
129
173
|
|
|
130
174
|
### Part 2 — The System-First Autolearn Doctrine (never work around a broken tool in `tmp/`)
|
|
131
175
|
|
package/skills/rcand/SKILL.md
CHANGED
|
@@ -45,7 +45,7 @@ mmi-cli devops rcand --apply --json --out "$r"
|
|
|
45
45
|
Read the receipt at `$r`, never the exit code (`1` = deploy failed after promotion; unresolved exits `0`):
|
|
46
46
|
|
|
47
47
|
- `promoted` is `true` even when the deploy failed; `tag` is the minted `vX.Y.0-rc.N` (`resumeNote`: resumed).
|
|
48
|
-
- `deployStatus`: `pending` is never terminal. Watch each non-success run in `workflowRuns`: `
|
|
48
|
+
- `deployStatus`: `pending` is never terminal. Watch each non-success run in `workflowRuns`: `mmi-cli devops read run watch <run-id> --repo {owner}/{repo} --exit-status --interval 60`.
|
|
49
49
|
- `releaseVerdict`: `followUpStatus` (`complete` · `pending` · `failed`); a failed `legs` row carries its error.
|
|
50
50
|
- `checkout.status: returned` to `development` and `localSync`/`ledger` green, or the named reason.
|
|
51
51
|
|
|
@@ -59,8 +59,8 @@ On any failure or interruption, read [recovery.md](recovery.md).
|
|
|
59
59
|
|
|
60
60
|
- **Never squash-merge a tagged commit (#3167).** A squash re-mints the SHA and orphans the tag, so tag-anchored checks mis-read. Any merge that carries an already-tagged commit — the `main → development` roll-forward, an alignment PR, a hotfix fold PR — lands as a true merge: `mmi-cli devops pr merge <number> --auto --merge` (or `--wait --merge`); `--wait` alone still squashes. The hotfix main-base PR itself may squash: its tag lands after, on the merged `main` HEAD, and the `-x` trailer must survive the squash message.
|
|
61
61
|
- **A refused train is a stop, never a license to finish by hand.** Every fail-closed halt — doctor blocker, authority probe, coverage guard, untolerated conflict, required checks, stray tag, ledger — ends the run. Fix the cause on `development` through a normal PR and rerun the train; never hand-resolve on `main`, hand-cherry-pick, bare-push a train branch, ack to save time, or bypass a check.
|
|
62
|
-
- **
|
|
63
|
-
- **One train
|
|
62
|
+
- **Probe the latest Release tag, not branches or stale local tags (#2734).** Queue: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json`; gh rejects `mergeQueueEntry`.
|
|
63
|
+
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
64
64
|
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
65
65
|
|
|
66
66
|
## Report
|
package/skills/rcand/recovery.md
CHANGED
|
@@ -7,4 +7,4 @@ Every refusal and every doctor blocker names its `code` and `anchor`: open `docs
|
|
|
7
7
|
|
|
8
8
|
The JSON is on stdout alone; a stale CLI first prints its self-update notice on stderr and re-runs itself, so parse stdout only, never `2>&1`. Read `ready`, then `findings[]`: each carries `code`, `severity` (`blocker` · `warning` · `healed` · `info`), `source` (`local` · `origin`), `remedy` and `anchor`. `ready: false` → stop and quote every blocker's `code` and `remedy`; an unread origin is never green. `--apply` re-runs this doctor as its step 0 with heal on.
|
|
9
9
|
|
|
10
|
-
- `deployStatus` — `pending` is never terminal. `runId` / `runUrl` / `workflowRuns` name the run: the dispatched `tenant-deploy.yml` for tenant-container, the auto-fired `deploy.yml` for serverless. Watch each non-success entry to conclusion: `
|
|
10
|
+
- `deployStatus` — `pending` is never terminal. `runId` / `runUrl` / `workflowRuns` name the run: the dispatched `tenant-deploy.yml` for tenant-container, the auto-fired `deploy.yml` for serverless. Watch each non-success entry to conclusion: `mmi-cli devops read run watch <run-id> --repo {owner}/{repo} --exit-status --interval 60`.
|
package/skills/release/SKILL.md
CHANGED
|
@@ -31,7 +31,7 @@ Run mktemp alone, copy its path; no channel: drop the summary flag. `mmi-cli dev
|
|
|
31
31
|
|
|
32
32
|
## Verify
|
|
33
33
|
|
|
34
|
-
Receipt fields (`served-channel`, npm, `jerv-gateway`): [verification.md](verification.md). Latest: `
|
|
34
|
+
Receipt fields (`served-channel`, npm, `jerv-gateway`): [verification.md](verification.md). Latest: `tag_name` from `mmi-cli devops api get repos/{owner}/{repo}/releases/latest` equals the resolved tag (recipe in verification.md); a failed read is unverified. Close on: `origin/main..origin/development` count, tag on origin, Latest, green runs on the SHA.
|
|
35
35
|
|
|
36
36
|
## Recovery
|
|
37
37
|
|
|
@@ -41,8 +41,8 @@ On failure or a pending ledger leg: [recovery.md](recovery.md).
|
|
|
41
41
|
|
|
42
42
|
- **Never squash-merge a tagged commit (#3167).** A squash re-mints the SHA and orphans the tag, so tag-anchored checks mis-read. Any merge that carries an already-tagged commit — the `main → development` roll-forward, an alignment PR, a hotfix fold PR — lands as a true merge: `mmi-cli devops pr merge <number> --auto --merge` (or `--wait --merge`); `--wait` alone still squashes. The hotfix main-base PR itself may squash: its tag lands after, on the merged `main` HEAD, and the `-x` trailer must survive the squash message.
|
|
43
43
|
- **A refused train is a stop, never a license to finish by hand.** Every fail-closed halt — doctor blocker, authority probe, coverage guard, untolerated conflict, required checks, stray tag, ledger — ends the run. Fix the cause on `development` through a normal PR and rerun the train; never hand-resolve on `main`, hand-cherry-pick, bare-push a train branch, ack to save time, or bypass a check.
|
|
44
|
-
- **
|
|
45
|
-
- **One train
|
|
44
|
+
- **Probe the latest Release tag, not branches or stale local tags (#2734).** Queue: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json`; gh rejects `mergeQueueEntry`.
|
|
45
|
+
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
46
46
|
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
47
47
|
|
|
48
48
|
## Report
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Release recovery and ledger continuation
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
Every refusal and every doctor blocker names its `code` and `anchor`: open `docs/Guides/train-troubleshooting.md#<code>` and follow that entry, nothing else. That guide is test-parsed, never free text — the infra drift and plugin-set suites validate every anchor cited here and assert policy from its wording — so an edit to it re-runs the infra suite (`npm --prefix infra test`) in the same PR: a heading or slug change is a code change. A pre-tag abort with no finding code (for example, a transient secrets-preflight timeout) is a transient stop: nothing was promoted and no tag was cut. Confirm no tag reached origin (`git ls-remote --tags origin`
|
|
4
|
+
Every refusal and every doctor blocker names its `code` and `anchor`: open `docs/Guides/train-troubleshooting.md#<code>` and follow that entry, nothing else. That guide is test-parsed, never free text — the infra drift and plugin-set suites validate every anchor cited here and assert policy from its wording — so an edit to it re-runs the infra suite (`npm --prefix infra test`) in the same PR: a heading or slug change is a code change. A pre-tag abort with no finding code (for example, a transient secrets-preflight timeout) is a transient stop: nothing was promoted and no tag was cut. Confirm no tag reached origin (`git ls-remote --tags origin`), then rerun `mmi-cli devops release --apply` as a fresh cut, never `--resume`; resume is only for a partial release with the tag already on origin. A partial release (tag on origin, later phases pending or failed) continues with `mmi-cli devops release --resume --watch --json --out <fresh-receipt>` — the only continuation form: `--resume` never re-tags or republishes, posts a deferred announcement only when it is the run that first proves deploy and publish green, and `--apply` belongs to a new cut only. A SUPERSEDED leg is not a pending one: a ledger that records a supersession is phases-green — `--resume` must not be used on it, and the deferred announcement is the next patch train's to carry. A refused train is a stop (Merge floor): fix the cause on `development` through a normal PR, then rerun.
|
|
5
5
|
|
|
6
6
|
**Exactly one continuation per ledger state.** Pick the row, run its verb, never combine two:
|
|
7
7
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
For the independent run recheck, scope the read to the release window, so a busy repo's unrelated runs cannot fill the cap: note the UTC instant you started `--apply` (`date -u +%Y-%m-%dT%H:%M:%SZ`), then
|
|
1
|
+
For the independent run recheck, scope the read to the release window, so a busy repo's unrelated runs cannot fill the cap: note the UTC instant you started `--apply` (`date -u +%Y-%m-%dT%H:%M:%SZ`), then pipe the typed App-pool list straight into a local filter on the exact SHA from the saved receipt: `mmi-cli devops read run list --repo {owner}/{repo} --created ">=<apply-start-utc>" --limit 100 --json databaseId,headSha,workflowName,status,conclusion,url | node -e 'const rows = JSON.parse(require("node:fs").readFileSync(0, "utf8")); const sha = process.argv[1]; const matches = rows.filter((run) => run.headSha === sha); if (rows.length >= 100 || !matches.length) throw new Error("release run set is incomplete or absent"); console.log(JSON.stringify(matches, null, 2));' "<release-sha>"`.
|
|
2
2
|
|
|
3
|
-
Do not use
|
|
3
|
+
Do not use a `--jq` formatter, raw `gh` reads (`gh run list`, `gh run list --commit`, `gh release list`, `gh api`), or a `tmp/` file read back with `require`; if the read fails, the bounded list reaches 100 rows or has no SHA match, the run set is unverified and must not be called green.
|
|
4
4
|
|
|
5
5
|
- A `private` npm surface (`surfaces.json`): the doctor's `npm-token-rejected` finding comes first. A 401 from `npm whoami` through the `_org` `npm/NPM_TOKEN` vault hop means the token is rejected, and every authenticated `npm view` then 404s exactly like an absent package — rotate the token; only after a login is a restricted 404 "unverifiable from here", never "not published" (`publish-private-package`). On a repo whose workflows publish through Trusted Publishing and name no registry token, that row is `info`, not a warning: no lane consumes the org token, so it constrains your manual read only.
|
|
6
6
|
|
|
@@ -21,7 +21,7 @@ Read the saved result, never the exit code (`1` = a follow-up failed after promo
|
|
|
21
21
|
- `deployStatus`: `pending` is never terminal; `promoted: true` holds even when a deploy failed.
|
|
22
22
|
- `workflowRuns`: every run on the release SHA; `parallel: true` marks legs run together. Name the red run: `deploy.yml`, `publish.yml`, `tenant-deploy.yml` and `jerv-gateway` are deploy/publish verdicts; a `gate` push run is ordinary CI.
|
|
23
23
|
- `announceNote`: `announced`, `skipped`, `not announced` (deploy/publish not green; a `--resume` with the same `--announce-summary-file` posts it), or the failure note. A failed announcement keeps its summary file; an uncertain delivery is never replayed automatically. Never install AWS, ask for AWS credentials, or copy the Slack key.
|
|
24
|
-
- `devRollForward` / `rcAlignment`: `pushed`, or `pr-pending` with an alignment PR to land by true merge; read
|
|
24
|
+
- `devRollForward` / `rcAlignment`: `pushed`, or `pr-pending` with an alignment PR to land by true merge; read `autoMergeRequest.mergeMethod` from `mmi-cli devops read pr view <n> --repo {owner}/{repo} --json autoMergeRequest`: it must be `MERGE`, and `SQUASH` is a stop.
|
|
25
25
|
- `versionFold`, `rcRetirement`, `checkout`: `returned`, or the reason you are still on `main`.
|
|
26
26
|
- `localInstall` (MMI-Hub): the train installs via `mmi-hub update`; never `npm i -g`.
|
|
27
27
|
|
|
@@ -67,12 +67,12 @@ Describe the release in plain words before each command: “Preparing release”
|
|
|
67
67
|
|
|
68
68
|
Use the actual current stage, never a guessed sequence. Explain a pending result as “Publishing is still pending” or name the unfinished step, then narrate the sanctioned resume command as “Checking the remaining release steps”. Say “Release complete” only after the status fields prove every required follow-up complete. Temporary filenames, `XXXXXX`, receipts, and ledger folding are internal bookkeeping, never a user-facing status.
|
|
69
69
|
|
|
70
|
-
- `workflowRuns` — every run on the release SHA (deploy-model runs, any `push: main` deploy, the repo's own `gate`). On this host, discover them with the bounded run-list read below; filter locally by the exact receipt SHA. If the list hits its 100-row cap or returns no matching SHA, treat the run set as unverified and stop rather than infer completeness. Watch each matching non-success entry to conclusion: `
|
|
70
|
+
- `workflowRuns` — every run on the release SHA (deploy-model runs, any `push: main` deploy, the repo's own `gate`). On this host, discover them with the bounded run-list read below; filter locally by the exact receipt SHA. If the list hits its 100-row cap or returns no matching SHA, treat the run set as unverified and stop rather than infer completeness. Watch each matching non-success entry to conclusion: `mmi-cli devops read run watch <run-id> --repo {owner}/{repo} --exit-status --interval 60`. Name which run is red: `deploy.yml` / `publish.yml` / `tenant-deploy.yml` / `jerv-gateway` is a deploy or publish verdict; a `gate` push run is ordinary CI sharing the SHA.
|
|
71
71
|
- With `--watch`, require every follow-up complete before declaring the cut done. For any pending ledger leg, read [recovery.md](recovery.md) before continuing or starting a new train.
|
|
72
72
|
- `announceNote` — `announced` (to the alerts channel for the Hub, to the project release channel for a product repo), `skipped`, `not announced` (deploy or publish not green; the note says whether a `--resume` carrying the same `--announce-summary-file` will post it), or the failure note. The channel id itself is never printed.
|
|
73
|
-
- `devRollForward` / `rcAlignment` — `pushed`, or `pr-pending` with the alignment PR to land by true merge (Merge floor). An enqueued auto-merge is not evidence of the method; before reporting, read the enqueued method back — `
|
|
73
|
+
- `devRollForward` / `rcAlignment` — `pushed`, or `pr-pending` with the alignment PR to land by true merge (Merge floor). An enqueued auto-merge is not evidence of the method; before reporting, read the enqueued method back — `autoMergeRequest.mergeMethod` from `mmi-cli devops read pr view <n> --repo {owner}/{repo} --json autoMergeRequest` — and prove it is `MERGE`. An enqueued `SQUASH` is a stop under the Merge floor, not something to wait out.
|
|
74
74
|
- `versionFold`, `rcRetirement`, `checkout` — `returned`, or the named reason you are still on `main`.
|
|
75
75
|
- `localInstall` (MMI-Hub) — the train installs the release on this machine via `mmi-hub update`; never run `npm i -g`.
|
|
76
76
|
For a private npm surface, read [verification.md](verification.md) before interpreting authentication or package visibility.
|
|
77
77
|
|
|
78
|
-
Then verify Latest with
|
|
78
|
+
Then verify Latest with the typed App-pool read (GitHub's Latest: never a draft or prerelease); a failed or empty read leaves Latest unverified: `mmi-cli devops api get repos/{owner}/{repo}/releases/latest | node -e 'const r = JSON.parse(require("node:fs").readFileSync(0, "utf8")); if (!r.tag_name || r.tag_name !== process.argv[1] || r.draft || r.prerelease) throw new Error("Latest is not the resolved tag"); console.log(r.tag_name, r.published_at);' "<resolved-tag>"`.
|