mixdog 1.0.11 → 1.1.0

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 (471) hide show
  1. package/NOTICE.md +20 -0
  2. package/README.md +75 -181
  3. package/package.json +9 -4
  4. package/scripts/build-shipped-history.mjs +131 -0
  5. package/scripts/check-changelog-locales.mjs +203 -0
  6. package/scripts/computer-task-cost-report.mjs +0 -4
  7. package/scripts/lib/run-node-tests.mjs +235 -13
  8. package/scripts/lib/test-failure-records.mjs +5 -0
  9. package/scripts/lib/test-failure-summary.mjs +9 -3
  10. package/scripts/lib/test-spawn-ledger.mjs +19 -0
  11. package/scripts/prune-embedding-runtime.mjs +9 -5
  12. package/scripts/sync-client-version-floors.mjs +100 -0
  13. package/scripts/test-direct.mjs +16 -1
  14. package/src/agents/advisor/AGENT.md +38 -0
  15. package/src/agents/advisor/agent.json +6 -0
  16. package/src/agents/reviewer/AGENT.md +5 -2
  17. package/src/agents/reviewer/agent.json +1 -1
  18. package/src/defaults/shipped-history.json +381 -0
  19. package/src/defaults/skills/docx/SKILL.md +7 -5
  20. package/src/defaults/skills/docx/references/html.md +9 -8
  21. package/src/defaults/skills/docx/references/native-authoring.md +28 -18
  22. package/src/defaults/skills/goal-management/SKILL.md +11 -5
  23. package/src/defaults/skills/local-provider/SKILL.md +2 -1
  24. package/src/defaults/skills/pdf/SKILL.md +9 -6
  25. package/src/defaults/skills/pdf/references/html.md +17 -12
  26. package/src/defaults/skills/pptx/SKILL.md +8 -6
  27. package/src/defaults/skills/pptx/references/composition.md +4 -4
  28. package/src/defaults/skills/pptx/references/concepts.md +168 -0
  29. package/src/defaults/skills/pptx/references/direction.md +5 -4
  30. package/src/defaults/skills/pptx/references/html.md +6 -29
  31. package/src/defaults/skills/pptx/references/kit-index.md +11 -3
  32. package/src/defaults/skills/pptx/references/kit.md +27 -5
  33. package/src/defaults/skills/pptx/references/review.md +6 -5
  34. package/src/defaults/skills/setup/SKILL.md +5 -8
  35. package/src/defaults/skills/setup/references/actions.md +61 -31
  36. package/src/defaults/skills/setup/references/surfaces.md +12 -10
  37. package/src/defaults/skills/xlsx/SKILL.md +8 -6
  38. package/src/defaults/skills/xlsx/references/html.md +8 -4
  39. package/src/defaults/skills/xlsx/references/model-conventions.md +2 -0
  40. package/src/defaults/skills/xlsx/references/report-design.md +32 -16
  41. package/src/help.mjs +1 -1
  42. package/src/lib/rules-builder.cjs +1 -1
  43. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +3 -1
  44. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +4 -0
  45. package/src/runtime/agent/orchestrator/config-presets.d.mts +1 -0
  46. package/src/runtime/agent/orchestrator/config-presets.mjs +44 -0
  47. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +9 -1
  48. package/src/runtime/agent/orchestrator/config.mjs +102 -21
  49. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +3 -2
  50. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +90 -26
  51. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +44 -14
  52. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +4 -4
  53. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +5 -3
  54. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +79 -8
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +29 -4
  56. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +3 -0
  57. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +10 -1
  58. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +11 -2
  59. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +9 -5
  60. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +9 -1
  61. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +2 -0
  62. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -22
  63. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -0
  64. package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +28 -10
  65. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +14 -72
  66. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +19 -3
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +20 -10
  68. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-sink.mjs +36 -9
  69. package/src/runtime/agent/orchestrator/providers/cursor.mjs +11 -17
  70. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +388 -0
  71. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +92 -109
  72. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +107 -0
  73. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +138 -30
  74. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +32 -15
  75. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +2 -0
  76. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +39 -5
  77. package/src/runtime/agent/orchestrator/providers/gemini.mjs +9 -2
  78. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +3 -2
  79. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +6 -1
  80. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +10 -1
  81. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +3 -2
  82. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +5 -1
  83. package/src/runtime/agent/orchestrator/providers/lib/note-error-usage.mjs +7 -0
  84. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +57 -0
  85. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +12 -5
  86. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +20 -15
  87. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +14 -9
  88. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +56 -11
  89. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +2 -1
  90. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +28 -1
  91. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +27 -3
  92. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +7 -5
  93. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +12 -0
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +23 -8
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +26 -6
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +7 -1
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +34 -15
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -2
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +12 -2
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +0 -6
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +0 -19
  102. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +12 -43
  103. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +6 -0
  104. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +39 -9
  105. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +31 -9
  106. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +13 -38
  107. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +5 -2
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +40 -9
  109. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +7 -39
  110. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +28 -101
  111. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +8 -4
  112. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +3 -6
  113. package/src/runtime/agent/orchestrator/providers/openai-service-tier.mjs +19 -0
  114. package/src/runtime/agent/orchestrator/providers/openai-startup-prewarm.mjs +5 -195
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +9 -18
  116. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +4 -66
  117. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +11 -5
  118. package/src/runtime/agent/orchestrator/providers/openai-ws-send/acquire-attempt.mjs +3 -15
  119. package/src/runtime/agent/orchestrator/providers/openai-ws-send/attempt-request.mjs +6 -56
  120. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +1 -19
  121. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +2 -2
  122. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +2 -1
  123. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +3 -0
  124. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure-stamps.mjs +0 -1
  125. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +3 -1
  126. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts.mjs +3 -5
  127. package/src/runtime/agent/orchestrator/providers/openai-ws-send-outcome.mjs +10 -89
  128. package/src/runtime/agent/orchestrator/providers/openai-ws-send-span.mjs +1 -1
  129. package/src/runtime/agent/orchestrator/providers/openai-ws-send-trace.mjs +0 -6
  130. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +34 -11
  131. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +0 -1
  132. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +3 -7
  133. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +44 -19
  134. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +40 -12
  135. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +70 -0
  136. package/src/runtime/agent/orchestrator/providers/registry.mjs +38 -3
  137. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +4 -0
  138. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +1 -0
  139. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +2 -0
  140. package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +11 -0
  141. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +31 -41
  142. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +5 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +0 -17
  144. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +0 -3
  145. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +0 -1
  146. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +1 -1
  148. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -2
  149. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +18 -4
  150. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +8 -1
  151. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +7 -1
  152. package/src/runtime/agent/orchestrator/runtime-core/session-route-policy.mjs +16 -0
  153. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +2 -0
  154. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -2
  155. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +7 -7
  156. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +6 -0
  157. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +45 -2
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +5 -3
  159. package/src/runtime/agent/orchestrator/session/eager-dispatch/entry.mjs +5 -0
  160. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +6 -13
  161. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +6 -2
  162. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +114 -0
  163. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +2 -0
  164. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +5 -9
  165. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +51 -18
  166. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +7 -4
  167. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -1
  168. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +0 -2
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +6 -9
  170. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +63 -3
  171. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +10 -28
  172. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +4 -4
  173. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +13 -0
  174. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +10 -19
  175. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +7 -1
  176. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +1 -0
  177. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +1 -3
  178. package/src/runtime/agent/orchestrator/stall-policy.mjs +0 -1
  179. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +18 -8
  180. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +19 -20
  181. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +6 -11
  182. package/src/runtime/agent/orchestrator/tools/builtin/file-version-test-helpers.mjs +11 -0
  183. package/src/runtime/agent/orchestrator/tools/builtin/file-version.mjs +13 -0
  184. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-single-file-rescue.mjs +8 -5
  185. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +25 -12
  186. package/src/runtime/agent/orchestrator/tools/builtin/raw-content-publication.mjs +17 -0
  187. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +136 -76
  188. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +15 -17
  189. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +4 -2
  190. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +11 -10
  191. package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +5 -3
  192. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +30 -16
  193. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +2 -2
  194. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +4 -11
  195. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +7 -3
  196. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-validation.mjs +16 -19
  197. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  198. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background.mjs +4 -1
  199. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +14 -4
  200. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +58 -8
  201. package/src/runtime/agent/orchestrator/tools/patch/content-guard.mjs +47 -0
  202. package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +155 -0
  203. package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-proofs.mjs +6 -2
  204. package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-snapshots.mjs +6 -2
  205. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +19 -16
  206. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +13 -44
  207. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +2 -2
  208. package/src/runtime/agent/orchestrator/tools/patch/post-patch-excerpts.mjs +5 -2
  209. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +47 -7
  210. package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +72 -8
  211. package/src/runtime/agent/orchestrator/tools/patch/section-coalesce.mjs +3 -2
  212. package/src/runtime/agent/orchestrator/tools/patch/sequence/run.mjs +9 -1
  213. package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +9 -1
  214. package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +6 -6
  215. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +16 -4
  216. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +35 -14
  217. package/src/runtime/agent/orchestrator/tools/patch/wave.mjs +42 -4
  218. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +2 -0
  219. package/src/runtime/agent/orchestrator/tools/shell-codepage.mjs +296 -0
  220. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +75 -24
  221. package/src/runtime/browser-bridge/tool-defs.mjs +1 -0
  222. package/src/runtime/channels/lib/config.mjs +3 -8
  223. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +7 -3
  224. package/src/{tui → runtime/channels}/lib/voice-setup.mjs +38 -22
  225. package/src/runtime/channels/lib/webhook/request-handler.mjs +42 -8
  226. package/src/runtime/computer-bridge/actions.mjs +2 -0
  227. package/src/runtime/effort-judge/judge-client.mjs +125 -25
  228. package/src/runtime/effort-judge/judge-input.mjs +96 -0
  229. package/src/runtime/effort-judge/judge-worker.mjs +52 -20
  230. package/src/runtime/effort-judge/model-install.mjs +74 -0
  231. package/src/runtime/effort-judge/model-manifest.json +21 -0
  232. package/src/runtime/effort-judge/previous-human-request.mjs +162 -0
  233. package/src/runtime/effort-judge/verified-context-input.mjs +10 -0
  234. package/src/runtime/github/tool.mjs +214 -14
  235. package/src/runtime/local-provider/context-settings.mjs +15 -6
  236. package/src/runtime/local-provider/gguf-header.mjs +13 -5
  237. package/src/runtime/local-provider/hugging-face.mjs +27 -5
  238. package/src/runtime/local-provider/install-progress.mjs +7 -0
  239. package/src/runtime/local-provider/managed-runtime.mjs +2 -1
  240. package/src/runtime/local-provider/model-maintenance.mjs +15 -6
  241. package/src/runtime/local-provider/resumable-installations.mjs +40 -1
  242. package/src/runtime/local-provider/server.mjs +2 -0
  243. package/src/runtime/memory/lib/embedding-provider.mjs +12 -0
  244. package/src/runtime/memory/lib/http-router/session-routes.mjs +2 -1
  245. package/src/runtime/memory/lib/memory-config-flags.mjs +3 -2
  246. package/src/runtime/memory/lib/memory-embed.mjs +5 -0
  247. package/src/runtime/memory/lib/pg/process.mjs +57 -5
  248. package/src/runtime/office/README.md +13 -7
  249. package/src/runtime/office/authoring/docx-html-build.mjs +4 -4
  250. package/src/runtime/office/authoring/docx-html-measure.mjs +60 -0
  251. package/src/runtime/office/authoring/pdf-author-action.mjs +6 -1
  252. package/src/runtime/office/authoring/pptx-brief.mjs +40 -1
  253. package/src/runtime/office/authoring/pptx-html-build.mjs +1 -1
  254. package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
  255. package/src/runtime/office/bench/deck-bench.mjs +1 -1
  256. package/src/runtime/office/com/office-com-host.ps1 +8 -0
  257. package/src/runtime/office/core/office-actions-render.mjs +2 -0
  258. package/src/runtime/office/design/design-art-direction.mjs +10 -2
  259. package/src/runtime/office/design/design-discipline.mjs +4 -5
  260. package/src/runtime/office/design/design-tokens.mjs +20 -1
  261. package/src/runtime/office/design/docx/design-docx/front-matter.mjs +7 -4
  262. package/src/runtime/office/design/docx/design-docx/section.mjs +3 -1
  263. package/src/runtime/office/design/docx/design-docx/writer.mjs +1 -0
  264. package/src/runtime/office/design/docx/design-docx-components.mjs +19 -15
  265. package/src/runtime/office/design/docx/design-docx.mjs +5 -6
  266. package/src/runtime/office/design/docx/document-typography.mjs +20 -6
  267. package/src/runtime/office/design/xlsx/design-xlsx.mjs +9 -2
  268. package/src/runtime/office/pdf/document-preview.mjs +133 -12
  269. package/src/runtime/office/pdf/pdf-writer.mjs +56 -22
  270. package/src/runtime/office/portable/portable-snapshot-docx.mjs +46 -3
  271. package/src/runtime/office/portable/portable-snapshot-shared.mjs +27 -1
  272. package/src/runtime/office/quality/assurance-rendered.mjs +21 -5
  273. package/src/runtime/office/quality/assurance-structure-docx.mjs +41 -9
  274. package/src/runtime/office/quality/design-aesthetics.mjs +4 -2
  275. package/src/runtime/office/quality/design-deck-diversity.mjs +15 -3
  276. package/src/runtime/office/quality/design-review.mjs +13 -5
  277. package/src/runtime/office/quality/document-brief.mjs +8 -2
  278. package/src/runtime/office/quality/forced-break-pages.mjs +203 -0
  279. package/src/runtime/office/quality/pptx-deck-rubric.mjs +21 -3
  280. package/src/runtime/office/quality/quality-pipeline.mjs +14 -17
  281. package/src/runtime/session-search/session-search-db.mjs +183 -0
  282. package/src/runtime/session-search/session-search-ingest.mjs +106 -0
  283. package/src/runtime/shared/agent-route-config.mjs +50 -2
  284. package/src/runtime/shared/bounded-file-read.mjs +166 -0
  285. package/src/runtime/shared/builtin-grandfathering.mjs +37 -0
  286. package/src/runtime/shared/config.mjs +24 -4
  287. package/src/runtime/shared/defaults-separation.mjs +263 -0
  288. package/src/runtime/shared/error-presentation.mjs +8 -1
  289. package/src/runtime/shared/llm/anthropic-effort.mjs +4 -0
  290. package/src/runtime/shared/llm/cost.mjs +4 -2
  291. package/src/runtime/shared/llm/model-catalog-projection.mjs +1 -1
  292. package/src/runtime/shared/llm/model-catalog.mjs +25 -0
  293. package/src/runtime/shared/llm/reasoning-usage.mjs +1 -2
  294. package/src/runtime/shared/llm/usage-accounting.mjs +14 -4
  295. package/src/runtime/shared/llm/usage-context.mjs +11 -1
  296. package/src/runtime/shared/llm/usage-ledger-repair.mjs +3 -1
  297. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +105 -1
  298. package/src/runtime/shared/llm/usage-ledger-worker.mjs +2 -1
  299. package/src/runtime/shared/llm/usage-ledger.mjs +72 -5
  300. package/src/runtime/shared/onnx-runtime-support.mjs +6 -0
  301. package/src/runtime/shared/orchestration.mjs +14 -6
  302. package/src/runtime/shared/pristine-execution-contract.json +7 -2
  303. package/src/runtime/shared/projects.mjs +65 -48
  304. package/src/runtime/shared/provider-accounts.mjs +47 -6
  305. package/src/runtime/shared/quota-resume-store.mjs +255 -0
  306. package/src/runtime/shared/shipped-definitions.mjs +275 -0
  307. package/src/runtime/shared/tool-card-model/agent-surface.mjs +30 -9
  308. package/src/runtime/shared/tool-card-model/aggregate-card.mjs +7 -3
  309. package/src/runtime/shared/tool-card-model/background-task.mjs +17 -1
  310. package/src/runtime/shared/tool-card-model/card-detail.mjs +10 -4
  311. package/src/runtime/shared/tool-card-model/card-header.mjs +10 -4
  312. package/src/runtime/shared/tool-card-model/card-status.mjs +22 -5
  313. package/src/runtime/shared/tool-card-model/displayed-result.mjs +6 -1
  314. package/src/runtime/shared/tool-card-model/media-result.mjs +53 -0
  315. package/src/runtime/shared/tool-card-model/terminal-status.mjs +17 -1
  316. package/src/runtime/shared/tool-card-model.golden-cases.mjs +1 -1
  317. package/src/runtime/shared/tool-card-model.golden.json +75 -66
  318. package/src/runtime/shared/tool-card-model.mjs +1 -0
  319. package/src/runtime/shared/tool-output-limit.mjs +3 -0
  320. package/src/runtime/shared/tool-primitives.mjs +24 -18
  321. package/src/runtime/shared/tool-result-summary.mjs +128 -17
  322. package/src/runtime/shared/tool-status.mjs +20 -7
  323. package/src/runtime/shared/tool-surface.mjs +105 -28
  324. package/src/runtime/shared/tool-work-units.mjs +221 -18
  325. package/src/runtime/shared/transcript-metadata.mjs +2 -0
  326. package/src/runtime/shared/turn-review-reply.mjs +2 -0
  327. package/src/runtime/shared/turn-snapshot.mjs +65 -6
  328. package/src/runtime/shared/turn-worktree-snapshot.mjs +202 -22
  329. package/src/runtime/shared/worker-requests.mjs +14 -2
  330. package/src/runtime/terminal-bridge/client.mjs +311 -0
  331. package/src/runtime/terminal-bridge/tool-defs.mjs +36 -0
  332. package/src/runtime/web-search/lib/ssrf-guard.mjs +12 -56
  333. package/src/runtime/web-search/tool-defs.mjs +2 -0
  334. package/src/session-runtime/boot/apis.mjs +30 -5
  335. package/src/session-runtime/boot/config.mjs +4 -0
  336. package/src/session-runtime/boot/facade.mjs +4 -1
  337. package/src/session-runtime/boot/infrastructure.mjs +21 -2
  338. package/src/session-runtime/boot/session.mjs +5 -5
  339. package/src/session-runtime/boot/tools.mjs +2 -0
  340. package/src/session-runtime/builtin-features.d.mts +1 -0
  341. package/src/session-runtime/channel-config-api.mjs +5 -0
  342. package/src/session-runtime/config-lifecycle/config-writers.mjs +3 -0
  343. package/src/session-runtime/config-lifecycle.mjs +31 -6
  344. package/src/session-runtime/goal-facade-api.mjs +4 -0
  345. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +15 -3
  346. package/src/session-runtime/lifecycle/inheritance.mjs +28 -6
  347. package/src/session-runtime/lifecycle/session-switch/context-switch.mjs +3 -0
  348. package/src/session-runtime/lifecycle/session-switch/resume.mjs +7 -1
  349. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +9 -0
  350. package/src/session-runtime/lifecycle/teardown/session-close.mjs +14 -2
  351. package/src/session-runtime/lifecycle/teardown.mjs +5 -0
  352. package/src/session-runtime/local-provider-settings.mjs +10 -0
  353. package/src/session-runtime/media-api.mjs +32 -22
  354. package/src/session-runtime/model-recency.mjs +14 -0
  355. package/src/session-runtime/model-route/route-persist.mjs +17 -2
  356. package/src/session-runtime/model-route/route-tuning.mjs +16 -5
  357. package/src/session-runtime/model-route/set-route.mjs +55 -22
  358. package/src/session-runtime/model-route/web-search-route.mjs +2 -2
  359. package/src/session-runtime/model-route-api.mjs +2 -1
  360. package/src/session-runtime/notification-bus.mjs +31 -6
  361. package/src/session-runtime/provider-auth/login.mjs +6 -0
  362. package/src/session-runtime/provider-models/catalog-load.mjs +3 -1
  363. package/src/session-runtime/provider-models/row-hydration.mjs +36 -10
  364. package/src/session-runtime/quick-model-rows/model-meta.mjs +26 -0
  365. package/src/session-runtime/quick-model-rows/provider-rows.mjs +40 -14
  366. package/src/session-runtime/resource-api.mjs +8 -1
  367. package/src/session-runtime/route-state.mjs +9 -0
  368. package/src/session-runtime/runtime-core.mjs +4 -0
  369. package/src/session-runtime/runtime-facade.mjs +20 -1
  370. package/src/session-runtime/runtime-feature-gates.mjs +2 -0
  371. package/src/session-runtime/runtime-review-api.mjs +12 -1
  372. package/src/session-runtime/services/agent-tool/helpers.mjs +14 -1
  373. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +10 -15
  374. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +6 -1
  375. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +20 -2
  376. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +14 -6
  377. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +2 -0
  378. package/src/session-runtime/services/agent-tool/tag-registry.mjs +12 -1
  379. package/src/session-runtime/services/agent-tool/worker-index.mjs +17 -1
  380. package/src/session-runtime/services/agent-tool.mjs +1 -0
  381. package/src/session-runtime/services/channel-admin.mjs +87 -13
  382. package/src/session-runtime/services/provider-admin.mjs +306 -66
  383. package/src/session-runtime/services/seeds.mjs +73 -142
  384. package/src/session-runtime/services/usage-dashboard-model.mjs +29 -0
  385. package/src/session-runtime/services/usage-dashboard.mjs +7 -0
  386. package/src/session-runtime/session-address.mjs +125 -0
  387. package/src/session-runtime/session-create.mjs +57 -2
  388. package/src/session-runtime/settings-api.mjs +1 -0
  389. package/src/session-runtime/settings-builtin-tools-api.mjs +15 -10
  390. package/src/session-runtime/settings-compaction-api.mjs +13 -0
  391. package/src/session-runtime/setup-tool/executor.mjs +93 -40
  392. package/src/session-runtime/setup-tool/extended-actions.mjs +64 -5
  393. package/src/session-runtime/setup-tool/settings-contract.mjs +46 -3
  394. package/src/session-runtime/setup-tool/tool-defs.mjs +14 -6
  395. package/src/session-runtime/tool-surface.mjs +16 -9
  396. package/src/session-runtime/turn/session-ops.mjs +3 -0
  397. package/src/session-runtime/turn/share-ops.mjs +4 -1
  398. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +6 -0
  399. package/src/session-runtime/usage-stats-api.mjs +43 -3
  400. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +31 -5
  401. package/src/session-runtime/workflow-agents-api/agent-route.mjs +6 -2
  402. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +27 -7
  403. package/src/standalone/daemon-boot-coordinator.mjs +10 -0
  404. package/src/standalone/daemon-desktop-runtime.mjs +1 -0
  405. package/src/standalone/daemon-drain-policy.mjs +9 -0
  406. package/src/standalone/daemon-stored-session-views.mjs +7 -8
  407. package/src/standalone/daemon.mjs +36 -8
  408. package/src/standalone/local-session-runtime.mjs +11 -0
  409. package/src/standalone/session-client.mjs +52 -7
  410. package/src/standalone/session-protocol.mjs +9 -0
  411. package/src/standalone/session-service/agent-tree/agent-child.mjs +2 -0
  412. package/src/standalone/session-service/entries/lifecycle.mjs +2 -0
  413. package/src/standalone/session-service/entries/session-loads.mjs +9 -0
  414. package/src/standalone/session-service/projection/revisions.mjs +28 -4
  415. package/src/standalone/session-service/projection.mjs +1 -0
  416. package/src/standalone/session-service/quota-resume.mjs +140 -0
  417. package/src/standalone/session-service/session-calls/session-action.mjs +2 -2
  418. package/src/standalone/session-service/session-calls.mjs +10 -2
  419. package/src/standalone/session-service/stored-reader.mjs +26 -1
  420. package/src/standalone/session-service.mjs +21 -0
  421. package/src/standalone/session-transport/routes.mjs +2 -0
  422. package/src/tui/app/doctor.mjs +7 -11
  423. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +3 -5
  424. package/src/tui/app/model-picker/model-footer.mjs +2 -2
  425. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +21 -2
  426. package/src/tui/app/model-picker/route-selection.mjs +6 -1
  427. package/src/tui/app/settings-picker/settings-rows.mjs +4 -6
  428. package/src/tui/app/settings-picker/settings-toggles/store-toggles.mjs +1 -1
  429. package/src/tui/app/slash-commands.mjs +1 -1
  430. package/src/tui/app/slash-dispatch/route-commands.mjs +5 -3
  431. package/src/tui/app/transcript-row-estimate.mjs +17 -5
  432. package/src/tui/components/ContextPanel.jsx +5 -1
  433. package/src/tui/components/Spinner.jsx +34 -319
  434. package/src/tui/components/SpinnerByline.jsx +256 -0
  435. package/src/tui/components/tool-execution/aggregate-card.jsx +4 -2
  436. package/src/tui/components/tool-execution/text-format.mjs +1 -0
  437. package/src/tui/components/use-spinner-progress.mjs +113 -0
  438. package/src/tui/dist/index.mjs +15896 -14452
  439. package/src/tui/session/agent-job-feed/execution-delivery.mjs +13 -1
  440. package/src/tui/session/agent-job-feed/notification-router.mjs +3 -0
  441. package/src/tui/session/agent-job-feed/pending-resume.mjs +14 -1
  442. package/src/tui/session/agent-job-feed.mjs +4 -0
  443. package/src/tui/session/context-state.mjs +13 -1
  444. package/src/tui/session/initial-state.mjs +6 -0
  445. package/src/tui/session/quota-resume.mjs +263 -0
  446. package/src/tui/session/session-api/intake/abort.mjs +39 -35
  447. package/src/tui/session/session-api/intake/submission.mjs +13 -21
  448. package/src/tui/session/session-api/intake.mjs +3 -3
  449. package/src/tui/session/session-api/integrations.mjs +5 -1
  450. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  451. package/src/tui/session/session-api/lifecycle/inheritance.mjs +2 -2
  452. package/src/tui/session/session-api/lifecycle/session-reset.mjs +4 -0
  453. package/src/tui/session/session-api/lifecycle.mjs +71 -2
  454. package/src/tui/session/session-api/media.mjs +2 -2
  455. package/src/tui/session/session-api/quota-resume.mjs +21 -0
  456. package/src/tui/session/session-api/routes.mjs +5 -2
  457. package/src/tui/session/session-api/settings.mjs +2 -0
  458. package/src/tui/session/session-api.mjs +2 -0
  459. package/src/tui/session/session-flow/auto-clear.mjs +14 -6
  460. package/src/tui/session/session-flow/drain.mjs +52 -5
  461. package/src/tui/session/session-flow/queue/take-entries.mjs +9 -4
  462. package/src/tui/session/session-flow/queue.mjs +4 -0
  463. package/src/tui/session/session-flow/steering.mjs +11 -0
  464. package/src/tui/session/session-flow.mjs +1 -0
  465. package/src/tui/session/tool-approval.mjs +7 -2
  466. package/src/tui/session/transcript-intake.mjs +1 -0
  467. package/src/tui/session/turn-tool-cards.mjs +4 -6
  468. package/src/tui/session/turn.mjs +40 -4
  469. package/src/vendor/statusline/bin/statusline-route.mjs +3 -2
  470. package/src/vendor/statusline/src/gateway/route-meta.mjs +1 -1
  471. package/src/runtime/agent/orchestrator/providers/openai-ws-warmup.mjs +0 -165
@@ -1,13 +1,13 @@
1
1
  # HTML route (Word)
2
2
 
3
- Owns the default route for a new Word document: the model designs the document in HTML and CSS and passes it as `author`'s `script`; a local Chrome or Edge lays it out at the printable width of its `@page` sheet; the runtime reads what the browser drew — each block's computed type, spacing, fills, rules, and widths — and writes native Word: paragraphs and runs, Heading styles, Word lists, tables on the grid the browser drew, pictures. The file stays editable in Word (no text boxes, no screenshots of text). The approach is dom-docx's (computed styles from Chromium; a flex row as a borderless table; a box as a one-cell table), set on Mixdog's own writer so Korean type, the audit, the brief, and the review apply unchanged.
3
+ The default route for a new designed Word document: the model writes HTML/CSS for the content, without selecting a preset, and passes it as `author`'s `script`. A local Chrome or Edge lays it out at the printable width of its `@page` sheet. The runtime maps computed type, spacing, fills, rules, and widths to native Word paragraphs, runs, headings, lists, tables, and pictures. Text stays editable, not a screenshot. Word flows differently from a browser: the supported mappings below and the converted-page comparison define what can be delivered.
4
4
 
5
5
  ## 1. The call
6
6
  `office action:'author' path:<file.docx> script:<html> [overwrite:true] [mode:'portable'|'background'] [render:false]`
7
7
  - Returns `session`, `audit`, `logs` (what could not be carried — each names its element), and unless `render:false` the rendered pages with `render.reviewToken` and `render.compare`: one image per page, the browser's print of the HTML on the left, the Word render on the right.
8
8
  - The HTML is kept as `<file>.docx.mixdog-source.html`. **Default — fix by editing that file** and calling `author path:<file.docx>` with no `script` (no `overwrite` needed).
9
9
  - Refusals land nothing: `html_failed` names the cause (a missing `@page` size, a browser that could not start).
10
- - After landing, the document is an ordinary session: `batch` edits, `render`, `qa`, `finalize` as SKILL.md describes. A `<!-- BRIEF … -->` comment (the deck's keys: `subject/audience/action`, `sources`, `facts`) holds the document to its facts and asks the scored critique at finalize, as `design.brief` does.
10
+ - After landing, the document is an ordinary session: `batch` edits, `render`, `qa`, `finalize` as SKILL.md describes. A `<!-- BRIEF … -->` comment (`subject/audience/action`, `sources`, `facts`, optionally `concept` as free text) holds the document to its facts and asks the scored critique at finalize, as `design.brief` does.
11
11
 
12
12
  ## 2. Document contract
13
13
  **Hard rule — the sheet is declared**: `@page { size: A4; margin: 20mm 20mm 18mm; }` (A3, A4, A5, B4, B5, letter, legal, each optionally `landscape`, or two lengths). The body is the text column: the runtime sets `body { margin: 0 }` and lays it out at the sheet's width between its margins. Pad inside boxes, never on `body`. → runtime `html_failed`
@@ -31,15 +31,16 @@ Owns the default route for a new Word document: the model designs the document i
31
31
 
32
32
  **Not carried** (reported in `logs`, never silently): `position: absolute|fixed` (left out), `transform` (drawn upright), CSS columns (one column), a picture inside a line of text (left out), `rowspan` (the cell keeps its first row), border radius and shadows (square, flat).
33
33
  **Default — charts are `data-chart`**: the pdf skill's spec (type, labels, values or series, colors, format, labelColor, size, gap, axisLine…) drawn as SVG and placed as a picture; give the element a height. A chart the reader must edit belongs in a workbook.
34
- **Default — type in pt, faces installed here**: `font-family` names an installed face first (`'Malgun Gothic'`, `'Noto Sans KR'`) — the face is written into the file; the reader's Word needs it too. Body 10–11 pt at `line-height` 1.6–1.75 for Hangul (Word holds each line at exactly that pitch), captions 8.5–9 pt, headings by a clear step. `word-break: keep-all` on `body`.
34
+ **Default — type in pt, faces from the concept**: `font-family` lists the concept's face for each script (`${MIXDOG_SKILL_DIR}/../pptx/references/concepts.md` §5 menu: sans, serif, or mixed), the Latin face and the Korean face both named, a generic family last. Word writes the face name into the file; a recipient without it sees a substitute and the runtime says so (advisory, not blocking). **The document type scale** (shared with flowing PDF): body 10–11 pt at `line-height` 1.6–1.7 for Hangul (1.4–1.5 Latin; Word holds each line at exactly that pitch), captions and running heads 8.5–9 pt, title 24–32 pt, section heading 15–18 pt, subsection 12–13 pt. The deck's 13 pt text-mode body is a screen size and does not apply. `word-break: keep-all` on `body`.
35
35
 
36
36
  ## 3. Design
37
- The document's direction is the deck's: `${MIXDOG_SKILL_DIR}/../pptx/references/direction.md` §3, §5, §6 (style vocabulary, palette from one seed hue with one accent that has one job, type pairing) read for a page in the hand, and `writing.md` for the words. What a frontier report page does, and what to avoid:
38
- - **The first page carries the decision**: eyebrow → assertion title (break it at a phrase with `<br>`, never leave one word on its own line) → one-line lede → a rule → a row of two to four figure cards (figure over label, each card one fill) → the conclusion in a callout. Pages after it: assertion headings, short paragraphs, an exhibit per section.
39
- - **Exhibits are numbered and titled above, sourced below**: `그림 1. 월별 평균 대기 시간 (분)` in bold caption type over the chart or table, `출처: …` in muted caption type under it.
37
+ The document's direction is the one you chose, optionally from a concept (`${MIXDOG_SKILL_DIR}/../pptx/references/concepts.md`; the brief's `concept:` line is optional free text): its palette roles (`paper`, `ink`, `muted`, `line`, `tint`, `accent`) written as CSS custom properties on `:root` and used by name, its type pairing, and its table and emphasis forms. `writing.md` is for the words. Write the stylesheet for this document; do not carry over an earlier unrelated document's. What a frontier page does, and what to avoid:
38
+ - **The opening follows the genre**, not one anatomy. A decision brief or board report opens with the conclusion (title → lede → optionally a row of two to four figure cards → the conclusion in a carrier); a feature or essay opens with a headline and the first paragraph; a letter or memo opens with the sender block and subject line; a technical manual opens with title, version, and contents; a form opens with its title and instructions. Break an assertion title at a phrase with `<br>`, never leaving one word on its own line. Pages after it follow the same genre: assertion headings and an exhibit per section for a report, flowing prose for an essay.
39
+ - **Emphasis carriers — choose one for the concept, or none**: a boxed note (full border or one-cell table in `tint`), a tinted band across the text column, a margin note beside the prose, a left-rule quote, a bold lead sentence, an oversized numeral, or no callout at all. The order of this list is not a default order; a left-bar callout is one option among them, not the house form. A conclusion that is only one sentence may just be the first paragraph, set larger.
40
+ - **Exhibits are numbered and titled above, sourced below** where the document has exhibits: `그림 1. 월별 평균 대기 시간 (분)` in caption type over the chart or table, `출처: …` in `muted` caption type under it. A letter or essay has none.
40
41
  - **A side note beside the prose** (`display:grid; grid-template-columns: 1.6fr 1fr`) carries a definition, a method, or a quote; it fills the space a short paragraph leaves beside a chart.
41
- - **Tables are sized to their content**, figures right-aligned with the header over them, a total row set apart (bold over a rule), hairlines between rows, no vertical rules.
42
- - **No page half empty**: content that leaves most of the last page blank is regrouped (a side note, a closing ask box) or tightened, not padded. A page before the last that stops short — a table or figure kept whole moved on — is reported by `qa` and finalize as `page_bottom_empty`: keep `break-inside: avoid` for short tables and figures, and let a long table break with its `thead` repeating.
42
+ - **Tables are sized to their content**, figures right-aligned with the header over them and a total row set apart; the rest of the anatomy is the concept's: ruled (bold header on a rule, hairlines between rows, no vertical rules), zebra (alternating `tint` rows, no rules), open (a single rule under the header, generous rows), or a full grid (forms, technical parameter tables).
43
+ - **No page half empty by accident**: content that leaves most of the last page blank is regrouped (a side note, a closing box) or tightened, not padded. A page before the last that stops short — a table or figure kept whole moved on — is reported by `qa` and finalize as `page_bottom_empty`: keep `break-inside: avoid` for short tables and figures, and let a long table break with its `thead` repeating. A deliberate chapter or section break (`break-before: page`) that leaves a page short is fine when the critique records it as deliberate.
43
44
  - Avoid the generated look `${MIXDOG_SKILL_DIR}/../pptx/references/html.md` §8 lists (cream paper and a terracotta accent, an all-caps label over every heading, identical shaded boxes everywhere, centred everything).
44
45
 
45
46
  ## 4. Review
@@ -9,7 +9,8 @@ file is a Word document.
9
9
  - Document face: `set_document_font properties:{ name, nameEastAsia, size, color }`
10
10
  sets the body's face, size and ink as the document's own, so a paragraph
11
11
  added later — by `append_text` or by hand in Word — matches the body; a
12
- Korean document names a Korean face (Malgun Gothic) so its digits and Hangul
12
+ Korean document names an installed face covering Hangul and digits
13
+ (for example Noto Sans KR, Malgun Gothic, or a Korean serif) so they
13
14
  share one.
14
15
  - Page: `set_page properties:{ pageSize, orientation, topMargin, bottomMargin,
15
16
  leftMargin, rightMargin, columns, columnSpacing }`. A new document is A4;
@@ -88,6 +89,11 @@ to author the requested document, then inspect the real pages.
88
89
  The carriers a report needs beyond running prose, each as the operations that draw it the same in Word
89
90
  and in the portable file. Distances are points; `properties` go on `append_text` (or `set_paragraph_format`
90
91
  for an existing paragraph). Use a carrier when the content has that job, never as decoration (`SKILL.md` §4).
92
+ Colours are the author's palette roles — `<ink>`, `<muted>`, `<line>`, `<tint>`, `<accent>` — as six-digit hex.
93
+ The optional concept examples are not required. The carriers below are the native route's (editing a
94
+ document, a template, a small generated one); a new designed document draws the same jobs in HTML, with the concept's
95
+ own forms (`references/html.md` §3). Where this list gives one form (a left-bar callout, a ruled table), it is one
96
+ option: a boxed note, a tinted band, or no callout, and open or zebra tables, are equally native (`border`, `shading`, `borders`).
91
97
 
92
98
  - **Type ladder for a Korean report** (body 10.5 pt): `Title` 24-26 bold · `Heading 1` 15-16 bold,
93
99
  `spacingBefore:18, spacingAfter:6, keepWithNext:true` · `Heading 2` 12.5-13 bold, `spacingBefore:12,
@@ -95,23 +101,24 @@ for an existing paragraph). Use a carrier when the content has that job, never a
95
101
  (lineSpacing is a minimum in points: 1.7× for Hangul, never 1.15× — Korean lines set at Latin leading
96
102
  touch; the alignment is explicit because a Korean Word's Normal style justifies, and justified Hangul
97
103
  opens gaps between words that the portable file, set left, never shows) · caption
98
- 9 pt muted (`color:'6B7280'`). One Latin face and one East Asian face for the whole document
99
- (`name` + `nameEastAsia` on a paragraph, `fontName` + `fontNameEastAsia` on `add_table` — the table names its
100
- own type and refuses the paragraph's field names); an essay takes a serif pairing
101
- (Cambria + 바탕/Noto Serif KR), a brief sets both faces in the Korean sans (`name` and `nameEastAsia` both
102
- Malgun Gothic, or both Noto Sans KR): beside Calibri figures the Hangul prints larger and heavier, and
103
- "184,200건" reads as two sizes. The ladder is written once, as the document's styles, before the first
104
- paragraph: `{ op:'define_styles', styles:{ Title:{ name, nameEastAsia, size:24, bold:true, color:'111827',
104
+ 9 pt `<muted>`. This is the one document scale, shared with flowing PDF. One Latin face and one East Asian face
105
+ for the whole document (`name` + `nameEastAsia` on a paragraph, `fontName` + `fontNameEastAsia` on `add_table` — the
106
+ table names its own type and refuses the paragraph's field names), chosen from the concept's face menu: an essay or
107
+ letter takes a serif pairing (Cambria + 바탕/Noto Serif KR), a brief sets both faces in a Korean sans (`name` and
108
+ `nameEastAsia` both Noto Sans KR, or both Malgun Gothic), an editorial piece mixes serif headings with a sans body:
109
+ beside Calibri figures the Hangul prints larger and heavier, and "184,200건" reads as two sizes. The ladder is
110
+ written once, as the document's styles, before the first
111
+ paragraph: `{ op:'define_styles', styles:{ Title:{ name, nameEastAsia, size:24, bold:true, color:<ink>,
105
112
  alignment:'left', lineSpacing:30, lineSpacingRule:'exact', spacingAfter:8 }, 'Heading 1':{ …, size:15, bold:true,
106
113
  spacingBefore:18, spacingAfter:6, keepWithNext:true }, 'Heading 2':{ … }, Normal:{ name, nameEastAsia, size:10.5,
107
- lineSpacing:18, spacingAfter:8, alignment:'left' }, Caption:{ size:9, color:'6B7280', spacingBefore:4,
114
+ lineSpacing:18, spacingAfter:8, alignment:'left' }, Caption:{ size:9, color:<muted>, spacingBefore:4,
108
115
  spacingAfter:14 } } }`; then `append_text style:'Heading 1' text:'2. 근거'` carries nothing else, and a
109
116
  caption is `style:'Caption'`.
110
117
  - **Cover group**: eyebrow (`size:9.5, bold:true, color:<accent>, spacingAfter:4`) → `Title` with
111
118
  `alignment:'left'` (Word's own Title style centers it and the portable file does not; say which) and
112
119
  `lineSpacing:<1.25 × its size>, lineSpacingRule:'exact'` (30 for 24 pt) — a minimum can only widen a line, and on
113
120
  Malgun Gothic's own line the two lines of one wrapped title stood nearly twice the size apart → subtitle
114
- (`size:13, color:'374151', spacingAfter:8`) → meta lines (`size:9.5, color:'6B7280'`) → a rule: an empty
121
+ (`size:13, color:<ink> or <muted>, spacingAfter:8`) → meta lines (`size:9.5, color:<muted>`) → a rule: an empty
115
122
  paragraph with `border:{ side:'bottom', size:8, color:<accent> }, spacingAfter:24`. The summary follows on
116
123
  the same page; `insert_break kind:'page'` only when the document is long enough to earn a cover page.
117
124
  - **Table of contents**: `insert_toc paragraph:<after the cover>` once every `Heading 1..3` exists
@@ -122,38 +129,41 @@ for an existing paragraph). Use a carrier when the content has that job, never a
122
129
  style — a heading lists itself as the first entry.
123
130
  - **Section header**: `Heading 1` with `keepWithNext:true`; a numbered section carries its number in the text
124
131
  ("2. 근거"), never a typed tab or a list marker.
125
- - **Callout** (the conclusion, a warning, the ask): one paragraph with `shading:'EEF2F7', border:{ side:'left',
132
+ - **Callout** (the conclusion, a warning, the ask) — optional, and its form is the concept's: a tinted band
133
+ (`shading:<tint>` with indents, no border), a boxed note (`border` on all four sides in `<line>` or `<accent>`), a
134
+ left rule (below), or none — the conclusion as a larger first paragraph. The left-rule form: one paragraph with
135
+ `shading:<tint>, border:{ side:'left',
126
136
  size:12, color:<accent> }, indentLeft:12, indentRight:12, spacingBefore:6, spacingAfter:12`; a label
127
137
  paragraph above it in the same field (`bold:true, size:8.5, color:<accent>, spacingAfter:2, shading, indentLeft`)
128
138
  when the field needs a name. Every paragraph of one callout carries the same `shading` and indents so the
129
139
  field reads as one. Points inside it (a warning's items) are list items with those same properties plus
130
140
  `listKind`: on a list item `indentLeft` places the mark and the text hangs 18 pt after it, inside the field.
131
141
  - **Quote**: `indentLeft:16, border:{ side:'left', size:16, color:<accent> }, size:12.5, lineSpacing:20,
132
- color:'1F2937', spacingBefore:10, keepTogether:true, keepWithNext:true`; the attribution a caption under it
133
- (`size:9, color:'6B7280', indentLeft:16, spacingAfter:12`) beginning "— ". The two keeps hold the quote whole and on
142
+ color:<ink>, spacingBefore:10, keepTogether:true, keepWithNext:true`; the attribution a caption under it
143
+ (`size:9, color:<muted>, indentLeft:16, spacingAfter:12`) beginning "— ". The two keeps hold the quote whole and on
134
144
  the page of its attribution — without them a two-line quote ending a page left one line behind and carried the other
135
145
  over with its speaker. The space above sets it apart from what it follows: without it a quote under a list sat as
136
146
  close to the last item as the items to each other and read as one more of them.
137
147
  - **Stat strip** (two to four figures with one cause): `add_table` with one row of values and one row of labels,
138
148
  `properties:{ borders:{ top:{ enabled:false }, left:{ enabled:false }, right:{ enabled:false }, insideV:{ enabled:false },
139
- insideH:{ enabled:false }, bottom:{ style:'single', size:4, color:'C9CED6' } }, repeatHeader:false,
140
- columnAlignments:['left', …], rowStyles:[{ fontSize:22, color:<accent>, bold:true }, { fontSize:9, color:'6B7280' }] }`
149
+ insideH:{ enabled:false }, bottom:{ style:'single', size:4, color:<line> } }, repeatHeader:false,
150
+ columnAlignments:['left', …], rowStyles:[{ fontSize:22, color:<accent>, bold:true }, { fontSize:9, color:<muted> }] }`
141
151
  — one table, the figures at display size over their labels at caption size. A single `fontSize` sets the labels at
142
152
  22 pt too ("평균 대기 시간 단축" over three lines). → runtime `table_label_oversized`
143
153
  - **Chart**: `add_chart categories:[…] values:[…] chartType:'bar'|'column' unit highlight forecast accent` — one series
144
- drawn as a picture in the document's accent (`accent:'1F5E4B'`, the hex the document's headings and callouts use;
154
+ drawn as a picture in the document's accent (`accent:<accent hex>`, the concept's accent that the document's headings and emphasis use;
145
155
  without it the writer's teal), every bar carrying its value and no grid; `bar` for a ranking (names on the
146
156
  left), `column` for periods, `highlight` the bar the paragraph is about, `forecast` the bars that are projections
147
157
  (a plan, an estimate: drawn pale in a dashed outline, never as counted figures). It lands like `add_image` (`width`,
148
158
  `properties:{ alignment:'center' }`) with a caption under it; its altText names each figure. The bars cannot be
149
159
  edited in Word — a chart the reader will edit belongs in a workbook.
150
- - **Caption**: the paragraph under a table or picture, `size:9, color:'6B7280', spacingBefore:4,
160
+ - **Caption**: the paragraph under a table or picture, `size:9, color:<muted>, spacingBefore:4,
151
161
  spacingAfter:14`: what it shows and its source. The table above it takes `properties.keepWithNext:true`
152
162
  so the caption never starts the next page alone, and the paragraph that introduces a table or chart takes
153
163
  `keepWithNext:true` too — without it a heading and its lead-in closed one page and the table opened the next; a picture (`add_image`) keeps with its caption on its own,
154
164
  and `properties:{ alignment:'center' }` centres it.
155
165
  - **Running header**: `set_header_footer kind:'header'` with `properties:{ name, nameEastAsia, size:8.5,
156
- color:'6B7280' }` — without them the line prints in the document default, louder than the eyebrow under it.
166
+ color:<muted> }` — a running head and folio are a choice of the concept (a letter or essay takes none) — without them the line prints in the document default, louder than the eyebrow under it.
157
167
  The cover page carries neither: after the default header and the page numbers (`add_page_numbers separator:' / '`
158
168
  prints "1 / 3"), `set_header_footer kind:'header' variant:'first' text:''` and the same for the footer give the
159
169
  first page empty ones.
@@ -150,11 +150,17 @@ status. Do not resume or extend the Goal without the user's approval.
150
150
 
151
151
  ### Blocked and redirected work
152
152
 
153
- Report an impasse that only external state or the user can clear with `block`
154
- once per turn, with a stable description of the same condition. The runtime
155
- stops after three consecutive turns confirm it; until then continue any
156
- available work. Treat equivalent blockers as the same condition even when their
157
- wording or stated next step changes. Never block for difficulty, slowness,
153
+ `block` stops the Goal immediately, with a stable description of an impasse
154
+ that only external state or the user can clear. Do not block the first time a
155
+ blocker appears: block only after the same condition has repeated for three
156
+ consecutive Goal turns, counting the user-triggered turn and automatic
157
+ continuations; after a resume, count only turns since that resume. Until then,
158
+ continue any available work and re-check the blocker against current state with
159
+ a tool each turn rather than restating it. When current state verifies an
160
+ impasse that only the user can clear (their action, approval, credentials, or a
161
+ resource they control), block on that turn. Once the threshold is met, block
162
+ instead of reporting the same blocker again. Treat equivalent blockers as the
163
+ same condition even when their wording or stated next step changes. Never block for difficulty, slowness,
158
164
  uncertainty, a choice you can make, confirmation for in-scope work, or
159
165
  clarification that would only help. Use `abandon` only when the user redirects away from
160
166
  the objective; it preserves a stopped record rather than declaring success.
@@ -27,7 +27,8 @@ available before Local Provider is installed or enabled.
27
27
  Prefer original publishers or established conversion publishers; popularity
28
28
  is not proof of correctness, licensing permission, or runtime compatibility.
29
29
  3. Inspect the chosen exact `filename` in that repository, with the intended
30
- `contextWindow` if needed (default 8192). The runtime pins revision and
30
+ `contextWindow` if needed (16384 minimum; default 32768 when the GPU holds
31
+ it, else 16384). The runtime pins revision and
31
32
  SHA-256 from HF and reads a bounded portion of the actual GGUF header for
32
33
  architecture, context, and a VRAM estimate. Split shards, gated repositories,
33
34
  auxiliary files and missing metadata may be refused; explain the limitation
@@ -26,20 +26,23 @@ A PDF is a fixed rendering to read faithfully or a document to produce: a new do
26
26
  6. Close a read-only session when done; anything that changed the file ends with `action:'finalize' session:<id> review:true`.
27
27
 
28
28
  ## Create
29
- **Default — HTML for a new document**: a new PDF is written as one HTML document and printed with `office action:'author' path:<file.pdf> script:<html>`; read `references/html.md` before writing the HTML. The browser lays out CSS (grid, flex, inline SVG charts, Hangul line breaks) far better than blocks can. Choose the kind of document first (`references/html.md` §1):
30
- - **Designed pages — the default for anything a reader judges by its look**: a report, proposal, one-pager, brochure, certificate, or handout. Each sheet is one `<section class="slide">` under the pptx skill's own frame: load the `pptx` skill (Skill name:"pptx") and follow its brief, direction, composition, writing, and HTML route as written, with the differences `references/html.md` §2 lists. `author` runs the deck's gates, measured audit, and receipt on the pages, then prints the HTML itself; finalize takes the deck's scored critique.
31
- - **Flowing text**: a contract, manual, letter, or long report the browser paginates by itself (`references/html.md` §3-§9).
29
+ **Step 1 — design for the content and reader**: choose the structure, type, palette, and density for the intended use. Existing files, templates, and brand requirements take precedence. `${MIXDOG_SKILL_DIR}/../pptx/references/concepts.md` is optional inspiration, not a required selection; `concept:` is optional free text. Neither a prescribed motif nor a fixed colour, whitespace, or layout ratio is required.
30
+
31
+ **Default — HTML for a new document**: write the layout in HTML/CSS and print with `office action:'author' path:<file.pdf> script:<html>`; read `references/html.md` first. The browser handles grid, flex, inline SVG, and Hangul line breaks. Choose the page model from the content (`references/html.md` §1), not a style catalogue:
32
+ - **Designed pages**: a document a reader judges by its look and meets page by page — a brochure, one-pager, certificate, handout, proposal or report built as composed spreads. Each sheet is one `<section class="slide">` under the pptx skill's own frame: load the `pptx` skill (Skill name:"pptx") and follow its brief, direction, composition, writing, and HTML route as written, with the differences `references/html.md` §2 lists. `author` runs the deck's gates, measured audit, and receipt on the pages, then prints the HTML itself; finalize takes the deck's scored critique.
33
+ - **Flowing text**: a document whose text the browser paginates by itself — a contract, manual, letter, essay, or a long report with running prose and tables (`references/html.md` §3-§9).
32
34
 
33
35
  The blocks below stay for two cases: a fillable form (the browser prints form controls as pictures, never as fields — or print the page from HTML and add the fields with `add_form_field`), and a small document generated from data with no design of its own. With no local Chrome or Edge, `author` fails with `html_failed` naming the launch error, and the blocks are the route.
34
36
 
35
37
  **Blocks route**:
36
- - Plan the reading purpose, type hierarchy, margins and page flow, then specify block styles directly. The writer supplies flow, not an art direction. `design.profile` explicitly opts into a preset; otherwise it does not inject a palette or redesign supplied blocks. A representative page is optional when it resolves a real design uncertainty.
38
+ - Plan the reading purpose, type hierarchy, margins and page flow, then specify block styles directly. The writer supplies flow, not an art direction. `design.profile` explicitly opts into a preset; otherwise it does not redesign supplied blocks. Its default ink is a neutral one; `properties.palette` (below) sets the concept's colours for the blocks that carry colour. A representative page is optional when it resolves a real design uncertainty.
37
39
  - `office action:'create' path:<file.pdf> format:'pdf' blocks:[...] fields:[...] properties:{ title, author, subject, keywords, pageSize:'a4'|'letter'|[w,h], orientation, margin, fontPath, pageNumbers, footer }`, then render and review before finalizing.
38
40
  - Blocks: `{ type:'heading', text, level:1-3, size }`, `{ type:'paragraph', text, size, color, after }` (`\n` breaks a line; unspaced text wraps by character), `{ type:'list', items:[…], marker, ordered:true, indent }` (the marker is drawn with a hanging indent, so never type `• ` into a paragraph), `{ type:'table', rows, headers, columnWidths:[weights], columnAlignments:['left','right'], rowHeight, fontSize, headerFill, headerColor }` (the header row repeats after a page break; cells wrap and rows grow; without `columnAlignments` a column of figures — `₩2,400,000` and `$120` included — is set right and a label column — including `1호`, `2호` — stays left; the anatomy is the Word one: a bold header on a rule, hairlines between rows, no vertical rules, `grid:true` for the full cell grid; `headers:false` for a table with no header row, such as the totals under an invoice's lines — give that block the `x` and `width` of the figure columns it closes, so each total stands under its column rather than across the page from its label; `totalRow:true` sets the last row bold under a rule), `{ type:'image', path, width, height, align:'center'|'right' }` (PNG or JPEG; fits the text width unless sized), `{ type:'pagebreak' }`.
39
- The document anatomy beyond prose, each one block the writer flows the same on every page: `{ type:'cover', eyebrow, title, subtitle, meta:[…] }` (the title group of the first page — eyebrow in the accent, title, subtitle, meta lines, one rule under; the summary follows on the same page unless a `pagebreak` says otherwise), `{ type:'stats', items:[{ value, label }] }` (several figures with one cause on one baseline, equal columns, one rule under — at most four, and every value is a fact with a source), `{ type:'callout', label, text, fill }` (a tinted field with its label above the text: the conclusion, a warning, the ask; never split across pages), `{ type:'quote', text, attribution }` (someone else's words behind a rule in the accent, the attribution a caption under), `{ type:'chart', categories:[…], values:[…], chartType:'bar'|'column', unit, highlight, title, height }` (one series drawn by the page in the document's face: `bar` lays the bars across — a ranking, its names on the left — and `column` stands them up for periods left to right; every bar carries its value (`unit` follows the number: `'건'`, `'%'`), there is no grid, and `highlight` — an index or a category — takes the accent while the other bars recede; values are zero or more, one per category; a `caption` right after it travels with it), `{ type:'caption', text }` (the small muted line under a table, picture, or chart: what it shows and its source), `{ type:'rule' }` (a hairline between sections). Body copy leads at 1.5× its size so Hangul lines breathe; a heading keeps 1.2× and never ends a page. A report is: cover → callout (the conclusion) or stats → headings with prose, tables with captions → quote where a voice carries the point → closing callout (the ask); an essay is headings and prose alone.
41
+ The document anatomy beyond prose, each one block the writer flows the same on every page: `{ type:'cover', eyebrow, title, subtitle, meta:[…] }` (the title group of the first page — eyebrow in the accent, title, subtitle, meta lines, one rule under; the summary follows on the same page unless a `pagebreak` says otherwise), `{ type:'stats', items:[{ value, label }] }` (several figures with one cause on one baseline, equal columns, one rule under — at most four, and every value is a fact with a source), `{ type:'callout', label, text, fill }` (a tinted field with its label above the text: the conclusion, a warning, the ask; never split across pages), `{ type:'quote', text, attribution }` (someone else's words behind a rule in the accent, the attribution a caption under), `{ type:'chart', categories:[…], values:[…], chartType:'bar'|'column', unit, highlight, title, height }` (one series drawn by the page in the document's face: `bar` lays the bars across — a ranking, its names on the left — and `column` stands them up for periods left to right; every bar carries its value (`unit` follows the number: `'건'`, `'%'`), there is no grid, and `highlight` — an index or a category — takes the accent while the other bars recede; values are zero or more, one per category; a `caption` right after it travels with it), `{ type:'caption', text }` (the small muted line under a table, picture, or chart: what it shows and its source), `{ type:'rule' }` (a hairline between sections). Body copy leads at 1.5× its size so Hangul lines breathe; a heading keeps 1.2× and never ends a page. Which of these a document uses follows its genre: a decision report may open on a cover and a callout or stats strip, a letter or essay is headings and prose alone, a data log is a table with captions; a callout, quote, or closing ask appears only where the content has that job, and the order is not fixed.
42
+ `properties.palette: { accent, muted, field, line }` (six-digit hex without `#`, all optional) overrides the writer's default ink for the cover eyebrow and rule, callout, quote rule, stats, chart bars, and table header and rules: `accent` the one emphasis colour, `muted` captions and labels, `field` the tinted callout and stat ground, `line` rules and hairlines. Take the four from the chosen concept's roles (`accent`, `muted`, `tint`, `line`).
40
43
  A form the reader fills travels with the copy that introduces it: `{ type:'field', name, label, fieldType:'text|checkbox|radio|dropdown|optionlist', height }` and `{ type:'fieldRow', items:[{ name, label, type }], gutter }` flow like any other block (a `checkbox` or `radio` is drawn as a square with its label beside it, a typed box with its label above; a `radio` with `options:[…]` is a question — its label above, the options in one row, each mark with its own words beside it; a `caption` right after a field block travels with its last row), so the writer fixes the page and the coordinates where the reader meets them, and a heading is never left on the page before its own boxes. Fields passed in `fields:[…]` keep the absolute `page`/`x`/`y` they were given, which is what stamping a form onto a scan needs.
41
44
  The block list is checked before anything is written: an unknown `type`, a block named with `kind`, an unknown field, or a missing `rows`/`items`/`text` is refused with every fault at once, instead of flowing as an empty paragraph. The writer flows and paginates; `pageNumbers` is on for multi-page output (`N / total`, bottom right) unless set `false`.
42
- - Fonts: the standard fonts cover Latin only. Korean, CJK, Cyrillic, or Greek text embeds a Unicode font found on the system (Malgun Gothic on Windows, Nanum/DejaVu/Noto on Linux); `properties.fontPath` chooses one, the result's `font.path` says which was used, and `action:'detect'` names it beforehand as `portable.pdfUnicodeFont`. When none is installed the call fails with the hint: ask for a font file rather than transliterating.
45
+ - Fonts: the standard fonts cover Latin only. Korean, CJK, Cyrillic, or Greek text embeds a Unicode font found on the system (for example Malgun Gothic or Noto on Windows, Nanum/DejaVu/Noto on Linux); a PDF embeds what it drew with, so the reader needs no font. `properties.fontPath` chooses one, the result's `font.path` says which was used, and `action:'detect'` names it beforehand as `portable.pdfUnicodeFont`. When none is installed the call fails with the hint: ask for a font file rather than transliterating.
43
46
  - Form fields: `{ name, label, type:'text|checkbox|radio|dropdown|optionlist', page, x, y, width, height, value, options, multiline, maxLength, fontSize, labelSize, required, readOnly }` — a PDF field is a bare box, so `label` is the caption drawn above it (without one the page reaches the reader as unnamed rectangles), and the box may be written as `rect:[x, y, width, height]`; the layout is linted before writing — missing or duplicate names and out-of-page boxes fail, overlaps and boxes too small to use (under 24 × 12 pt typed, 8 × 8 pt marks) come back as `formIssues` on the result. A field that belongs with the copy around it is better declared as a `field` or `fieldRow` block, which flows with that copy instead of holding a page number the text may have moved off.
44
47
 
45
48
  ## Edit
@@ -1,16 +1,16 @@
1
1
  # HTML route (PDF)
2
2
 
3
- Owns the default route for a new PDF: the model writes one HTML document and passes it as `author`'s `script`; a local Chrome or Edge lays it out under the document's own `@page` rules, the runtime checks it, and the browser prints it — text stays text, headings become bookmarks, the file is tagged. Everything else in SKILL.md (render, finalize, the rules) applies unchanged.
3
+ The default route for a new PDF: the model writes HTML/CSS for the content and intended reader, without selecting a preset, and passes it as `author`'s `script`. A local Chrome or Edge lays it out under the document's own `@page` rules, the runtime checks it, and the browser prints it — text stays text, headings become bookmarks, and the file is tagged. Inspect the printed pages for breaks, clipping, missing content, and readability before finalizing.
4
4
 
5
5
  ## 1. Two kinds of document
6
6
  The HTML itself says which one it is: `<section class="slide">` pages make it designed pages (§2); anything else flows (§4-§8).
7
7
  | | Designed pages (§2) | Flowing text (§4-§8) |
8
8
  |---|---|---|
9
- | For | reports, proposals, one-pagers, brochures, certificates, handouts — anything judged by its look | contracts, manuals, letters, long running text |
9
+ | For | one-pagers, brochures, certificates, handouts, proposals and reports composed as spreads — anything judged by its look and taken in page by page | contracts, manuals, letters, essays, and reports of running prose and tables |
10
10
  | Pages | one `section.slide` per sheet, composed like a slide | the browser paginates the flow |
11
11
  | Frame | the pptx skill's: brief, plan and facts gates, geometry gate, measured audit, receipt, scored critique | this file's checks and the per-page critique of SKILL.md |
12
12
 
13
- **Default — designed pages** whenever the document has a cover, key figures, or pages a reader takes in at a glance; flowing text when the content is read straight through and its length decides the page count.
13
+ **The route follows the page model, not a concept id**: designed pages when each sheet is a composed unit or a fixed page count is needed; flowing text when the content is read straight through and its length decides the page count. Either can be a report.
14
14
 
15
15
  ## 2. Designed pages — the deck's frame
16
16
  Load the `pptx` skill and follow it as written for the brief (SKILL.md §3: `subject/audience/action`, `directions`, `style`, `facts`, `slide plan`), the workflow, `direction.md`, `composition.md`, `writing.md`, and its HTML route (`references/html.md`); the PDF differs only here:
@@ -18,7 +18,7 @@ Load the `pptx` skill and follow it as written for the brief (SKILL.md §3: `sub
18
18
  - **Type in pt**: here 1 px is 0.75 pt (the deck's canvas runs 0.5 pt per px), so take the pptx references' roles, not their px. A page is read in the hand, not projected: the `text` reading mode of `direction.md` §1, body 9.5–11 pt, captions 7.5–8.5 pt (the audit's print floors: body 9 pt, a one-line caption or note 7 pt, never the deck's screen 12 / 9 pt), page titles 20–32 pt, a hero numeral 60 pt and up; the plan's `hero` promise reads 40 pt+, `statement` 22 pt+. Margins 15–20 mm.
19
19
  - **Charts are `data-chart`**, written exactly as the pptx HTML route's §5 (type, labels, values or series, colors, min/max, format, labelColor, size in pt, legend, grid, valueAxis, categoryAxis, gap, stacked, hole, plot): the deck frame reads it as a native chart (a plan line names it `chart`), and the runtime draws the same spec as an inline SVG on the page before it prints, value labels as text. A chart no spec covers (a dumbbell, an annotated line) is an inline `<svg>` drawn from the facts' values and named `picture` in the plan. `<table>` (`table`), `<img>`, and `data-icon` print as drawn.
20
20
  - **Every page prints**: each `section.slide` goes on its own sheet and stays displayed in print (never hide the inactive ones in CSS); `aside.notes` is not printed. Pages that print onto more sheets than there are slides are refused.
21
- - **No margin boxes**: with `margin: 0` there is nowhere for `@page` page numbers — set the folio and running head inside the slide, as the deck sets its page number. `h1`–`h3` still become bookmarks.
21
+ - **No margin boxes**: with `margin: 0` there is nowhere for `@page` page numbers — set the folio and running head inside the slide, as the deck sets its page number, if the concept's chrome has them at all (a brand or statement page carries none). `h1`–`h3` still become bookmarks.
22
22
  - **What comes back**: `designedPages: true`, the deck's `audit` (`status` pass/fail, top targets), `receipt` (with the printed pages' render readings), `render.contactSheet`, and `logs`; a later `render` on the session returns the receipt and contact sheet again, and `qa` adds the brief's readings (`plan_count_mismatch`, `fact_without_locator`). Refusals are the deck's: `html_failed`, `geometry_gate`, `plan_gate`, `facts_gate`. There is no `render.compare`: the PDF is the browser's own print.
23
23
  - **Finalize** takes the pptx skill's critique (its SKILL.md §5), one entry per page keyed `page` (or `slide`): `verdict`, the five scores, a page-specific `note`, `fixes`, `checks`; an anchor page carries `role`. An error the audit found holds finalize until the HTML is fixed and authored again.
24
24
  - Copy that outgrows its page is split onto another page or cut (the deck's rule); content whose length should decide the page count is flowing text instead.
@@ -35,29 +35,34 @@ Load the `pptx` skill and follow it as written for the brief (SKILL.md §3: `sub
35
35
  **Hard rule — pictures are local**: `<img src>` is a file beside the PDF (relative paths resolve from its folder) or a `data:` URI; a web URL is refused, and so is a picture that did not load. There is no network: no CDN fonts, scripts, or stylesheets. → runtime `layout_gate` (`remote_image`, `image_missing`)
36
36
  **Hard rule — nothing wider than the page**: a table, a code block, a picture, or a row of cards wider than the printable width is cut at the margin by print. Give pictures `max-width: 100%`, let tables wrap their cells (`table-layout: fixed` with column widths in %), and wrap long code. A box inside a container with `overflow: hidden` is the container's business and is not reported. → runtime `layout_gate` (`overflow_x`)
37
37
  - A full-bleed cover before a flowing body uses a named page: `@page cover { margin: 0 }` with `.cover { page: cover; break-after: page; }`.
38
- **Default — the brief and its facts**: an optional `<!-- BRIEF` … `-->` comment at the top, one `key: value` per line (`subject/audience/action`, `sources`, `facts: F1 2,400건 — 운영 시트 B4 · F2 …`). When it is present, every figure the printed pages show that no fact carries comes back in `facts` (`pages[].figures`); it is reported, not refused — answer it by adding the fact with its source or correcting the figure. `facts: sample — <why>` marks every figure illustrative, and the delivery says so. Dates, page counters, and small ordinals are not figures.
38
+ **Default — the brief and its facts**: an optional `<!-- BRIEF` … `-->` comment at the top, one `key: value` per line (`subject/audience/action`, optionally `concept: <free text>` (`concepts.md` §1), `sources`, `facts: F1 2,400건 — 운영 시트 B4 · F2 …`). When it is present, every figure the printed pages show that no fact carries comes back in `facts` (`pages[].figures`); it is reported, not refused — answer it by adding the fact with its source or correcting the figure. `facts: sample — <why>` marks every figure illustrative, and the delivery says so. Dates, page counters, and small ordinals are not figures.
39
39
 
40
40
  ## 5. Flowing text: pages and breaks
41
- - **Running head, foot, and page numbers** live in the `@page` margin boxes, never in the body: `@page { @bottom-right { content: counter(page) " / " counter(pages); font: 8.5pt 'Malgun Gothic'; color: #6B7280; } @top-left { content: "분기 운영 보고서"; … } }`. `counter(page)` works only there. Turn them off on a cover with `@page :first { @bottom-right { content: none } }` or the named cover page.
42
- - **Breaks**: `h1, h2, h3 { break-after: avoid; }` keeps a heading with what follows; `figure, table.compact, .callout, .card, tr { break-inside: avoid; }` keeps a unit whole; `p, li { orphans: 2; widows: 2; }`; `thead { display: table-header-group; }` repeats a long table's header on every page; `break-before: page` opens a chapter on a new sheet. A block that may not break but is taller than a page breaks anyway — the result warns `unbreakable_too_tall`; shorten it or let it break. A kept block that moves on leaves the page before it short: `qa` and finalize report a page before the last whose body stops above 70% of its height as `page_bottom_empty`, so keep only short units whole.
41
+ - **Running head, foot, and page numbers** are a choice of the concept, and when present live in the `@page` margin boxes, never in the body. `counter(page)` works only there. Pick one variant (none is also right for a letter, a short document, or a statement piece), with the face and colour from the concept's roles:
42
+ - running head top-right, folio bottom-right (a long filed report): `@page { @top-right { content: "분기 운영 보고서"; font: 8.5pt <face>; color: <muted>; } @bottom-right { content: counter(page) " / " counter(pages); font: 8.5pt <face>; color: <muted>; } }`
43
+ - centred folio alone (a manual, an essay): `@page { @bottom-center { content: counter(page); font: 9pt <face>; color: <muted>; } }`
44
+ - folio only on the inside edge, small (an editorial piece): `@page :left { @bottom-left { content: counter(page); … } } @page :right { @bottom-right { content: counter(page); … } }`
45
+ - none: no margin boxes at all (a letter, a notice).
46
+ Turn them off on a cover with `@page :first { @top-right { content: none } @bottom-right { content: none } }` (naming every box the document sets) or the named cover page.
47
+ - **Breaks**: `h1, h2, h3 { break-after: avoid; }` keeps a heading with what follows; `figure, table.compact, .callout, .card, tr { break-inside: avoid; }` keeps a unit whole; `p, li { orphans: 2; widows: 2; }`; `thead { display: table-header-group; }` repeats a long table's header on every page; `break-before: page` opens a chapter on a new sheet. A block that may not break but is taller than a page breaks anyway — the result warns `unbreakable_too_tall`; shorten it or let it break. A kept block that moves on leaves the page before it short: `qa` and finalize report a page before the last whose body stops above 70% of its height as `page_bottom_empty`, so keep only short units whole. A deliberate chapter or section break that leaves a page short is fine when the finalize critique says it is deliberate.
43
48
  - **Backgrounds print**. A colour field or band behind a section prints as drawn; `position: fixed` repeats on every page, so use it only for a deliberate watermark or edge band.
44
49
  - **Bookmarks** come from `h1`–`h3`: keep heading levels true to the structure (one `h1` for the title, `h2` per section), and never fake a heading with a styled `div`. A heading set on two lines with `<br>` keeps the space in its bookmark.
45
50
  - **Not in the browser**: running heads taken from the content (`string-set`), table-of-contents page numbers (`target-counter()`), footnotes (`float: footnote`), and `leader()`. A contents list names the sections without page numbers (the bookmarks carry the navigation), and notes are endnotes.
46
51
 
47
52
  ## 6. Text and fonts (both kinds)
48
53
  - Set `word-break: keep-all; overflow-wrap: break-word` on `body`, `text-wrap: pretty` on prose, `text-wrap: balance` on headings; wrap a name that must not break in `white-space: nowrap`.
49
- - Faces: the browser embeds what it drew with, so a face must be installed on this machine — `'Malgun Gothic'` on Windows, `'Noto Sans KR'` / `'Noto Serif KR'` where installed, Latin system faces. A face that is missing falls back silently: list the installed face first and a generic family last, and check the render.
50
- - Sizes in `pt` or `mm`: body 10–11.5 pt with `line-height` 1.55–1.7 for Hangul, captions and running heads 8–9 pt, headings by a clear step (title ~24–32 pt, section ~15–18 pt). Measure: 30–40 Hangul characters per line for body copy; a full-width A4 column runs long, so a report body often sits in a narrower column beside a side rail for captions or key figures.
51
- - Contrast 4.5:1 for body text, 3:1 for 14 pt bold and up. A weight renders only if the face has it (Malgun Gothic has regular and bold); a missing weight is synthesized or rounded.
54
+ - Faces: the browser embeds what it drew with, so the reader needs no font — but the face must be installed on this machine. Choose from the concept's menu (`concepts.md` §5): a sans (`'Noto Sans KR'`, `'Malgun Gothic'`), a serif (`'Noto Serif KR'`, `'Batang'`), or a serif-over-sans mix, with a Latin face named beside it. A face that is missing falls back silently: list the installed face first and a generic family last, and check the render.
55
+ - Sizes in `pt` or `mm` (the one document scale, shared with Word): body 10–11 pt with `line-height` 1.6–1.7 for Hangul, captions and running heads 8.5–9 pt, headings by a clear step (title ~24–32 pt, section ~15–18 pt, subsection 12–13 pt). Measure: 30–40 Hangul characters per line for body copy; a full-width A4 column runs long, so a report body often sits in a narrower column beside a side rail for captions or key figures.
56
+ - Contrast 4.5:1 for body text, 3:1 for 14 pt bold and up. A weight renders only if the face has it (Malgun Gothic has regular and bold; Noto families carry more); a missing weight is synthesized or rounded.
52
57
 
53
58
  ## 7. Tables, charts, pictures
54
- - **Tables** are real `<table>` with `<thead>`: a bold header on a rule, hairlines between rows, no vertical rules unless the grid carries meaning; figures right-aligned with `font-variant-numeric: tabular-nums`, labels left; a total row bold under a rule. A caption under it says what it shows and its source.
59
+ - **Tables** are real `<table>` with `<thead>`; the treatment is the concept's — ruled (bold header on a rule, hairlines between rows), zebra (alternating `tint` rows, no rules), open (one rule under the header, wide rows), or a full grid (forms, parameter tables) — and no vertical rules unless the grid carries meaning; figures right-aligned with `font-variant-numeric: tabular-nums`, labels left; a total row set apart. The first listed is not a default. A caption under it says what it shows and its source.
55
60
  - **Charts** are `data-chart` on an empty, sized element (the spec of §2), drawn by the runtime as SVG before printing; a chart no spec covers is an inline `<svg>` with numbers computed from one set of values (bar length = value / max × width), not typed separately. Either way: direct value labels, no gridline clutter, the subject's bar or point in the accent and the rest receding, the unit in the format (`"#,##0\"건\""`). JavaScript runs, but a chart library must be inlined, since nothing loads from the network.
56
61
  - **Pictures**: `<img>` with `alt`, `max-width: 100%`, `object-fit` for a crop. A generated picture is mood or illustration, never evidence (figures, screenshots, and product UI are real or absent). Flowing text has no `data-icon`: draw icons as inline SVG (designed pages have it, §2).
57
62
 
58
63
  ## 8. Flowing text: design pass
59
64
  Designed pages take the pptx skill's design pass instead. Before writing flowing HTML, plan once and check the plan against the defaults:
60
- 1. **Plan** from the subject and the sources: palette of 4–6 hex values with roles (paper, ink, muted ink, one accent with one job, one tint for fields); type roles in pt; the grid (margins, column, side rail); the document anatomy — cover or title block → the conclusion first (a callout or a row of key figures) → sections with their evidence → the closing ask.
65
+ 1. **Plan** from the subject and the sources, in the chosen concept (`concepts.md`): the palette roles (`paper`, `ink`, `muted`, `line`, `tint`, `accent`, optional `accent2`) as CSS custom properties; type roles in pt from the face menu; the grid (margins, column, side rail); the anatomy the genre calls for — a report may lead with its conclusion, an essay with its first paragraph, a letter with the sender block, a manual with contents. Emphasis carriers are a choice: a boxed note, a tinted band, a margin note, a left-rule quote, an oversized numeral, or no callout; the first listed is not a default. Write this document's stylesheet fresh.
61
66
  2. **Check**: one anchor per page (the first thing the eye lands on is that page's claim); three tiers of space (inside a unit < between units < around sections); proximity carries relation (a label nearer its value than the next value); decoration never stands in for content. Avoid the generated look unless the brief asks for it: cream paper with a serif and a terracotta accent, an all-caps tracked label over every heading, identical rounded cards with one soft shadow, gradient washes, centred everything.
62
67
 
63
68
  ## 9. Review
@@ -16,7 +16,7 @@ Use `office` to create, redesign, and review PowerPoint decks. Read this guide
16
16
  before the first deck operation. A new deck is written as HTML slides by default
17
17
  (`references/html.md`); the pptxgenjs script and its kit remain the second route.
18
18
 
19
- The model designs; the runtime measures. The kit supplies editable primitives, not a required visual style. Facts, safety, file integrity, legibility, and current rendered review remain mandatory. Palette, typography scales, spacing ladders, layout recipes, and stylistic avoid lists are defaults: adapt them to the audience, brand, or reference deck rather than sacrificing the result to match a recipe. Existing accessible product assets and user materials precede generated imagery; the runtime has no photo library.
19
+ The model designs; the runtime converts and measures. Write HTML/CSS for the actual content, audience, and use, not to fill a predefined layout. Facts, safety, file integrity, legibility, and current rendered review remain mandatory. Palette, typography, spacing, motifs, density, repetition, and layout recipes in the references are optional examples, not requirements or acceptance criteria. Neither a named concept nor a style score proves quality. Existing accessible product assets and user materials precede generated imagery; the runtime has no photo library.
20
20
 
21
21
  ## 0. Route by task
22
22
  | Task | Route | Done when |
@@ -30,8 +30,9 @@ Prerequisites: the Office capability (`metadata.requires`) — its portable back
30
30
  ## 1. Load routing
31
31
  | File | Owns | Read when |
32
32
  |---|---|---|
33
- | `references/direction.md` | reading mode, argument mode, visual styles, representative direction trials, palette from a seed, typography | always, before the brief |
34
- | `references/composition.md` | the page brief, relationship atoms, composition lenses, page recipes, starting structures, spacing, lines and surfaces, rhythm, text, device menu, component specs, icons, machine tells | always, before the slide plan |
33
+ | `references/concepts.md` | optional examples of palette, type, and document treatments | only when examples help resolve an open design choice; no id must be selected |
34
+ | `references/direction.md` | reading modes, argument structures, and visual direction examples | when the reading mode or direction is unclear |
35
+ | `references/composition.md` | relationship vocabulary, composition examples, and script-kit devices | when a page needs composition help or a script-kit device |
35
36
  | `references/writing.md` | sentence rules, one register, the notation of numbers, dates, money, and units, room for translation, the read-back | always, before the copy (§2 step 2) |
36
37
  | `references/html.md` | the HTML route: the document contract, the brief as an HTML comment, what CSS converts to, text and fonts, `data-chart`, icons and SVG, the `images:` plan, the one-shot design pass and the generated-look list, review with `render.compare` | always for a new deck on the HTML route, before the plan; it replaces `kit-index.md` there |
37
38
  | `references/kit-index.md` | every helper of `kit.md`, `charts.md`, and `pictures.md` by signature, defaults, and the guidance above it, with the kit's rules — read it instead of those files' code: tokens, `palette()`, `typography()`, masters, measured text (`reading()` and `columns()` for the commentary beside or under a carrier — both refuse a block that would cross the foot; `avail(top)` measures the height first), the anchors of a deck without pictures (`poster()`, `numeralBeat()`, `motif()`, `orb()` — the beat's one hero object; `display()` and `dateline()` for the editorial text page on paper; `emph:` for the headline's contrast phrase), layout by weight, shapes (`stage()` — the context field a structure stands on; `shareDown(top, columnsH(...))` when the reading sits under it, `readingH()` to register a reading to its row, `loop(s, st, …)` / `hub(s, st, …)` for radii from the stage), the relationship structures (timeline, steps, hub, loop, merge, tiers, lanes, quadrants, venn, quote, brace groups) | always on the script route, before the script |
@@ -40,11 +41,11 @@ Prerequisites: the Office capability (`metadata.requires`) — its portable back
40
41
  | `references/review.md` | representative direction trials, source questions, independent image review | for a new visual direction, substantive redesign, or quality comparison |
41
42
 
42
43
  ## 2. Workflow
43
- 1. Read the always-loaded references; add `pictures.md` only on its trigger (chart helpers are in the index). Before choosing a visual direction, identify the available brand assets, product views, and reference deck (`direction.md` §4). For a product pitch, select the real view or artifact that demonstrates the benefit before substituting a generic diagram. No generation lane does not imply no pictures. **Default — the picture lane is checked, not assumed**: when the plan wants a picture no supplied asset covers, load the `image` skill and `list` its lanes before authoring, so the deck knows whether one can be generated at all. A picture is generated only where the user asked for one or the claim needs the artifact itself; a signed-in lane is not a reason to add imagery. With no lane the picture is omitted, the page anchors on the drawn devices instead (`spot()`, `orb()`, `poster()`, `motif()`), and the delivery says the deck went without generated pictures. Done when the brief names each selected asset and its source, or explains why typography or a conceptual diagram is more faithful.
44
+ 1. Read the HTML contract and writing guide; load other references only for the decisions they help. Identify supplied brand assets, product views, and reference material. For a product pitch, prefer the real artifact that demonstrates the benefit to an interchangeable diagram. When an illustration is needed and authorized but no supplied asset covers it, load the `image` skill and check its lanes; do not assume generation is available or add imagery merely because it is. Without it, choose a faithful text or drawn explanation and disclose any unmet image requirement. Done when selected assets and their sources are known.
44
45
  2. Ground: with source material, read it and write the fact sheet (each figure with its page or cell) before any outline; then the outline as assertion titles that read as one argument in sequence (`references/writing.md` for the sentence and notation rules). Done when every figure the outline will show has a fact line with a locator (§3).
45
46
  **Hard rule — copy is rewritten, never reinvented**: slide copy is condensed from the source in the deck's language with the source's own vocabulary; entity names, product names, figures, and abbreviations stay in their original form; a figure the source does not contain is not on the slide. → runtime `number_without_fact` for figures; wording → manual
46
- 3. Direct: define plausible directions, then compare two rendered compositions of the same representative content when the direction is open (`direction.md` §4; `references/review.md`). Select by reader understanding and visual craft, not style names; a fixed template or small edit keeps its approved direction. A preferred color alone does not settle composition. Use the kit palette and type as starting points, or adapt its tokens to the brand before creating slides. Done when the brief records the selection and the visible reason, not merely a named style.
47
- 4. Plan each slide before any geometry (`composition.md` §0): job, relationship, move, composition, carriers, texture, rhythm. Decide what the reader should understand from the visual itself; choose the relevant evidence or a faithful visual explanation before arranging the remaining copy. Content over the mode's budget is split or cut, never squeezed. Then the deck's sequence in the brief's `rhythm:` line (`composition.md` §7: the marks — cover, section fields, closing — 5-13 evidence pages apart, the page grammar turning about every other page, never the same grammar on five in a row, a quiet page answered by colour within two), checked in the receipt's `deck.shape` before the render. Done when every slide has its plan line (§3).
47
+ 3. Direct: choose the reading order, type, palette, density, and structure for this request. Supplied templates and brand requirements take precedence. A `concept:` line is optional free text, not a catalogue selection. Related deliverables share facts and any requested identity, not necessarily layouts. Compare representative rendered pages only when it resolves a real uncertainty; an existing approved direction needs no contest. Done when the design has a reason grounded in the content and reader.
48
+ 4. Plan each slide's purpose, relationships, composition, and carriers in the brief (§3). Describe the layout in ordinary words, without selecting a recipe. Use as much space and repetition as the content needs: a comparison series may repeat a layout, a statement may be sparse, and an evidence page may be dense. Preserve the facts and qualifications; split content when it cannot remain readable rather than shrinking or deleting evidence. Done when every slide has a plan line describing what it actually carries.
48
49
  5. HTML route: the brief (§3) as a `<!-- BRIEF -->` comment, then one `<section class="slide">` per page, written after the design pass of `references/html.md` §8; the rest of this step is the script route. Script: the brief (§3) as a comment block, then `deck({ style, hue, accentHue?, mode, script, pairing, fonts })` — the brief's style id is passed here, not only written down — then the slides. The runtime runs the kit — the code blocks of `kit.md`, `charts.md`, and `pictures.md` — before the script, so the script never pastes a helper (it may redefine one). Each slide is measured down before it is drawn — `const top = head(…)`, `avail(top)` for the height left, `shareDown(top, columnsH(…))` / `readingH()` when a row or rail shares it, then the carrier on the stage or column those give (`composition.md` §4 "measure down before drawing"; the helpers refuse under their floors and name the fix, so no y or h is guessed) — and drawn spine → nodes → connectors → labels → garnish; every text box is measured (`MEASURE` through the kit helpers).
49
50
  6. `office action:'author' path:<deck.pptx> script:<html or pptxgenjs script>` (a source that opens with `<` is read as HTML; `overwrite:true` when re-authoring the same path) writes the file, opens the session, and returns three things (the HTML route adds `render.compare`, the HTML beside the PPTX render per page):
50
51
  - **pages** — every slide rendered and one contact sheet of the whole deck (unless `render:false`); the rendered pages come back as `images[]` (`page`, `path`) with the sheet as `contactSheet` (its file is always written; its image is attached past four slides, since a shorter deck's pages already show the sequence), and `pageCount` says how many the deck has;
@@ -70,6 +71,7 @@ Prerequisites: the Office capability (`metadata.requires`) — its portable back
70
71
  ```
71
72
  // BRIEF
72
73
  // subject/audience/action: <what this deck must make someone do>
74
+ // concept: <optional free-text design intent; no catalogue id required>
73
75
  // reading mode: presentation | balanced | text · argument mode: pyramid | narrative | instructional | showcase | briefing
74
76
  // directions: A <style, seed hue, pairing, motif — one-sentence note> · B <…> · selected: <A|B> · why: <visible reason from trial, or fixed-template constraint>
75
77
  // style: <direction.md §3 id or custom> · palette: hue <deg> [· accent hue <deg>] · accent: <hex> · type: MODE <mode> → body <pt> · script: ko | ja | zh | latin · pairing: serif | weight | concord · fonts: noto | safe
@@ -2,14 +2,14 @@
2
2
 
3
3
  Owns how one slide is composed once the direction exists (`direction.md`). This is vocabulary the author composes with, not a catalog the slide picks from: there is no slide type to select, only a page job, a relationship, and a composition move the author decides before writing a coordinate. `kit.md` draws the core page, `charts.md` adds native data carriers, and `pictures.md` adds the picture families.
4
4
 
5
- Rule strength as in `direction.md`: **Hard rule** (with `→ runtime \`code\`` or `→ manual`), **Default**, **Reference**.
5
+ Use this file as optional vocabulary and script-kit guidance. Layout recipes, density targets, rhythm intervals, type sizes, and decorative treatments are examples, not quotas for an HTML-authored page. Semantic relationships, explicit carrier promises, legibility, and the kit's actual geometry constraints still apply.
6
6
 
7
7
  ## 0. The page brief — decided before geometry (one plan line per slide)
8
8
  Each slide's plan line in the brief (`SKILL.md` §3) names, in this order:
9
9
  - **job** — cover · section · claim · evidence · process · comparison · structure · picture · closing (what the page does for the reader).
10
10
  - **relationship** — the atom the content carries (§1), or `none` for a focal claim.
11
11
  - **move** — what the reader now believes, decides, or does. **Hard rule — every slide states its move**: a slide that cannot state it is an outline defect — cut it or merge it, never decorate around it. → manual
12
- - **composition** — the page-scale move (§2 lens + §3 recipe in ordinary words: "one dark field on the left third holding the number; evidence hangs from a vertical rule on the right").
12
+ - **composition** — describe the intended arrangement in ordinary words; no lens or recipe must be selected.
13
13
  - **carriers** — what carries the content: chart · table · picture · hero · statement · quote · specimen · diagram · prose · list (`author` refuses a page that does not carry what its line named: `plan_promise_missing`, `SKILL.md` §3).
14
14
  - **texture** — prose · list · specimen · keywords (§8).
15
15
  - **rhythm** — anchor · dense · breathing (§7).
@@ -50,7 +50,7 @@ Before coordinates, name the move the page makes and the jobs it serves (surface
50
50
  ## 3. Page recipes — back to front, omit every layer without a job (Reference)
51
51
  | Page job | Back-to-front stack | Stop when |
52
52
  |---|---|---|
53
- | cover | hero field — a full accent or dark field (Naver, Sequoia), a full-bleed picture under a scrim (Samsung, NVIDIA), or paper with a wordmark and one illustration field (Kakao) → optional scrim or wash → one purposeful contour or motif at full size (`motif()`) → kicker + title + one line (date · author), never a list. Without a picture the title itself is the anchor: `poster()` sets the claim at poster scale on the field (Sequoia, a16z), and the one hero object stands on the right third — `orb()`, the lit sphere half the page tall that 13 of 26 measured mock covers carry (the object 0.26-0.67 of the canvas; a motif at low alpha reads as background and a beat without an object measures 0) | copy is safe and title and field read as one object |
53
+ | cover | hero field — a full accent or dark field (Naver, Sequoia), a full-bleed picture under a scrim (Samsung, NVIDIA), or paper with a wordmark and one illustration field (Kakao) → optional scrim or wash → one purposeful contour or motif at full size (`motif()`) → kicker + title + one line (date · author), never a list. Without a picture the title itself is the anchor: `poster()` sets the claim at poster scale on the field (Sequoia, a16z), and the one hero object stands on the right third — a picture, a drawn artifact, a `motif()` at full size, or a numeral (not `orb()`: the glowing sphere is on the generated-look list, `html.md` §8, and stays a script-route device for a brief that asks for it; the object 0.26-0.67 of the canvas — a motif at low alpha reads as background and a beat without an object measures 0) | copy is safe and title and field read as one object |
54
54
  | section | the cover's field again with the section name (Sequoia), a progressive agenda on the dark field with the current section lit (`agenda()`, the Coatue device), the section's number at 220 pt beside its claim (`numeralBeat()`, its default `size`; the a16z opener — every section a different accent field), or the label alone on paper (Kakao), or the section on its own picture — `picture()` full-bleed under a `scrim()`, the number and name in the scrim's light (the photo section of the Sequoia and Coatue decks; the one section device that carries a picture, so a photo deck's marks are not its cover repeated) → restrained wash → the motif at half size. Three devices, one deck: the section marks vary between them, never the same beat repeated | the deck language is recognizable and the reader knows where the deck is |
55
55
  | claim | quiet field → the statement or number at scale → one emphasis run or attribution → air where it gives the focal element room (below or beside, entering high). On paper the editorial hero (the frontier text page, measured across 26 rendered mock pages, September 2026): kicker → `display()` at cover size on two lines over 45-60% of the width → the deck line at lead size → a `statBand()` of three or four peers, or the one hero object (a picture, a product, a disc) on the right third → `dateline()` and the source closing the corners. Such a page measures only 0.02-0.09 largest object; the headline at 4-5 × the body, the strip under it, and the four corners are what separate it — never a card under the text | 40-60% of the canvas is deliberately empty |
56
56
  | evidence | title (+ sub line) on the open canvas, the source line at the foot → native chart/table/leaders filling the body between them, 40-60% of the canvas → the legend, a hero figure, or the kicker in the rail → optional takeaway on the dark field | the claim is native and the evidence is the largest element |
@@ -58,7 +58,7 @@ Before coordinates, name the move the page makes and the jobs it serves (surface
58
58
  | comparison | matched planes seamed by weight → optional shared wash or divider → matched labels → one difference marker on one side only | crop, elevation, and paint stay symmetric unless asymmetry is the claim |
59
59
  | structure | one field or outline → hierarchy by nesting, indentation, or scale → labels registered to their unit | placement alone communicates with color stripped |
60
60
  | picture | the picture family from `pictures.md` §2 — on a body page almost always the artifact row (`tiles()`: three or four screenshots, stills, or clippings on one baseline, a label and a caption each) or the collage (`clippings()`); the full-bleed photograph under a scrim is a cover or section device → modifier → native type on the calm zone | the captions say what each artifact proves; text sits on a scrim or beside the picture, never on it bare |
61
- | closing | the cover's field echoed (every reference deck closes on its cover's field: Samsung's photo, Naver's green, NVIDIA's swoosh, Kakao's mascot) → echoed contour or gradient, the motif at a corner, the cover's hero object at half size (`orb()`) → the ask or the thanks as the one line, in the on-dark accent (`poster()` at a step under the cover's size) → contact/meta | the ask is the most legible line |
61
+ | closing | the cover's field echoed (every reference deck closes on its cover's field: Samsung's photo, Naver's green, NVIDIA's swoosh, Kakao's mascot) → echoed contour or gradient, the motif at a corner, the cover's hero object at half size → the ask or the thanks as the one line, in the on-dark accent (`poster()` at a step under the cover's size) → contact/meta | the ask is the most legible line |
62
62
 
63
63
  ## 4. Starting structures — relationship → geometry (Reference, first placements only)
64
64
  Canvas 13.33 × 7.5 in, margin `M` 0.6; safe area x 0.6-12.73, y 0.6-6.9. Proportion follows information weight; these are first placements, not slots.