@mutmutco/claude-plugin 4.6.3 → 4.6.5
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/.claude-plugin/plugin.json +1 -1
- package/cli/dist/main.cjs +665 -131
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/skills/board/SKILL.md +12 -11
- package/skills/board/reference.md +5 -1
- package/skills/bootstrap/SKILL.md +5 -5
- package/skills/bootstrap/reference.md +16 -77
- package/skills/epic/SKILL.md +3 -3
- package/skills/hotfix/SKILL.md +10 -12
- package/skills/hotfix/recovery.md +3 -7
- package/skills/intercom-guest/SKILL.md +6 -7
- package/skills/mmi-help/SKILL.md +5 -4
- package/skills/org-guide/SKILL.md +18 -27
- package/skills/org-guide/references/design.md +301 -0
- package/skills/org-guide/references/vault.md +2 -9
- package/skills/org-guide/references/work-and-releases.md +11 -298
- package/skills/rcand/SKILL.md +5 -9
- package/skills/rcand/recovery.md +1 -10
- package/skills/rcand/suite.md +1 -1
- package/skills/release/SKILL.md +7 -11
- package/skills/release/recovery.md +1 -2
- package/skills/release/suite.md +1 -1
- package/skills/release/train-common.md +28 -0
- package/skills/release/verification.md +11 -46
- package/skills/secrets/SKILL.md +6 -5
- package/skills/secrets/reference.md +5 -47
|
@@ -35,6 +35,11 @@ MMI_ACTOR=app mmi-cli devops read pr list --repo <owner/repo> --head <branch> --
|
|
|
35
35
|
```
|
|
36
36
|
For run logs, never native `gh run view --log`/`--log-failed`: use
|
|
37
37
|
`MMI_ACTOR=app mmi-cli devops read run log <runId> --repo <owner/repo> [--failed | --job <name>] [--tail N]`.
|
|
38
|
+
A `https://github.com/<owner>/<repo>/actions/runs/<id>` web URL is auth-gated: an unauthenticated page fetch
|
|
39
|
+
(`fetch_content`) returns HTTP 404 (GitHub answers 404, not 403, for private repos the extractor cannot see), so
|
|
40
|
+
treat a 404 from `github.com` as missing authentication rather than a moved page and read the run with
|
|
41
|
+
`MMI_ACTOR=app mmi-cli devops read run view|log <id> --repo <owner/repo>` or
|
|
42
|
+
`MMI_ACTOR=app mmi-cli devops api get repos/<owner>/<repo>/actions/runs/<id>/jobs` (#9480).
|
|
38
43
|
A refused command writes no output, so a `> file` redirect leaves it empty or missing: read the
|
|
39
44
|
refusal, then rerun the typed form.
|
|
40
45
|
|
|
@@ -59,303 +64,7 @@ Never defer a live check waiting for real data (owner ruling 2026-10-27T20:04Z,
|
|
|
59
64
|
state it verifies with the module's dev/admin tools (MDT verbs, admin endpoints, module CLI,
|
|
60
65
|
synthetic accounts); if a needed verb is missing, add it in the same lane, then verify now.
|
|
61
66
|
|
|
62
|
-
|
|
63
|
-
the required `gate` holds fast deterministic checks only; UI/design uses `@mutmutco/mmwork-ds`
|
|
64
|
-
(`mmwork-check-ui`) and the mandatory Impeccable skill/toolkit. Inspect all applicable toolkit
|
|
65
|
-
capabilities for every design task. Work on the live app; use our own MM Artifacts A/B canvas only
|
|
66
|
-
for owner design choices, with live kit pieces and recorded choice ID / owner-decision reference.
|
|
67
|
-
A canvas is for how something looks or works on screen only (#8986, relay wording): approvals for
|
|
68
|
-
keys, releases, deletions, data access or tooling never go on a canvas; send them to the
|
|
69
|
-
orchestrator, who asks the owner in plain words.
|
|
70
|
-
Functional browser journeys remain opt-in `workflow_dispatch`-only, never design checks or gates.
|
|
71
|
-
|
|
72
|
-
## The MM Open Design System Bible (#8837, #8839)
|
|
73
|
-
|
|
74
|
-
Every agent doing UI, design, document or MM Artifact work reads this first: Part 1 builds the
|
|
75
|
-
system, Part 2 improves it, Part 3 governs A/B choosing, Part 4 gates kit changes on visual A/B.
|
|
76
|
-
Handoff and workaround notes cite this section by path and add only the task's own deviation,
|
|
77
|
-
failure and action, never a restatement; new owner rulings are still recorded verbatim.
|
|
78
|
-
|
|
79
|
-
### Part 1 — The five pillars of the MM Open Design System
|
|
80
|
-
|
|
81
|
-
Owner ruling 2026-10-25 (#8837, MM-Work#7668): the stage skill is retired completely. UI and
|
|
82
|
-
design work follows one harmonized **Front-Loaded Impeccable v4.7.0 + MM Artifacts + Live Docs
|
|
83
|
-
(`Canlı belgeler`) + Atomic Design Kit (`@mutmutco/mmwork-ds`)** workflow:
|
|
84
|
-
|
|
85
|
-
- **Front-load Impeccable** before any UI or MM Artifact authoring: `impeccable context --target <path>`,
|
|
86
|
-
`DESIGN.md` plus its `design.json` sidecar in `.impeccable`, shared `.impeccable/config.json`
|
|
87
|
-
(`hook.enabled: true`), `reference/craft-floor.md` + `reference/operate.md`, and
|
|
88
|
-
`impeccable detect --json <target>`.
|
|
89
|
-
- **MM Artifacts** (local/canvas packs in the `mm-artifact` v3 format) use one command,
|
|
90
|
-
`node artifacts/review/review.mjs <folder>`. It runs `check.mjs`, `check-ui.mjs` and
|
|
91
|
-
`geometry.mjs`, pre-renders the board in `node:vm` via `ReactDOMServer.renderToStaticMarkup` into
|
|
92
|
-
`#root` and runs `impeccable detect --json` on that SSR-rendered HTML. Interactive owner A/B
|
|
93
|
-
reviews use the live loopback HTTP review server (`http://127.0.0.1:<port>/`), where the owner's
|
|
94
|
-
`Send answers` posts back to `POST /answers`; a seat must not open the owner's browser. An A/B is
|
|
95
|
-
shown as the live canvas link, never as prose (#8987, relay wording). Once the canvas passes review,
|
|
96
|
-
send the orchestrator only the review URL and issue number, and keep the server running until the
|
|
97
|
-
owner answers. A kept-alive canvas review server must stay light (no dev/watch build pinning
|
|
98
|
-
gigabytes); a seat whose canvas needs a heavy local server flags that to the orchestrator instead
|
|
99
|
-
of holding the RAM silently, and stops it as soon as the owner has answered. The orchestrator opens
|
|
100
|
-
it on the owner's screen. `--standalone [<out.html>]` is only
|
|
101
|
-
for offline HTML previews/exports and SSR pre-render verification, never for an interactive owner
|
|
102
|
-
decision.
|
|
103
|
-
**Headless seat rule:** `--open` is review.mjs-only; never pass `--open` to `vite`, and never use it from a seat to open the owner's browser for an A/B review.
|
|
104
|
-
Vite parses its value as a URL path, so `vite --open false` opens the owner's real browser at `/false`;
|
|
105
|
-
run dev/preview servers with `BROWSER=none` and no `--open` flag.
|
|
106
|
-
- **Live Docs** (`Canlı belgeler` viewer) carry the living references, including the live
|
|
107
|
-
design-system artifact `3a5c79df-5274-40ad-a1b5-a75e67a74dac`.
|
|
108
|
-
- **Atomic Design Kit** (`@mutmutco/mmwork-ds`): kit pieces and tokens only, checked with `mmwork-check-ui`.
|
|
109
|
-
|
|
110
|
-
How the five pillars fit together (owner, 2026-10-25):
|
|
111
|
-
|
|
112
|
-
| Pillar | What it is | Claude / industry analogy | Where it lives |
|
|
113
|
-
|---|---|---|---|
|
|
114
|
-
| **1. MM Artifacts (`mm-artifact`)** | The HTML artifact file format (`type: 'document' \| 'canvas' \| 'design-system'`). By default a single self-contained HTML artifact; a multi-board Canvas only when comparing A/B options or viewport sizes side by side. | Claude Artifacts (the HTML artifact itself) | Local `.html` / `artifact.json` during agent dev (opened straight in the browser); stored in Live Docs when shared or created by Junior. |
|
|
115
|
-
| **2. Design System Artifacts (`type: 'design-system'`)** | MM Artifacts stored in Live Docs that define a complete visual system (tokens, CSS, components, `DESIGN.md`). Every MM Artifact binds to one (`kit: { id, version }`). Includes (a) the MM-Work Atomic Design System (`3a5c79df`, MM-Work app and modules), (b) the Document/Editorial Design System (reports, checklists, decks, client documents), and future brand/client systems. | Claude Design Systems / theme packs an artifact pulls from on creation | Hosted in Live Docs (`Canlı belgeler`). Only the MM-Work app design system is also exported to npm (`@mutmutco/mmwork-ds`). |
|
|
116
|
-
| **3. Live Docs (`Canlı belgeler`)** | The viewer, library, commenter and A/B picker inside the MM-Work app (`/documents/:id`), where people, Junior and agents view, comment on, version and share MM Artifacts. | Claude's Artifact viewer / workspace panel | Built into MM-Work (`web/src/documents/`, `src/documents.ts`). |
|
|
117
|
-
| **4. Open Design Kit (`@mutmutco/mmwork-ds`)** | The npm package generated from `packages/mmwork-ds/source/` (the source of the MM-Work Atomic Design System), so MM-Work, the 10 suite modules and local app-UI MM Artifacts render real Atoms, Molecules, Organisms, Templates and Pages. | Published React/CSS component kit | `packages/mmwork-ds/source/` → `@mutmutco/mmwork-ds`, synced to Live Docs (`3a5c79df`) and all 10 module roots. |
|
|
118
|
-
| **5. Impeccable (`v4.7.0`)** | The front-loaded design craft and quality engine (`impeccable context`, `craft-floor`, 15 playbooks such as `distill`, `typeset`, `layout`, `colorize`, `clarify`, `polish`, plus `impeccable detect --json` and `DESIGN.md`). Runs in front of every UI or MM Artifact creation so output is readable, well typeset, purposefully coloured and never AI slop. | Design director + mechanical UI linter | `.agents/skills/impeccable` + root `DESIGN.md` and the `design.json` sidecar in `.impeccable`. |
|
|
119
|
-
|
|
120
|
-
Four owner decisions (2026-10-25T15:35:52Z):
|
|
121
|
-
|
|
122
|
-
1. **Doc vs. app kit — add a Document Design System too.** Keep the MM-Work Atomic Design System (`3a5c79df-5274-40ad-a1b5-a75e67a74dac`) for MM-Work and module app UI (and as the fallback for now), and add a dedicated Document/Editorial Design System Artifact in Live Docs for reports, checklists, decks and client documents made by Junior or agents.
|
|
123
|
-
2. **Where to save — local HTML for dev, Live Docs for shared.** Coding agents build local `.html` MM Artifacts for fast iteration. For interactive owner A/B reviews, serve the canvas on the live loopback HTTP review server (`http://127.0.0.1:<port>/` with `Send answers`) without opening the owner's browser; relay the URL and issue number to the orchestrator and keep the server running until the owner answers (#8987, relay wording). A kept-alive canvas review server must stay light (no dev/watch build pinning gigabytes); a seat whose canvas needs a heavy local server flags that to the orchestrator instead of holding the RAM silently, and stops it as soon as the owner has answered. Use `node artifacts/review/review.mjs <folder> --standalone [<out.html>]` for offline HTML previews/exports or SSR pre-render verification. Publish to Live Docs only for a shared deliverable, an A/B decision canvas or a Design System. Junior inside MM-Work saves directly to Live Docs.
|
|
124
|
-
3. **Artifact shape — single HTML by default, Canvas for A/B.** A single self-contained HTML view for documents, checklists and single-screen work; a multi-board spatial Canvas only for A/B choices or `1440`/`1024`/`390` side-by-side comparisons.
|
|
125
|
-
4. **Kit binding — Live Docs hosts kits; npm only for MM-Work.** Every Design System Artifact in Live Docs stores its tokens/CSS/components and `DESIGN.md` so any HTML artifact can bind to it (`kit: { id, version }`); only the MM-Work app design system is also exported as `@mutmutco/mmwork-ds`, because the MM-Work app and the 10 suite modules compile against it.
|
|
126
|
-
|
|
127
|
-
Impeccable **v4.7.0 / engine v0.1.16** details:
|
|
128
|
-
|
|
129
|
-
- Impeccable is invoked as the installed script at `~/.agents/skills/impeccable/scripts/impeccable` or
|
|
130
|
-
bare `impeccable` on `PATH` — no Impeccable CLI is published on npm, so never run
|
|
131
|
-
`npx @impeccable-style/cli ...` (it 404s) or chain `npx` guesses into git/bootstrap commands (#8885).
|
|
132
|
-
Refresh the local kit cache through MMI-Hub `scripts/kit-adopt.mjs`'s `refreshKitCache({ mmWorkRoot, cacheRoot })`
|
|
133
|
-
(#9271, #9279). It runs `node "<absolute-MM-Work-root>/scripts/sync-design-system.mjs" "<absolute-MM-Work-root>/packages/mmwork-ds/source" --out "<staging-dir>"`
|
|
134
|
-
(the source argument is required, #8887) into a staging dir inside the cache root, then publishes that output to
|
|
135
|
-
`<cache-dir>/<version>/`, `<cache-dir>/latest/` and `version.json`, which is what `scripts/kit-adopt.mjs --local-dir`
|
|
136
|
-
reads. Run the sync yourself only into such a staging dir: `--out` alone writes the generated files flat and writes no
|
|
137
|
-
`package.json`, so a bare `--out "<cache-dir>"` fills a cache `--local-dir` cannot resolve. The cache dir is the machine
|
|
138
|
-
cache `~/.jerv/cache/mmwork-ds`. Never run the two-argument form: without `--out`
|
|
139
|
-
the sync writes the nine generated kit files and `sync.json` into the MM-Work working tree, where they are
|
|
140
|
-
post-merge bot output, MM-Work's lane guard refuses a commit touching them, and a lane that already ran it cleans
|
|
141
|
-
up with `git checkout -- packages/mmwork-ds`. Never commit those files (#9271). Resolve and verify the checkout as described under
|
|
142
|
-
[shared support-script invocation](#shared-support-script-invocation). A local `npm ci` against `npm.pkg.github.com` that returns
|
|
143
|
-
`E401` needs the GitHub Packages credential, never the npm one: the Jerv vault key `GH_PACKAGES_READ_TOKEN`, used keyless
|
|
144
|
-
(`jerv-cli vault use GH_PACKAGES_READ_TOKEN -- sh -c 'NODE_AUTH_TOKEN="$GH_PACKAGES_READ_TOKEN" npm ci --prefix module'`),
|
|
145
|
-
or your own `gh` login when it carries `read:packages` (`NODE_AUTH_TOKEN=$(gh auth token) npm ci --prefix module`); the
|
|
146
|
-
org `npm/NPM_TOKEN` belongs to `registry.npmjs.org` and returns `E401` here. Or adopt credential-free
|
|
147
|
-
with `mmi-cli devops packages adopt-export` (`docs/Guides/package-adopt-export.md`, #8886). To probe a kit
|
|
148
|
-
version, read the pin from the consumer's module/`package.json` (or `node_modules/@mutmutco/mmwork-ds`); a bare
|
|
149
|
-
`npm view @mutmutco/...` asks the public registry only and 404s, because the scope lives on GitHub Packages (#9238).
|
|
150
|
-
A registry read needs the registry flag and a token: in a consumer whose `.npmrc` maps the scope,
|
|
151
|
-
`NODE_AUTH_TOKEN=$(gh auth token) npm view @mutmutco/mmwork-ds@<v> version --registry https://npm.pkg.github.com`;
|
|
152
|
-
from a root without that line, pass the token directly —
|
|
153
|
-
`npm view @mutmutco/mmwork-ds@<v> version --registry https://npm.pkg.github.com --//npm.pkg.github.com/:_authToken=$(gh auth token)`.
|
|
154
|
-
To see **which** kit versions are actually published, run MMI-Hub's
|
|
155
|
-
`node scripts/kit-adopt.mjs --list-versions [--limit 5] [--json]` (#9426) instead of deriving it: it reads GitHub
|
|
156
|
-
Packages `/orgs/mutmutco/packages/npm/mmwork-ds/versions` (newest first, falling back to `npm view` against
|
|
157
|
-
`https://npm.pkg.github.com` with `GH_PACKAGES_READ_TOKEN`/`NODE_AUTH_TOKEN`), reports the local cache's latest
|
|
158
|
-
version, and never hits the `registry.npmjs.org` 404 of a bare `npm view @mutmutco/mmwork-ds` (#9264). That is the supported listing read:
|
|
159
|
-
`mmi-cli devops packages` covers consumer adoption (`adopt-export`) only, so it never names a published
|
|
160
|
-
version — never carry the packages API as a stopgap.
|
|
161
|
-
- Boot once: `impeccable context --target <path>`; `init` captures PRODUCT.md, `document` maintains
|
|
162
|
-
`DESIGN.md` and its `design.json` sidecar, `impeccable doctor --json` reports drift, and `extract`
|
|
163
|
-
identifies reusable candidates (kit additions still need the Design Lead). Read
|
|
164
|
-
`reference/craft-floor.md` before UI edits and `reference/operate.md` for app UI.
|
|
165
|
-
- `impeccable hooks on` enables shared `.impeccable/config.json`; local overrides/consent belong in
|
|
166
|
-
ignored `.impeccable/config.local.json`. Tier 1 scans mechanical problems per edit; Tier 2 deep-scans
|
|
167
|
-
at turn-end `Stop` on supported hosts. Verify `hooks status` and host support, not config alone.
|
|
168
|
-
If automatic hooks are unavailable, run `impeccable detect --json <target>` manually on markup
|
|
169
|
-
files/directories (not CSS-only): **0 clean / 2 findings**. Unavailable or broken scans are not passes.
|
|
170
|
-
- Dual-subagent `critique` keeps design assessment independent from detector evidence and persists via
|
|
171
|
-
`critique-storage`; disclose degraded runs. `audit` scores accessibility, performance, theming,
|
|
172
|
-
responsive design and implementation integrity 0–4 each (**20 points**). These evaluations are
|
|
173
|
-
agent playbooks, not standalone engine CLI verbs; still inspect the live result.
|
|
174
|
-
- Pick relevant playbooks: `polish`, `bolder`, `quieter`, `distill`, `harden`, `onboard`, `layout`,
|
|
175
|
-
`typeset`, `colorize`, `animate`, `delight`, `overdrive`, `clarify`, `adapt`, `optimize` (15 names in
|
|
176
|
-
v4.7.0, despite the requested “14”). Do not apply conflicting playbooks blindly.
|
|
177
|
-
- Iterate with `live` / `generate` (`live-generate`, `live-poll`, `live-server`); `serve-question`
|
|
178
|
-
supports choices, while owner A/B decisions use the MM Artifacts canvas.
|
|
179
|
-
Stop temporary servers. Check installed versions and approved upstream updates via the owning
|
|
180
|
-
installer; do not modify shared skills from a module task. Record command + exit + findings,
|
|
181
|
-
kit version and available checks separately from contract identity; reports are not conformance.
|
|
182
|
-
|
|
183
|
-
Craft essentials every agent applies (owner, 2026-10-25, #8839):
|
|
184
|
-
|
|
185
|
-
- **Sleek translucent glass cards and zero GPU usage — never color-washed
|
|
186
|
-
(`2026-10-25T16:21:19.344Z`).** Cards use sleek, modern translucent glass material (neutral
|
|
187
|
-
translucent surface with a crisp glass rim, `--card-tint-dark: 0%`, `--card-tint-light: 0%`)
|
|
188
|
-
rather than color-washed card fills in any theme, and zero GPU-compositing blur or shadow
|
|
189
|
-
(`--card-blur: none`, `--card-blur-frost: none`, `--frost-see-blur: 0px`, `--glass-blur: none`,
|
|
190
|
-
`--card-shadow-dark: none`; never `backdrop-filter: blur(...)`). Module tones (`blue`, `coral`,
|
|
191
|
-
`teal`, `purple`, `terracotta`, `green`, `pink`, `lime`, `cyan`, `magenta`, `fuchsia`)
|
|
192
|
-
belong on `Badge`, `Mark`, `Checkbox` (`lead`), and card `icon`/`mark` accents (`edge="bite"`).
|
|
193
|
-
- **Front-loaded Impeccable v4.7.0, in front of creation.** Run `impeccable context --target <path>`,
|
|
194
|
-
read `DESIGN.md` and `reference/craft-floor.md`, choose the surface mode (`Operate`, `Read`,
|
|
195
|
-
`Persuade` or `Experience`) and load the matching playbooks (`shape`, `distill`, `typeset`,
|
|
196
|
-
`layout`, `colorize`, `clarify`, `polish`, `harden`, `adapt`) before writing markup.
|
|
197
|
-
- **Restraint and hierarchy.** Group related items into clean section `Card`s (`heading: 2` under
|
|
198
|
-
the page `<h1>`), keep main-column rows concise (`Cluster` with `fill` = `Checkbox` plus one
|
|
199
|
-
trailing action), and put multi-line inspector detail in the right-hand `HelperCard` as `Stack` +
|
|
200
|
-
`Text` — never `DataList`, which clips multi-line prose. No walls of text.
|
|
201
|
-
- **Verify the SSR pre-rendered HTML.** `impeccable detect --json` is blind on an unrendered
|
|
202
|
-
`<div id="root"></div>` file, so verify the output of `review.mjs <folder> --standalone --open`,
|
|
203
|
-
which pre-renders the board into `#root` first. An empty `#root`, missing fonts or an unrendered
|
|
204
|
-
detector run is a failed check, not a pass. For one page-spec module, run
|
|
205
|
-
`node scripts/design-pack-render.mjs --page-spec <spec.mjs>` (it SSR-renders `renderPage(ctx)` per
|
|
206
|
-
theme mode and runs `impeccable detect --json` on the HTML), or `node artifacts/review/review.mjs
|
|
207
|
-
<folder> --standalone` for a pack; never hand-roll an inline `node -e` SSR script, which evaluates
|
|
208
|
-
as CommonJS and fails on the spec's ESM `import` lines (#8876).
|
|
209
|
-
|
|
210
|
-
### Shared support-script invocation
|
|
211
|
-
|
|
212
|
-
Resolve shared support tools from their **known canonical checkout**, not the caller's module/worktree
|
|
213
|
-
layout (#8890). Never guess `../../MMI-Hub/scripts/kit-adopt.mjs`: that can resolve to the
|
|
214
|
-
`mmi-worktrees/MMI-Hub` container, not a checkout, or to a sibling branch without the script.
|
|
215
|
-
|
|
216
|
-
1. Start with a known absolute MMI-Hub checkout/worktree path supplied by repository or host metadata.
|
|
217
|
-
If only a Hub task worktree is known, use `git -C "<known-Hub-worktree>" rev-parse --path-format=absolute --git-common-dir`
|
|
218
|
-
and `git -C "<known-Hub-worktree>" worktree list --porcelain` to identify its canonical/main checkout.
|
|
219
|
-
Git metadata is repository-specific: a module's common directory cannot locate MMI-Hub. If no Hub
|
|
220
|
-
checkout is known, ask for it; do not scan drive roots or traverse arbitrary parents.
|
|
221
|
-
2. Verify the selected checkout's identity with `git -C "<absolute-Hub-root>" remote get-url origin`
|
|
222
|
-
(must identify `mutmutco/MMI-Hub`) and verify `"<absolute-Hub-root>/scripts/kit-adopt.mjs"` exists as
|
|
223
|
-
a file before invocation. If missing, stop and resolve the correct checkout/version; do not retry
|
|
224
|
-
sibling guesses or create a replacement script.
|
|
225
|
-
3. Resolve each target/source independently to its intended absolute path. Invoke Node with separate,
|
|
226
|
-
quoted arguments, for example:
|
|
227
|
-
`node "<absolute-Hub-root>/scripts/kit-adopt.mjs" --local-dir "<absolute-module-root>" --version <kit-version>`.
|
|
228
|
-
For cache refresh, verify `<absolute-MM-Work-root>/scripts/sync-design-system.mjs`, then
|
|
229
|
-
pass the absolute script path, the absolute `packages/mmwork-ds/source` path and `--out "<absolute-cache-dir>"`
|
|
230
|
-
as shown above: the generated kit files and `sync.json` land in the cache, never in the MM-Work checkout (#9271).
|
|
231
|
-
These are path patterns, not literal host paths; keep machine-specific roots out of bundled docs.
|
|
232
|
-
|
|
233
|
-
Verify paths before chaining unrelated operations such as a board claim. Path resolution grants no
|
|
234
|
-
new authority: use only the tool mode and target already authorized; never replay a successful claim
|
|
235
|
-
just because a later script failed to load.
|
|
236
|
-
|
|
237
|
-
### Part 2 — The System-First Autolearn Doctrine (never work around a broken tool in `tmp/`)
|
|
238
|
-
|
|
239
|
-
Owner ruling 2026-10-25T15:41:41.360Z (#8839): agents learn from their work, mistakes and
|
|
240
|
-
discoveries with the MM open design system and improve the system wherever they can, instead of only
|
|
241
|
-
fixing the current situation. Never patch the moment in `tmp/` and leave the shared system broken.
|
|
242
|
-
If creating, bundling, rendering, checking or opening an MM Artifact or a design-kit change needs a
|
|
243
|
-
custom script in `tmp/`, a patch around a bundler regex, manually inlined fonts, or locally overridden
|
|
244
|
-
broken tokens, that is a **system defect, not a local task**.
|
|
245
|
-
|
|
246
|
-
The immediate three-step system upgrade reflex:
|
|
247
|
-
|
|
248
|
-
1. **Step A — fix the shared system at its source.** File or claim an issue, or message the owning
|
|
249
|
-
suite seat (Design Lead, MM-Work, Jerv-JervCode, MMI-Hub, Jerv-Hub), so the shipped CLI, bundler,
|
|
250
|
-
token, component or skill is fixed in its repository and no agent ever needs the workaround again.
|
|
251
|
-
A temporary workaround may unblock the task only when it is named as such and linked to that issue.
|
|
252
|
-
2. **Step B — record it in the autolearn queue** (`jerv_learning_note` in JervCode, or
|
|
253
|
-
`mmi-cli learning skill-lesson --skill <name> --title <summary> --body-file <path>`): the exact
|
|
254
|
-
friction and its root cause, so autolearn turns it into a durable doctrine, code or skill fix.
|
|
255
|
-
3. **Step C — record it in Hindsight memory** (`hindsight_ingest_document`): the root cause and the
|
|
256
|
-
permanent system fix, so every later session recalls it automatically.
|
|
257
|
-
|
|
258
|
-
Autolearn watches design and artifact work for these signals and escalates each into a shared
|
|
259
|
-
toolchain, kit or skill improvement: ad-hoc build/render/verify scripts under `tmp/`, empty `#root`
|
|
260
|
-
renders, missing fonts, unrendered `impeccable detect` runs, geometry or layout regressions,
|
|
261
|
-
graywashed or untinted surfaces, verbose walls of text, and skipped front-loaded `impeccable context`
|
|
262
|
-
or playbook passes. Reflect after each design task: what would have made this easier for the next
|
|
263
|
-
agent, and is that improvement filed?
|
|
264
|
-
|
|
265
|
-
### Part 3 — A/B Choosing Architecture & Viewer Rules (owner ruling 2026-10-25T15:57:26.199Z, #8841)
|
|
266
|
-
|
|
267
|
-
Settled owner ruling: present clear, distinct choices in the existing MM Artifact viewer, not a
|
|
268
|
-
"shell over a shell". These are authoring and viewer requirements, not proof of installed capabilities.
|
|
269
|
-
|
|
270
|
-
**Canvases carry design choices only (#8986, relay wording).** An A/B canvas asks how something
|
|
271
|
-
looks or works on screen. Approvals for keys, releases, deletions, data access or tooling never go on
|
|
272
|
-
a canvas: send them to the orchestrator, who asks the owner in plain words.
|
|
273
|
-
|
|
274
|
-
1. **No "shell over a shell" — designer agents build only the alternatives, never their own A/B switcher.**
|
|
275
|
-
The outer MM Artifact viewer (the local review shell and `CanvasStage` / `CompareView` in Live Docs)
|
|
276
|
-
already IS the A/B selector shell: it renders the question prompt, Option A / Option B / Neither
|
|
277
|
-
buttons, notes and board switcher. A `designer` subagent must **NEVER** draw an A/B picker,
|
|
278
|
-
question header, option cards or a gallery of tiny `ThemePreview` thumbnails inside a board.
|
|
279
|
-
**One A/B decision = one page with two full-resolution live HTML boards:**
|
|
280
|
-
- `board-a`: the actual full-size (`1440x900`) live MM-Work screen rendered in **Option A**
|
|
281
|
-
(for example, Linear Dark).
|
|
282
|
-
- `board-b`: the exact same full-size (`1440x900`) live MM-Work screen rendered in **Option B**
|
|
283
|
-
(for example, Apple Black).
|
|
284
|
-
Never pack multiple themes or multiple options onto a single board.
|
|
285
|
-
2. **Compare the live HTML artifacts directly — never screenshots or low-res thumbnails.**
|
|
286
|
-
Both options are live, vector-sharp HTML/CSS/React artifacts rendered from `@mutmutco/mmwork-ds`,
|
|
287
|
-
never raster PNG screenshots or shrunken preview cards. The A/B viewer must let the owner inspect
|
|
288
|
-
Option A and Option B side-by-side or toggle 1:1 at full crisp resolution, so subtle palette,
|
|
289
|
-
contrast and typography differences (such as Linear Dark vs. Apple Black) are immediately clear.
|
|
290
|
-
3. **Content-only zoom — zoom the artifact content, never the outer A/B shell.**
|
|
291
|
-
In the local review viewer and Live Docs (`CanvasStage` / `BoardBridge`), `wheel` events
|
|
292
|
-
(including `ctrlKey` / `metaKey` pinch-zoom) and keyboard zoom (`Ctrl/Cmd + +/-/0`) on both the
|
|
293
|
-
outer review shell and inside board iframes (forwarded via `postMessage`) must call
|
|
294
|
-
`preventDefault()` and zoom **only the artifact canvas/board viewport**. `Ctrl + Mousewheel` and
|
|
295
|
-
viewer zoom controls must keep the outer A/B selector shell, question bar and controls at a fixed
|
|
296
|
-
1:1 UI size.
|
|
297
|
-
|
|
298
|
-
4. **A recorded owner answer is decided state — read it back, never re-ask (owner ruling, #9259).**
|
|
299
|
-
An answer the owner already gave on an A/B canvas is durable decided state, not a pending question.
|
|
300
|
-
Before re-presenting or re-asking any A/B choice, read the recorded answer — `answers.json` in the
|
|
301
|
-
canvas folder plus the canvas choice ID Part 4 Stage 2 says to record — and when a canvas is reopened,
|
|
302
|
-
rebuilt or replaced, carry that pick forward and show the board as already answered. Never tell the
|
|
303
|
-
owner he has not picked while a recorded pick exists: a decided board reads as decided, naming where
|
|
304
|
-
and when it was chosen, and the work proceeds instead of stalling behind a closed question.
|
|
305
|
-
|
|
306
|
-
### Part 4 — Visual A/B Choice via Designer Subagent Before Kit Implementation — Never Prose Specs (owner ruling 2026-10-25T16:29:46.339Z, #8844, #8846, #8848)
|
|
307
|
-
|
|
308
|
-
Settled owner ruling (verbatim): "You should use a designer to create a couple card designs with my
|
|
309
|
-
specifications and then let me choose then build the complete spec into the design system, replacing
|
|
310
|
-
any other card available atomically. That's the proper way to do it. Learn from this mistake of yours,
|
|
311
|
-
requests like this should follow this structure, not prose guide."
|
|
312
|
-
|
|
313
|
-
1. **Never reply with a prose specification in chat or jump straight to kit implementation.**
|
|
314
|
-
When the owner asks to "design the spec for X and add it to the design system" (for example, The One
|
|
315
|
-
Card), writing a markdown or prose spec in chat violates Principle 7 ("Choices for Jervaise go only
|
|
316
|
-
on the A/B canvas"). Building one guessed design straight into the kit skips the owner's choice.
|
|
317
|
-
2. **Always follow the visual spec pipeline:**
|
|
318
|
-
- **Phase 0 — Inspiration via front-loaded Impeccable v4.7.0 and 21st.dev MCP (`https://21st.dev/api/mcp`) only (owner ruling 2026-10-25T21:37:00+03:00, #8854; superseding #8848).**
|
|
319
|
-
Before building visual A/B boards, use front-loaded **Impeccable v4.7.0** alongside **21st.dev MCP**
|
|
320
|
-
(`https://21st.dev/api/mcp`; verbatim owner ruling: `"we don't need the mcp better design yet,
|
|
321
|
-
impeccable and 21st is enough"`, dropping Better Design MCP) to study high-craft reference patterns,
|
|
322
|
-
layout proportions, and interaction details. Always translate inspired patterns into zero-GPU
|
|
323
|
-
`@mutmutco/mmwork-ds` tokens (`--card-blur: none`, `--card-tint-dark: 0%`, `--card-tint-light: 0%`,
|
|
324
|
-
sleek translucent glass cards) and Atomic Design layers; never copy raw third-party CSS/HTML or
|
|
325
|
-
GPU-heavy effects. `MM-Inspo` is strictly a customer/tenant module inside the MM-Work suite, never
|
|
326
|
-
an internal tool for designing the MM-Work app or its design system.
|
|
327
|
-
- **Stage 1 — a designer subagent builds visual A/B alternatives on an MM Artifact canvas.**
|
|
328
|
-
Dispatch a `designer` subagent with front-loaded Impeccable (`impeccable context`, `craft-floor`,
|
|
329
|
-
`distill`, `typeset`, `layout`, `colorize`, `polish`) to create 2–3 genuinely distinct visual
|
|
330
|
-
designs that honor every constraint in the owner's brief: Option A, Option B and optionally
|
|
331
|
-
Option C, each its own full-resolution `1440x900` live HTML board in one MM Artifact A/B canvas
|
|
332
|
-
(Part 3 rules: content-only `Ctrl + Mousewheel` zoom, 1:1 or side-by-side live comparison). Serve
|
|
333
|
-
the verified canvas on the live loopback HTTP review server without opening a browser from the
|
|
334
|
-
seat, so the owner's `Send answers` posts straight back to `POST /answers`. Once review passes,
|
|
335
|
-
send the orchestrator only the review URL and issue number, and keep the server running through
|
|
336
|
-
Stage 2; the orchestrator opens it on the owner's screen (#8987, relay wording). Never open a
|
|
337
|
-
`--standalone` `file://` export (`Download answers.json`) for an
|
|
338
|
-
interactive owner A/B decision: `--standalone [<out.html>]` is only for offline previews/exports
|
|
339
|
-
and SSR detector checks. Spawn a dedicated, fresh
|
|
340
|
-
`designer` subagent for each distinct design task (item 3); never reuse a busy designer seat.
|
|
341
|
-
- **Stage 2 — the owner chooses visually on the A/B canvas.** Wait while the owner inspects the
|
|
342
|
-
live HTML alternatives, zooms into details and picks the preferred design or asks for
|
|
343
|
-
adjustments, then presses `Send answers` on the live review server page; `review.mjs` writes
|
|
344
|
-
`answers.json` into the canvas folder and exits. Record the canvas choice ID and the
|
|
345
|
-
owner-decision reference.
|
|
346
|
-
- **Stage 3 — atomic replacement in the kit source.** Only AFTER the owner picks on the A/B canvas,
|
|
347
|
-
build the chosen design into the source folder of packages/mmwork-ds in mutmutco/MM-Work,
|
|
348
|
-
**atomically replacing** every other legacy or competing variant of that piece across the design
|
|
349
|
-
system, publish it to `Canlı belgeler` / MM-Work, and propagate it to all 10 suite modules.
|
|
350
|
-
3. **One dedicated `designer` subagent per distinct design task — never overload a designer seat
|
|
351
|
-
(owner ruling 2026-10-25T16:33:00Z, #8846).**
|
|
352
|
-
Settled owner ruling (verbatim): "The lead designer sent the card building to the same designer
|
|
353
|
-
agent, overloading it. I don't think it was a wise idea. Please learn from this."
|
|
354
|
-
Spawn a separate, fresh `designer` subagent in its own isolated lane for each distinct design task
|
|
355
|
-
or visual A/B canvas (for example, a theme A/B exploration vs. a unified Card spec A/B). Never steer
|
|
356
|
-
or queue a second unrelated design task onto an active `designer` seat: overloading one
|
|
357
|
-
`designer` subagent serializes work that should run in parallel, bloats its context window, and
|
|
358
|
-
degrades craft quality.
|
|
67
|
+
UI, design, document and MM Artifact work follows the [design topic](design.md): the required `gate` holds fast deterministic checks only, and owner A/B choices go on an MM Artifacts canvas, never as prose.
|
|
359
68
|
|
|
360
69
|
## Documentation preflight
|
|
361
70
|
|
|
@@ -456,7 +165,11 @@ that actually ships in the cut: the train refuses an issue or PR number the rele
|
|
|
456
165
|
commit, so build and verify the lines from one pass over that range —
|
|
457
166
|
`git log --stat --format='%h %s%n%b' origin/main..origin/development`, which carries each commit's
|
|
458
167
|
subject, body and changed files — never from subjects, PR titles or memory; a line whose claim is not
|
|
459
|
-
in that output does not go in the file.
|
|
168
|
+
in that output does not go in the file. Release recovery can re-cut the same `v*` tag on a new SHA, so
|
|
169
|
+
other checkouts still holding the old tag reject a plain `git fetch origin --tags` (`would clobber existing tag`);
|
|
170
|
+
refresh tags with `git fetch origin --tags --force` (or `git fetch origin '+refs/tags/*:refs/tags/*'`) and
|
|
171
|
+
never chain a plain tag fetch with `&&` ahead of a read-only `git log <tag>..origin/<branch>` range (#9517).
|
|
172
|
+
A Hub summary never mentions a Jerv-side project; the train
|
|
460
173
|
refuses such a line.
|
|
461
174
|
Every new MM-Work suite Release, solo and hotfix included, requires `--announce-summary-file` and `--announce-summary-file-tr` in the bilingual update-notes template of the [MM-Work GUIDE, "Update notes"](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md#update-notes) (`Fixed`/`Düzeldi`, then `New`/`Yeni`, with `<Area>: <sentence>.` lines; a Fixed line states what works now, never the problem). A suite release requires `--member-summary-file owner/repo=path` and `--member-summary-file-tr owner/repo=path` for every member it releases. A suite cut's `--owner-go` records the owner's explicit go for that one cut, never an agent's own decision: a held train or stale MM-Work cut goes to the suite orchestrator with the exact owner-gated commands. On its own an agent runs only `suite rcand --dry-run` and `suite hotfix <member> --dry-run`; it never runs `suite release` or `suite abandon`, which have no dry-run. Details: the release skill.
|
|
462
175
|
|
package/skills/rcand/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rcand
|
|
3
|
-
description: Promote development to a release candidate.
|
|
3
|
+
description: Promote development to a release candidate on rc. Use on a full-track repo before release, not for a direct-track repo or an urgent fix (hotfix).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Host-native invocation:** Claude `/mmi:rcand` · Codex `$mmi:rcand` · jervcode `/rcand` · OpenBot the `rcand` skill (loaded by name).
|
|
@@ -27,7 +27,7 @@ mmi-cli oracle org project get {owner}/{repo} --json
|
|
|
27
27
|
mmi-cli devops train doctor --lane rcand --heal --json
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Read it per [train-common.md](../release/train-common.md#doctor).
|
|
31
31
|
|
|
32
32
|
## Apply
|
|
33
33
|
|
|
@@ -57,19 +57,15 @@ On any failure or interruption, read [recovery.md](recovery.md).
|
|
|
57
57
|
|
|
58
58
|
## Merge floor
|
|
59
59
|
|
|
60
|
-
|
|
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
|
-
- **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
|
-
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
60
|
+
Ordinary development PRs land with `mmi-cli devops pr land <number>`. Merges that carry a tagged commit (roll-forward, alignment, fold PR) are true merges, and a refused train is a stop, never finished by hand: the full floor is in [train-common.md](../release/train-common.md#merge-floor). Queue state: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json` (gh rejects `mergeQueueEntry`).
|
|
65
61
|
|
|
66
62
|
## Report
|
|
67
63
|
|
|
68
|
-
Verdict first: the
|
|
64
|
+
Verdict first, per [train-common.md](../release/train-common.md#report): the rc tag (never a placeholder like `vX.Y.0-rc.N`), no Release URL at rc, and the receipt fields above.
|
|
69
65
|
|
|
70
66
|
## Retro
|
|
71
67
|
|
|
72
|
-
|
|
68
|
+
Shared rules: [train-common.md](../release/train-common.md#retro).
|
|
73
69
|
|
|
74
70
|
```bash
|
|
75
71
|
mmi-cli learning skill-lesson --skill rcand --title "<what misfired>" --body "<what; evidence; proposed amendment>"
|
package/skills/rcand/recovery.md
CHANGED
|
@@ -1,10 +1 @@
|
|
|
1
|
-
Every refusal and every doctor blocker names its `code` and `anchor`: open `
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
## Field reference (moved from SKILL.md)
|
|
5
|
-
|
|
6
|
-
**Argument:** `/rcand minor`, `/rcand major`, or `/rcand patch` — a bare bump word, never a `--flag` or env var. No argument → `patch`; declare `minor` or `major` for a planned feature cycle.
|
|
7
|
-
|
|
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
|
-
|
|
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`.
|
|
1
|
+
Every refusal and every doctor blocker names its `code` and `anchor`: open the finding's `anchor` URL and follow that entry, nothing else ([shared recovery](../release/train-common.md#recovery)). A candidate whose immutable rc tag passed policy but whose `origin/rc` was not pushed continues with `mmi-cli devops rcand --resume --watch --json --out <fresh-receipt>` — the only continuation form: `--resume` never re-tags, and `--apply` mints the next `-rc.N` for a new cut only. A promoted candidate whose rc deploy failed retries it, once the cause is fixed, with `mmi-cli devops rcand --retry-deploy --watch --json --out <fresh-receipt>` — same tag and SHA, never re-cut or re-pushed; `--resume` only re-reads that failed leg. Supersede is the last resort, with the authorized human's fresh approval. A refused train is a stop (Merge floor): fix the cause on `development` through a normal PR, then rerun; a rejected protected push leaves the local tag for an authorized rerun, never a force.
|
package/skills/rcand/suite.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
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.
|
|
2
2
|
|
|
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
|
|
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
|
|
package/skills/release/SKILL.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: release
|
|
3
|
-
description: Ship rc or direct-track development to main and production.
|
|
3
|
+
description: Ship rc or direct-track development to main and production. Use for a production release, not for a candidate (rcand) or an urgent merged fix (hotfix).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Host-native invocation:** Claude `/mmi:release` · Codex `$mmi:release` · jervcode `/release` · OpenBot the `release` skill (loaded by name). A backticked `/name` in this doc names the matching workflow (this skill or a sibling), not a literal command.
|
|
7
7
|
|
|
8
8
|
# /release — ship to main + prod
|
|
9
9
|
|
|
10
|
-
Bare `minor|major|patch` (default `patch`), never a flag
|
|
10
|
+
Bare `minor|major|patch` (default `patch`), never a flag. A production release normally needs Jervaise's yes unless a standing authorization covers this repo. Support sessions (`MMI-Hub`, `Jerv-Hub`, `Jerv-JervCode`) hold such a standing owner authorization (2026-10-25) to release at their discretion during active suite runs without repeated per-release approval ([suite.md](suite.md)). All standard release preflight, gate, and verification checks still apply. `minor`: `MMI_BUMP_REASON`. `major`: also `MMI_MAJOR_APPROVED=<exact version>` after the yes (bump rules: [verification.md](verification.md)).
|
|
11
11
|
|
|
12
12
|
## Lane
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ Read `mmi-cli oracle org project get {owner}/{repo} --json` and name the lane ([
|
|
|
15
15
|
|
|
16
16
|
## Preflight
|
|
17
17
|
|
|
18
|
-
`mmi-cli devops train doctor --lane release --heal --json
|
|
18
|
+
`mmi-cli devops train doctor --lane release --heal --json`; read it per [train-common.md](train-common.md#doctor).
|
|
19
19
|
|
|
20
20
|
## Apply
|
|
21
21
|
|
|
@@ -27,7 +27,7 @@ mktemp .jerv/tmp/release-receipt.XXXXXX
|
|
|
27
27
|
mmi-cli devops release --apply --watch --announce-summary-file "<summary-path>" --json --out "<result-path>"
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
MMI-Hub itself releases through the `hub-release` workflow instead: an org owner runs `gh workflow run hub-release.yml --repo mutmutco/MMI-Hub --ref development -f summary='line | line | line'` and watches that run; never build a Hub release on a workstation.
|
|
30
|
+
MMI-Hub itself releases through the `hub-release` workflow instead: an org owner runs `gh workflow run hub-release.yml --repo mutmutco/MMI-Hub --ref development -f summary='line | line | line'` and watches that run; never build a Hub release on a workstation. The board needs no touch: items reached `Done` when their PRs merged to `development`.
|
|
31
31
|
|
|
32
32
|
Run mktemp alone, copy its path; no channel: drop the summary flag. `mmi-cli devops release --apply --ack <sha>` only for a verified main-only commit the hotfix-coverage guard refused. It runs the version fold (automatic, inside `mmi-cli devops release --apply`) bumping manifests unconditionally, pushes the tag first (`gate.yml` runs on `v*` tags), deploys (`tenant-deploy.yml` for tenant-container), announces. Nothing by hand.
|
|
33
33
|
|
|
@@ -41,19 +41,15 @@ On failure or a pending ledger leg: [recovery.md](recovery.md).
|
|
|
41
41
|
|
|
42
42
|
## Merge floor
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
- **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.
|
|
46
|
-
- **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`.
|
|
47
|
-
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
48
|
-
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
44
|
+
Ordinary development PRs land with `mmi-cli devops pr land <number>`. Merges that carry a tagged commit (roll-forward, alignment, fold PR) are true merges, and a refused train is a stop, never finished by hand: the full floor is in [train-common.md](train-common.md#merge-floor). Queue state: `mmi-cli devops read pr queue <number> --repo <owner/repo> --json` (gh rejects `mergeQueueEntry`).
|
|
49
45
|
|
|
50
46
|
## Report
|
|
51
47
|
|
|
52
|
-
Verdict first: the resolved tag (never a placeholder like `vX.Y.0`), Release URL,
|
|
48
|
+
Verdict first, per [train-common.md](train-common.md#report): the resolved tag (never a placeholder like `vX.Y.0`), Release URL, and the receipt fields in [verification.md](verification.md).
|
|
53
49
|
|
|
54
50
|
## Retro
|
|
55
51
|
|
|
56
|
-
|
|
52
|
+
Shared rules: [train-common.md](train-common.md#retro).
|
|
57
53
|
|
|
58
54
|
```bash
|
|
59
55
|
mmi-cli learning skill-lesson --skill release --title "<what misfired>" --body "<what; evidence; proposed amendment>"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Release recovery and ledger continuation
|
|
2
2
|
|
|
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`), 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.
|
|
3
|
+
Every refusal and every doctor blocker names its `code` and `anchor`: open the finding's `anchor` URL and follow that entry, nothing else ([shared recovery](train-common.md#recovery)). 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
4
|
|
|
6
5
|
**Exactly one continuation per ledger state.** Pick the row, run its verb, never combine two:
|
|
7
6
|
|
package/skills/release/suite.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
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.
|
|
2
2
|
|
|
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
|
|
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
|
|
|
5
5
|
Every new mm-work suite Release (including solo and hotfix releases) requires both `--announce-summary-file <path>` (English) and `--announce-summary-file-tr <path>` (Turkish, "sen" form) in the update-notes template. The canonical wording lives in the [MM-Work GUIDE, "Update notes"](https://github.com/mutmutco/MM-Work/blob/development/packages/mmwork-ds/GUIDE.md#update-notes); this repo links it and never copies it. Each file has the section word `Fixed` / `Düzeldi` (what works now, never the problem: "Drive: Scans of large drives now finish without timing out."; a line without now / again / no longer, or artık / yeniden / tekrar / yine, is refused) and/or `New` / `Yeni` (what you can now do) on its own line, Fixed first, each only when it has lines. Under them go 1–8 lines of `<Area>: <sentence>.`, each at most 120 characters, with no issue numbers, versions or commit prefixes. Off-template or missing files refuse before tagging. Do not write the head (app · date · time) or the thanks line: MM-Work renders both from the Release date and credits. Suite release also requires a valid `--member-summary-file <owner/repo=path>` and `--member-summary-file-tr <owner/repo=path>` for every member being released, before promoting any member. Carried, held and already-released members need none, and existing Releases can resume without new files.
|
|
6
6
|
The `/user-releases` feed serves template notes as `updateNotes: {en?, tr?: {fixed[], new[]}}`. Older title-and-notes bodies keep `plainWords` and get `updateNotes: null`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Train skills: shared doctor, recovery, merge floor, report and retro
|
|
2
|
+
|
|
3
|
+
`/release`, `/rcand` and `/hotfix` read this one file (from a sibling skill: `../release/train-common.md`). Each skill keeps only what differs by lane.
|
|
4
|
+
|
|
5
|
+
## Doctor
|
|
6
|
+
|
|
7
|
+
The preflight 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. The apply step (`release --apply`, `rcand --apply`, `hotfix start`, `hotfix release`) re-runs the doctor first, with heal on.
|
|
8
|
+
|
|
9
|
+
## Recovery
|
|
10
|
+
|
|
11
|
+
Every refusal and every doctor blocker names its `code` and `anchor`: open the finding's `anchor` URL and follow that entry, nothing else. The CLI emits the URL; a product repo carries no local copy of the guide.
|
|
12
|
+
|
|
13
|
+
## Merge floor
|
|
14
|
+
|
|
15
|
+
- **Ordinary development PRs land with `mmi-cli devops pr land <number>`.** The rules below are for the train's own merges.
|
|
16
|
+
- **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.
|
|
17
|
+
- **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.
|
|
18
|
+
- **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`.
|
|
19
|
+
- **One train per repo (#5380).** Overlapping trains race tags; never start one to help another.
|
|
20
|
+
- **Tag and Release deletion need Jervaise's yes (principle 12),** named in the guide entry that prescribes it.
|
|
21
|
+
|
|
22
|
+
## Report
|
|
23
|
+
|
|
24
|
+
Verdict first: the resolved tag (never a placeholder like `vX.Y.0`), Release URL (none at rc), `releaseStatus`, `followUpStatus`, `deployStatus`, `promoted`, each run's conclusion and URL (or the no-run-URL note), which run is red (deploy/publish verdict or ordinary CI), `announceNote`, the alignment note (`devRollForward`, `rcAlignment` or the fold PR), `checkout`, the dispatch used. Pending is unverified, never success. Product names only when releasing that product's repo.
|
|
25
|
+
|
|
26
|
+
## Retro
|
|
27
|
+
|
|
28
|
+
Before the final report: did this skill misfire? Process only. If yes, file one lesson with the skill's own Retro command (hard cap: one per run); a clean run is silent; if the call fails, note it and continue. Lessons are deduplicated on the owning board and change the skill only by reviewed PR, never live.
|