mixdog 1.4.1 → 1.4.2

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.
Files changed (326) hide show
  1. package/package.json +3 -2
  2. package/scripts/build-shipped-history.mjs +115 -33
  3. package/scripts/gate-local.mjs +172 -61
  4. package/scripts/lib/gate-scheduler.mjs +138 -32
  5. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  6. package/scripts/lib/run-node-tests.mjs +54 -29
  7. package/scripts/lib/scoped-temp.mjs +1 -0
  8. package/scripts/lib/test-failure-records.mjs +14 -1
  9. package/scripts/lib/test-failure-summary.mjs +16 -4
  10. package/scripts/lib/test-spawn-ledger.mjs +12 -3
  11. package/scripts/pptx-kit-index.mjs +5 -6
  12. package/scripts/suite-health.mjs +110 -28
  13. package/scripts/test.mjs +9 -14
  14. package/src/agents/advisor/AGENT.md +4 -4
  15. package/src/agents/advisor/agent.json +1 -1
  16. package/src/agents/explore/AGENT.md +22 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/cli.mjs +7 -0
  19. package/src/defaults/agents.json +7 -0
  20. package/src/defaults/shipped-history.json +18 -2
  21. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  22. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  23. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  24. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  25. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  26. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  27. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  28. package/src/defaults/skills/goal-management/SKILL.md +1 -1
  29. package/src/defaults/skills/setup/references/actions.md +12 -6
  30. package/src/defaults/skills/setup/references/surfaces.md +2 -2
  31. package/src/defaults/skills/setup-guide/SKILL.md +5 -2
  32. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  33. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  34. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  35. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  36. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  37. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  38. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  39. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  40. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  41. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  42. package/src/defaults/skills/visualize/SKILL.md +6 -2
  43. package/src/lib/rules-builder.cjs +6 -30
  44. package/src/rules/lead/LEAD.md +3 -3
  45. package/src/rules/shared/20-research.md +3 -6
  46. package/src/rules/shared/40-editing.md +1 -0
  47. package/src/rules/shared/60-verification.md +10 -9
  48. package/src/rules/shared/70-delivery.md +4 -3
  49. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  50. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
  51. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +130 -21
  52. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
  53. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  54. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  55. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  56. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
  57. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  58. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
  59. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
  60. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
  61. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
  63. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  64. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
  65. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  66. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  67. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  69. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  70. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  71. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  73. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  74. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  75. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  76. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  77. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  78. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  79. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  80. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  81. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  82. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  83. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  85. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  88. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  89. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  90. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  92. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  93. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  94. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  95. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  96. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
  97. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  98. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +2 -1
  99. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  100. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -0
  101. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
  102. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  103. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  104. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  105. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  106. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +3 -3
  107. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +10 -5
  108. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +5 -5
  109. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  110. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  111. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
  112. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  113. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +21 -2
  114. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
  115. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  116. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  117. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
  118. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
  119. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +3 -4
  120. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  121. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
  122. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  123. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +25 -14
  124. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +17 -14
  125. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  126. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  127. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -3
  128. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +47 -29
  129. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  130. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
  131. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  132. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  133. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  134. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
  135. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  136. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  137. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +36 -26
  138. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +3 -5
  139. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  141. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
  142. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  143. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  144. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  145. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  146. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
  147. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  148. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  149. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  150. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
  151. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  152. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  153. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
  154. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  155. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  156. package/src/runtime/channels/lib/whisper-server.mjs +10 -1
  157. package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
  158. package/src/runtime/connectors/gmail-app-password.mjs +3 -3
  159. package/src/runtime/explore/explorer.mjs +93 -0
  160. package/src/runtime/explore/tool-defs.mjs +35 -0
  161. package/src/runtime/explore/tool.mjs +123 -0
  162. package/src/runtime/memory/index.mjs +4 -0
  163. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  164. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  165. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  166. package/src/runtime/shared/agent-route-config.mjs +17 -2
  167. package/src/runtime/shared/atomic-file.mjs +103 -2
  168. package/src/runtime/shared/background-tasks.mjs +15 -6
  169. package/src/runtime/shared/connector-accounts.mjs +5 -5
  170. package/src/runtime/shared/connector-catalog.d.mts +11 -4
  171. package/src/runtime/shared/connector-catalog.mjs +60 -52
  172. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  173. package/src/runtime/shared/file-has-data.mjs +26 -2
  174. package/src/runtime/shared/file-lock.mjs +13 -15
  175. package/src/runtime/shared/git-launch.d.mts +9 -0
  176. package/src/runtime/shared/git-launch.mjs +213 -0
  177. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  178. package/src/runtime/shared/llm/cost.mjs +6 -1
  179. package/src/runtime/shared/llm/http-agent.mjs +313 -29
  180. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  181. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  182. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  183. package/src/runtime/shared/llm/system-proxy.mjs +452 -0
  184. package/src/runtime/shared/provider-accounts.mjs +52 -2
  185. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  186. package/src/runtime/shared/staged-update.mjs +47 -2
  187. package/src/runtime/shared/tool-surface.mjs +110 -36
  188. package/src/runtime/shared/tool-work-units.mjs +4 -0
  189. package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
  190. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  191. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  192. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  193. package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
  194. package/src/runtime/shared/worktrees/git.mjs +57 -0
  195. package/src/runtime/shared/worktrees/manager.mjs +205 -137
  196. package/src/runtime/tidy/install.mjs +95 -15
  197. package/src/runtime/tidy/languages.mjs +17 -15
  198. package/src/runtime/tidy/process.mjs +7 -4
  199. package/src/runtime/tidy/resolve.mjs +19 -16
  200. package/src/runtime/tidy/runners/biome.mjs +3 -3
  201. package/src/runtime/tidy/tool.mjs +1 -1
  202. package/src/runtime/tidy/worktree.mjs +10 -6
  203. package/src/runtime/visualize-bridge/client.mjs +4 -1
  204. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  205. package/src/runtime/web-search/index.mjs +1 -1
  206. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  207. package/src/session-runtime/boot/tools.mjs +2 -0
  208. package/src/session-runtime/bot-status.mjs +103 -103
  209. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  210. package/src/session-runtime/conversation-import/discovery.mjs +159 -40
  211. package/src/session-runtime/conversation-import/service.mjs +9 -3
  212. package/src/session-runtime/handoff-attachments.mjs +1 -1
  213. package/src/session-runtime/held-requests.mjs +3 -1
  214. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
  215. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  216. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +143 -116
  217. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
  218. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  219. package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
  220. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  221. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  222. package/src/session-runtime/provider-auth/login.mjs +2 -2
  223. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  224. package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
  225. package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
  226. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  227. package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
  228. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  229. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
  230. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  231. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  232. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  233. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  234. package/src/session-runtime/services/plugin-admin.mjs +10 -6
  235. package/src/session-runtime/services/provider-admin.mjs +281 -10
  236. package/src/session-runtime/session-turn-api.mjs +2 -0
  237. package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
  238. package/src/session-runtime/settings-system-api.mjs +1 -1
  239. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  240. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  241. package/src/session-runtime/setup-tool/executor.mjs +6 -2
  242. package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
  243. package/src/session-runtime/turn/agent-ops.mjs +23 -0
  244. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
  245. package/src/session-runtime/workflow-agents-api/agent-route.mjs +10 -1
  246. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  247. package/src/session-runtime/workspace/session-view.mjs +149 -0
  248. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  249. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  250. package/src/session-runtime/workspace/transitions.mjs +108 -1066
  251. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  252. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  253. package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
  254. package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
  255. package/src/session-runtime/workspace/worktree-tool.mjs +54 -54
  256. package/src/standalone/daemon-desktop-runtime.mjs +2 -0
  257. package/src/standalone/daemon-session-control.mjs +151 -136
  258. package/src/standalone/daemon.mjs +7 -0
  259. package/src/standalone/desktop-service-registry.mjs +9 -0
  260. package/src/standalone/local-session-runtime.mjs +5 -1
  261. package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
  262. package/src/standalone/session-client.mjs +5 -1
  263. package/src/standalone/session-frame-stream.mjs +83 -11
  264. package/src/standalone/session-protocol.mjs +4 -0
  265. package/src/standalone/session-service/agent-tree.mjs +45 -9
  266. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  267. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  268. package/src/standalone/session-service/stored-reader.mjs +127 -40
  269. package/src/tui/App.jsx +154 -164
  270. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  271. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  272. package/src/tui/app/clipboard.mjs +21 -10
  273. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  274. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  275. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  276. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  277. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  278. package/src/tui/app/provider-setup-picker.mjs +20 -13
  279. package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
  280. package/src/tui/app/slash-commands.mjs +1 -0
  281. package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
  282. package/src/tui/app/slash-dispatch.mjs +1 -1
  283. package/src/tui/app/use-btw-panel.mjs +29 -0
  284. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  285. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  286. package/src/tui/app/use-mouse-input.mjs +11 -0
  287. package/src/tui/app/use-onboarding-start.mjs +8 -3
  288. package/src/tui/app/use-panel-transition.mjs +10 -1
  289. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  290. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  291. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  292. package/src/tui/app/use-prompt-queue-history.mjs +3 -2
  293. package/src/tui/app/use-selection-focus.mjs +11 -2
  294. package/src/tui/app/use-selection-geometry.mjs +18 -9
  295. package/src/tui/app/use-selection-paint.mjs +4 -4
  296. package/src/tui/app/use-selection-stitch.mjs +3 -3
  297. package/src/tui/app/use-slash-palette.mjs +62 -0
  298. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  299. package/src/tui/app/use-transcript-activity.mjs +47 -32
  300. package/src/tui/app/use-transcript-follow.mjs +12 -4
  301. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  302. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  303. package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
  304. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  305. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  306. package/src/tui/app/use-transcript-window.mjs +21 -11
  307. package/src/tui/app/use-tui-ready.mjs +18 -0
  308. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  309. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  310. package/src/tui/components/Picker.jsx +27 -3
  311. package/src/tui/components/SignInUrl.jsx +68 -0
  312. package/src/tui/components/TextEntryPanel.jsx +76 -46
  313. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  314. package/src/tui/dist/index.mjs +1896 -1341
  315. package/src/tui/session/goal-turn-state.mjs +6 -2
  316. package/src/tui/session/session-api/controls.mjs +4 -0
  317. package/src/tui/session/session-api/extensions.mjs +8 -0
  318. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  319. package/src/tui/session/session-api/intake.mjs +2 -0
  320. package/src/tui/session/session-api/integrations.mjs +2 -2
  321. package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
  322. package/src/tui/session/session-api/settings.mjs +2 -2
  323. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  324. package/src/tui/session/transcript-spill.mjs +92 -4
  325. package/src/tui/session/transcript-store.mjs +2 -0
  326. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
@@ -1,31 +1,20 @@
1
1
  # Test-suite slop
2
2
 
3
- Read this when tests are in scope for agent-level cleanup. Tests accumulate
4
- through repeated agent corrections the same way production code does:
3
+ Read this when tests are in scope. Pruning rules and the test workflow belong
4
+ to the `test-suite` skill (Prune); this file only adds the cleanup gate.
5
5
 
6
- First distinguish redundant coverage from removing a supported behavior.
7
- Keep distinct observable success, rejection, error, and compatibility cases.
8
- Before removing a behavior and its tests, require independent evidence from
9
- current requirements, real callers, or a specification; tests existing only
10
- for that branch are neither proof of necessity nor permission to delete it.
6
+ First tell redundant coverage from removing a supported behavior. Keep
7
+ distinct observable success, rejection, error, and compatibility cases. Before
8
+ removing a behavior and its tests, require independent evidence from current
9
+ requirements, real callers, or a specification; a test existing only for that
10
+ branch is neither proof of necessity nor permission to delete it. A closed
11
+ loop (a fallback justified by its test, a test justified by the fallback) is
12
+ no evidence either; unresolved intent blocks deletion.
11
13
 
12
- - **Dominated tests** — several tests reach the same branch and the same
13
- result; one asserts the observable output, the others only check
14
- construction, type, or non-emptiness. Keep the strongest, delete the rest
15
- and the fixtures that served only them.
16
- - **Accumulated regression tests** — a near-identical test appended after each
17
- correction, or parameter permutations whose values never cross a new branch,
18
- equivalence class, or failure mode. Keep the smallest set that still covers
19
- distinct regressions, and a permutation only where it marks a real boundary.
20
- - **Tautological assertions** — assertions that cannot fail: `assert True`,
21
- two equal literals compared, a state the fixture itself guarantees, a mock
22
- verifying the setup that fed it. Delete, or rewrite against the observable
23
- result.
24
- - **Verification theater** — checksums, receipts, validators, or
25
- recomputation where producer and verifier share the same information and
26
- failure domain. They cannot fail independently; delete.
27
- - **Closed justification loop** — a fallback exists because a test exercises
28
- it and the test exists because the fallback was added. Neither is evidence
29
- for deleting the pair. Apply the independent-evidence gate above first;
30
- unresolved intent blocks deletion. A distinct externally observable
31
- rejection, error, or compatibility test is not a loop; preserve its coverage.
14
+ Delete a test only when it is dominated (same branch and result as a stronger
15
+ test), tautological (cannot fail), a permutation crossing no new branch, or
16
+ verification theater (verifier and producer share one failure domain), or it
17
+ asserts a removal, a restated constant or copied production logic, and name
18
+ the test that still owns the contract. Deleting a contract test needs the
19
+ user's approval. Merging into an owner, rewriting source-text assertions, and
20
+ everything else follows `test-suite`.
@@ -182,13 +182,21 @@ GNOME with Mixdog's own shell extension, which the app sets up); prefer accessib
182
182
  the turn, like any session exit, releases what the session pressed, and a
183
183
  failed release is reported rather than assumed.
184
184
  Execution stops at the first failure or when the target transitions
185
- (popup, dialog, window change) and returns one fresh observation. An act
185
+ (a popup, dialog, or window change present at the settle check, about
186
+ 150 ms after the input) and returns one fresh observation. An act
186
187
  whose first action uses a `ref` returns accessibility only (`ax`) unless
187
188
  that tree is unusable; pass `observe: "state"` when the next step needs
188
189
  pixels, a `frame_id`, or visual confirmation.
189
190
  4. Read the returned observation, including any successor target. It replaces
190
191
  the pre-action state: continue from it without another capture when usable.
191
192
  Recapture only when evidence is missing, failed, expired, or invalidated.
193
+ That observation shows one window, never the others on screen. Windows the
194
+ settle check saw are in `window_transition.opened_windows`; a window that
195
+ opened later is named by the next command's
196
+ `windows_opened_since_last_action` (since, not necessarily caused by, your
197
+ last action). After a click that may open a popup (sign-in, OAuth,
198
+ connect, continue, authorize), run `list` (kind windows, `query` with the
199
+ app or expected title) before concluding nothing opened.
192
200
 
193
201
  Prefer semantic `ref` > SOM/OCR `element` > coordinates. When pixels are
194
202
  reported `pixel_unavailable`, coordinate input fails closed but fresh semantic
@@ -253,7 +261,9 @@ and a trailing short `wait`; verify with `verify` rather than another capture.
253
261
  `alt+f4` is blocked in every delivery mode. To close a window, obtain the
254
262
  user's go-ahead and use `window` with the `close` operation.
255
263
 
256
- **Dialog appears mid-sequence** — `act` halts automatically. Use its successful
264
+ **Dialog appears mid-sequence** — `act` halts when the settle check sees it; a
265
+ dialog that opens later arrives in the next command's
266
+ `windows_opened_since_last_action`. Use its successful
257
267
  successor observation to handle the dialog; capture only if it is unusable.
258
268
  Returning to the original window also requires a fresh observation, whether
259
269
  returned by the action or obtained through `capture`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: goal-management
3
3
  description: Manage the task list of approved work carried across turns, its progress, approvals, and completion.
4
- when_to_use: 'Explicit Goal (`goal` tool) requests, approved multi-turn work in progress (migrations, improvement passes); not single-turn tasks or recurring schedules.'
4
+ when_to_use: 'Goal requests or approved multi-turn work in progress; not one-turn tasks or recurring schedules.'
5
5
  dependencies:
6
6
  tools:
7
7
  - type: tool
@@ -52,7 +52,7 @@ Read this when choosing a `setup` mutation.
52
52
  | Permanently delete confirmed, unchanged, unused model files | `delete_local_model` |
53
53
  | TUI system shell | `set_system_shell` |
54
54
  | Automatic updates | `set_auto_update` |
55
- | Mixy's heartbeat: a regular check that wakes her only when something needs attention and only after the user had no operation for 30 minutes (no sent turn, no keyboard/mouse/wheel input in the desktop app's windows) (on by default; `status features` reports `heartbeat.enabled` and `heartbeat.intervalMinutes`) | `set_heartbeat_enabled` |
55
+ | Mixy's heartbeat: a regular check that wakes her only when something needs attention and only after the user had no operation for 30 minutes (no sent turn, no keyboard/mouse/wheel input in the desktop app's windows) (off by default; `status features` reports `heartbeat.enabled` and `heartbeat.intervalMinutes`) | `set_heartbeat_enabled` |
56
56
  | How often the heartbeat checks: `minutes` 30, 60 (default), 120 or 240; applies from the next tick, counted from the last check | `set_heartbeat_interval` |
57
57
  | Bots' emoji reactions on the user's messages (on by default; `status features` reports `reactions.enabled`) | `set_reactions_enabled` |
58
58
  | Worktree defaults: new tasks on the current branch or a new worktree, branch prefix, large-repository warning size, automatic cleanup | `set_worktree_settings` |
@@ -103,7 +103,7 @@ Read this when choosing a `setup` mutation.
103
103
  | Read a Project's connector switches | `read_project_connectors` |
104
104
  | An agent's action permission (block/ask per action kind) | `set_agent_permission` |
105
105
  | Switch a connector off for an agent / a Project (switching it back on is done in the desktop app) | `set_agent_connector`, `set_project_connector` |
106
- | One connector tool of an agent to needs_approval or disabled | `set_agent_connector_tool` |
106
+ | One connector tool of an agent to disabled, needs_approval or auto (a widening asks the user on an approval card) | `set_agent_connector_tool` |
107
107
  | Bring back an archived bot or agent (`definitionKind: "agent"`) | `restore_definition` |
108
108
  | Bot display order (Bots page, Sessions bot section; `status agents` `botOrder`) | `set_bot_order` |
109
109
 
@@ -344,10 +344,16 @@ markers are read with `status desktop`.
344
344
  `status mcp` afterwards. `add_mcp_server` with the service URL is not the
345
345
  sign-in flow; never use it for a catalog service.
346
346
  - Agent permissions and connector switches change only toward less: `block`
347
- or `ask`, a connector off, a tool to `needs_approval`/`disabled`. Anything
348
- that lets an agent do more without asking (`allow`, a connector back on, a
349
- tool to `auto`) is refused ("make it on the desktop"); `open agents` and let
350
- the person do it. Payments and permanent deletes always ask regardless.
347
+ or `ask`, a connector off, a tool to `disabled`. An action permission
348
+ `allow` or a connector back on is refused ("make it on the desktop");
349
+ `open agents` and let the person do it. One connector tool's widening
350
+ (`set_agent_connector_tool` from `disabled` to `needs_approval`/`auto`, or
351
+ `needs_approval` to `auto`) asks the user instead: the call waits on an
352
+ approval card (on the desktop or a paired phone) offering "needs approval",
353
+ "auto" or Deny, whatever level was asked; the result's `permission` and
354
+ `note` say what was applied. Only a press on that card decides it: never
355
+ treat a chat reply as approval, and ask again for each change. Payments and
356
+ permanent deletes always ask regardless.
351
357
  Connector ids are MCP server names from `read_agent_settings`; a bot's
352
358
  thread changes only its own bot.
353
359
  - `enable_plugin_mcp` turns every server the plugin declares back on and
@@ -134,8 +134,8 @@ The setup tool does not mutate:
134
134
  browser action confirmations (`MIXDOG_BROWSER_CONFIRM_ACTIONS`,
135
135
  `MIXDOG_BROWSER_CONFIRM_SUBMIT`; see the browser-use skill);
136
136
  - widening an agent's authority: action permission `allow`, a connector
137
- switched back on for an agent or Project, a connector tool to `auto`
138
- (setup only narrows them);
137
+ switched back on for an agent or Project (setup only narrows them; a
138
+ single connector tool's widening asks the user on an approval card);
139
139
  - the remote-access switch ("Use this PC from other devices") and this PC's
140
140
  name: turning it off from a phone would cut that phone off mid-session;
141
141
  - permanently deleting an archived bot (Sessions → Archived → delete);
@@ -106,6 +106,8 @@ done. Take the first open step, explain it in a sentence or two, ask, then act.
106
106
  provider. Give the reason in one line: a different model family catches what
107
107
  the main one misses. Suggest turning on the Maintainer with
108
108
  a cheap model at the lowest effort; it also decides turns in group rooms.
109
+ Offer Explore the same way, from its own picks: a cheap model that
110
+ searches code for the Lead in separate parallel sessions.
109
111
  A pick may carry `plans`: when the Lead provider's plan (`plan` in
110
112
  `status providers`) is listed there, recommend that model instead. A null or
111
113
  unlisted plan keeps the pick as is; never fail on an unknown plan.
@@ -152,8 +154,9 @@ step; do not insist.
152
154
  does part of a task. Users add their own on the Workflows page with the
153
155
  "에이전트 +" button. Bots are people-facing; agents work behind a task.
154
156
  - Default agents (기본 에이전트): built-in helpers listed on Workflows, such as
155
- Web Search (runs the web search tool) and the Maintainer (memory upkeep and
156
- session titles). They need a model route to work.
157
+ Web Search (runs the web search tool), the Maintainer (memory upkeep and
158
+ session titles) and Explore (code search for the Lead). They need a model
159
+ route to work.
157
160
  - Agent mode (에이전트 모드): a coding work session run by Lead and agents.
158
161
  A session a bot starts for a job is an agent task session (에이전트 작업
159
162
  세션); others are just sessions (세션).
@@ -328,6 +328,19 @@
328
328
  "source": "https://www.benchleader.com/best/llm-for-coding"
329
329
  }
330
330
  ]
331
+ },
332
+ {
333
+ "roles": ["Explore"],
334
+ "note": "Measured on Mixdog code searches: Haiku found the key locations; cheaper models tested missed about half on unseen questions. With no qualifying pick, leave Explore off.",
335
+ "picks": [
336
+ {
337
+ "provider": "Anthropic",
338
+ "model": "Claude Haiku 5.5",
339
+ "effort": "low",
340
+ "checkedAt": "2026-10-29",
341
+ "source": "https://benchlm.ai/anthropic/api-pricing"
342
+ }
343
+ ]
331
344
  }
332
345
  ]
333
346
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: skill-creator
3
- description: Create, audit, repair, or simplify a Mixdog Agent Skill and its SKILL.md.
3
+ description: Create, audit, repair, or simplify your Mixdog skills and their SKILL.md.
4
4
  when_to_use: 'Create, audit, repair, or edit skills, including activation failures; not ordinary feature work.'
5
5
  dependencies:
6
6
  tools:
@@ -12,195 +12,90 @@ dependencies:
12
12
 
13
13
  # Skill Creator
14
14
 
15
- Build a compact operating guide that makes recurring agent work more reliable.
16
- The result should encode useful decisions and recovery behavior, not narrate
17
- everything a capable model or a tool schema already knows.
15
+ Manages the skills a user keeps in Mixdog: turning a recurring workflow into a
16
+ skill, repairing one that misfires, and keeping the whole set small and tidy.
17
+ A skill earns its place by changing results — decisions, procedure, recovery
18
+ and a way to prove completion — not by narrating what the model or a tool
19
+ schema already knows.
18
20
 
19
- ## Select the right deliverable
21
+ ## Pick the deliverable
20
22
 
21
- Before writing files, classify the request:
22
-
23
- | Need | Best home |
23
+ | Need | Home |
24
24
  |---|---|
25
- | Reusable judgement or a repeatable procedure using existing tools | Skill |
26
- | Precise new runtime capability, authentication, streaming, or binary handling | Tool or product code |
27
- | Repository facts and contributor conventions | Project documentation |
28
- | A user-specific standing preference or constraint | Memory, with approval |
29
- | A single task unlikely to recur | Complete the task without a skill |
30
-
31
- Do not create a routing-only skill whose main job is listing other skills.
32
- Improve an existing owner when the requested capability already fits there.
33
-
34
- ## Choose scope before content
35
-
36
- - **Machine-global** — personal workflows useful across Projects.
37
- - **Plugin** — capability that ships with an independently installed extension.
38
- - **Built-in** — broadly useful Mixdog behavior with low context and dependency
39
- cost. Niche or heavy workflows do not belong here.
40
-
41
- Mixdog does not discover project-local `.mixdog/skills` directories. Read
42
- `references/design.md` before choosing placement or file structure.
43
-
44
- ## Creation loop
45
-
46
- ### 1. Recover the real workflow
47
-
48
- Use the conversation, successful tool calls, corrections, failure recovery, and
49
- produced artifacts as evidence. Ask only about gaps that would change the
50
- design.
51
-
52
- Capture:
53
-
54
- - one recurring outcome;
55
- - phrases and situations that should activate the skill;
56
- - nearby requests that another capability should own;
57
- - inputs, outputs, dependencies, side effects, and approvals;
58
- - completion evidence and important failure recovery.
59
-
60
- Completion criterion: another agent could identify when to use the skill and
61
- what successful completion looks like without guessing.
62
-
63
- ### 2. Check local constraints
64
-
65
- Inspect the target skill when modifying one. For a new skill, inspect only the
66
- runtime rules and nearest comparable skills needed to settle naming, placement,
67
- and integration.
68
-
69
- Treat system instructions and current tool schemas as higher authority than any
70
- skill. A skill may explain selection and workflow but must not redefine tool
71
- arguments or permission boundaries.
72
-
73
- Completion criterion: every proposed dependency and path exists in the target
74
- environment or is explicitly part of the implementation.
75
-
76
- ### 3. Review external candidates when useful
77
-
78
- Read `references/source-review.md` when the user asks to find, import, borrow
79
- from, or compare public skills.
80
-
81
- Extract requirements and design lessons rather than copying prose. If exact
82
- third-party content is genuinely needed, surface its license obligations before
83
- editing. Prefer a clean local implementation when a small compatible design can
84
- provide the same behavior.
85
-
86
- Completion criterion: the adopt, reimplement, or reject decision is supported
87
- by compatibility, maintenance, executable-content, and license evidence.
88
-
89
- ### 4. Draft the smallest complete skill
90
-
91
- Read the "Listing line" section of `references/design.md` before writing
92
- frontmatter; it owns the `description` and `when_to_use` budgets and wording.
93
- Write instructions and listing text in English, describing user intent
94
- across languages rather than listing translated keywords. Preserve exact
95
- literals and language-specific examples when needed.
96
-
97
- Write the body in the section order from `references/design.md`: intro,
98
- boundary or mode selection, prerequisites, procedure with an observable result
99
- per important step, pitfalls, verification, resource links. Body text never
100
- routes the skill. Put capabilities, tool usage, prerequisites, operating rules,
101
- and recovery details here, not in the trigger or UI description. Keep only
102
- selection conditions in the trigger; the body must stand on its own when loaded.
103
-
104
- Move conditional detail into directly referenced files. Add scripts only for
105
- deterministic work that would otherwise be rebuilt on repeated invocations.
106
-
107
- Completion criterion: the listing line fits its budget with the trigger
108
- intact, and removing any remaining body section would lose judgement,
109
- execution, recovery, or verification value.
110
-
111
- ### 5. Validate structure
112
-
113
- Run:
114
-
115
- ```text
116
- node "${MIXDOG_SKILL_DIR}/scripts/validate-skill.mjs" "<skill-directory>"
117
- ```
118
-
119
- Then run checks required by the target repository. The validator catches
120
- portable structure, code-fence, and path problems and warns when the listing line exceeds
121
- its budget; the runtime parser remains authoritative for loading behavior.
122
-
123
- Completion criterion: validation passes, warnings are reviewed at their
124
- reported severity, resources resolve, and the folder name matches the manifest.
125
-
126
- ### 6. Exercise behavior
127
-
128
- Read `references/evaluation.md`. Test realistic requests, including an implicit
129
- positive case, an edge case, and a close negative case. For a modified skill,
130
- preserve the prior version before editing and compare the same scenarios.
131
-
132
- Judge generated artifacts by observable outcomes. Use deterministic assertions
133
- for mechanical properties and user review for subjective quality.
134
-
135
- Completion criterion: required scenarios pass without task-specific harness
136
- hints, and failures have either been fixed or clearly reported.
137
-
138
- ### 7. Tighten
139
-
140
- Remove duplicated rules, generic advice, stale examples, and branches that did
141
- not affect evaluation. When adding a corrected rule, replace the obsolete rule
142
- instead of accumulating exceptions.
143
-
144
- Completion criterion: the final skill is smaller or clearer than the draft
145
- without losing proven behavior.
146
-
147
- ## Updating an existing skill
148
-
149
- - Keep its name and scope unless the user requests a change.
150
- - Diagnose whether the defect is routing, instructions, resources, integration,
151
- or the underlying tool before editing.
152
- - Preserve warnings, resource bounds, user approvals, and recovery paths.
153
- - Read only references implicated by the defect.
154
- - Re-run checks affected by the edit; do not repeat checks already closed by
155
- unchanged evidence.
156
-
157
- ## Auditing the skill set
158
-
159
- When asked to audit, review, or tidy skills rather than fix one defect:
160
-
161
- 1. List every skill directory in scope: machine-global
162
- (`<mixdog-data>/skills`), enabled plugin skills, and built-ins
163
- (`src/defaults/skills` in the Mixdog repository).
164
- 2. Run `scripts/validate-skill.mjs` on each directory and collect the errors
165
- and warnings; they cover the listing line, code fences, and resource paths
166
- mechanically.
167
- 3. Read each trigger and body against the audit checklist in
168
- `references/design.md`: trigger content, section order, completion
169
- results, duplication, and stale instructions.
170
- 4. Report findings as one table (skill, check, current value, proposed fix)
171
- before editing. Edit only after the user approves the scope.
172
- 5. Re-run the validator on every edited directory.
173
-
174
- Completion criterion: every skill in scope validates; report unresolved
175
- findings with reasons, without promoting warnings to failures.
176
-
177
- ## Mixdog loading facts
178
-
179
- - Discovery precedence is machine-global, enabled plugin, then built-in.
180
- - The directory name must equal frontmatter `name`.
181
- - The model sees one listing line per skill (`references/design.md`
182
- "Listing line" owns its form and budget); UI descriptions are not
183
- injected, and the body loads once through `Skill`.
184
- - `${MIXDOG_SKILL_DIR}` resolves to the active skill directory.
185
- - `metadata.requires` names a mandatory Mixdog built-in feature. Add it only
186
- when the skill cannot function without that feature.
187
- - Optional frontmatter has no effect unless the current runtime implements it.
188
- - `dependencies.tools` declares tools loaded with the skill, without granting
189
- permissions. Use `type: tool` with the exact tool name or `type: mcp` with
190
- an existing server name. Keep optional tools out; `allowed-tools` is not
191
- interpreted as dependencies. Imported `agents/openai.yaml` dependencies
192
- are also read, but never authorize installation or activation.
193
-
194
- ## Final review
195
-
196
- - Is this genuinely a reusable skill rather than another deliverable?
197
- - Does the trigger say only when to load the skill, strongest situation first?
198
- - Does every major step end in evidence, not “be careful”?
199
- - Are platform assumptions, external programs, network access, and secrets
200
- visible?
201
- - Are pitfalls based on plausible or observed failures?
202
- - Can subjective outputs reach the user for review?
203
- - Are temporary evaluation files excluded from the shipped skill?
204
- - Were commit, publish, install, deployment, and restart left to explicit user
205
- requests?
206
-
25
+ | Reusable judgement or a repeatable procedure with existing tools | Skill |
26
+ | A new runtime capability, authentication, streaming, binary handling | Tool or product code |
27
+ | Facts and conventions of one repository | That repository's docs |
28
+ | A standing personal preference or constraint | Memory, with approval |
29
+ | A one-off task | Do the task; no skill |
30
+
31
+ Never create a skill whose job is to list other skills. When an existing skill
32
+ already owns the outcome, extend it instead.
33
+
34
+ ## Where skills live
35
+
36
+ - The user's skills: `<mixdog-data>/skills/<name>/SKILL.md`, available in
37
+ every project.
38
+ - Enabled plugins and Mixdog's built-ins are read in place. A user skill with
39
+ the same name replaces them and stops following their updates, so pick a new
40
+ name unless replacing is the point.
41
+ - The folder name equals the frontmatter `name`.
42
+
43
+ ## Create a skill
44
+
45
+ 1. **Recover the workflow.** From the conversation, successful tool calls,
46
+ corrections and produced artifacts, capture the one recurring outcome; the
47
+ requests that should select the skill and the nearby requests another skill
48
+ or tool owns; inputs, side effects and approvals; completion evidence and
49
+ recovery. Ask only about gaps that change the design. Result: another agent
50
+ could tell when to use it and what done looks like.
51
+ 2. **Draft** with `references/design.md`: the listing line first, then the
52
+ body in its section order; detail that loads only in some cases goes to
53
+ `references/`, deterministic repeated work to `scripts/`. Every tool, path
54
+ and dependency it names exists. Result: the trigger fits its budget, and
55
+ removing any section would lose judgement, execution, recovery or
56
+ verification.
57
+ 3. **Validate:**
58
+ `node "${MIXDOG_SKILL_DIR}/scripts/validate-skill.mjs" "<skill-directory>"`.
59
+ Result: no errors; each warning fixed or kept on purpose.
60
+ 4. **Exercise** with `references/evaluation.md`: realistic requests, including
61
+ an implicit positive and a near-miss negative. Result: the scenarios pass
62
+ without hints, or the failures are reported.
63
+ 5. **Tighten:** delete duplicated rules, generic advice, stale examples and
64
+ rules no scenario needed; replace an obsolete rule instead of adding an
65
+ exception. Result: smaller or clearer, with the same proven behaviour.
66
+
67
+ ## Repair or update a skill
68
+
69
+ - Keep its name and scope unless the user asks otherwise.
70
+ - Classify the defect first (`references/evaluation.md`) and edit the part
71
+ that owns it: a trigger that never selects the skill is not fixed in the
72
+ body, and more prose does not fix a broken tool.
73
+ - Keep a copy of the prior version and rerun the same scenarios against both.
74
+ - Keep its approvals, bounds, warnings and recovery paths.
75
+ - Rerun only the checks the edit affects.
76
+
77
+ ## Audit the set
78
+
79
+ When asked to review or tidy skills rather than fix one:
80
+
81
+ 1. List the skills in scope: the user's (`<mixdog-data>/skills`), enabled
82
+ plugins, built-ins.
83
+ 2. Run the validator on each and collect its errors and warnings.
84
+ 3. Read each against the audit checklist in `references/design.md` and give a
85
+ verdict: **Keep**; **Improve** (name the defect); **Merge** into another
86
+ (name it); **Retire** (name what covers the need instead).
87
+ 4. Report one table — skill, verdict, finding, proposed fix — and edit only
88
+ what the user approves. Plugin and built-in skills are never edited in
89
+ place.
90
+ 5. Rerun the validator on every edited skill.
91
+
92
+ Result: every edited skill validates; unresolved findings are reported with
93
+ their reason.
94
+
95
+ ## Resources
96
+
97
+ - `references/design.md` — read before drafting or auditing: ownership,
98
+ frontmatter, listing line, body, resources, audit checklist.
99
+ - `references/evaluation.md` — read when exercising a skill or diagnosing a
100
+ failure.
101
+ - `scripts/validate-skill.mjs` — run on every created or edited skill.