markilo 0.4.0 → 1.0.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 (140) hide show
  1. package/README.md +70 -47
  2. package/THIRD_PARTY_NOTICES.md +26 -12
  3. package/package.json +15 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/THIRD_PARTY_NOTICES.md +26 -12
  6. package/plugin/agents/concept-designer.md +14 -5
  7. package/plugin/agents/design-critic.md +32 -3
  8. package/plugin/dist/markilo.mjs +213 -146
  9. package/plugin/fonts/alegreya-sans/OFL.txt +93 -0
  10. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-400-normal.woff +0 -0
  11. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-500-normal.woff +0 -0
  12. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-700-normal.woff +0 -0
  13. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-800-normal.woff +0 -0
  14. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-400-normal.woff +0 -0
  15. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-500-normal.woff +0 -0
  16. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-700-normal.woff +0 -0
  17. package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-800-normal.woff +0 -0
  18. package/plugin/fonts/archivo/OFL.txt +93 -0
  19. package/plugin/fonts/archivo/archivo-latin-400-normal.woff +0 -0
  20. package/plugin/fonts/archivo/archivo-latin-500-normal.woff +0 -0
  21. package/plugin/fonts/archivo/archivo-latin-600-normal.woff +0 -0
  22. package/plugin/fonts/archivo/archivo-latin-700-normal.woff +0 -0
  23. package/plugin/fonts/archivo/archivo-latin-800-normal.woff +0 -0
  24. package/plugin/fonts/archivo/archivo-latin-900-normal.woff +0 -0
  25. package/plugin/fonts/archivo/archivo-latin-ext-400-normal.woff +0 -0
  26. package/plugin/fonts/archivo/archivo-latin-ext-500-normal.woff +0 -0
  27. package/plugin/fonts/archivo/archivo-latin-ext-600-normal.woff +0 -0
  28. package/plugin/fonts/archivo/archivo-latin-ext-700-normal.woff +0 -0
  29. package/plugin/fonts/archivo/archivo-latin-ext-800-normal.woff +0 -0
  30. package/plugin/fonts/archivo/archivo-latin-ext-900-normal.woff +0 -0
  31. package/plugin/fonts/atkinson-hyperlegible-next/OFL.txt +93 -0
  32. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-400-normal.woff +0 -0
  33. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-500-normal.woff +0 -0
  34. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-600-normal.woff +0 -0
  35. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-700-normal.woff +0 -0
  36. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-800-normal.woff +0 -0
  37. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-400-normal.woff +0 -0
  38. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-500-normal.woff +0 -0
  39. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-600-normal.woff +0 -0
  40. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-700-normal.woff +0 -0
  41. package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-800-normal.woff +0 -0
  42. package/plugin/fonts/bricolage-grotesque/OFL.txt +93 -0
  43. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-400-normal.woff +0 -0
  44. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-500-normal.woff +0 -0
  45. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-600-normal.woff +0 -0
  46. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-700-normal.woff +0 -0
  47. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-800-normal.woff +0 -0
  48. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-400-normal.woff +0 -0
  49. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-500-normal.woff +0 -0
  50. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-600-normal.woff +0 -0
  51. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-700-normal.woff +0 -0
  52. package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-800-normal.woff +0 -0
  53. package/plugin/fonts/dm-serif-display/OFL.txt +93 -0
  54. package/plugin/fonts/dm-serif-display/dm-serif-display-latin-400-normal.woff +0 -0
  55. package/plugin/fonts/dm-serif-display/dm-serif-display-latin-ext-400-normal.woff +0 -0
  56. package/plugin/fonts/familjen-grotesk/OFL.txt +93 -0
  57. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-400-normal.woff +0 -0
  58. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-500-normal.woff +0 -0
  59. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-600-normal.woff +0 -0
  60. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-700-normal.woff +0 -0
  61. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-400-normal.woff +0 -0
  62. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-500-normal.woff +0 -0
  63. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-600-normal.woff +0 -0
  64. package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-700-normal.woff +0 -0
  65. package/plugin/fonts/fonts.json +628 -0
  66. package/plugin/fonts/instrument-serif/OFL.txt +93 -0
  67. package/plugin/fonts/instrument-serif/instrument-serif-latin-400-normal.woff +0 -0
  68. package/plugin/fonts/instrument-serif/instrument-serif-latin-ext-400-normal.woff +0 -0
  69. package/plugin/fonts/newsreader/OFL.txt +93 -0
  70. package/plugin/fonts/newsreader/newsreader-latin-400-normal.woff +0 -0
  71. package/plugin/fonts/newsreader/newsreader-latin-500-normal.woff +0 -0
  72. package/plugin/fonts/newsreader/newsreader-latin-600-normal.woff +0 -0
  73. package/plugin/fonts/newsreader/newsreader-latin-700-normal.woff +0 -0
  74. package/plugin/fonts/newsreader/newsreader-latin-800-normal.woff +0 -0
  75. package/plugin/fonts/newsreader/newsreader-latin-ext-400-normal.woff +0 -0
  76. package/plugin/fonts/newsreader/newsreader-latin-ext-500-normal.woff +0 -0
  77. package/plugin/fonts/newsreader/newsreader-latin-ext-600-normal.woff +0 -0
  78. package/plugin/fonts/newsreader/newsreader-latin-ext-700-normal.woff +0 -0
  79. package/plugin/fonts/newsreader/newsreader-latin-ext-800-normal.woff +0 -0
  80. package/plugin/fonts/schibsted-grotesk/OFL.txt +93 -0
  81. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-400-normal.woff +0 -0
  82. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-500-normal.woff +0 -0
  83. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-600-normal.woff +0 -0
  84. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-700-normal.woff +0 -0
  85. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-800-normal.woff +0 -0
  86. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-900-normal.woff +0 -0
  87. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-400-normal.woff +0 -0
  88. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-500-normal.woff +0 -0
  89. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-600-normal.woff +0 -0
  90. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-700-normal.woff +0 -0
  91. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-800-normal.woff +0 -0
  92. package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-900-normal.woff +0 -0
  93. package/plugin/fonts/space-mono/OFL.txt +93 -0
  94. package/plugin/fonts/space-mono/space-mono-latin-400-normal.woff +0 -0
  95. package/plugin/fonts/space-mono/space-mono-latin-700-normal.woff +0 -0
  96. package/plugin/fonts/space-mono/space-mono-latin-ext-400-normal.woff +0 -0
  97. package/plugin/fonts/space-mono/space-mono-latin-ext-700-normal.woff +0 -0
  98. package/plugin/fonts/syne/OFL.txt +93 -0
  99. package/plugin/fonts/syne/syne-latin-400-normal.woff +0 -0
  100. package/plugin/fonts/syne/syne-latin-500-normal.woff +0 -0
  101. package/plugin/fonts/syne/syne-latin-600-normal.woff +0 -0
  102. package/plugin/fonts/syne/syne-latin-700-normal.woff +0 -0
  103. package/plugin/fonts/syne/syne-latin-800-normal.woff +0 -0
  104. package/plugin/fonts/syne/syne-latin-ext-400-normal.woff +0 -0
  105. package/plugin/fonts/syne/syne-latin-ext-500-normal.woff +0 -0
  106. package/plugin/fonts/syne/syne-latin-ext-600-normal.woff +0 -0
  107. package/plugin/fonts/syne/syne-latin-ext-700-normal.woff +0 -0
  108. package/plugin/fonts/syne/syne-latin-ext-800-normal.woff +0 -0
  109. package/plugin/fonts/unbounded/OFL.txt +93 -0
  110. package/plugin/fonts/unbounded/unbounded-latin-400-normal.woff +0 -0
  111. package/plugin/fonts/unbounded/unbounded-latin-500-normal.woff +0 -0
  112. package/plugin/fonts/unbounded/unbounded-latin-600-normal.woff +0 -0
  113. package/plugin/fonts/unbounded/unbounded-latin-700-normal.woff +0 -0
  114. package/plugin/fonts/unbounded/unbounded-latin-800-normal.woff +0 -0
  115. package/plugin/fonts/unbounded/unbounded-latin-900-normal.woff +0 -0
  116. package/plugin/fonts/unbounded/unbounded-latin-ext-400-normal.woff +0 -0
  117. package/plugin/fonts/unbounded/unbounded-latin-ext-500-normal.woff +0 -0
  118. package/plugin/fonts/unbounded/unbounded-latin-ext-600-normal.woff +0 -0
  119. package/plugin/fonts/unbounded/unbounded-latin-ext-700-normal.woff +0 -0
  120. package/plugin/fonts/unbounded/unbounded-latin-ext-800-normal.woff +0 -0
  121. package/plugin/fonts/unbounded/unbounded-latin-ext-900-normal.woff +0 -0
  122. package/plugin/fonts/young-serif/OFL.txt +93 -0
  123. package/plugin/fonts/young-serif/young-serif-latin-400-normal.woff +0 -0
  124. package/plugin/fonts/young-serif/young-serif-latin-ext-400-normal.woff +0 -0
  125. package/plugin/fonts/zilla-slab/OFL.txt +93 -0
  126. package/plugin/fonts/zilla-slab/zilla-slab-latin-400-normal.woff +0 -0
  127. package/plugin/fonts/zilla-slab/zilla-slab-latin-500-normal.woff +0 -0
  128. package/plugin/fonts/zilla-slab/zilla-slab-latin-600-normal.woff +0 -0
  129. package/plugin/fonts/zilla-slab/zilla-slab-latin-700-normal.woff +0 -0
  130. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-400-normal.woff +0 -0
  131. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-500-normal.woff +0 -0
  132. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-600-normal.woff +0 -0
  133. package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-700-normal.woff +0 -0
  134. package/plugin/skills/concepts/SKILL.md +4 -4
  135. package/plugin/skills/design/SKILL.md +35 -12
  136. package/plugin/skills/design/references/cli.md +37 -36
  137. package/plugin/skills/design/references/construction.md +34 -1
  138. package/plugin/skills/design/references/design-principles.md +30 -0
  139. package/plugin/skills/export/SKILL.md +4 -2
  140. package/plugin/skills/gallery/SKILL.md +7 -6
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  <p align="center">
14
14
  <a href="https://github.com/cihantopac/markilo/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/cihantopac/markilo/actions/workflows/ci.yml/badge.svg"></a>
15
15
  <a href="LICENSE"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/license-Apache--2.0-d12c12"></a>
16
- <img alt="Version" src="https://img.shields.io/badge/version-0.4.0-101218">
16
+ <img alt="Version" src="https://img.shields.io/badge/version-1.0.0-101218">
17
17
  <img alt="Platforms" src="https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20Windows-101218">
18
18
  </p>
19
19
 
@@ -47,15 +47,21 @@ registry search has been done yet; the guidelines say so.</sub>
47
47
  logged registry searches the answer is `insufficient-evidence`, never "clear". Calibrated on 24 real brands' logos
48
48
  (AUC 0.99; mirrored, rotated and recolored copies always caught; see [docs/ORIGINALITY.md](docs/ORIGINALITY.md)). It
49
49
  finds conflicts among what was collected; it cannot prove a mark is unique or registrable.
50
+ - **Ideas before drawings.** Every identity starts from a longlist of at least 12 visual hooks from the product, the
51
+ audience, the name, type and abstract character; a critic strikes the ones a stranger would read as a UI glyph or a
52
+ cliché from the words alone, before anything is drawn, and the gallery shows what was kept and why.
50
53
  - **Real design output.** Symbols built from construction specs — primitives, booleans, gaps, offsets, fillets,
51
54
  repeats and real letterforms, compiled with Skia's path engine into clean SVG — and tuned by measured variants.
52
- Wordmarks outlined from OFL fonts with real kerning (Turkish and other Latin-extended letters included), lockups
53
- aligned to cap height, OKLCH tonal palettes with WCAG pairs.
55
+ Wordmarks outlined from 24 bundled OFL families chosen for the brief's character, with real kerning (Turkish and
56
+ other Latin-extended letters checked in every weight); every changed letter is measured against the font's own
57
+ alphabet, so a word that would be misread ("an e that lost its eye", a dot that reads as a hyphen) is caught before
58
+ review. Lockups aligned to cap height, OKLCH tonal palettes with WCAG pairs.
54
59
  - **Looks before it talks.** Directions start as cheap sketches that a critical review must pick before any are
55
60
  developed. Every concept is rendered to a review sheet (16–256 px, light, dark, black, white) and a context sheet (a
56
61
  browser tab, a home screen next to the competitors, a site header, an avatar). An independent critic records a blind
57
62
  first impression before it reads the rationale, and only concepts that pass its gate (brand fit, distinctiveness and
58
- memorability ≥ 6, average ≥ 6.5, "a senior designer would present it") reach you.
63
+ memorability ≥ 6 and "a senior designer would present it") reach you. A first look on the edge of the bar is decided
64
+ by the majority of three cold looks from fresh critics, and the designer can never approve its own work.
59
65
  - **Complete asset kit.** Logo variants, favicons, PWA + maskable icons, iOS (incl. dark/tinted and Icon Composer
60
66
  layers), macOS `.icns`, Android adaptive + themed icons, Windows ICO + MSIX assets, Open Graph and social images,
61
67
  marketing templates, design tokens and brand guidelines, with a manifest of sizes and hashes. You get what the
@@ -69,61 +75,75 @@ registry search has been done yet; the guidelines say so.</sub>
69
75
  are reproduced byte-for-byte and never redesigned.
70
76
  - **Fits your stack.** `install-assets --framework auto` puts the files where Next.js (App Router metadata files),
71
77
  Laravel, Flutter (Android, iOS and web) or a static site expects them — a dry run first, backups before anything is
72
- replaced. Claude Code is home; Codex, Cursor and other agents can run the same workflow through the CLI
73
- (`agent-setup`, see [docs/INTEGRATIONS.md](docs/INTEGRATIONS.md)).
78
+ replaced.
79
+ - **Not tied to one AI.** Claude Code is home, but the toolchain is a plain CLI: `agent-setup` gives VS Code with
80
+ Copilot, Codex and Cursor the same workflow, with the researcher, designer and critic as sub-agents on the models
81
+ you choose (see [docs/INTEGRATIONS.md](docs/INTEGRATIONS.md)).
74
82
 
75
83
  ## Measured quality
76
84
 
77
- Markilo is benchmarked end to end with nobody steering, on seven realistic products (an independent SaaS, a mobile
78
- app, a multi-product family, a developer tool, an online shop, a B2B platform and a learning app). Four of them were
79
- **holdouts** for a while: written before the changes they test and never used for tuning until those results were
80
- in. The plugin researches, writes the brief, designs, critiques, and finalizes only what passes its own gate. Blind
81
- judges then rate every critiqued concept from the brief and the images alone. Every run, image and score is in
82
- [bench/](bench).
83
-
84
- | Version | Runs | Passed the gate | Opus 5.5 judge would present (of concepts it judged) | Time per run | Cost per run (API equivalent) |
85
- | ---------------- | ------------------- | --------------- | ---------------------------------------------------- | ------------ | ----------------------------- |
86
- | 0.4.0-rc.1 | 3 | 0 | — | 11–21 min | $2.61–3.67 |
87
- | 0.4.0-rc.2 | 3 | 1 | — | 8–15 min | $1.60–2.68 |
88
- | 0.4.0-rc.3 | 3 | 2 | 0 of 2 (the two that passed) | 14–24 min | $3.15–4.37 |
89
- | 0.4.0-rc.5 | 9 (6 on holdouts) | 2 | 0 of 12 | 10–19 min | $2.29–4.41 |
90
- | 0.4.0-rc.7 | 11 (2 new holdouts) | 0 | 2 of 5 — both rejected by the gate | 6–16 min | $1.66–3.30 |
91
- | 0.4.0-rc.8 | 9 | 0 | 0 of 3 — the recalibrated gate agreed on all 3 | 8–18 min | $1.91–3.48 |
92
- | **0.4.0** (rc.9) | **9** | **2** | **Portwise 2 of 4 looks, Dozeline 0 of 4** | 14–28 min | $3.00–7.13 |
85
+ Markilo is benchmarked end to end with nobody steering, on nine realistic products (an independent SaaS, a mobile
86
+ app, a multi-product family, a developer tool, an online shop, a B2B platform, a learning app, a feature-flag service
87
+ and a team secrets manager). Six of them were **holdouts** for a while: written before the changes they test and
88
+ never used for tuning until those results were in. The plugin researches, writes the brief, designs, critiques, and
89
+ finalizes only what passes its own gate. Blind judges then rate every critiqued concept from the brief and the images
90
+ alone. Every run, image and score is in [bench/](bench).
91
+
92
+ | Version | Runs | Passed the gate | Opus 5.5 judge would present (of concepts it judged) | Time per run | Cost per run (API equivalent) |
93
+ | ------------ | ------------------------------------------- | ------------------------ | ---------------------------------------------------- | ------------ | ----------------------------- |
94
+ | 0.4.0-rc.1 | 3 | 0 | — | 11–21 min | $2.61–3.67 |
95
+ | 0.4.0-rc.2 | 3 | 1 | — | 8–15 min | $1.60–2.68 |
96
+ | 0.4.0-rc.3 | 3 | 2 | 0 of 2 (the two that passed) | 14–24 min | $3.15–4.37 |
97
+ | 0.4.0-rc.5 | 9 (6 on holdouts) | 2 | 0 of 12 | 10–19 min | $2.29–4.41 |
98
+ | 0.4.0-rc.7 | 11 (2 new holdouts) | 0 | 2 of 5 — both rejected by the gate | 6–16 min | $1.66–3.30 |
99
+ | 0.4.0-rc.8 | 9 | 0 | 0 of 3 — the recalibrated gate agreed on all 3 | 8–18 min | $1.91–3.48 |
100
+ | 0.4.0 (rc.9) | 9 | 2 | Portwise 2 of 4 looks, Dozeline 0 of 4 | 14–28 min | $3.00–7.13 |
101
+ | 0.5.0-rc.1 | 9 (4 on new holdouts) | 2 | 2 of 29, the two that passed (3/3 and 2/3 looks) | 14–36 min | $3.37–5.86 |
102
+ | **1.0.0** | **14 (5 sealed holdouts, 9 on real tools)** | **2, both false passes** | **0 of 43 (Opus + Sonnet panel)** | 21–35 min | $6.85–13.87 |
93
103
 
94
104
  What this shows, plainly:
95
105
 
96
- - **Unattended, Markilo rarely reaches its own gate** — 4 of the 38 validation runs since rc.5, 1 of 8 on briefs that
97
- were still untouched holdouts when they ran. rc.3's two of three did not hold up on new briefs.
98
- - **Markilo's best unattended work sits on the line of "presentable".** rc.9 (sketch review that only strikes clear
99
- failures, a calibrated cold-look gate on Opus) developed 22 of 27 directions and passed two identities. A strict
100
- judge looked at each borderline mark four times: Portwise was presentable in two of four looks, Dozeline in none.
101
- At this level a single judgment flips about half the time, so the gate now errs about as often as the judge
102
- disagrees with itself; what is left is making better marks, not tuning the gate.
106
+ - **1.0 did not make unattended work better, and says so.** On five briefs sealed before any 1.0 change and on three
107
+ real developer tools, an independent panel (Opus and Sonnet, blind) would present none of the 1.0 concepts; it would
108
+ not have presented the 0.5.0-rc.1 ones either. The two 1.0 gate passes were edge passes the panel rejected; the
109
+ gallery now marks such passes "at the edge". What 1.0 did improve is everything around the design: safety, the
110
+ install transaction, letter checks, typefaces, the critique process and the evidence. See
111
+ [bench/results/1.0.0](bench/results/1.0.0).
112
+
113
+ - **Unattended, Markilo still rarely reaches its own gate** — 6 of the 47 validation runs since rc.5, 2 of 12 on
114
+ briefs that were still untouched holdouts when they ran.
115
+ - **For the first time, what passes is what a strict judge would present.** In 0.5.0-rc.1 the gate and the Opus judge
116
+ (the majority of three looks per concept) agreed on all 29 critiqued concepts, and both identities that passed —
117
+ Quillnest, and Pinehold on a brief written for this round — were presentable to the judge. In 0.4.0 the two that
118
+ passed split it 2 of 4 and 0 of 4.
119
+ - **Words beat invented symbols.** Both passes were wordmark-led: the name drawn from a real typeface with one letter
120
+ changed, the icon cut from it (2 of 13 judged presentable; invented symbols 0 of 16). Symbols assembled from
121
+ rectangles, circles and polygons keep reading as UI icons or objects — a power button, a wallet, an eye.
122
+ - **Reworking a failed idea does not work, so Markilo stopped doing it.** Of 34 concepts sent back after a failed gate
123
+ in earlier rounds, one passed later, after three rounds. The gate now says `fix` once or `reject`; in rc.1 one
124
+ concept got a fix round, and the budget went to more directions instead (43, up from 27).
103
125
  - **How the gate got here was measured.** The critic's scores given after reading the rationale barely tracked the
104
- strict judge (Spearman 0.20 on 32 concepts), a cold look did much better (0.51); the gate now rests on the cold
105
- look. A sketch review that bet on the finished score stopped 24 of 27 directions; one that strikes only clear
106
- failures lets the gate decide.
107
- - **It does not ship weak work.** Across all runs the gate and the judges agreed on 48 of 57 critiqued concepts, and
108
- most disagreements were marks the judge itself splits on. When nothing passes, Markilo says so and nothing is finalized or exported.
126
+ strict judge (Spearman 0.20 on 32 concepts), a cold look did much better (0.51); the gate rests on the cold look.
127
+ Across all runs the gate and the judges agreed on 77 of 86 critiqued concepts. When nothing passes, Markilo says
128
+ so and nothing is finalized or exported.
109
129
  - **What moved the needle was measured, not guessed.** Hairline gaps came from Markilo's own guide; clichés reached
110
130
  development because the sketch review picked the best of weak boards; the name's initial with a cut became the
111
131
  default move once objects were ruled out; same-colour layers left seams. Each was found in the runs and fixed in
112
132
  the plugin. The model was not the bottleneck (Opus 5.5 as designer did no better on the SaaS brief).
113
133
 
114
- Markilo is built to work with you: you pick directions, react in the gallery and decide. Unattended runs measure
115
- the floor. Two of them, as exported (fictional products, no human edits):
134
+ Markilo is built to work with you: you pick the sketch to develop, react in the gallery and decide. Unattended runs
135
+ measure the floor. The two that passed in 0.5.0-rc.1, as exported (fictional products, no human edits):
116
136
 
117
137
  <table>
118
138
  <tr>
119
- <td><img src="bench/results/0.4.0-rc.3/saas-invoicing/tallyline/overview.png" alt="Tallyline logo files made by Markilo unattended"></td>
120
- <td><img src="bench/results/0.4.0-rc.3/mobile-sleep/dozeline/overview.png" alt="Dozeline logo files made by Markilo unattended"></td>
139
+ <td><img src="bench/results/0.5.0-rc.1/edu-app/quillnest/overview.png" alt="Quillnest logo files made by Markilo unattended"></td>
140
+ <td><img src="bench/results/0.5.0-rc.1/secrets-team-r2/pinehold/overview.png" alt="Pinehold logo files made by Markilo unattended"></td>
121
141
  </tr>
122
142
  <tr>
123
- <td><sub>Tallyline (invoicing SaaS): critic 6.8, passed the gate; Sonnet judge 6.4 "present", Opus judge 6.2 "not as is"
124
- — the T reads as a figure kicking a ball.</sub></td>
125
- <td><sub>Dozeline (sleep app): critic 6.8, passed the gate; Sonnet judge 6.8 "present", Opus judge 5.8 "not as is" — the
126
- arch motif is common.</sub></td>
143
+ <td><sub>Quillnest (writing coach for teenagers): passed the gate; Opus judge "present" in 3 of 3 looks, 6.3 — "a
144
+ smiling face built from a q, with the orange dot as a nose".</sub></td>
145
+ <td><sub>Pinehold (secrets manager for small teams, a fresh holdout): passed the gate; Opus judge "present" in 2 of 3
146
+ looks, 6.3 — "an arch or doorway sheltering an orange seed".</sub></td>
127
147
  </tr>
128
148
  </table>
129
149
 
@@ -196,12 +216,13 @@ you › /markilo:design ./ — we're launching this as a product, it needs an i
196
216
  › Discover: no real identity yet → mode "new". May I research competitors on the web? (y)
197
217
  › Research: 8 competitors, category codes (green + shields everywhere), 3 gaps recorded
198
218
  › Brief: 3 questions, each with a suggested answer
199
- › Explore: 3 directions — "Pulse" monogram, "Lighthouse" pictogram, "Signal" abstract
200
- › Sketch: 4 quick constructions per direction; the sketch review keeps one per direction, drops "Signal"
219
+ › Ideas: 16 visual hooks; the critic strikes 11 from the words ("a gauge", "a return key"), keeps 5
220
+ › Explore: 3 directions from the kept ideas — "Pulse" monogram, "Lighthouse" pictogram, "Signal" abstract
221
+ › Sketch: 4 quick constructions per direction; you pick in the gallery, with the critic's reading beside each
201
222
  › Design: concept-designer agents develop the picks; each iterates on its review and context sheets
202
223
  › Verify: "Lighthouse" 71% similar to a competitor reference → reworked from the idea up
203
224
  › Critique: blind first look ("reads as: a pin, a drop") then scores; only "Pulse" passes the gate
204
- › Review: gallery at http://127.0.0.1:…/ — pin a note on the stem, compare, "Send to Claude"
225
+ › Review: gallery at http://127.0.0.1:…/ — pin a note on the stem, compare, "Send to your agent"
205
226
  › Deliverables: a web app → logos, web, social, tokens, guidelines (app icons are one question away)
206
227
  › Finalize "Pulse" → Export: 80 files → Next.js detected: 10 files for app/ and public/ (dry run, 0 overwrites)
207
228
  ```
@@ -302,8 +323,10 @@ Details: [docs/PRIVACY.md](docs/PRIVACY.md) · [SECURITY.md](SECURITY.md).
302
323
  - Icon Composer (`.icon`) files are not written directly; Markilo exports the layer sources to import.
303
324
  - X (Twitter) image sizes could not be verified against x.com documentation (blocked to automated readers).
304
325
  - Design quality still depends on the model and on your direction: unattended runs rarely pass the critic gate, and a
305
- strict independent judge accepts only a few of the marks they develop (see [Measured quality](#measured-quality)). Markilo raises the floor and refuses to hide weak work; taste is a
306
- conversation.
326
+ strict independent judge accepts only a few of the marks they develop (see [Measured quality](#measured-quality)).
327
+ On real developer tools with coined names, twelve unattended runs produced no identity an independent panel would
328
+ present ([bench/results/1.0.0/real-projects.md](bench/results/1.0.0/real-projects.md)). Markilo raises the floor and
329
+ refuses to hide weak work; taste is a conversation, and the gallery is where you steer it.
307
330
 
308
331
  ## Develop
309
332
 
@@ -5,18 +5,32 @@ each under its own license. Generated by `scripts/notices.mjs`.
5
5
 
6
6
  ## Fonts (`plugin/fonts/`)
7
7
 
8
- | Family | License | Source |
9
- | ----------------- | ------------------------------------------------------ | ------------------------------------------------------ |
10
- | Inter | SIL OFL 1.1 (`plugin/fonts/inter/OFL.txt`) | @fontsource/inter@5.3.0 (Google Fonts v20) |
11
- | Manrope | SIL OFL 1.1 (`plugin/fonts/manrope/OFL.txt`) | @fontsource/manrope@5.3.0 (Google Fonts v20) |
12
- | Space Grotesk | SIL OFL 1.1 (`plugin/fonts/space-grotesk/OFL.txt`) | @fontsource/space-grotesk@5.3.0 (Google Fonts v22) |
13
- | Sora | SIL OFL 1.1 (`plugin/fonts/sora/OFL.txt`) | @fontsource/sora@5.3.0 (Google Fonts v17) |
14
- | DM Sans | SIL OFL 1.1 (`plugin/fonts/dm-sans/OFL.txt`) | @fontsource/dm-sans@5.3.0 (Google Fonts v17) |
15
- | Outfit | SIL OFL 1.1 (`plugin/fonts/outfit/OFL.txt`) | @fontsource/outfit@5.3.0 (Google Fonts v15) |
16
- | Plus Jakarta Sans | SIL OFL 1.1 (`plugin/fonts/plus-jakarta-sans/OFL.txt`) | @fontsource/plus-jakarta-sans@5.3.0 (Google Fonts v12) |
17
- | Fraunces | SIL OFL 1.1 (`plugin/fonts/fraunces/OFL.txt`) | @fontsource/fraunces@5.3.0 (Google Fonts v38) |
18
- | IBM Plex Serif | SIL OFL 1.1 (`plugin/fonts/ibm-plex-serif/OFL.txt`) | @fontsource/ibm-plex-serif@5.3.0 (Google Fonts v20) |
19
- | JetBrains Mono | SIL OFL 1.1 (`plugin/fonts/jetbrains-mono/OFL.txt`) | @fontsource/jetbrains-mono@5.3.0 (Google Fonts v24) |
8
+ | Family | License | Source |
9
+ | -------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------- |
10
+ | Inter | SIL OFL 1.1 (`plugin/fonts/inter/OFL.txt`) | @fontsource/inter@5.3.0 (Google Fonts v20) |
11
+ | Manrope | SIL OFL 1.1 (`plugin/fonts/manrope/OFL.txt`) | @fontsource/manrope@5.3.0 (Google Fonts v20) |
12
+ | Space Grotesk | SIL OFL 1.1 (`plugin/fonts/space-grotesk/OFL.txt`) | @fontsource/space-grotesk@5.3.0 (Google Fonts v22) |
13
+ | Sora | SIL OFL 1.1 (`plugin/fonts/sora/OFL.txt`) | @fontsource/sora@5.3.0 (Google Fonts v17) |
14
+ | DM Sans | SIL OFL 1.1 (`plugin/fonts/dm-sans/OFL.txt`) | @fontsource/dm-sans@5.3.0 (Google Fonts v17) |
15
+ | Outfit | SIL OFL 1.1 (`plugin/fonts/outfit/OFL.txt`) | @fontsource/outfit@5.3.0 (Google Fonts v15) |
16
+ | Plus Jakarta Sans | SIL OFL 1.1 (`plugin/fonts/plus-jakarta-sans/OFL.txt`) | @fontsource/plus-jakarta-sans@5.3.0 (Google Fonts v12) |
17
+ | Fraunces | SIL OFL 1.1 (`plugin/fonts/fraunces/OFL.txt`) | @fontsource/fraunces@5.3.0 (Google Fonts v38) |
18
+ | IBM Plex Serif | SIL OFL 1.1 (`plugin/fonts/ibm-plex-serif/OFL.txt`) | @fontsource/ibm-plex-serif@5.3.0 (Google Fonts v20) |
19
+ | JetBrains Mono | SIL OFL 1.1 (`plugin/fonts/jetbrains-mono/OFL.txt`) | @fontsource/jetbrains-mono@5.3.0 (Google Fonts v24) |
20
+ | Bricolage Grotesque | SIL OFL 1.1 (`plugin/fonts/bricolage-grotesque/OFL.txt`) | @fontsource/bricolage-grotesque@5.3.0 (Google Fonts v9) |
21
+ | Instrument Serif | SIL OFL 1.1 (`plugin/fonts/instrument-serif/OFL.txt`) | @fontsource/instrument-serif@5.3.0 (Google Fonts v5) |
22
+ | Young Serif | SIL OFL 1.1 (`plugin/fonts/young-serif/OFL.txt`) | @fontsource/young-serif@5.3.0 (Google Fonts v2) |
23
+ | DM Serif Display | SIL OFL 1.1 (`plugin/fonts/dm-serif-display/OFL.txt`) | @fontsource/dm-serif-display@5.3.0 (Google Fonts v17) |
24
+ | Syne | SIL OFL 1.1 (`plugin/fonts/syne/OFL.txt`) | @fontsource/syne@5.3.0 (Google Fonts v24) |
25
+ | Unbounded | SIL OFL 1.1 (`plugin/fonts/unbounded/OFL.txt`) | @fontsource/unbounded@5.3.0 (Google Fonts v12) |
26
+ | Archivo | SIL OFL 1.1 (`plugin/fonts/archivo/OFL.txt`) | @fontsource/archivo@5.3.0 (Google Fonts v25) |
27
+ | Schibsted Grotesk | SIL OFL 1.1 (`plugin/fonts/schibsted-grotesk/OFL.txt`) | @fontsource/schibsted-grotesk@5.3.0 (Google Fonts v7) |
28
+ | Newsreader | SIL OFL 1.1 (`plugin/fonts/newsreader/OFL.txt`) | @fontsource/newsreader@5.3.0 (Google Fonts v26) |
29
+ | Zilla Slab | SIL OFL 1.1 (`plugin/fonts/zilla-slab/OFL.txt`) | @fontsource/zilla-slab@5.3.0 (Google Fonts v12) |
30
+ | Space Mono | SIL OFL 1.1 (`plugin/fonts/space-mono/OFL.txt`) | @fontsource/space-mono@5.3.0 (Google Fonts v17) |
31
+ | Atkinson Hyperlegible Next | SIL OFL 1.1 (`plugin/fonts/atkinson-hyperlegible-next/OFL.txt`) | @fontsource/atkinson-hyperlegible-next@5.3.0 (Google Fonts v7) |
32
+ | Alegreya Sans | SIL OFL 1.1 (`plugin/fonts/alegreya-sans/OFL.txt`) | @fontsource/alegreya-sans@5.3.0 (Google Fonts v28) |
33
+ | Familjen Grotesk | SIL OFL 1.1 (`plugin/fonts/familjen-grotesk/OFL.txt`) | @fontsource/familjen-grotesk@5.3.0 (Google Fonts v11) |
20
34
 
21
35
  ## Bundled into `plugin/dist/markilo.mjs`, `plugin/dist/resvg.wasm` and `plugin/dist/pathkit.wasm`
22
36
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markilo",
3
- "version": "0.4.0",
3
+ "version": "1.0.0",
4
4
  "description": "AI-powered brand identity studio for Claude Code: research, originality analysis, SVG identity design, verification and complete asset export.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -52,16 +52,30 @@
52
52
  },
53
53
  "devDependencies": {
54
54
  "@biomejs/biome": "2.6.4",
55
+ "@fontsource/alegreya-sans": "5.3.0",
56
+ "@fontsource/archivo": "5.3.0",
57
+ "@fontsource/atkinson-hyperlegible-next": "5.3.0",
58
+ "@fontsource/bricolage-grotesque": "5.3.0",
55
59
  "@fontsource/dm-sans": "5.3.0",
60
+ "@fontsource/dm-serif-display": "5.3.0",
61
+ "@fontsource/familjen-grotesk": "5.3.0",
56
62
  "@fontsource/fraunces": "5.3.0",
57
63
  "@fontsource/ibm-plex-serif": "5.3.0",
64
+ "@fontsource/instrument-serif": "5.3.0",
58
65
  "@fontsource/inter": "5.3.0",
59
66
  "@fontsource/jetbrains-mono": "5.3.0",
60
67
  "@fontsource/manrope": "5.3.0",
68
+ "@fontsource/newsreader": "5.3.0",
61
69
  "@fontsource/outfit": "5.3.0",
62
70
  "@fontsource/plus-jakarta-sans": "5.3.0",
71
+ "@fontsource/schibsted-grotesk": "5.3.0",
63
72
  "@fontsource/sora": "5.3.0",
64
73
  "@fontsource/space-grotesk": "5.3.0",
74
+ "@fontsource/space-mono": "5.3.0",
75
+ "@fontsource/syne": "5.3.0",
76
+ "@fontsource/unbounded": "5.3.0",
77
+ "@fontsource/young-serif": "5.3.0",
78
+ "@fontsource/zilla-slab": "5.3.0",
65
79
  "@resvg/resvg-wasm": "2.6.2",
66
80
  "@types/node": "22.20.5",
67
81
  "@types/pngjs": "6.0.5",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "markilo",
3
3
  "displayName": "Markilo",
4
- "version": "0.4.0",
4
+ "version": "1.0.0",
5
5
  "description": "AI-powered brand identity studio: brand research, originality and similarity analysis, original SVG identity design with visual verification, and complete asset export (web, iOS, Android, macOS, Windows, social).",
6
6
  "author": {
7
7
  "name": "Cihan Topa\u00e7",
@@ -5,18 +5,32 @@ each under its own license. Generated by `scripts/notices.mjs`.
5
5
 
6
6
  ## Fonts (`plugin/fonts/`)
7
7
 
8
- | Family | License | Source |
9
- | ----------------- | ------------------------------------------------------ | ------------------------------------------------------ |
10
- | Inter | SIL OFL 1.1 (`plugin/fonts/inter/OFL.txt`) | @fontsource/inter@5.3.0 (Google Fonts v20) |
11
- | Manrope | SIL OFL 1.1 (`plugin/fonts/manrope/OFL.txt`) | @fontsource/manrope@5.3.0 (Google Fonts v20) |
12
- | Space Grotesk | SIL OFL 1.1 (`plugin/fonts/space-grotesk/OFL.txt`) | @fontsource/space-grotesk@5.3.0 (Google Fonts v22) |
13
- | Sora | SIL OFL 1.1 (`plugin/fonts/sora/OFL.txt`) | @fontsource/sora@5.3.0 (Google Fonts v17) |
14
- | DM Sans | SIL OFL 1.1 (`plugin/fonts/dm-sans/OFL.txt`) | @fontsource/dm-sans@5.3.0 (Google Fonts v17) |
15
- | Outfit | SIL OFL 1.1 (`plugin/fonts/outfit/OFL.txt`) | @fontsource/outfit@5.3.0 (Google Fonts v15) |
16
- | Plus Jakarta Sans | SIL OFL 1.1 (`plugin/fonts/plus-jakarta-sans/OFL.txt`) | @fontsource/plus-jakarta-sans@5.3.0 (Google Fonts v12) |
17
- | Fraunces | SIL OFL 1.1 (`plugin/fonts/fraunces/OFL.txt`) | @fontsource/fraunces@5.3.0 (Google Fonts v38) |
18
- | IBM Plex Serif | SIL OFL 1.1 (`plugin/fonts/ibm-plex-serif/OFL.txt`) | @fontsource/ibm-plex-serif@5.3.0 (Google Fonts v20) |
19
- | JetBrains Mono | SIL OFL 1.1 (`plugin/fonts/jetbrains-mono/OFL.txt`) | @fontsource/jetbrains-mono@5.3.0 (Google Fonts v24) |
8
+ | Family | License | Source |
9
+ | -------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------- |
10
+ | Inter | SIL OFL 1.1 (`plugin/fonts/inter/OFL.txt`) | @fontsource/inter@5.3.0 (Google Fonts v20) |
11
+ | Manrope | SIL OFL 1.1 (`plugin/fonts/manrope/OFL.txt`) | @fontsource/manrope@5.3.0 (Google Fonts v20) |
12
+ | Space Grotesk | SIL OFL 1.1 (`plugin/fonts/space-grotesk/OFL.txt`) | @fontsource/space-grotesk@5.3.0 (Google Fonts v22) |
13
+ | Sora | SIL OFL 1.1 (`plugin/fonts/sora/OFL.txt`) | @fontsource/sora@5.3.0 (Google Fonts v17) |
14
+ | DM Sans | SIL OFL 1.1 (`plugin/fonts/dm-sans/OFL.txt`) | @fontsource/dm-sans@5.3.0 (Google Fonts v17) |
15
+ | Outfit | SIL OFL 1.1 (`plugin/fonts/outfit/OFL.txt`) | @fontsource/outfit@5.3.0 (Google Fonts v15) |
16
+ | Plus Jakarta Sans | SIL OFL 1.1 (`plugin/fonts/plus-jakarta-sans/OFL.txt`) | @fontsource/plus-jakarta-sans@5.3.0 (Google Fonts v12) |
17
+ | Fraunces | SIL OFL 1.1 (`plugin/fonts/fraunces/OFL.txt`) | @fontsource/fraunces@5.3.0 (Google Fonts v38) |
18
+ | IBM Plex Serif | SIL OFL 1.1 (`plugin/fonts/ibm-plex-serif/OFL.txt`) | @fontsource/ibm-plex-serif@5.3.0 (Google Fonts v20) |
19
+ | JetBrains Mono | SIL OFL 1.1 (`plugin/fonts/jetbrains-mono/OFL.txt`) | @fontsource/jetbrains-mono@5.3.0 (Google Fonts v24) |
20
+ | Bricolage Grotesque | SIL OFL 1.1 (`plugin/fonts/bricolage-grotesque/OFL.txt`) | @fontsource/bricolage-grotesque@5.3.0 (Google Fonts v9) |
21
+ | Instrument Serif | SIL OFL 1.1 (`plugin/fonts/instrument-serif/OFL.txt`) | @fontsource/instrument-serif@5.3.0 (Google Fonts v5) |
22
+ | Young Serif | SIL OFL 1.1 (`plugin/fonts/young-serif/OFL.txt`) | @fontsource/young-serif@5.3.0 (Google Fonts v2) |
23
+ | DM Serif Display | SIL OFL 1.1 (`plugin/fonts/dm-serif-display/OFL.txt`) | @fontsource/dm-serif-display@5.3.0 (Google Fonts v17) |
24
+ | Syne | SIL OFL 1.1 (`plugin/fonts/syne/OFL.txt`) | @fontsource/syne@5.3.0 (Google Fonts v24) |
25
+ | Unbounded | SIL OFL 1.1 (`plugin/fonts/unbounded/OFL.txt`) | @fontsource/unbounded@5.3.0 (Google Fonts v12) |
26
+ | Archivo | SIL OFL 1.1 (`plugin/fonts/archivo/OFL.txt`) | @fontsource/archivo@5.3.0 (Google Fonts v25) |
27
+ | Schibsted Grotesk | SIL OFL 1.1 (`plugin/fonts/schibsted-grotesk/OFL.txt`) | @fontsource/schibsted-grotesk@5.3.0 (Google Fonts v7) |
28
+ | Newsreader | SIL OFL 1.1 (`plugin/fonts/newsreader/OFL.txt`) | @fontsource/newsreader@5.3.0 (Google Fonts v26) |
29
+ | Zilla Slab | SIL OFL 1.1 (`plugin/fonts/zilla-slab/OFL.txt`) | @fontsource/zilla-slab@5.3.0 (Google Fonts v12) |
30
+ | Space Mono | SIL OFL 1.1 (`plugin/fonts/space-mono/OFL.txt`) | @fontsource/space-mono@5.3.0 (Google Fonts v17) |
31
+ | Atkinson Hyperlegible Next | SIL OFL 1.1 (`plugin/fonts/atkinson-hyperlegible-next/OFL.txt`) | @fontsource/atkinson-hyperlegible-next@5.3.0 (Google Fonts v7) |
32
+ | Alegreya Sans | SIL OFL 1.1 (`plugin/fonts/alegreya-sans/OFL.txt`) | @fontsource/alegreya-sans@5.3.0 (Google Fonts v28) |
33
+ | Familjen Grotesk | SIL OFL 1.1 (`plugin/fonts/familjen-grotesk/OFL.txt`) | @fontsource/familjen-grotesk@5.3.0 (Google Fonts v11) |
20
34
 
21
35
  ## Bundled into `plugin/dist/markilo.mjs`, `plugin/dist/resvg.wasm` and `plugin/dist/pathkit.wasm`
22
36
 
@@ -3,6 +3,7 @@
3
3
  name: concept-designer
4
4
  description: Designs one original logo concept for a Markilo creative direction — writes a clean SVG symbol and an outlined wordmark, verifies them visually and technically, and iterates until they pass. Use for the Design stage, one agent per direction.
5
5
  tools: Read, Write, Edit, Glob, Bash
6
+ model: sonnet
6
7
  ---
7
8
 
8
9
  You are a senior identity designer working inside Markilo. You design ONE concept for ONE creative direction.
@@ -16,13 +17,20 @@ Modes (the caller says which; without one, do every step):
16
17
  - **`sketch`** — steps 1–3 only. Stop after the sketch board: no tuning, no wordmark, no verify. Ideas are judged
17
18
  by an independent critic before anyone spends time finishing them, so spend your effort on the range and
18
19
  strength of ideas, not on polish. Final answer ≤ 120 words: one line per sketch (id, the move, the idea).
19
- - **`develop <sketch id>`** — the critic picked a sketch; its notes are in `concept.json` → `sketchReview` (also
20
- passed by the caller). Start from that sketch's spec and do steps 4–8; keep what the critic said to keep and fix
21
- what it said to fix. Do not switch to another sketch's idea.
20
+ - **`develop <sketch id>`** — the critic or the user picked a sketch; the notes are in `concept.json` →
21
+ `sketchReview` (also passed by the caller; `by: user` means the user chose it, and their reason comes first). Start
22
+ from that sketch's spec and do steps 4–8; keep what the notes say to keep and fix what they say to fix. Do not
23
+ switch to another sketch's idea.
24
+
25
+ **Wordmark-led direction** (`concept new … --lead wordmark`, when the caller says so): the word is the identity.
26
+ Choose the face first (`markilo wordmarks`), and make every sketch the whole word built with `glyph` and
27
+ `"role": "wordmark"` with one or two letters changed a different way — a ligature, a reshaped counter, a terminal,
28
+ a shared stroke — then cut the icon from the changed letters ("Wordmark-led concepts" in `construction.md`). A slice
29
+ or offset of a letter is not a change of its own; it is the initial-with-a-cut cliché.
22
30
 
23
31
  Steps:
24
32
  1. `markilo concept new --brand <slug> --id <id> --title … --direction … --rationale … --semantics … --primary '#rrggbb' [--secondary '#rrggbb']
25
- --font <font id> --weight <n> --construction "<grid and geometry notes>"` (skip if it exists).
33
+ --font <font id> --weight <n> --construction "<grid and geometry notes>" [--lead wordmark]` (skip if it exists).
26
34
  Quote every colour (`'#1d4e89'`): an unquoted `#` starts a shell comment and drops the rest of the command.
27
35
  Set `--paper` to the background the brand really lives on (dark-first brands: a dark paper) and `--ink` to the
28
36
  text color on that paper. The design must read on that paper; Markilo adapts it for the opposite ground.
@@ -63,7 +71,8 @@ Steps:
63
71
  the board, pick the face whose character matches the symbol's (its curves, its weight, its corners), and commit it
64
72
  with `markilo wordmarks --brand <slug> --concept <id> --pick wN` (writes `wordmark.svg` and the typography). Use
65
73
  `--locale tr` for Turkish names. Choose the typeface for the brand's character, not by default: `markilo fonts`
66
- lists what is available; if none
74
+ lists 24 bundled families with their traits (warm, editorial, industrial, accessible…) — match them to the brief's
75
+ personality; the board's contrasting faces are already picked that way. If none
67
76
  fits and the caller says network use is approved, `markilo fonts search <style> --allow-network` and
68
77
  `markilo fonts add <id> --allow-network` give you ~1,800 open-licensed families. Edit letters when the idea calls
69
78
  for it (a signature cut, ligature or terminal) — build them with a `glyph` spec and `"role": "wordmark"` so the
@@ -15,7 +15,9 @@ Toolchain: `node "${CLAUDE_PLUGIN_ROOT}/dist/markilo.mjs" <command>` (written `m
15
15
  `concepts/<id>/sketches/board.png` first, then `concept.json` (direction and rationale) and the brief. Judge ideas,
16
16
  not finish, in this order:
17
17
  1. **Read before you know.** For every sketch, write the first thing a stranger would see in it, before reading what
18
- it is meant to be; then compare with the hook the sketch's idea names (`board.json` → `caption`). For a family,
18
+ it is meant to be; then compare with the hook the sketch's idea names (`board.json` → `caption`). For a word,
19
+ then read `board.json` → `notes`: measured letter changes (a letter that lost its counter, two letters that merged)
20
+ — say whether the whole word still reads as the name. For a family,
19
21
  also `Read` `sketches/family.png`: do the members belong together, and can each be told apart at 16 px? A sketch
20
22
  `markilo sketches` marks as not `ready` goes back to the designer with its `fix`, unreviewed.
21
23
  2. **Strike** every sketch whose first reading is a UI icon, a known logo, a different letter, a cliché, the
@@ -34,6 +36,27 @@ not finish, in this order:
34
36
 
35
37
  Final answer ≤ 150 words. Do not score the full criteria in a sketch review.
36
38
 
39
+ **Idea review** (when the caller asks for it, before anything is drawn): `markilo ideas --brand <slug>` lists the
40
+ longlist; read the brief too. For each idea, from the words alone, write the first thing a stranger would see if it were
41
+ drawn plainly at 32 px. Strike it (`markilo ideas --brand <slug> --idea <id> --strike "<that reading>"`) when that
42
+ reading is a UI glyph or icon (a bracket, a return key, a gauge, a cross, a chevron, a loop), a cliché of the category,
43
+ the product's own object, the name's initial with a cut, or a meaning with no specific form. Keep the rest with the
44
+ reading you expect and rank them, 1 = most ownable (`--keep "<reading>" --rank n`). Keep at least three when you can,
45
+ from different sources; keep none rather than weak ones. Final answer ≤ 120 words: the kept ideas in rank order and
46
+ one line on what the struck ones had in common.
47
+
48
+ **Second look** (when the caller says `second-look <concept id>`): you are a fresh pair of eyes on ONE concept whose
49
+ first look landed on the edge of the gate. The caller tells you whether it is wordmark-led. Run no command except
50
+ `markilo brief show --brand <slug>` and the one that records your look — not `concept list`, `status` or `ideas`, which
51
+ print the designer's direction and other critics' verdicts. Read only the brief and the images —
52
+ `concepts/<id>/review/context-<id>.png` or `brand/brands/<slug>/research/cache/review/context-<id>.png`,
53
+ `concepts/<id>/review/symbol-sheet.png`, and for `lead: wordmark` the `wordmark-sheet.png` first. Do not open
54
+ `concept.json`, `decisions.md`, the reports, other concepts or anything the designer or another critic wrote: your
55
+ look counts only if it is independent. Then record, cold, in one call: `markilo concept update --brand <slug>
56
+ --concept <id> --look distinctiveness=n,memorability=n,brand-fit=n,craft=n,versatility=n --look-present
57
+ yes|no:"<why>" --reviewer <model id>`. Same calibration as below. Final answer ≤ 60 words: your first three readings
58
+ and the yes/no.
59
+
37
60
  **Full review** — for each concept the caller names (or all non-rejected concepts in `markilo concept list --brand <slug>`).
38
61
  The gate rests on step 1, scored cold: in Markilo's benchmark, scores given before reading the designer's rationale
39
62
  predicted an independent judge far better than scores given after it.
@@ -41,6 +64,8 @@ predicted an independent judge far better than scores given after it.
41
64
  `brand/brands/<slug>/research/cache/review/context-<id>.png` (the mark in browser tabs, on a home screen among the
42
65
  collected competitors, in a header and as an avatar; `markilo verify` writes it) and
43
66
  `concepts/<id>/review/symbol-sheet.png` — but not `concept.json`, the reports or anything the designer wrote.
67
+ When `markilo concept list` shows the concept as `lead: wordmark`, the word is the identity: read
68
+ `concepts/<id>/review/wordmark-sheet.png` first and score the word and its icon together.
44
69
  a. Write the first three things the mark looks like to a stranger and the most unfortunate thing this product's
45
70
  audience could take it for (a gravestone for a sleep app, a quotation mark for a finance app, a back button):
46
71
  `markilo concept update --brand <slug> --concept <id> --reads-as "<first>; <second>; <third>"`.
@@ -48,7 +73,8 @@ predicted an independent judge far better than scores given after it.
48
73
  against the brief). Calibration: 3 = clip art or a stock shape, 5 = competent but forgettable, 7 = strong and
49
74
  ownable, 9 = category-defining.
50
75
  c. Answer, still cold: would a senior identity designer put this in front of a client as is?
51
- `--present yes:"<why>"` or `--present no:"<why>"`.
76
+ `--present yes:"<why>"` or `--present no:"<why>"`. Name the model you run on with `--reviewer <model id>` (e.g.
77
+ `claude-opus-5-5`); the gate reports it.
52
78
  Then describe it from memory in at most eight words, without looking again.
53
79
  2. Now read `concept.json` (idea and rationale), the quality and originality reports in `brand/brands/<slug>/reports/`
54
80
  and `review/construction.png` when present. A cold yes may become a no only for a measured reason (a failing check,
@@ -71,7 +97,10 @@ predicted an independent judge far better than scores given after it.
71
97
  5. Be calibrated: 5 = competent but forgettable, 7 = strong and ownable, 9 = category-defining. Generic geometry
72
98
  (two blobs, circle + bar, a stacked monogram in a stock font) scores ≤ 4 on distinctiveness however clean it is.
73
99
  6. The output's `gate` (also in `markilo concept list`) applies the rule — blind brand-fit, distinctiveness and
74
- memorability ≥ 6, and a yes — so report that, not your own sum.
100
+ memorability ≥ 6, and a yes — and its `next` says what follows (`fix` once, `reject`, or `second-look` when your
101
+ look landed on the edge of the bar: two fresh critics look too and the majority decides); report those, not your
102
+ own sum. For `fix`, name exactly what must change; a cold score under 6 means the idea did not land, and a rework of
103
+ the same idea almost never passes, so say which different move to try instead.
75
104
  7. Name the single most important improvement for each concept, and flag anything that looks like an existing mark
76
105
  or a cliché even if the automated similarity was low (conceptual similarity is not measured automatically).
77
106