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.
- package/README.md +70 -47
- package/THIRD_PARTY_NOTICES.md +26 -12
- package/package.json +15 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/THIRD_PARTY_NOTICES.md +26 -12
- package/plugin/agents/concept-designer.md +14 -5
- package/plugin/agents/design-critic.md +32 -3
- package/plugin/dist/markilo.mjs +213 -146
- package/plugin/fonts/alegreya-sans/OFL.txt +93 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-400-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-500-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-700-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-800-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/alegreya-sans/alegreya-sans-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/archivo/OFL.txt +93 -0
- package/plugin/fonts/archivo/archivo-latin-400-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-500-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-600-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-700-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-800-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-900-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/archivo/archivo-latin-ext-900-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/OFL.txt +93 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-400-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-500-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-600-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-700-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-800-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/atkinson-hyperlegible-next/atkinson-hyperlegible-next-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/OFL.txt +93 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-400-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-500-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-600-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-700-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-800-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/bricolage-grotesque/bricolage-grotesque-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/dm-serif-display/OFL.txt +93 -0
- package/plugin/fonts/dm-serif-display/dm-serif-display-latin-400-normal.woff +0 -0
- package/plugin/fonts/dm-serif-display/dm-serif-display-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/OFL.txt +93 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-400-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-500-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-600-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-700-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/familjen-grotesk/familjen-grotesk-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/fonts.json +628 -0
- package/plugin/fonts/instrument-serif/OFL.txt +93 -0
- package/plugin/fonts/instrument-serif/instrument-serif-latin-400-normal.woff +0 -0
- package/plugin/fonts/instrument-serif/instrument-serif-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/newsreader/OFL.txt +93 -0
- package/plugin/fonts/newsreader/newsreader-latin-400-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-500-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-600-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-700-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-800-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/newsreader/newsreader-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/OFL.txt +93 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-400-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-500-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-600-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-700-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-800-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-900-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/schibsted-grotesk/schibsted-grotesk-latin-ext-900-normal.woff +0 -0
- package/plugin/fonts/space-mono/OFL.txt +93 -0
- package/plugin/fonts/space-mono/space-mono-latin-400-normal.woff +0 -0
- package/plugin/fonts/space-mono/space-mono-latin-700-normal.woff +0 -0
- package/plugin/fonts/space-mono/space-mono-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/space-mono/space-mono-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/syne/OFL.txt +93 -0
- package/plugin/fonts/syne/syne-latin-400-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-500-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-600-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-700-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-800-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/syne/syne-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/unbounded/OFL.txt +93 -0
- package/plugin/fonts/unbounded/unbounded-latin-400-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-500-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-600-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-700-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-800-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-900-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-700-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-800-normal.woff +0 -0
- package/plugin/fonts/unbounded/unbounded-latin-ext-900-normal.woff +0 -0
- package/plugin/fonts/young-serif/OFL.txt +93 -0
- package/plugin/fonts/young-serif/young-serif-latin-400-normal.woff +0 -0
- package/plugin/fonts/young-serif/young-serif-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/OFL.txt +93 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-400-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-500-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-600-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-700-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-400-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-500-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-600-normal.woff +0 -0
- package/plugin/fonts/zilla-slab/zilla-slab-latin-ext-700-normal.woff +0 -0
- package/plugin/skills/concepts/SKILL.md +4 -4
- package/plugin/skills/design/SKILL.md +35 -12
- package/plugin/skills/design/references/cli.md +37 -36
- package/plugin/skills/design/references/construction.md +34 -1
- package/plugin/skills/design/references/design-principles.md +30 -0
- package/plugin/skills/export/SKILL.md +4 -2
- 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.
|
|
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
|
|
53
|
-
|
|
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
|
|
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.
|
|
73
|
-
|
|
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
|
|
78
|
-
app, a multi-product family, a developer tool, an online shop, a B2B platform
|
|
79
|
-
**holdouts** for a while: written before the changes they test and
|
|
80
|
-
in. The plugin researches, writes the brief, designs, critiques, and
|
|
81
|
-
judges then rate every critiqued concept from the brief and the images
|
|
82
|
-
[bench/](bench).
|
|
83
|
-
|
|
84
|
-
| Version
|
|
85
|
-
|
|
|
86
|
-
| 0.4.0-rc.1
|
|
87
|
-
| 0.4.0-rc.2
|
|
88
|
-
| 0.4.0-rc.3
|
|
89
|
-
| 0.4.0-rc.5
|
|
90
|
-
| 0.4.0-rc.7
|
|
91
|
-
| 0.4.0-rc.8
|
|
92
|
-
|
|
|
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
|
-
- **
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
105
|
-
|
|
106
|
-
|
|
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
|
|
115
|
-
the floor.
|
|
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.
|
|
120
|
-
<td><img src="bench/results/0.
|
|
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>
|
|
124
|
-
|
|
125
|
-
<td><sub>
|
|
126
|
-
arch
|
|
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
|
-
›
|
|
200
|
-
›
|
|
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
|
|
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)).
|
|
306
|
-
|
|
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
|
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -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
|
|
9
|
-
|
|
|
10
|
-
| Inter
|
|
11
|
-
| Manrope
|
|
12
|
-
| Space Grotesk
|
|
13
|
-
| Sora
|
|
14
|
-
| DM Sans
|
|
15
|
-
| Outfit
|
|
16
|
-
| Plus Jakarta Sans
|
|
17
|
-
| Fraunces
|
|
18
|
-
| IBM Plex Serif
|
|
19
|
-
| JetBrains Mono
|
|
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.
|
|
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
|
+
"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
|
|
9
|
-
|
|
|
10
|
-
| Inter
|
|
11
|
-
| Manrope
|
|
12
|
-
| Space Grotesk
|
|
13
|
-
| Sora
|
|
14
|
-
| DM Sans
|
|
15
|
-
| Outfit
|
|
16
|
-
| Plus Jakarta Sans
|
|
17
|
-
| Fraunces
|
|
18
|
-
| IBM Plex Serif
|
|
19
|
-
| JetBrains Mono
|
|
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;
|
|
20
|
-
passed by the caller
|
|
21
|
-
what
|
|
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
|
|
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
|
|
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 —
|
|
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
|
|