@mutmutco/pi-plugin 4.6.47 → 4.6.49
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/package.json +1 -1
- package/skills/board/SKILL.md +3 -1
- package/skills/board/reference.md +8 -0
- package/skills/bootstrap/seeds/manifest.json +2 -0
- package/skills/bootstrap/seeds/runbook-unaffected.json +8 -0
- package/skills/hotfix/SKILL.md +1 -1
- package/skills/org-guide/references/design.md +13 -2
- package/skills/release/SKILL.md +1 -1
- package/skills/release/suite.md +1 -1
- package/skills/release/train-common.md +1 -1
package/package.json
CHANGED
package/skills/board/SKILL.md
CHANGED
|
@@ -35,7 +35,9 @@ parsed mmi-claim evidence object, null when unclaimed; `openPullRequests` lists
|
|
|
35
35
|
closing-issue body links name the item — on the full JSON object that list lives at `report.pullRequests`,
|
|
36
36
|
never `openPullRequests`). Partial reads
|
|
37
37
|
exit nonzero; `--allow-partial` only when the dev accepts an incomplete board. The CLI partitions rows into
|
|
38
|
-
**Yours**, **Free to claim** and **Taken**; stale stamps (4 hours without work) hold nothing.
|
|
38
|
+
**Yours**, **Free to claim** and **Taken**; stale stamps (4 hours without work) hold nothing. Asked who
|
|
39
|
+
holds an item, answer with its recorded stamp (`surface/session@host`) and age, never a family name or
|
|
40
|
+
"an earlier session"; a stamp is not proof that session is alive ([reference.md](reference.md)). Recovery
|
|
39
41
|
moves: a zero-byte or empty `.jerv/tmp/*.json` (`Unexpected end of JSON input`) means a shell-redirected
|
|
40
42
|
read FAILED — re-run with `--out` and check the exit code before parsing; a Status change on an existing
|
|
41
43
|
item is `mmi-cli oracle board move <status> <ref>`, never a hand-written `gh api graphql`
|
|
@@ -43,6 +43,14 @@ stale. Work means the stamp, an issue comment, a commit on the issue's branch, o
|
|
|
43
43
|
PR that closes it. Any of these in the last 4 hours keeps the hold; a date that cannot be read counts as
|
|
44
44
|
work. A takeover keeps the old branch and PR and names them, so the new session continues them.
|
|
45
45
|
|
|
46
|
+
A holder question ("who holds these?") is answered per item from the board read: the stamp's
|
|
47
|
+
`surface/session@host` and its work age. "Codex", "another agent" or "an earlier session of mine" is not
|
|
48
|
+
an answer. A stamp names who claimed the item; it does not prove that session is alive or reachable.
|
|
49
|
+
Never report an item as moving, active or "still with" a session unless that session answered on intercom,
|
|
50
|
+
or named work in the window is attributable to it. Commits and PRs pushed through a shared bot account
|
|
51
|
+
prove only that someone pushed; the PR body or commit text may name the author seat, so read it before
|
|
52
|
+
saying. Otherwise say the holder is unknown and apply the stale and takeover rules.
|
|
53
|
+
|
|
46
54
|
`--bodies` fetches body and comments for every scoped issue. In the JSON, read them at
|
|
47
55
|
`row.details.body` and `row.details.comments` — not `row.body` or `row.comments`. `--bundle-details` is
|
|
48
56
|
the cheaper variant that covers only `userOwned` and `claimable` — prefer it when the plan is limited
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
{ "target": ".github/ISSUE_TEMPLATE/task.yml", "source": "self", "ownership": "org", "classes": ["deployable", "content"] },
|
|
8
8
|
{ "target": ".github/ISSUE_TEMPLATE/config.yml", "source": "self", "ownership": "repo", "classes": ["deployable", "content"] },
|
|
9
9
|
{ "target": "scripts/next-version.mjs", "source": "self", "ownership": "org", "classes": ["deployable"], "releaseTracks": ["full", "direct", "trunk"] },
|
|
10
|
+
{"target": "scripts/ordered-test-run.mjs", "source": "self", "ownership": "org", "classes": ["deployable"], "repos": ["mm-work", "mm-pm", "jerv-jervcode"]},
|
|
11
|
+
{"target": "scripts/test-child-report.mjs", "source": "self", "ownership": "org", "classes": ["deployable"], "repos": ["mm-work", "mm-pm", "jerv-jervcode"]},
|
|
10
12
|
{ "target": ".github/workflows/gate.yml", "source": "seed:gate.template.yml", "ownership": "repo", "classes": ["deployable"], "waivers": { "mmi-katip": "gates through py-gate and web-gate (in-job path filters, #3836) and its registry requiredChecks name exactly those two; a generic Node gate.yml here is red noise on every PR and would be re-created by every apply (#6333)." } },
|
|
11
13
|
{ "target": ".github/workflows/agent-pr.yml", "source": "self", "ownership": "org", "classes": ["deployable"], "waivers": { "jerv-jervcode": "pins this workflow's EXACT step shapes in its own scripts/workflow-boundary-core.mjs — a literal repositories: Jerv-JervCode token scope, and whole-step equality for the surface and verdict legs. #4040 widened the org seed to the same hardened boundary (pull_request_target off the trusted base, an immutable BASE..HEAD compare with a file-count equality wall, a per-repo App token scope, and a certified-head merge), so the two now agree on substance. They cannot agree on bytes: a seed serving 16 repos resolves its token scope and its required contexts at run time, which exact-step equality rejects by construction. The waiver is permanent by design, not a deferral — lifting it would mean weakening the strictest repo to match a fleet file." } },
|
|
12
14
|
{ "target": ".github/rulesets/mmi-product-required-checks.json", "source": "seed:mmi-product-required-checks.template.json", "ownership": "org", "classes": ["deployable"] },
|
|
@@ -7,6 +7,14 @@
|
|
|
7
7
|
"blob": "7faba0bb3ee48074702da48d149657820d74de1a",
|
|
8
8
|
"reason": "comment-only header: the train applies only to repos with a release lane; MM-Work and its modules merge to development and it goes live with no release, rc or candidate stage (#10071); no runtime or operator behaviour change"
|
|
9
9
|
},
|
|
10
|
+
"scripts/test-child-report.mjs": {
|
|
11
|
+
"blob": "067ccb6497be9440d7b87c1423970c829aefc6f8",
|
|
12
|
+
"reason": "new helper imported by scripts/ordered-test-run.mjs that only formats a diagnostic `[tests] child-died` line (exit, signal, cases, cgroup memory) for a file that fails with no failing case (#10185); no CLI flag, env var, exit code or operator step changes, so no runbook section changes"
|
|
13
|
+
},
|
|
14
|
+
"scripts/ordered-test-run.mjs": {
|
|
15
|
+
"blob": "f6f9ec7ffa59c33a1f9cba194f4fbe576dea74bb",
|
|
16
|
+
"reason": "diagnostic output only (#10185, #10193: the child import is optional, loaded only when scripts/test-child-report.mjs exists): a file that fails with no failing case now adds one `[tests] child-died` line (exit, signal, cases, cgroup memory) after the duration table, via the seeded scripts/test-child-report.mjs child import; exit codes, ordering and the failure summary are unchanged. Plus the optional second-argument hooks seam (#10168): hooks.fileFailure and hooks.runEnd are undefined by default, so the run, its report, its exit code and its .jerv/jev-test-order.jsonl record are unchanged for MM-Work and MM-PM; no new CLI flag, env var or operator step, and the jev-tests guidance that the runner does not read JEV_RECENT_FAILURES_FILE yet still holds"
|
|
17
|
+
},
|
|
10
18
|
"README.md": {
|
|
11
19
|
"blob": "46f5e07288931eee1c26362219b9d4271a5ed49e",
|
|
12
20
|
"reason": "the developer-environment seed block now says Hub release trains (repos that have one) stay org-owner only and MM-Work and its modules have none — merge and go live (#10071); no runbook step changes"
|
package/skills/hotfix/SKILL.md
CHANGED
|
@@ -52,7 +52,7 @@ mkdir -p .jerv/tmp && r1=$(mktemp .jerv/tmp/hotfix-start.XXXXXX)
|
|
|
52
52
|
mmi-cli devops hotfix start --from <pr|sha>[,<pr|sha>…] --json --out "$r1"
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
2. Verify: local gate, required review, acceptance criteria. Merge with `mmi-cli devops pr merge <number> --squash --wait` (waits for CI and review; keep the `-x` trailer). Because Hub's default branch is `development`, it closes no issue; no raw GitHub issue operations.
|
|
55
|
+
2. Verify: local gate, required review, acceptance criteria. Merge with `mmi-cli devops pr merge <number> --squash --wait` (waits for CI and review; keep the `-x` trailer). For MMI-Hub, a full patch release through the `hub-release` workflow already carries every merged `development` change, so prefer it over a hotfix whose `main`-base PR cannot be merged by the agent's credential (`main`'s push allowlist); never hand the merge to the owner. Because Hub's default branch is `development`, it closes no issue; no raw GitHub issue operations.
|
|
56
56
|
|
|
57
57
|
3. Release:
|
|
58
58
|
|
|
@@ -168,7 +168,10 @@ Craft essentials every agent applies (owner, 2026-10-25, #8839):
|
|
|
168
168
|
space scale read live from the page's `:root` `--space-*` / `--mm-space-*` tokens (kit 4px fallback
|
|
169
169
|
steps when a board defines none), so off-scale padding/gap/sibling-margin values and 1–3px sibling
|
|
170
170
|
edge near-misses are named in `check.json` `detail.rhythm` / `detail.align` and fail the run
|
|
171
|
-
(exit 0 clean, 2 with faults — no standing caveat).
|
|
171
|
+
(exit 0 clean, 2 with faults — no standing caveat). A padding counts as on-scale when either it or
|
|
172
|
+
padding + the same-side border is (15px + 1px border = a 16px inset); a value above the largest
|
|
173
|
+
scale step is layout-derived, counted as `rhythmUnjudged` / `detail.rhythmUnjudged` and never
|
|
174
|
+
fails the run (#10134). Boards that load `/kit/kit.css` and
|
|
172
175
|
`/kit/kit.js` are canvas boards: use `review.mjs <folder> --no-open`, which serves the kit beside
|
|
173
176
|
each board on `127.0.0.1` and runs live-DOM `impeccable detect` per board.
|
|
174
177
|
`artifacts/review/kit-assets.mjs`, `review.mjs`'s kit and board serving, and
|
|
@@ -179,7 +182,15 @@ Craft essentials every agent applies (owner, 2026-10-25, #8839):
|
|
|
179
182
|
instead of looping `impeccable detect` with shell redirection — it runs one
|
|
180
183
|
`detect <url> --viewport WxH --json` per URL x width x theme (theme merged into the URL query),
|
|
181
184
|
writes one validated `check.json`, and treats empty or unparseable detect output as an operational
|
|
182
|
-
failure that names the run with the captured stderr, never a clean pass.
|
|
185
|
+
failure that names the run with the captured stderr, never a clean pass. Each run also opens the
|
|
186
|
+
same themed URL in Playwright and measures the live DOM with the pack path's own rhythm/alignment
|
|
187
|
+
sampler against the page's `:root` `--space-*` / `--mm-space-*` scale (#10134): off-scale
|
|
188
|
+
padding/gap/sibling-margin values and 1–3px sibling edge near-misses land in that run's
|
|
189
|
+
`rhythm` / `align` counts and `detail.rhythm` / `detail.align` and fail the matrix (exit 2), judged
|
|
190
|
+
by the same border-inclusive and `rhythmUnjudged` rules as the pack path; a page
|
|
191
|
+
that exposes no kit scale (`no-kit-scale`) or could not be opened is a named `geometryError`
|
|
192
|
+
(exit 1). A live app page check is not clean until this geometry pass ran on it: a clean
|
|
193
|
+
`impeccable detect` alone never covers spacing rhythm or control alignment.
|
|
183
194
|
|
|
184
195
|
### Shared support-script invocation
|
|
185
196
|
|
package/skills/release/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Ship rc or direct-track development to main and production. Use for
|
|
|
7
7
|
|
|
8
8
|
# /release — ship to main + prod
|
|
9
9
|
|
|
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
|
|
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, widened 2026-11-07) to land PRs and cut patch releases as needed at any time (active suite runs, AFK sessions, and ordinary runs) without asking the owner to press Merge or approve the cut ([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
|
|
package/skills/release/suite.md
CHANGED
|
@@ -2,4 +2,4 @@ MM-Work and its modules (MM-Account, MM-Chat, MM-Inspo, MM-Moments, MM-PM, MM-St
|
|
|
2
2
|
|
|
3
3
|
The Hub's own release train (MMI-Hub, Jerv-Hub, Jerv-JervCode and other non-MM repos with a release lane) is unchanged and never applies to MM-Work or its modules.
|
|
4
4
|
|
|
5
|
-
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
|
|
5
|
+
Support sessions (MMI-Hub, Jerv-Hub, Jerv-JervCode) are not suite members and hold standing owner authorization (2026-10-25, widened 2026-11-07) to land PRs and cut and ship patch releases as needed at any time (suite runs, AFK sessions, and ordinary runs) without asking the owner to press Merge or approve the cut, 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.
|
|
@@ -16,7 +16,7 @@ Every refusal and every doctor blocker names its `code` and `anchor`: open the f
|
|
|
16
16
|
|
|
17
17
|
## Merge floor
|
|
18
18
|
|
|
19
|
-
- **Ordinary development PRs land with `mmi-cli devops pr land <number>`.** If a merge-queue group leaves the queue with no failed check, `pr land` re-queues once (or rerun `mmi-cli devops pr land <number>` once); a refused land is a stop to report verbatim — never fall back to a hand/admin merge, actor override (`MMI_ACTOR=personal`), or interim workaround. The rules below are for the train's own merges.
|
|
19
|
+
- **Ordinary development PRs land with `mmi-cli devops pr land <number>`.** Support sessions (`MMI-Hub`, `Jerv-Hub`, `Jerv-JervCode`) land their own PRs (`mmi-cli devops pr land` / `pr merge`) under standing owner authorization (2026-11-07) without asking the owner; never ask the owner to press Merge. If a merge-queue group leaves the queue with no failed check, `pr land` re-queues once (or rerun `mmi-cli devops pr land <number>` once); a refused land is a stop to report verbatim — never fall back to a hand/admin merge, actor override (`MMI_ACTOR=personal`), or interim workaround. The rules below are for the train's own merges.
|
|
20
20
|
- **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.
|
|
21
21
|
- **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.
|
|
22
22
|
- **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`.
|