diff --git a/assets/make-it-a-bit-better/icon.png b/assets/make-it-a-bit-better/icon.png
new file mode 100644
index 00000000..89c91369
Binary files /dev/null and b/assets/make-it-a-bit-better/icon.png differ
diff --git a/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json b/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json
new file mode 100644
index 00000000..519dd440
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/.zcode-plugin/plugin.json
@@ -0,0 +1,25 @@
+{
+ "name": "make-it-a-bit-better",
+ "version": "0.2.4",
+ "description": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.",
+ "description_i18n": {
+ "en": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.",
+ "zh-CN": "自主产品打磨循环:每轮强制开一场新头脑风暴(3 个视角子代理),择一个小角度实现、验证并提交,落账到项目级 ledger;超格好想法进 icebox。一轮好一点点,轮次积累成产品进步。"
+ },
+ "author": {
+ "name": "Lumos-789",
+ "url": "https://github.com/Lumos-789"
+ },
+ "homepage": "https://github.com/Lumos-789/make-it-a-bit-better",
+ "repository": "https://github.com/Lumos-789/make-it-a-bit-better",
+ "license": "MIT",
+ "keywords": [
+ "polish",
+ "iteration",
+ "continuous-improvement",
+ "product",
+ "brainstorm",
+ "ux"
+ ],
+ "skills": "skills"
+}
diff --git a/external_plugins/make-it-a-bit-better/CHANGELOG.md b/external_plugins/make-it-a-bit-better/CHANGELOG.md
new file mode 100644
index 00000000..32610761
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/CHANGELOG.md
@@ -0,0 +1,67 @@
+# Changelog
+
+## 0.2.4
+
+- Quick start: the expectation line after the 5-round example says "up to N
+ committed small improvements" again (both languages) — it had drifted to
+ "up to 3" when the example was added, but each round lands at most one
+ improvement, so N rounds yield at most N (0.2.1 already said "up to N").
+- `.gitignore` drops `build/`, `__pycache__/` and `*.pyc` — template leftovers
+ from the initial commit; this is a pure-JS skill repo with no Python files
+ and no build step.
+
+## 0.2.3
+
+- README 双语的 DSH 版本要求补上上界,改为 `>=0.2.1-rc.2 <0.3.0`,与
+ `package.json` 的 `engines.dsh` 同口径:原文「0.2.1-rc.2 or newer / 或更新」
+ 漏了 `<0.3.0` 上限,DSH 0.3.x 用户按文档以为兼容,实际会被安装闸挡下。
+
+## 0.2.2
+
+- The repo gate now requires `target` to be the repository root: a directory
+ nested inside another repository fails the gate and reports both paths,
+ instead of silently committing rounds into the parent repo.
+- This changelog is the single release history: the README keeps one line of
+ news and points here (it had drifted — the README listed 0.2.1/0.2.0/0.1.0
+ while this file only had 0.2.2).
+- `package.json` declares `engines.dsh` and the skill-filesystem peer, so an
+ incompatible DSH blocks install and activation instead of failing at runtime.
+
+## 0.2.1 (2026-11-03)
+
+- The skill text carries a soft cap (150 lines): growth past the cap pays for
+ itself by distilling existing lines, so every round stays loadable for
+ small-context agents.
+- README answers "why not just ask an agent to improve it?" up front — the three
+ structural guarantees an ad-hoc prompt can't give.
+- Quick start expectations calibrated: up to N committed improvements; a
+ self-stop (`stalled` ledger line) or a reverted round (`failed, reverted`) is
+ the loop being honest, not broken.
+- A round whose red check can't be fixed ships nothing, in exactly two commits —
+ the round's commit plus its revert; the failed diff and its failing evidence
+ stay in git history for the fix workflow.
+
+## 0.2.0 (2026-11-03)
+
+Protocol hardened by 13 self-hosted rounds (mabb polishing itself):
+
+- Verify honesty: a red check is fixed within the round cap or reverted with a
+ reversing commit and logged as `failed, reverted`; "verification pending" is
+ distinct from a missing toolchain; a repo with no verification surface gets a
+ manual smoke, never an invented check.
+- Safety gates: non-git targets are rejected before any work; the ledger's
+ `.agents/` home is verified gitignored before recording; a repo without docs
+ grounds on entry-point code + tree, never an improvised summary.
+- `focus` now shapes generation in every lens and ranks in-focus candidates
+ first — end to end, not just where the round grounds.
+- Fixed-shape reporting: every round ends with the same six-field report, every
+ run closes with a four-field summary; the ledger carries a dimensions-coverage
+ view and next-round hint, and a self-stopped run leaves a dated `stalled`
+ marker.
+- Icebox lifecycle: thin brainstorms promote a sliceable icebox idea instead of
+ stopping early; entries carry stable short ids (`IB-N`) and are deleted when
+ landed.
+
+## 0.1.0
+
+Initial release: the 7-step round protocol, lens pool, ledger and icebox.
diff --git a/external_plugins/make-it-a-bit-better/LICENSE b/external_plugins/make-it-a-bit-better/LICENSE
new file mode 100644
index 00000000..b6c14d9c
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Lumos-789
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/external_plugins/make-it-a-bit-better/README.md b/external_plugins/make-it-a-bit-better/README.md
new file mode 100644
index 00000000..2208ea50
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/README.md
@@ -0,0 +1,79 @@
+
+
+make-it-a-bit-better
+
+A bit better, round after round.
+
+A skill plugin that runs an autonomous product-polish loop. Every round opens a **mandatory fresh brainstorm** (3 perspective-forced subagents), picks **one small angle**, implements, verifies and commits it, and logs the round in a per-project ledger. Good ideas that are too big for one round go to an **icebox** instead of being forced in. The philosophy is the name: no rewrites — a bit better, accumulated round after round.
+
+## Why not just ask an agent to "improve it"?
+
+An ad-hoc prompt can produce a change; it can't produce this loop's three structural guarantees:
+
+- **A fresh brainstorm every round** — 3 forced perspectives regenerate candidates outside the last round's frame, deduped against the ledger. An ad-hoc prompt re-cooks whatever the model already said.
+- **One small, verified change** — ≤3 files / ≈100 lines, a real check must pass, and a red check is reverted rather than shipped. An ad-hoc prompt optimizes for looking done.
+- **Memory across rounds** — the ledger records dimensions touched and parks oversized ideas in the icebox, so round 17 doesn't repeat round 3. An ad-hoc prompt restarts from zero every time.
+
+## Inputs
+
+| input | default | what it does |
+|-------|---------|--------------|
+| `target` | current working directory | repo path to polish. Must be the root of a git repository: a non-git target, or one nested inside another repo, is rejected before any work starts. |
+| `rounds N` | 1 | how many rounds to run ("N rounds" or "keep going"). With N given, all N run without asking; after two consecutive thin brainstorms the loop stops itself early. |
+| `focus` | none | a feature/path to spotlight (e.g. a just-shipped feature). Shapes generation in every lens and ranks in-focus candidates first — not just where the round grounds. |
+
+## What a round looks like
+
+1. **Ground** — read the product, recent commits and the ledger; dimensions never touched get priority. A non-git target is rejected up front, before any work is done. A repo with no README/docs grounds on entry-point code + tree instead — and says so in the round report, never improvising a product summary.
+2. **Brainstorm (mandatory)** — 3 fresh subagents, each wearing a different lens (first-time user, picky daily user, maintainer-in-six-months, auditor, automation caller, …), each returning candidate angles; deduped against the ledger so nothing gets re-cooked. Without a subagent tool it falls back to three in-session, lens-forced passes. A run with `focus` spotlights that area in every lens's grounding. Still thin after widening the lenses? A good icebox idea that slices into the round cap gets promoted instead of letting the run stop early.
+3. **Select one** — felt-impact × freshness ÷ cost, capped at ≤3 files / ≈100 lines per round. Bigger ideas → icebox. With `focus`, in-focus candidates rank first.
+4. **Implement** — target-repo conventions, complete changes only, no TODO/mock leftovers.
+5. **Verify** — the repo's own tests / build / lint / smoke; honest "verification pending" if the toolchain is missing; a repo with no verification surface at all gets a minimal manual smoke of the changed path (real command + observed output as evidence), or an honest `verification pending (no runnable surface)` when nothing can run; a red check gets fixed within the round cap or the round ships nothing: it is committed as `mabb #N: ` and immediately reversed by a second `mabb #N: revert` commit (never discarded — the failed diff stays in history), logged as failed — never shipped unverified.
+6. **Record** — one commit per round (`mabb #N: `) plus a ledger entry (dimension, angle, who feels it, evidence). Before writing the ledger, its `.agents/` home is verified gitignored (`git check-ignore`; a missing rule is appended within the round), so agent working state never leaks into the commit.
+7. **Loop** — ask-to-continue by default, N rounds on request; stops itself after two consecutive thin brainstorms rather than forcing weak changes. Every round closes with the same six-field report (angle / who feels it / what changed / evidence / icebox additions / next-round hint; empty fields say `none`), so rounds and repos stay comparable. When a run ends — N done, declined, or self-stopped — a four-field run summary closes it (`rounds:` / `changes:` / `icebox added:` / `leftovers:`), so a 5-round batch ends with totals instead of trailing off. A self-stop also overwrites the ledger's next-round hint with a dated `stalled` line (why it went thin, what to widen next) — the stop survives the conversation, and a later session can tell a stalled run from a finished one.
+
+## The ledger
+
+`.agents/mabb/ledger.md` in the target repo is the loop's memory. It prevents repeating old angles and carries a coverage view that keeps steering the brainstorm toward untouched dimensions. The icebox holds good-but-too-big ideas until you promote them to real projects — a round that lands one deletes its entry, so the icebox always lists what is still pending. Icebox entries carry short ids (`IB-1`, `IB-2`, …, stable once assigned), so reports, next-round hints and promotions cite an entry exactly instead of describing it.
+
+## Side effects (disclosed for review)
+
+- **Model calls**: each round spawns 3 short-lived brainstorm subagents (falls back to three in-session passes when the client has no subagent tool) — N rounds means ≈3N such calls.
+- **Files**: writes the improvement itself in the target repo, plus the local ledger under `/.agents/mabb/`.
+- **Git**: one local commit per round in the target repo (exactly two when a round fails: the round's commit, then its revert — the failed diff stays in history, nothing ships unverified). Shared/team repos get a branch proposal first — never a direct main commit. **Never pushes** to any remote unless you explicitly say push.
+- **Network**: none beyond the model API.
+- **Context**: the skill text is loaded whole by the executor every round, so it carries a soft cap (150 lines) — growth past the cap pays for itself by distilling existing lines, keeping rounds loadable for small-context agents.
+
+## Install
+
+**DSH** — this repo is a DSH bundle: one package mounts the `make-it-a-bit-better` skill (pure skill — no MCP server, no runtime dependencies). Requires DSH `>=0.2.1-rc.2 <0.3.0`.
+
+```bash
+# From a checkout
+dsh plugin add /path/to/make-it-a-bit-better
+
+# Once published
+dsh plugin add make-it-a-bit-better
+```
+
+**ZCode** — the same repo doubles as a ZCode plugin (`.zcode-plugin/plugin.json` + `skills/`): install it from any marketplace that lists it — for a local tryout, a dev marketplace pointing at a checkout works.
+
+## Quick start
+
+With the plugin installed:
+
+> Run 3 rounds of make it a bit better on /path/to/repo
+
+Or with the steering wheel: point it at a repo, ask for N rounds, spotlight one area:
+
+> Run 5 rounds of make it a bit better on /path/to/repo, focusing on the checkout flow
+
+Expect: a ledger row per round and up to N committed small improvements — *up to*, because the loop self-stops after two consecutive thin brainstorms (the ledger gets a dated `stalled` line) and a red check it can't fix is reverted (a `failed, reverted` row, nothing shipped). Fewer commits than N is the loop being honest, not broken. An icebox appears only when the brainstorm produced ideas too big for one round.
+
+## What's new
+
+**0.2.4** — quick-start expectation corrected back to "up to N committed small improvements"; `.gitignore` template leftovers dropped. Full history: [CHANGELOG.md](CHANGELOG.md).
+
+## License
+
+MIT © Lumos-789
diff --git a/external_plugins/make-it-a-bit-better/README_CN.md b/external_plugins/make-it-a-bit-better/README_CN.md
new file mode 100644
index 00000000..1e02da76
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/README_CN.md
@@ -0,0 +1,79 @@
+
+
+make-it-a-bit-better(好一点点)
+
+一轮好一点点,轮次积累成产品进步。
+
+一个跑自主产品打磨循环的 skill 插件。每轮**强制开一场新头脑风暴**(3 个视角强制的子代理),**择一个小角度**,实现、验证并提交,落账到项目级 ledger。一轮装不下的好想法进 **icebox**,不硬塞。哲学就是名字本身:不做重写——一轮好一点点,轮次积累成产品进步。
+
+## 为什么不直接让 agent「优化一下」?
+
+即兴 prompt 也能改出一段代码,但给不了这个循环的三个结构保证:
+
+- **每轮强制新风暴** — 3 个强制视角在上一轮的框架之外重新生成候选,再按账本去重;即兴 prompt 只会重炒模型上次说过的话。
+- **一个小而验证过的改动** — ≤3 文件 / ≈100 行,真实检查必须通过,检查红了就回滚而不是带伤提交;即兴 prompt 优化的是「看起来做完了」。
+- **跨轮记忆** — 账本记录碰过的维度、把超格想法停在冰柜,第 17 轮不会重复第 3 轮;即兴 prompt 每次从零开始。
+
+## 输入
+
+| 输入 | 默认 | 作用 |
+|------|------|------|
+| `target` | 当前工作目录 | 要打磨的仓路径。必须是 git 仓的根目录——非 git 目标、或嵌在别人的仓里的子目录,动工前就被拦下。 |
+| `rounds N` | 1 | 跑几轮(说「N 轮」或「继续」皆可)。给了 N 就连跑满 N 轮不再询问;连续两轮风暴出不了合格候选会提前自停。 |
+| `focus` | 无 | 要聚光的功能/路径(如刚上线的功能)。贯穿每个视角的风暴生成,区内候选排序优先——不只是接地时看一眼。 |
+
+## 一轮长什么样
+
+1. **接地** — 读产品、最近提交和账本;从没碰过的维度本轮优先。非 git 目标仓在动工前就被拦下。目标仓没有 README/文档时,接地降级为入口代码 + 目录树,并在轮报里说明——绝不凭空即兴编一段产品摘要。
+2. **风暴(强制)** — 3 个新上下文子代理各戴一个视角镜头(初见用户、挑剔的日常用户、半年后的维护者、审查者、脚本调用方……),各自产出候选角度;按账本去重,不炒冷饭。客户端没有子代理工具时,退化为会话内三趟视角强制风暴。带 `focus` 的运行,每个视角的接地摘要都聚光该区。宽想之后还是瘦?冰柜里能切成单轮上限的好想法会被晋升落地,而不是让运行提前自停。
+3. **择一** — 按感知面 × 新鲜度 ÷ 成本排序,单轮硬上限 ≤3 文件 / ≈100 行;超格好想法进 icebox。带 `focus` 时区内候选优先。
+4. **落地** — 遵守目标仓自身规范,只留完整改动,不留 TODO / mock。
+5. **验证** — 用目标仓自己的测试 / 构建 / lint / 冒烟;工具链缺失时如实报「验证待补」,不谎报;目标仓压根没有验证面(区别于工具链缺失)时,最低手动冒烟改动路径(真实命令 + 实际输出作为证据),实在无可执行对象(纯文档/文案改动)就如实落 `verification pending(无可执行验证面)`;检查红了先在单轮上限内修,修不好就零带伤离场:先以 `mabb #N: <角度>` 提交本轮改动,再以第二个 `mabb #N: revert` commit 原地反转(绝不 discard——失败 diff 留在历史里),落一条 failed 账——失败轮恰好两个 commit,绝不带伤提交。
+6. **落账** — 一轮一 commit(`mabb #N: <角度>`)+ 一条账本记录(维度、角度、谁会感知、证据)。写账前用 `git check-ignore` 核实账本的 `.agents/` 位置已被忽略,缺规则就当轮补上(计入文件上限),agent 工作态绝不混进轮次 commit。
+7. **续轮** — 默认问一次是否继续,给了 N 就连跑;连续两轮风暴出不了合格候选就自停,不硬凑弱改动。每轮以同构的 6 字段轮报收尾(角度 / 谁感受到 / 改了什么 / 证据 / icebox 新增 / 下轮提示;空字段写 `none` 不缺行),跨轮跨仓可比较。整场运行收尾(N 轮跑满、用户不续或自停)再以 4 字段运行总结块落幕(`rounds:` / `changes:` / `icebox added:` / `leftovers:`)——5 轮批量跑完有底线汇总,而非不了了之。自停时账本的「下轮提示」也会被改写为一行带日期的 `stalled`(为何贫瘠、下轮先宽想什么)——自停事实留档在对话之外,后续会话能区分「贫瘠自停」与「正常跑完」。
+
+## 账本
+
+目标仓的 `.agents/mabb/ledger.md` 是循环的记忆:防重复旧角度,覆盖视图逼着风暴往没碰过的维度去。icebox 存好但超格的想法,等你拍板升级成正式需求——某轮落地即销账,冰柜永远只列还没做的。冰柜条目带短 id(`IB-1`、`IB-2`……一旦分配不再变),轮报、下轮提示与晋升引用精确到条,不再靠描述性指认。
+
+## 副作用披露(供评审)
+
+- **模型调用**:每轮派 3 个短命头脑风暴子代理(无子代理工具的客户端退化为会话内三趟)——N 轮约 3N 次这样的调用。
+- **文件**:在目标仓写改动本身,外加本地账本 `/.agents/mabb/`。
+- **Git**:每轮在目标仓落一个本地 commit(失败轮恰好两个:本轮 commit + 其 revert——失败 diff 留在历史,零带伤提交);多人协作仓先提分支方案再动,绝不直提主干;**绝不 push**,除非你当次明说。
+- **网络**:除模型 API 外无任何访问。
+- **上下文**:技能文本每轮被执行 agent 整读,故带软顶(150 行)——超顶的增长须以蒸馏现有行来抵偿,小上下文 agent 永远装得下一轮。
+
+## 安装
+
+**DSH**——本仓即 DSH bundle:一个包挂载 `make-it-a-bit-better` 技能(纯技能——无 MCP server、无运行时依赖)。需要 DSH `>=0.2.1-rc.2 <0.3.0`。
+
+```bash
+# 从 checkout 安装
+dsh plugin add /path/to/make-it-a-bit-better
+
+# 发布后
+dsh plugin add make-it-a-bit-better
+```
+
+**ZCode**——同一仓库兼作 ZCode 插件(`.zcode-plugin/plugin.json` + `skills/`):从任一收录它的插件市场安装;本地试用可让 dev 市场指向一份 checkout。
+
+## 快速开始
+
+装好插件后:
+
+> 对 /path/to/repo 跑 3 轮 make it a bit better
+
+也可以带上方向盘:指定仓、要 N 轮、聚光一个区域:
+
+> 对 /path/to/repo 跑 5 轮 make it a bit better,focus 在结账流程
+
+预期:每轮一条账本记录,最多 N 个已提交的小改进——说「最多」是因为连续两轮风暴贫瘠会自停(账本留一行带日期的 `stalled`),检查红了修不好就整轮回滚(落一条 `failed, reverted`,零带伤提交)。commit 数少于 N 是循环在诚实,不是坏了。只有风暴产出超格想法时才会出现 icebox。
+
+## 版本历史
+
+**0.2.4** — 快速开始预期改回「最多 N 个已提交的小改进」;删除 `.gitignore` 模板残留。完整历史见 [CHANGELOG.md](CHANGELOG.md)。
+
+## 许可
+
+MIT © Lumos-789
diff --git a/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png
new file mode 100644
index 00000000..89c91369
Binary files /dev/null and b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.png differ
diff --git a/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg
new file mode 100644
index 00000000..04820f36
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/assets/make-it-a-bit-better/icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/external_plugins/make-it-a-bit-better/cordis.patch.yml b/external_plugins/make-it-a-bit-better/cordis.patch.yml
new file mode 100644
index 00000000..b5a4b848
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/cordis.patch.yml
@@ -0,0 +1,3 @@
+- insert:
+ - id: make-it-a-bit-better
+ name: make-it-a-bit-better
diff --git a/external_plugins/make-it-a-bit-better/index.js b/external_plugins/make-it-a-bit-better/index.js
new file mode 100644
index 00000000..9fee05fd
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/index.js
@@ -0,0 +1,17 @@
+import { fileURLToPath } from "node:url";
+import { apply as applySkillFilesystem } from "@deepseek-ai/dsh-skill-filesystem";
+
+const skillsRoot = fileURLToPath(new URL("./skills/", import.meta.url));
+
+export const name = "make-it-a-bit-better";
+export const inject = ["skills"];
+
+export function apply(ctx) {
+ applySkillFilesystem(ctx, {
+ providerName: name,
+ includeDefaultRoots: false,
+ bundledSkillDir: skillsRoot,
+ watch: false,
+ });
+ return ctx;
+}
diff --git a/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md b/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md
new file mode 100644
index 00000000..f7ec00d2
--- /dev/null
+++ b/external_plugins/make-it-a-bit-better/skills/make-it-a-bit-better/SKILL.md
@@ -0,0 +1,117 @@
+---
+name: make-it-a-bit-better
+description: Autonomous product-polish loop. Every round MUST open a fresh brainstorm, pick ONE small angle that makes the product a bit better, implement, verify and commit it, then log the round in a per-project ledger. Use when the user says "make it a bit better", "polish it", "iterate a few rounds", "打磨", "好一点点", "让它好一点", "持续改进", "再优化几轮", or asks to iteratively improve a product or feature one small step at a time.
+metadata:
+ short-description: One small brainstormed improvement per round, committed and logged
+---
+
+# Make It a Bit Better (mabb)
+
+An incremental product-polish loop. Each round: **brainstorm → pick ONE small angle → implement → verify → commit → log**. No rewrites, no big-bang redesigns — a product gets better one small, felt improvement at a time, round after round.
+
+## Inputs
+
+- **target** — repo path (default: current working directory)
+- **rounds N** — how many rounds to run (default 1; the user may say "N rounds" or "keep going")
+- **focus** — optional feature/path to examine (e.g. a just-shipped feature)
+
+## Round protocol — run every step, in order, every round
+
+### 1. Ground
+
+- Read the product's README/docs entry, `git log --oneline -15`, and a quick tree overview. With `focus` given, ground mainly on that area.
+- No README/docs entry at all (scripts, small tools — common)? Degrade grounding to the entry-point code (main/module entry) plus the directory tree, and say so in that round's report — grounding degrades honestly; a product summary improvised from nothing is fabrication, not grounding.
+- Read the ledger at `/.agents/mabb/ledger.md` if it exists; its `Dimensions touched` line and `Next round` hint (either may be absent in older ledgers — reconcile from the table then) steer this round, and dimensions never touched get brainstorm priority. No ledger yet → this is round 1; otherwise the round number is the ledger's max `#` + 1.
+- Repo gate (fail-loud): confirm `` is the root of a git repository — `git -C rev-parse --show-toplevel` must resolve to `` itself, not to a parent. A target nested inside someone else's repo fails the gate: stop before any work, report both paths (`` and the resolved top level), and ask which one the round should run in. mabb records rounds as commits, so a non-git target cannot be recorded; never `git init` on the user's behalf or drift to a nearby directory that does have `.git`.
+- Repo safety: if the target is a shared/team repo (protected main, MR flow), propose a branch and get the user's confirmation before the first commit. Never commit to main directly in such repos.
+
+### 2. Brainstorm (mandatory — never skip, never thin)
+
+- Draw **3 lenses** from the lens pool below; exclude lenses used in the previous round (the ledger records them).
+- Spawn **3 fresh subagents in parallel**, one per lens. Each receives: a 5–10 line product grounding summary, the ledger's past angles, the dimension seeds, and its lens. Each returns **3–5 candidates**, one line each:
+ `angle — who feels it (persona + moment) — one-line rationale — cost S/M/L`
+- Merge in-session; drop anything already in the ledger or icebox; you may add your own candidates.
+- With `focus` given: spotlight that area in each lens's grounding summary, and ask every lens for ≥1 in-focus candidate — focus must shape generation, not just Ground.
+- If the client has no subagent tool: still brainstorm — write three separate passes, one per lens, each yielding ≥3 candidates. Perspective-forced fresh generation every round is the point.
+- Fewer than 6 distinct surviving candidates → widen the lenses and go again. Never select from a thin list. Still thin after widening → before heading for the early stop, check the ledger's icebox for a good idea that slices into the round cap (≤3 files / ≈100 lines); promoting a slice keeps the round real, and nothing slice-able leaves the honest stop standing.
+
+### 3. Select ONE
+
+- Rank by felt-impact × freshness ÷ cost. Take the top.
+- With `focus` given, rank in-focus candidates first; pick out-of-focus only when no in-focus candidate survived, and say so in the round report.
+- **"A bit better" cap**: one round changes ≤3 files or ≈100 lines, whichever binds first (docs/copy-only rounds may exceed with one stated sentence of reason). If the top candidate exceeds the cap, move it to the ledger's **icebox** and take the next.
+- The chosen angle must name a concrete "who feels it". If it can't, it is probably a refactor in disguise — icebox it.
+
+### 4. Implement
+
+- Follow the target repo's conventions and instruction files (AGENTS.md / CLAUDE.md / CONTRIBUTING).
+- Read every file before editing. Complete changes only — no TODO, mock, placeholder or "temporary path".
+
+### 5. Verify
+
+- Use the repo's own verification surface: tests, build, lint, type-check, or a real smoke run. At least one real check must pass.
+- If the toolchain is unavailable, report "verification pending" honestly in the round report — never claim verified.
+- No verification surface at all (the repo simply has no tests/build/lint — distinct from a missing toolchain)? Smoke the changed path by hand: run the real command and record it plus the observed output as evidence. Nothing runnable (e.g. a pure docs/copy change) → log `verification pending (no runnable surface)` and say so — still never claim verified.
+- Check failed after implementing? Fix it within the round's ≤3-file/≈100-line cap. Still failing: ship nothing — commit the round's change as `mabb #N: `, then a second commit `mabb #N: revert` reversing it (at this point nothing is committed yet, so an uncommitted change gives a "reversing commit" nothing to reverse and discarding is forbidden — commit-then-revert keeps the failed diff and its failing check in history for the fix workflow; a failed round is exactly two commits). Log a normal ledger row citing the revert commit, change = `failed, reverted`, evidence = the failing check, and say so in the round report — shipping nothing beats shipping unverified.
+
+### 6. Record
+
+- Commit the change alone: `mabb #N: `, body line = who feels it + evidence. (A failed round commits nothing here — its round + revert commits were made in Verify; this step only writes its ledger row.)
+- Update `/.agents/mabb/ledger.md` (create on first record):
+
+```markdown
+# mabb ledger —
+
+| # | date | dimension | angle | who feels it | change | commit | evidence |
+|---|------|-----------|-------|--------------|--------|--------|----------|
+| 1 | 2026-11-03 | error-messages | ... | ... | ... | abc1234 | pytest 41 green |
+
+## Dimensions touched
+- error-messages, microcopy — steer the next brainstorm toward untouched ones (accessibility, cost, …)
+
+## Next round
+-
+
+## Icebox (good, too big for one round; a round that lands an entry deletes it)
+- IB-1 (dimension) idea — why it matters — rough size M/L
+
+## Lenses used
+- #1: first-time-user, auditor, automation-caller
+```
+
+- While recording, append this round's dimension to `Dimensions touched` and overwrite `Next round` with the current round report's hint — both are what the next round's Ground reads.
+- A round that lands a promoted icebox idea deletes that entry in the same ledger update: the icebox is a pending list, and a landed idea's permanent record is its ledger row — an entry left behind reads as still-to-do and invites a duplicate round later.
+- Icebox entries carry short ids: `IB-1`, `IB-2`, … — a new entry takes the next free id (current max + 1); ids are stable once assigned (never renumbered, never reused), and the round report, `Next round` hint and a promotion's ledger row cite entries by id instead of describing them. Ledgers started before ids keep working: id-less entries stay valid until they are edited or landed.
+- Before writing the ledger, make sure it cannot leak into git history: `git -C check-ignore .agents/mabb/ledger.md` must exit 0 — if not, append a `.agents/` line to the target's `.gitignore` within this round (counts toward the ≤3-file cap). Never let a repo-convention `git add -A` sweep the untracked ledger into the round commit.
+- The ledger is local working state by default; a team that wants shared history can deliberately un-ignore it — say so to the user once.
+
+### 7. Loop
+
+- End every round with a one-block round report of exactly six labeled fields, always this order, one per line: `angle:` / `who feels it:` / `what changed:` / `evidence:` / `icebox additions:` / `next-round hint:` — an empty field is written `none`, never dropped; `icebox additions:` lists each new entry as `IB-N (dimension) short name`. The fixed shape keeps reports comparable across rounds and repos, and lets an outer orchestrator parse them.
+- Default: ask once "continue?". With N given: run all N. Stop early when 2 consecutive brainstorms yield no qualifying candidate — report "nothing worth a round right now" instead of forcing a weak change. That self-stop is itself recorded: overwrite the ledger's `## Next round` with a dated line `- stalled : two consecutive thin brainstorms, icebox held no slice — ` (no round row — nothing shipped), so a later Ground reads a stalled run as stalled instead of re-running the same doomed brainstorm.
+- When a run ends — all N rounds done, the user declines to continue, or the loop self-stops after two consecutive thin brainstorms — close the whole run with a one-block run summary of exactly four labeled fields, always this order, one per line: `rounds:` (e.g. `3 run`, or `2 of 5 run, stopped after two consecutive thin brainstorms`) / `changes:` (commits and files across the run, e.g. `3 commits, 7 files`; a reverted round shows as `1 failed, reverted`) / `icebox added:` (count plus short names, or `none`) / `leftovers:` (the strongest thread worth a future round, or `none`). Empty fields are written `none`, never dropped. Same fixed-shape rationale as the round report: run totals stay comparable across runs and parseable by an outer orchestrator.
+- Never push to any remote unless the user explicitly said push in this run.
+
+## Lens pool (draw 3, rotate)
+
+first-time user (day one) · picky daily user · maintainer in six months · competitor migrant · constrained user (weak network / old device / small screen) · auditor (security, privacy, compliance) · accessibility user · automation/script caller
+
+## Dimension seeds (ammunition, not a checklist)
+
+first-run & empty states · error messages & failure paths · microcopy (labels, buttons, tooltips) · defaults · speed, felt and real · feedback (loading, progress, confirmation) · consistency (terms, visuals, interactions) · discoverability · edge cases & input boundaries · undo & safety nets · docs & examples · trust & transparency (logs, observability) · cost (time, tokens, API calls) · accessibility · keyboard & power users · install & onboarding
+
+Free-form candidates that fit no seed are welcome — seeds steer coverage, they do not fence it.
+
+## Red lines
+
+- A rewrite or big refactor is not mabb — icebox it.
+- Fixing an already-reported bug belongs to a fix workflow, not a round (an unreported rough edge is fair game).
+- Pure reformatting / renames never count as a round.
+- Every round must answer: **who feels this bit of better?**
+- Shared/team repos: no direct commits to main; confirm branch strategy first.
+- No unbounded loops: N rounds or an explicit "keep going" only.
+- The skill text stays lean — executors load SKILL.md whole every round. Past the soft cap (150 lines), added lines must pay for themselves: distill or merge existing ones in the same commit, or the addition waits in the icebox.
+
+## Trial
+
+Suggested first prompt: *对 /path/to/repo 跑 2 轮 make it a bit better*, or in English *run 2 rounds of make it a bit better on /path/to/repo* — expect two brainstormed, small, verified, committed improvements and a ledger with 2 entries.
diff --git a/marketplace.json b/marketplace.json
index c7f09a06..7d1bc544 100644
--- a/marketplace.json
+++ b/marketplace.json
@@ -10,7 +10,10 @@
"url": "https://z.ai"
},
"unlistedPlugins": [
- { "name": "openpencil", "source": "./external_plugins/openpencil" }
+ {
+ "name": "openpencil",
+ "source": "./external_plugins/openpencil"
+ }
],
"plugins": [
{
@@ -827,7 +830,9 @@
},
{
"name": "excalidraw",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "Excalidraw",
"displayName_i18n": {
"en": "Excalidraw",
@@ -850,7 +855,9 @@
"name": "photocraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/photocraft/icon.png",
"source": "./external_plugins/photocraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "PhotoCraft",
"displayName_i18n": {
"en": "PhotoCraft",
@@ -877,7 +884,9 @@
"name": "vectorcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/vectorcraft/icon.png",
"source": "./external_plugins/vectorcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "VectorCraft",
"displayName_i18n": {
"en": "VectorCraft",
@@ -904,7 +913,9 @@
"name": "pdfcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/pdfcraft/icon.png",
"source": "./external_plugins/pdfcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "PdfCraft",
"displayName_i18n": {
"en": "PdfCraft",
@@ -931,7 +942,9 @@
"name": "designcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/designcraft/icon.png",
"source": "./external_plugins/designcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "DesignCraft",
"displayName_i18n": {
"en": "DesignCraft",
@@ -958,7 +971,9 @@
"name": "wordcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/wordcraft/icon.png",
"source": "./external_plugins/wordcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "WordCraft",
"displayName_i18n": {
"en": "WordCraft",
@@ -985,7 +1000,9 @@
"name": "gridcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/gridcraft/icon.png",
"source": "./external_plugins/gridcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "GridCraft",
"displayName_i18n": {
"en": "GridCraft",
@@ -1012,7 +1029,9 @@
"name": "deckcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/deckcraft/icon.png",
"source": "./external_plugins/deckcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "DeckCraft",
"displayName_i18n": {
"en": "DeckCraft",
@@ -1039,7 +1058,9 @@
"name": "cadcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/cadcraft/icon.png",
"source": "./external_plugins/cadcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "CADCraft",
"displayName_i18n": {
"en": "CADCraft",
@@ -1066,7 +1087,9 @@
"name": "soundcraft",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/soundcraft/icon.png",
"source": "./external_plugins/soundcraft",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "SoundCraft",
"displayName_i18n": {
"en": "SoundCraft",
@@ -1149,7 +1172,9 @@
},
"category": "developer-tools",
"icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/kicad/icon.png",
- "componentTypes": ["ui"],
+ "componentTypes": [
+ "ui"
+ ],
"displayName": "KiCad",
"displayName_i18n": {
"en": "KiCad",
@@ -1443,6 +1468,36 @@
"mcp",
"verification"
]
+ },
+ {
+ "name": "make-it-a-bit-better",
+ "source": "./external_plugins/make-it-a-bit-better",
+ "icon": "https://cdn-zcode.z.ai/zcode/official-plugin/assets/make-it-a-bit-better/icon.png",
+ "description": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.",
+ "description_i18n": {
+ "en": "An autonomous product-polish loop: every round opens a mandatory fresh brainstorm (3 perspective subagents), picks one small angle, implements, verifies and commits it, and logs it in a per-project ledger; oversized ideas go to an icebox. A bit better, round after round.",
+ "zh-CN": "自主产品打磨循环:每轮强制开一场新头脑风暴(3 个视角子代理),择一个小角度实现、验证并提交,落账到项目级 ledger;超格好想法进 icebox。一轮好一点点,轮次积累成产品进步。"
+ },
+ "version": "0.2.4",
+ "author": {
+ "name": "Lumos-789",
+ "url": "https://github.com/Lumos-789"
+ },
+ "category": "productivity",
+ "keywords": [
+ "polish",
+ "iteration",
+ "continuous-improvement",
+ "product",
+ "brainstorm",
+ "ux"
+ ],
+ "examplePrompts": [],
+ "examplePrompts_i18n": {},
+ "displayName": "Make It a Bit Better",
+ "displayName_i18n": {
+ "zh-CN": "好一点点"
+ }
}
]
-}
\ No newline at end of file
+}