iconflow 0.5.0__tar.gz

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 (143) hide show
  1. iconflow-0.5.0/.claude-plugin/marketplace.json +32 -0
  2. iconflow-0.5.0/AGENTS.md +179 -0
  3. iconflow-0.5.0/CHANGELOG.md +353 -0
  4. iconflow-0.5.0/CONTRIBUTING.md +260 -0
  5. iconflow-0.5.0/LICENSE +201 -0
  6. iconflow-0.5.0/LICENSES.md +244 -0
  7. iconflow-0.5.0/MANIFEST.in +24 -0
  8. iconflow-0.5.0/NOTICE +64 -0
  9. iconflow-0.5.0/PKG-INFO +555 -0
  10. iconflow-0.5.0/README.md +515 -0
  11. iconflow-0.5.0/SECURITY.md +42 -0
  12. iconflow-0.5.0/THIRD_PARTY_NOTICES.md +31 -0
  13. iconflow-0.5.0/TRADEMARKS.md +59 -0
  14. iconflow-0.5.0/brand/LICENSE +52 -0
  15. iconflow-0.5.0/brand/iconflow.toml +43 -0
  16. iconflow-0.5.0/brand/master-review.json +42 -0
  17. iconflow-0.5.0/brand/master.svg +18 -0
  18. iconflow-0.5.0/brand/tray.svg +26 -0
  19. iconflow-0.5.0/demo/LICENSE +37 -0
  20. iconflow-0.5.0/demo/iconflow.toml +43 -0
  21. iconflow-0.5.0/demo/master-review.json +42 -0
  22. iconflow-0.5.0/demo/master.svg +18 -0
  23. iconflow-0.5.0/demo/tray.svg +26 -0
  24. iconflow-0.5.0/docs/AGENT_CONTRACT.md +122 -0
  25. iconflow-0.5.0/docs/BRAND_SYSTEM.md +188 -0
  26. iconflow-0.5.0/docs/CONCEPTING.md +248 -0
  27. iconflow-0.5.0/docs/DESIGN_PLAYBOOK.md +352 -0
  28. iconflow-0.5.0/docs/EMOJI_MATRIX.md +107 -0
  29. iconflow-0.5.0/docs/EVOLUTION.md +139 -0
  30. iconflow-0.5.0/docs/GALLERY.md +72 -0
  31. iconflow-0.5.0/docs/I18N_PLAN.md +208 -0
  32. iconflow-0.5.0/docs/ISSUE_SEEDS.md +114 -0
  33. iconflow-0.5.0/docs/LAUNCH_READINESS.md +233 -0
  34. iconflow-0.5.0/docs/LAUNCH_SITE.md +221 -0
  35. iconflow-0.5.0/docs/LEARNINGS.md +809 -0
  36. iconflow-0.5.0/docs/LICENSE +18 -0
  37. iconflow-0.5.0/docs/MILESTONE_v0.5.md +97 -0
  38. iconflow-0.5.0/docs/OUTPUT_TARGETS.md +313 -0
  39. iconflow-0.5.0/docs/PROOF_ACTION.md +138 -0
  40. iconflow-0.5.0/docs/PROVENANCE.md +216 -0
  41. iconflow-0.5.0/docs/RELEASING.md +193 -0
  42. iconflow-0.5.0/docs/REVIEW_CHECKLIST.md +76 -0
  43. iconflow-0.5.0/docs/SHOWCASE_PLAN.md +109 -0
  44. iconflow-0.5.0/docs/SOCIAL_SIGNALS.md +94 -0
  45. iconflow-0.5.0/docs/STYLE_CATALOG.md +146 -0
  46. iconflow-0.5.0/docs/SVG_TECHNIQUES.md +330 -0
  47. iconflow-0.5.0/docs/WORKFLOW.md +127 -0
  48. iconflow-0.5.0/docs/assets/LICENSE +36 -0
  49. iconflow-0.5.0/docs/assets/concept-bake.png +0 -0
  50. iconflow-0.5.0/docs/assets/hero-flow.svg +119 -0
  51. iconflow-0.5.0/docs/assets/review-proof.png +0 -0
  52. iconflow-0.5.0/docs/assets/social-preview.png +0 -0
  53. iconflow-0.5.0/docs/assets/social-preview.svg +65 -0
  54. iconflow-0.5.0/docs/assets/style-gallery.png +0 -0
  55. iconflow-0.5.0/examples/README.md +205 -0
  56. iconflow-0.5.0/examples/community-case/LICENSE +16 -0
  57. iconflow-0.5.0/examples/community-case/README.md +28 -0
  58. iconflow-0.5.0/iconflow/__init__.py +16 -0
  59. iconflow-0.5.0/iconflow/__main__.py +8 -0
  60. iconflow-0.5.0/iconflow/agentkit.py +520 -0
  61. iconflow-0.5.0/iconflow/assemble.py +325 -0
  62. iconflow-0.5.0/iconflow/build.py +338 -0
  63. iconflow-0.5.0/iconflow/casebook.py +820 -0
  64. iconflow-0.5.0/iconflow/cli.py +1632 -0
  65. iconflow-0.5.0/iconflow/config.py +654 -0
  66. iconflow-0.5.0/iconflow/htmlhead.py +146 -0
  67. iconflow-0.5.0/iconflow/qa.py +499 -0
  68. iconflow-0.5.0/iconflow/rasterize.py +287 -0
  69. iconflow-0.5.0/iconflow/resources/__init__.py +3 -0
  70. iconflow-0.5.0/iconflow/review.py +857 -0
  71. iconflow-0.5.0/iconflow/shortcut.py +189 -0
  72. iconflow-0.5.0/iconflow/styles.py +227 -0
  73. iconflow-0.5.0/iconflow.egg-info/PKG-INFO +555 -0
  74. iconflow-0.5.0/iconflow.egg-info/SOURCES.txt +141 -0
  75. iconflow-0.5.0/iconflow.egg-info/dependency_links.txt +1 -0
  76. iconflow-0.5.0/iconflow.egg-info/entry_points.txt +2 -0
  77. iconflow-0.5.0/iconflow.egg-info/requires.txt +8 -0
  78. iconflow-0.5.0/iconflow.egg-info/top_level.txt +1 -0
  79. iconflow-0.5.0/licenses/CC-BY-4.0.txt +396 -0
  80. iconflow-0.5.0/licenses/CC-BY-NC-ND-4.0.txt +403 -0
  81. iconflow-0.5.0/licenses/CC-BY-SA-4.0.txt +428 -0
  82. iconflow-0.5.0/licenses/CC0-1.0.txt +121 -0
  83. iconflow-0.5.0/pyproject.toml +94 -0
  84. iconflow-0.5.0/requirements.txt +5 -0
  85. iconflow-0.5.0/scripts/build_archive.py +629 -0
  86. iconflow-0.5.0/scripts/build_emoji_matrix.py +556 -0
  87. iconflow-0.5.0/scripts/build_gallery.py +648 -0
  88. iconflow-0.5.0/scripts/build_i18n.py +1094 -0
  89. iconflow-0.5.0/scripts/build_social_signals.py +710 -0
  90. iconflow-0.5.0/scripts/deploy-site.ps1 +76 -0
  91. iconflow-0.5.0/scripts/proof_receipt.py +270 -0
  92. iconflow-0.5.0/scripts/render_social_preview.py +59 -0
  93. iconflow-0.5.0/scripts/setup.ps1 +19 -0
  94. iconflow-0.5.0/scripts/setup.sh +23 -0
  95. iconflow-0.5.0/scripts/verify_distribution.py +211 -0
  96. iconflow-0.5.0/setup.cfg +4 -0
  97. iconflow-0.5.0/skills/.claude-plugin/plugin.json +26 -0
  98. iconflow-0.5.0/skills/LICENSE +18 -0
  99. iconflow-0.5.0/skills/commands/icon.md +46 -0
  100. iconflow-0.5.0/skills/commands/setup.md +56 -0
  101. iconflow-0.5.0/skills/iconflow/LICENSE +18 -0
  102. iconflow-0.5.0/skills/iconflow/SKILL.md +249 -0
  103. iconflow-0.5.0/skills/iconflow/agents/openai.yaml +4 -0
  104. iconflow-0.5.0/templates/LICENSE +24 -0
  105. iconflow-0.5.0/templates/grid-overlay.svg +22 -0
  106. iconflow-0.5.0/templates/master.svg +27 -0
  107. iconflow-0.5.0/templates/presets/blueprint.svg +27 -0
  108. iconflow-0.5.0/templates/presets/cel-shaded.svg +32 -0
  109. iconflow-0.5.0/templates/presets/chrome.svg +35 -0
  110. iconflow-0.5.0/templates/presets/clay.svg +25 -0
  111. iconflow-0.5.0/templates/presets/cut-paper.svg +23 -0
  112. iconflow-0.5.0/templates/presets/duotone-cut.svg +26 -0
  113. iconflow-0.5.0/templates/presets/enamel-pin.svg +24 -0
  114. iconflow-0.5.0/templates/presets/flat-geometric.svg +16 -0
  115. iconflow-0.5.0/templates/presets/glass-stack.svg +31 -0
  116. iconflow-0.5.0/templates/presets/gradient-glow.svg +34 -0
  117. iconflow-0.5.0/templates/presets/ink-brush.svg +17 -0
  118. iconflow-0.5.0/templates/presets/isometric.svg +22 -0
  119. iconflow-0.5.0/templates/presets/line-mark.svg +19 -0
  120. iconflow-0.5.0/templates/presets/mascot.svg +26 -0
  121. iconflow-0.5.0/templates/presets/pixel-grid.svg +15 -0
  122. iconflow-0.5.0/templates/presets/risograph.svg +25 -0
  123. iconflow-0.5.0/templates/presets/stained-glass.svg +31 -0
  124. iconflow-0.5.0/templates/presets/stencil-cut.svg +24 -0
  125. iconflow-0.5.0/templates/presets/woodcut.svg +19 -0
  126. iconflow-0.5.0/templates/presets/woven.svg +21 -0
  127. iconflow-0.5.0/tests/test_agentkit.py +369 -0
  128. iconflow-0.5.0/tests/test_assemble.py +114 -0
  129. iconflow-0.5.0/tests/test_browser_security.py +64 -0
  130. iconflow-0.5.0/tests/test_build.py +242 -0
  131. iconflow-0.5.0/tests/test_casebook.py +184 -0
  132. iconflow-0.5.0/tests/test_cli.py +260 -0
  133. iconflow-0.5.0/tests/test_config.py +403 -0
  134. iconflow-0.5.0/tests/test_contract.py +533 -0
  135. iconflow-0.5.0/tests/test_distribution.py +159 -0
  136. iconflow-0.5.0/tests/test_htmlhead.py +42 -0
  137. iconflow-0.5.0/tests/test_licensing.py +345 -0
  138. iconflow-0.5.0/tests/test_qa.py +224 -0
  139. iconflow-0.5.0/tests/test_rasterize.py +73 -0
  140. iconflow-0.5.0/tests/test_repo_contract.py +368 -0
  141. iconflow-0.5.0/tests/test_review.py +115 -0
  142. iconflow-0.5.0/tests/test_shortcut.py +69 -0
  143. iconflow-0.5.0/tests/test_website.py +911 -0
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "iconflow",
3
+ "description": "IconFlow — reviewed, platform-ready icon families from one semantic SVG master.",
4
+ "owner": {
5
+ "name": "snowyukitty",
6
+ "url": "https://github.com/snowyukitty"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "iconflow",
11
+ "source": "./skills",
12
+ "description": "Design, review at 16px, and ship a distinctive icon family from one semantic SVG master — favicon, PWA, Tauri, Electron, and tray, behind a fail-closed quality gate.",
13
+ "category": "design",
14
+ "tags": [
15
+ "icon",
16
+ "favicon",
17
+ "svg",
18
+ "design",
19
+ "pwa",
20
+ "electron",
21
+ "tauri",
22
+ "tray"
23
+ ],
24
+ "author": {
25
+ "name": "snowyukitty"
26
+ },
27
+ "homepage": "https://ai-iconflow.com",
28
+ "repository": "https://github.com/snowyukitty/ai-iconflow",
29
+ "license": "CC-BY-SA-4.0"
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,179 @@
1
+ <!-- SPDX-License-Identifier: CC-BY-SA-4.0
2
+ SPDX-FileCopyrightText: 2026 snowyukitty · https://ai-iconflow.com
3
+ Reusing this prose requires attribution and the same license.
4
+ Applying the methods it describes requires nothing: icons you design
5
+ with IconFlow are entirely yours. See LICENSES.md section 1. -->
6
+ # AGENTS.md — how an AI agent uses IconFlow
7
+
8
+ You are the **designer**. IconFlow gives you a design playbook, reusable SVG
9
+ building blocks, and a deterministic engine that turns ONE SVG into every icon
10
+ format — plus a render-and-review loop so you can see and fix your work before
11
+ shipping. This file is the contract for Claude, Codex, and any other agent.
12
+
13
+ ## The procedure (follow in order)
14
+
15
+ Before step 0, resolve the runner. `python -m iconflow` below means the
16
+ `iconflow` command on PATH when the package is installed (`uv tool install
17
+ iconflow`, `pipx install iconflow`, or `pip install iconflow` — once
18
+ published on PyPI); from a source checkout use that checkout's venv interpreter
19
+ (`.venv\Scripts\python.exe` on Windows or `.venv/bin/python` on POSIX). Run
20
+ `-m iconflow setup` once if needed, and use that one runner for every command
21
+ below. When invoked from another repository, keep the shell in the consuming
22
+ project so its config and final sources land there; use absolute paths for
23
+ toolkit docs and `work/<slug>/` drafts. See *Environment* for both modes.
24
+
25
+ 0. **Read** `docs/LEARNINGS.md` — the rules distilled from every previously
26
+ shipped icon. This is what makes the system self-evolving: past mistakes
27
+ are only worth their cost if you apply them now. Optionally run
28
+ `python -m iconflow case stats` to see the current weakest axis and any
29
+ house-cliché warning before you start. Treat that signal as diagnostic; it
30
+ does not itself authorize editing this shared toolkit.
31
+ 1. **Read** `docs/DESIGN_PLAYBOOK.md`. From the consuming project, create its
32
+ `iconflow.toml` with `python -m iconflow init --out iconflow.toml`, then
33
+ record the app intent, user job, one-word
34
+ essence, personality, existing brand palette, clichés, signature-device
35
+ hypothesis, and exact output targets. A visual decision without a product
36
+ job is not a complete brief. For privacy-sensitive work, reduce the brief to
37
+ a neutral user-job verb rather than a sensitive category noun.
38
+ 2. **Diverge for distinctiveness** (`docs/CONCEPTING.md`) — DO NOT skip; this is
39
+ why most AI icons look generic. Generate 4+ concepts via different lenses,
40
+ apply the cliché filter, add ONE signature device. Draft 2–3 finalist SVGs.
41
+ 3. **Bake-off** the finalists:
42
+ `python -m iconflow compare a.svg b.svg c.svg --out bake.png` →
43
+ **Read `bake.png`**, run the silhouette + row tests, promote the most
44
+ distinctive-yet-legible winner to `master.svg`. Run the name-the-thing test
45
+ at both 128px and 16px; change the viewpoint if the noun changes. With color
46
+ removed, test vertical cuts above detached round accents as punctuation and
47
+ offset their centerlines by at least two output pixels (~128 viewBox units).
48
+ (Shortcut for simple jobs: inspect the current catalog with
49
+ `python -m iconflow styles`, start with
50
+ `python -m iconflow new <preset>`, and still apply a signature device.)
51
+ 4. **Author the SVG** by editing `master.svg`, using `docs/SVG_TECHNIQUES.md`
52
+ (§10 = signature devices, §11 = semantic source/target variants). One bold
53
+ idea, on the 1024 grid, inside the safe area. If a full-card app icon also
54
+ needs a tray target, author a linked mark-only `tray.svg`; do not assume its
55
+ card alpha is a meaningful menu-bar silhouette.
56
+ 5. **Check + review:**
57
+ `python -m iconflow check master.svg` → fix every warning. With a linked
58
+ tray source, add `--tray-svg tray.svg --tray-template-mode <mode>`: it audits
59
+ the macOS template the build will emit and reports one that kept none of the
60
+ colour mark's features.
61
+ `python -m iconflow review --config iconflow.toml --html review.html` →
62
+ **Read `review.png` and open the Review Lab**. Inspect actual-size pixels,
63
+ visual silhouette, alpha footprint, adaptive crops, and every selected
64
+ target transform. Score against `docs/REVIEW_CHECKLIST.md` and export the
65
+ JSON receipt. Distinctiveness is a gate—do not ship below 4/5 on it. If any
66
+ axis <4, make the one change that helps most and re-render. Usually 2–3 passes.
67
+ If managed browser policy blocks the Lab, inspect the static sheet and exact
68
+ target assets at real sizes, then use a complete source-hash-bound approved
69
+ fallback; record the blocked interactive check honestly and keep every gate.
70
+ 6. **Ship** into the consuming project:
71
+ `python -m iconflow ship --config iconflow.toml --review master-review.json`.
72
+ `ship` re-runs automated QA, verifies the receipt belongs to the current SVG,
73
+ tray source, selected targets, colors, scheme, radius, and template mode, and
74
+ requires all six axes ≥4. The low-level `build`
75
+ command remains for callers that own an equivalent quality gate. See
76
+ `docs/OUTPUT_TARGETS.md` for the exact target file sets.
77
+ 7. **Report** the brief essence, the cliché avoided, the signature device chosen,
78
+ final rubric scores, and the produced file list.
79
+ 8. **Record the case** (mandatory — this closes the self-evolution loop):
80
+ `python -m iconflow case new --slug <slug> --essence <word> --device "..." --device-family <family> --device-detail "..." --concept-lens <lens> --cliche "..." --first "legibility=3 ..." --final "legibility=4 ..." --iterations N --lesson "..."`
81
+ then fill in the created file's *Summary* / *What failed first* sections.
82
+ Run `python -m iconflow case lint`, `case stats`, and (for a visual audit)
83
+ `case atlas`. If stats says **DISTILL NOW** or flags an evolution target,
84
+ edit the shared toolkit only when the current work supplies new,
85
+ generalizable evidence and shared-toolkit writes are in scope. Otherwise
86
+ report the signal to the owner. When authorized, follow `docs/EVOLUTION.md`
87
+ and fold the lessons into the docs before ending.
88
+ Public cases from privacy-sensitive work use neutral labels and omit sensitive
89
+ category nouns, private repository names, local paths, and identifying
90
+ operational details while preserving reusable visual evidence.
91
+
92
+ ## Working files
93
+ Put draft SVGs, bake sheets, and review renders in `work/<slug>/` (gitignored),
94
+ not the repo root — e.g. `work/myapp/a.svg`, `work/myapp/bake.png`. The final
95
+ `master.svg` belongs in the consuming project; the case file in `casebook/`.
96
+
97
+ ## Non-negotiables
98
+ - Always run **review** and actually inspect both the static sheet and selected
99
+ target contexts before shipping. An icon is judged at 16px and after platform
100
+ transforms, not at the size you draw it.
101
+ - Keep the editable `master.svg` in the project (it's the source of truth; rebuild
102
+ any time).
103
+ - Don't ship if `check` has warnings, the receipt does not match the current
104
+ source/targets, or any rubric axis <4/5.
105
+ - Don't end a session without recording the case (`iconflow case new`) — an
106
+ unrecorded icon teaches the system nothing.
107
+
108
+ ## Environment
109
+ - Needs Python 3.10+ + Playwright Chromium + Pillow. Two ways to have the runner:
110
+ - **PATH install (primary, once `iconflow` is published on PyPI):**
111
+ `uv tool install iconflow`, `pipx install iconflow`, or
112
+ `pip install iconflow` in a venv. Then `iconflow` (≡ `python -m iconflow`)
113
+ is on PATH; run `iconflow setup` once (the only network step) and
114
+ `iconflow doctor` to prove the environment. Every document this file cites
115
+ is packaged with the wheel and served by the CLI: `iconflow docs` lists
116
+ them, `iconflow docs DESIGN_PLAYBOOK` prints one, and
117
+ `iconflow docs --out ./iconflow-docs` exports the set. No checkout needed.
118
+ - **Checkout / contributor (editable) mode — the only mode until PyPI is live:**
119
+ clone the repository and run `scripts/setup.ps1` (Windows) or
120
+ `scripts/setup.sh` (macOS/Linux). Each creates `.venv`, installs the checkout
121
+ editable into it, runs `iconflow setup`, and installs the open Agent Skill
122
+ into the common personal discovery locations. Use that venv interpreter
123
+ (`.venv\Scripts\python.exe` / `.venv/bin/python`) as the runner.
124
+ - One-time `python -m iconflow setup` installs the Chromium runtime in either mode.
125
+ - Pure stdlib + two pip deps. No API keys, no external services, fully offline.
126
+ - Rendering runs network-isolated with page JavaScript, external resources, and
127
+ animation disabled. Treat a safety warning as source content to remove, not a
128
+ renderer feature to re-enable.
129
+ - Machine consumers (CI, other agents) read `--json` envelopes and the 0/1/2 exit
130
+ codes from `docs/AGENT_CONTRACT.md`; the PR Proof action in
131
+ `docs/PROOF_ACTION.md` is the reference consumer.
132
+
133
+ ## Invocation from another project
134
+ With a PATH install nothing else is needed: run `iconflow ...` from the
135
+ consuming repository; its `iconflow.toml`, `master.svg`, receipt, and casebook
136
+ stay there.
137
+
138
+ From a checkout, the smoothest cross-project use is still the toolkit venv,
139
+ which the setup scripts already install editable:
140
+ ```
141
+ path\to\iconflow\.venv\Scripts\python.exe -m iconflow ...
142
+ ```
143
+ (or `python -m pip install -e path\to\iconflow` into any other interpreter).
144
+ If it is not installed editable, run commands from the `iconflow` checkout and
145
+ pass absolute paths to candidate SVGs and output files.
146
+
147
+ For Windows desktop shortcuts, prefer the high-level helper when launching a
148
+ PowerShell script:
149
+ ```
150
+ python -m iconflow shortcut --powershell-script D:\app\launch.ps1 \
151
+ --icon D:\app\icons\build\icon.ico --name "My App" --out desktop --verify
152
+ ```
153
+ `--verify` reads the `.lnk` back after creation, which catches quoting and CJK
154
+ path issues immediately. Add `--content-address-icon` for delivery: it copies the
155
+ icon to `shortcut-icon-<sha12>.ico`, points the shortcut at the immutable alias,
156
+ and implies `--verify`, avoiding Explorer's stale path-keyed icon pixels.
157
+
158
+ ## Getting this procedure into another agent
159
+
160
+ The procedure above ships as an open-format Agent Skill so a session in some
161
+ other repository follows the same gates without being handed this file.
162
+
163
+ - **Claude Code** — install the plugin, which carries the skill plus the
164
+ `/iconflow:icon` and `/iconflow:setup` commands:
165
+
166
+ ```
167
+ /plugin marketplace add snowyukitty/ai-iconflow
168
+ /plugin install iconflow@iconflow
169
+ ```
170
+
171
+ - **Codex, Copilot, and other Agent Skills clients** — `iconflow skill install`
172
+ deploys `SKILL.md` into `~/.claude/skills/`, `~/.agents/skills/`, and
173
+ `~/.copilot/skills/` straight from the installed package; `--project` writes
174
+ into the current repository instead. Both the setup scripts and a wheel
175
+ install use this one code path, so a deployed copy never drifts from the
176
+ canonical `skills/iconflow/SKILL.md`. Edit the canonical source and rerun the
177
+ installer rather than editing a deployed copy.
178
+ - **Anything else** — `iconflow skill print` writes the whole procedure to
179
+ stdout, and every agent can follow this file and call the same CLI.
@@ -0,0 +1,353 @@
1
+ # Changelog
2
+
3
+ All notable changes to IconFlow are documented here. The project uses Semantic
4
+ Versioning for published releases; repository-only development before the
5
+ first published release remains under `Unreleased`.
6
+
7
+ ## 0.5.0 - 2026-08-22
8
+
9
+ First public release. IconFlow had been developed in a private repository since
10
+ 2026-06-23; this is the version that made it installable.
11
+
12
+
13
+ ### Added
14
+
15
+ - **The distribution is now `iconflow`, renamed from `ai-iconflow` before any
16
+ upload.** `pip install iconflow` gives you an `iconflow` command — the
17
+ property the entire adoption story rests on, since an agent told to use
18
+ IconFlow types the obvious thing first. The CLI, the product, the agent skill,
19
+ the Claude Code plugin, and the slash commands were all already called
20
+ `iconflow`; the distribution was the only piece out of step, and the `ai-`
21
+ prefix additionally misdescribed a toolkit that deliberately has no image
22
+ model and no API key. The README's claim that the package "remains named
23
+ `ai-iconflow` for compatibility" was compatibility with nothing: nothing had
24
+ ever been published.
25
+
26
+ 123 references across 36 files, done before the name could become permanent —
27
+ PyPI has no rename. The domain `ai-iconflow.com`, the GitHub repository
28
+ `snowyukitty/ai-iconflow`, and the Cloudflare Pages project keep their names;
29
+ none of them has to match the distribution. The translation catalogs needed no
30
+ work, because the one user-visible occurrence sits inside a `<code>` element
31
+ that `build_i18n.py` carries as a placeholder — 708 strings still verify
32
+ across four languages.
33
+
34
+ - **Per-file attribution across the whole source tree, and a CLA.** The engine
35
+ stays `Apache-2.0` — a modified fork inside someone else's closed product is
36
+ permitted, and that permissiveness is what makes the tool safe to adopt. What
37
+ a redistributor still owes is attribution, so every one of the 41 Python files
38
+ now carries `SPDX-License-Identifier: Apache-2.0` and a copyright line.
39
+ `NOTICE` binds a distribution; a per-file header travels with an individual
40
+ file, which is what makes a stripped copy identifiable later. Apache-2.0 §4
41
+ obliges a redistributor to keep those notices, to say that files changed, and
42
+ to reproduce `NOTICE` — and a fork produced by pointing an agent at the
43
+ repository typically drops all of it. `docs/PROVENANCE.md` §3b writes down
44
+ exactly what is required, which distinctive gate codes survive modification,
45
+ and the asymmetry that matters: the engine is Apache, but the playbook is
46
+ CC BY-SA and the proof corpus is CC BY-NC-ND, so copying the code gets the
47
+ mechanism without the method.
48
+ - [`CLA.md`](CLA.md) — contributors keep their copyright (it is a license, not
49
+ an assignment) and grant the right to **relicense**, so one outside pull
50
+ request cannot freeze IconFlow's licensing permanently. §6 states the reason
51
+ openly rather than leaving it implied. Wired into `CONTRIBUTING.md`, both PR
52
+ templates, and `LICENSES.md` §8; `tests/test_licensing.py` fails if a source
53
+ file loses its header or a referrer loses the link.
54
+
55
+ - **A three-tier licence split, built so that the icons users make stay theirs.**
56
+ The repository is no longer under one licence, and
57
+ [`LICENSES.md`](LICENSES.md) is the map: the engine, scripts, and site code
58
+ stay `Apache-2.0`; the technique scaffolds in `templates/` become `CC0-1.0`;
59
+ the written methodology in `docs/`, `casebook/`, and `skills/` becomes
60
+ `CC-BY-SA-4.0`; IconFlow's product mark and the imagery that ships inside the
61
+ package — `brand/`, `demo/`, `docs/assets/` — becomes `CC-BY-4.0` on top of
62
+ the existing trademark policy; and the published corpus that does *not* ship —
63
+ `showcase/`, `gallery/`, `examples/`, and the 137 Living Archive studies —
64
+ becomes `CC-BY-NC-ND-4.0`. Each tier carries its own `LICENSE`, 241 files
65
+ carry an SPDX header, the full texts are vendored in `licenses/`, and the
66
+ wheel declares `Apache-2.0 AND CC0-1.0 AND CC-BY-SA-4.0 AND CC-BY-4.0` —
67
+ every one a free licence, so the distribution stays packageable. Nothing
68
+ noncommercial is shipped; the identity is protected by trademark, which is
69
+ the right instrument for it.
70
+ - **The scaffolds are CC0 for one specific reason, and it is load-bearing.**
71
+ Under `Apache-2.0` an icon evolved from `iconflow new flat-geometric` would
72
+ technically be a derivative work owing attribution and a licence copy when
73
+ shipped. `CC0-1.0` removes that chain: **no attribution, no share-alike, no
74
+ commercial restriction reaches through the tool into anything a user
75
+ designs**, and applying the published method creates no obligation either
76
+ because copyright covers the playbook's wording, not its design rules.
77
+ `LICENSES.md` §1, `NOTICE`, the README, the agent skill, `/llms.txt`, and the
78
+ new `iconflow license` (with `--json`) all say so, and
79
+ `tests/test_licensing.py` fails the build if a restrictive tier ever leaks
80
+ into a user-facing resource.
81
+ - `iconflow new` now **strips the licence header** from the scaffold it copies.
82
+ Left in, it rode `master.svg` all the way into the `favicon.svg` a user serves
83
+ in production — an IconFlow URL embedded in someone's shipped asset, which is
84
+ precisely the attribution §1 promises never to require. The CC0 grant is
85
+ printed to the terminal instead, where it is information for the person rather
86
+ than for their visitors' browsers.
87
+ - `iconflow demo` writes a `LICENSE-NOTICE.md` beside the family it
88
+ materializes, because that one command deliberately copies **IconFlow's own
89
+ product mark** into a directory the user chose. It says what the directory
90
+ holds, that it is not a starting point, and which commands are.
91
+ `iconflow docs --out` likewise reports that its export is CC BY-SA reference
92
+ material to keep out of version control.
93
+ - The Remix Lab bends IconFlow's actual product mark, so its output carries the
94
+ mark's own `CC-BY-4.0` — derivatives and commercial use allowed, attribution
95
+ required — stated on the site in all five languages, in `brand/LICENSE`, and
96
+ in `LICENSES.md` §5. A no-derivatives term on something a visitor was invited
97
+ to remix would be dishonest; an unconditional CC0 grant on output derived from
98
+ the official logo would be too broad, and the lab now points anyone who wants
99
+ a start with no conditions at all to the CC0 scaffolds behind `iconflow new`.
100
+ `examples/community-case/` *is* carved out to CC0, because that fixture exists
101
+ to be copied and a no-derivatives term on a template is a contradiction.
102
+ - **Two adversarial reviews (Codex `gpt-5.6-sol`, Grok `grok-4.6`) attacked the
103
+ split before publication and found real holes, all closed here.** The
104
+ scaffold's own licence header was riding `master.svg` into the `favicon.svg`
105
+ users serve; `LICENSES.md` §1 claimed *every* file the toolkit writes is CC0
106
+ when `docs --out` and `skill install` write CC BY-SA reference material;
107
+ `CONTRIBUTING.md` still declared all contributions Apache-2.0, which would
108
+ have re-created the very problem CC0 on the scaffolds exists to avoid; the
109
+ `demo` notice could be suppressed by a pre-planted symlink; and `robots.txt`
110
+ was blocking the on-demand fetchers that agents use on a person's behalf,
111
+ which costs discovery and does nothing about training. §1 now also carries an
112
+ explicit catch-all: any IconFlow boilerplate embodied in a generated artifact
113
+ is supplied under CC0, and the section states plainly what no licence can
114
+ promise — that an icon is copyrightable, registrable, or clear of other marks.
115
+ `tests/test_licensing.py` runs a real `build` and fails if any produced file
116
+ contains an IconFlow notice, URL, or SPDX tag.
117
+
118
+ - **Provenance that makes copying provable rather than preventable.** All 137
119
+ published archive studies carry an RDF `<metadata>` block naming the work,
120
+ its author, its licence, and its canonical URL; `scripts/build_archive.py`
121
+ writes it and `--verify-only` fails without it.
122
+ [`docs/PROVENANCE.md`](docs/PROVENANCE.md) records the evidence trail, a dated
123
+ registry of the coined terminology that fingerprints this corpus, how to check
124
+ a suspected copy — and, plainly, what none of this can do.
125
+ - `website/llms.txt` states terms for AI systems and doubles as an agent-facing
126
+ index; `robots.txt` asks named training crawlers to stay out of `/archive/`,
127
+ `/gallery/`, and `/how-icons-are-made/` in every language while leaving the
128
+ front door and `/getting-started/` open to everyone, because being found by
129
+ agents is the point. Both are voluntary, and both say so.
130
+ - `NOTICE` became substantive. Apache-2.0 §4(d) obliges every redistributor to
131
+ reproduce it, so it is the one attribution a fork cannot quietly drop: it now
132
+ carries the maintainer attribution, the per-directory licence map, the
133
+ trademark reservation, and the user-output carve-out.
134
+ - `CONTRIBUTING.md` gains the tier table, the rule that new files carry an SPDX
135
+ header, and a Developer Certificate of Origin sign-off requirement
136
+ (`git commit -s`) so the copyright chain stays clean enough to enforce.
137
+
138
+ - **A one-command front door for other people's agents.** IconFlow ships as a
139
+ Claude Code plugin: `/plugin marketplace add snowyukitty/ai-iconflow` then
140
+ `/plugin install iconflow@iconflow` installs the design procedure plus the
141
+ `/iconflow:icon` and `/iconflow:setup` slash commands. The catalog is
142
+ `.claude-plugin/marketplace.json` and the plugin itself is the `skills/`
143
+ directory (`skills/.claude-plugin/plugin.json`), so the published plugin is
144
+ five files rather than the whole repository, and its skill *is* the canonical
145
+ `skills/iconflow/SKILL.md` — there is no second copy to drift.
146
+ - `iconflow skill install|print|path`: deploys the Agent Skill into
147
+ `~/.claude/skills/`, `~/.agents/skills/`, and `~/.copilot/skills/` (and clears
148
+ the superseded `~/.codex/skills/iconflow/` duplicate) **straight from the
149
+ installed package**, so a Codex or Copilot session no longer needs a clone to
150
+ get the procedure. `--project` writes into the current repository and `--dir`
151
+ names a location. `scripts/setup.ps1` and `scripts/setup.sh` now call this one
152
+ command instead of each maintaining its own copy of the discovery-root list —
153
+ the place those two scripts were free to drift apart.
154
+ - `iconflow docs [NAME] [--out DIR] [--path] [--json]`: lists, prints, or
155
+ exports the packaged reference documents the procedure cites. An agent that
156
+ installed a wheel used to need
157
+ `python -c "from importlib.resources import files; ..."` and a walk through
158
+ `site-packages` to read `DESIGN_PLAYBOOK.md`; it now runs
159
+ `iconflow docs DESIGN_PLAYBOOK`. `doctor` verifies the packaged skill along
160
+ with the other resources, and the wheel carries `SKILL.md` and its Codex
161
+ metadata under `iconflow/resources/skill/`.
162
+ - Two independent reviews of the front door (Codex `gpt-5.6-sol` and Grok
163
+ `grok-4.6`, sealed read-only ATD delegations) found the same defects, all
164
+ fixed here: the source-checkout branch of resource resolution now demands
165
+ this project's own `pyproject.toml` beside the package before it is trusted,
166
+ so an unrelated distribution's top-level `site-packages/docs` can no longer
167
+ shadow the packaged playbook; `importlib.resources.files(None)` silently
168
+ resolving to IconFlow's own package turned an unknown resource set into a
169
+ wrong answer instead of an error; `skill install` reads every packaged file
170
+ before writing any destination, so a broken install fails closed rather than
171
+ leaving an empty skill directory that shadows a working one; the superseded
172
+ `~/.codex/skills/iconflow/` deployment is retired by deleting only the files
173
+ IconFlow wrote and then removing the directory only if nothing else is left,
174
+ instead of an unconditional `rmtree`; every deployed write refuses to follow
175
+ a symlink out of its target; and `--path` reports honestly when an install
176
+ keeps resources inside a zip rather than printing a path nothing can open.
177
+ - The skill was rewritten for an agent working in **someone else's**
178
+ repository. It no longer resolves a two-mode `<AI_PROJECTS>/iconflow`
179
+ placeholder against the maintainer's private workspace layout: the runner is
180
+ `iconflow` on PATH, reference documents come from `iconflow docs <NAME>`,
181
+ drafts go to the consuming project's `work/<slug>/`, and cases land in its own
182
+ `./casebook`. Both reviews caught the same two regressions in that rewrite
183
+ and both are repaired: the PyPI warning now leads with a hard stop *before*
184
+ any index install command, because an agent runs the first command it reads;
185
+ and the guardrails the old procedure carried — one bold idea on the 1024 grid
186
+ inside the safe area, reporting the brief's essence, and the rule that a
187
+ recolored preset is not a finished icon — are back. The managed-browser
188
+ fallback used to strand an agent by describing the approved-config route and
189
+ then telling it to `ship --review` anyway; it now names both routes exactly.
190
+ `tests/test_agentkit.py` fails the build if a workspace path, a `cd` into the
191
+ toolkit, a dropped quality gate, an index install command that precedes its
192
+ warning, or a broken exemplar image link comes back.
193
+
194
+ - **The site speaks five languages.** English under `website/` stays the source
195
+ of truth; `scripts/build_i18n.py` extracts every translatable string into
196
+ `website/i18n/en.json` (keyed by a slug plus a hash of the English text, so a
197
+ copy edit invalidates its translations instead of silently keeping a stale
198
+ one) and renders `/es/`, `/ja/`, `/zh-hant/`, and `/zh-hans/` copies of `/`,
199
+ `/getting-started/`, `/how-icons-are-made/`, `/archive/`, and the 404 page.
200
+ The build **fails closed**: one missing key drops that whole language rather
201
+ than mixing English into a translated page, and a translation that loses a
202
+ markup placeholder or a `{size}`/`{count}` token is rejected the same way.
203
+ Every page carries the complete `hreflang` set with `x-default`, a canonical
204
+ URL in its own language, a language switcher in the header and footer, and a
205
+ matching `sitemap.xml` entry with `xhtml:link` alternates; `_headers` gains a
206
+ revalidation stanza per language route. Inline markup inside a sentence
207
+ survives translation as numbered placeholders, so commands such as
208
+ `iconflow check` stay verbatim inside translated prose. Copy that used to be
209
+ hard-coded in `app.js`, `archive.js`, `playground.js`, and one CSS
210
+ `content:` rule now lives in `data-*` attributes on the markup, which is what
211
+ makes it translatable at all. CJK typography uses installed system faces only
212
+ (no webfont: `font-src 'self'`) and resets the Latin display tracking.
213
+ Evidence is never translated — the 137 archive readings, mark names, file
214
+ names, hashes, and score strings stay exactly as they ship, and the build
215
+ now **fails closed when a translation drops one**: if the English says
216
+ `Chromium`, `master.svg`, `PyPI` or `16px`, every language has to say it too.
217
+ Terminology, honesty rules, and per-language style are pinned in
218
+ `website/i18n/GLOSSARY.md`, whose terminology table is parsed by
219
+ `--status`, which reports per-language adherence so a term splitting into two
220
+ renderings surfaces as a number instead of waiting for a reader to notice.
221
+ A controlled four-model benchmark (111 curated zh-Hant strings, one prompt,
222
+ candidates shuffled per string, mapping withheld until the picks were
223
+ recorded) settled the drafting comparison and, more usefully, exposed
224
+ consistency defects in the shipped catalogs that string-by-string review had
225
+ missed; `docs/I18N_PLAN.md` records the method, the numbers and the caveats.
226
+
227
+ - **Agent Contract v1** (`docs/AGENT_CONTRACT.md`): `doctor`, `check`, `review`, `ship`, and `demo` accept `--json` and emit exactly one envelope on stdout (`schema`, `command`, `status`, `exit_code`, `warnings`, `advisories`, `outputs`, `errors`) with human lines on stderr. QA warnings now carry stable codes (`svg-safety`, `viewbox`, `stroke-floor`, `coverage-16`, `contrast`, `maskable-detail`, `distinctiveness-text`; advisory `tray-template-featureless`), `ship` blocks report `receipt-stale-source`, `receipt-stale-contract`, `receipt-not-ready`, `score-below-floor`, or `qa-warnings`, and every `doctor` FAIL carries a copy-paste `fix` (Chromium: the exact `<python> -m iconflow setup`). The exit-code matrix is pinned to `0` ok / `1` blocked by an IconFlow gate / `2` usage, configuration, or runtime failure: `review` now exits `1` when automated QA warnings exist, `check` with only advisories exits `0`, and an incomplete, unapproved, or stale approved-config fallback is a gate block (`1`) rather than a configuration error. Successful ships report Review Packet v1 provenance (`toolchain`, and `artifacts` / `reviewer` when a receipt carries them; unknown receipt keys are tolerated). `review --receipt-template receipt.json` writes an unscored, source-bound receipt an agent can score and pass to `ship --review`.
228
+ - `iconflow demo --out DIR [--setup] [--json] [--force]`: materializes the packaged, already-reviewed brand family (`iconflow.resources.demo`, copied from `brand/` into `demo/` and shipped on the wheel via `importlib.resources`) and runs `doctor` → `check` → `review` (sheet + Review Lab) → `ship` against the bundled receipt, reporting each step and the worst exit code. Editing the materialized `master.svg` and re-running `ship` fails closed with `receipt-stale-source`.
229
+ - The **PR Proof GitHub Action** (`.github/actions/proof`, wired by `.github/workflows/icon-proof.yml` on `pull_request` for `**/*.svg`, `**/iconflow.toml`, and receipts): installs the pinned package, caches Playwright Chromium, runs `check --json` and `review --json` for every touched `iconflow.toml`, validates the receipt read-only through `scripts/proof_receipt.py` (`receipt-stale-source` / `receipt-stale-contract`), uploads the review sheet, writes a job summary parsed only from the Agent Contract envelopes, and fails on a QA warning or stale receipt with `contents: read` and no secrets. Documented in `docs/PROOF_ACTION.md`.
230
+ - The contributor funnel: a checkbox-driven case PR template (`.github/PULL_REQUEST_TEMPLATE/case.md`), the minimal receipt-bound `examples/community-case/` fixture (Keepsake Knot), a CONTRIBUTING "First 30 minutes" section with the install table and case lane, `docs/ISSUE_SEEDS.md` with eight bounded good-first-issue drafts, and skill/AGENTS wording that resolves `iconflow` on PATH first with the checkout as contributor mode.
231
+ - A browser-side **Remix Lab** on the homepage: the Petal, Balloon, and Canopy Haypile sources from one brief, live palette, card-radius, scale, mirror, and card controls, exact native 16–128px canvases rasterized by the visitor's own browser, a 16× pixel zoom, a colour-removed silhouette, an alpha-template preview, and Download SVG / Copy SVG / Copy agent brief actions. Nothing is uploaded; the lab labels its output as unreviewed and points at `check`, `review`, and `ship`.
232
+ - The **Living Archive**: every identity direction IconFlow drew while searching for its own mark — 137 original SVG studies across 7 rounds (proof machines, living care, expanded living, hidden brand, orchard & garden, canopy cargo, organic neko), each with an exact 16px proof, its status (study, gated finalist, promoted, or the temporary product mark), and its one-line reading. `scripts/build_archive.py` promotes the gitignored exploration into tracked `website/assets/archive/` assets and a `catalog.json`, regenerates `/archive/` (filters, deep links, detail dialog) and the homepage blocks between marker comments, and has a clean-clone `--verify-only` gate that the website tests run. The homepage now opens with archive marks drifting around the current mark, a three-row marquee wall of the whole archive, and a strip of the nineteen directions that passed the gate.
233
+ - A first-class methodology page, `/how-icons-are-made/`: the nine-stage pipeline with its two human stages marked, the user-job brief, divergence and the signature-device test, editable 1024-grid SVG and deterministic generation, exact Chromium rendering, what `check` and the similarity audits really test, human review and source-bound receipts, vector-versus-raster, the clean-room boundary and trademark caveat, and a five-tier relative cost model with no invented prices. Every claim sits beside a real repository artifact; the route is in the sitemap, the cache headers, the primary navigation, and the website contract tests.
234
+ - Four distilled rules, `docs/LEARNINGS.md` L51–L54 (dense control families keep the noun and give state its own rail; a coloured band on a dark block is a folder tab until a wedge and a cut say otherwise; repeated teeth cannot say "torn" at 16px; scan the 128/256px strips for spikes before scoring craft), folded into `DESIGN_PLAYBOOK.md` §6 and `REVIEW_CHECKLIST.md`, with the two recorded cases that produced them.
235
+ - An advisory macOS tray-template audit, `iconflow check <master> --tray-svg <tray.svg> [--tray-template-mode auto|alpha|contrast]`, surfaced by `review` as well. It compares the interior detail of the colour tray asset against the enclosed holes of the derived template and reports a template that kept none of the mark's features — the failure that ships a featureless black lozenge to the menu bar. Advisory by design: it audits a linked variant, so it informs the designer without gating `ship`.
236
+ - Two worked `examples/` icon families built through the full gated loop from one brief, `iconflow-balloon` (Balloon Haypile) and `iconflow-parachute` (Canopy Haypile), each with its editable master and tray source, source-bound receipt, shipped web/Tauri/Electron/tray outputs, and casebook record.
237
+ - Five distilled rules, `docs/LEARNINGS.md` L46–L50, folded into `CONCEPTING.md` §3, `DESIGN_PLAYBOOK.md` §2/§5, `SVG_TECHNIQUES.md` §11, and `OUTPUT_TARGETS.md`.
238
+ - Twenty structurally distinct, small-size-first technique scaffolds, a
239
+ machine-readable `iconflow styles --json` catalog, and a Chromium-rendered
240
+ `styles --gallery` proof matrix with per-family tray guidance.
241
+ - A launch-site product narrative and a 24-brief, cross-theme showcase plan
242
+ designed to turn reviewed icon cases into website and video evidence.
243
+ - A responsive, dependency-free promotional site with an interactive native-pixel
244
+ Proof Lab, technique gallery, accessible controls, security headers, and a
245
+ canonical production deployment at `ai-iconflow.com`, with
246
+ `iconflow.pages.dev` retained as a permanent compatibility redirect.
247
+ - An agent-first `/getting-started/` guide with copyable cross-platform setup,
248
+ an honest agent/CLI responsibility split, the complete quality-gated loop,
249
+ exact output families, current limitations beside the workflow, and
250
+ crawlable `WebSite` / `SoftwareSourceCode` metadata without invented ratings.
251
+ - Cross-platform setup scripts that deploy the open-format IconFlow skill to
252
+ Codex, Claude Code, open Agent Skills, and GitHub Copilot discovery homes.
253
+ - Nine reviewed Theme Worlds now prove subject range beyond the fixed Flow Gate
254
+ specimen: relationship, cat, dog, fish, original character, and game. Each
255
+ includes an editable SVG, source-bound receipt, native 16px render, shipped
256
+ web assets, and a casebook record.
257
+ - A 100-case Gallery spanning specific product worlds and construction
258
+ grammars. Every case exposes an editable SVG, exact native 16px proof,
259
+ silhouette, contract-bound review receipt, and reusable case record; eleven
260
+ weaker or repetitive directions were removed from 111 generated candidates.
261
+ - Two separately labeled clean-room practice collections: Social Signals maps
262
+ 20 user jobs across all 20 techniques, and Emoji Matrix provides a complete
263
+ 20-by-20 field of 400 source-bound specimens.
264
+ - A clean-clone `build_gallery.py --verify-only` gate that rechecks all 100
265
+ tracked sources, receipts, renders, case records, and deploy copies without
266
+ the gitignored candidate-adjudication workspace.
267
+ - A clean-room style research record covering current upstream licenses,
268
+ small-size lessons, and explicit no-asset-copy provenance.
269
+ - Apache-2.0 project licensing, package license metadata, attribution notices,
270
+ and a separate trademark policy protecting the official IconFlow identity.
271
+ - Browser integration tests proving that external SVG resources do not reach
272
+ the network and that animated input renders repeatably.
273
+ - Distribution-content verification and a non-publishing release-candidate
274
+ workflow with checksums and wheel reproducibility checks.
275
+ - Security, provenance, contribution, issue, pull-request, and release guidance.
276
+
277
+ ### Changed
278
+
279
+ - Pre-publish UI/UX pass on the site, synthesized from three independent audits (Codex, Grok, Gemini via ATD): the hero rail is a real native-size scrubber with a pixel loupe; the primary navigation is six real destinations with the menu collapsing at 1000px on every page; the works wall sits directly under the hero with a persistent Pause/Resume control while the archive's explanation and finalist strip moved below the case studies; visible `:focus-visible` rings on every control, 44px coarse-pointer targets, `scroll-padding-top` for the fixed header, honest reduced-motion (animations off, not 0.01ms), raised contrast on dimmed headings and captions, intrinsic dimensions on every image, `aria-labelledby` on the technique dialog, Escape/outside-click for the mobile menu, `role="button"` archive cards, "passed review" instead of "gated", a one-line definition of the receipt, US "color" everywhere, a product-describing `<title>`, `og:image` dimensions/alt, versioned CSS/JS URLs, and revalidation headers for every canonical route.
280
+ - Every remaining Flow Gate brand asset now shows the current Petal Haypile mark: the homepage proof PNGs (`/assets/proof/icon-16…256.png`), the Proof Lab receipt scores and hash, the bake-off and review-sheet evidence images, the README hero, and the social preview SVG/PNG. Flow Gate stays only where it is explicitly historical or the fixed technique specimen.
281
+ - The Emoji Matrix explorer and complete matrix raise every mono micro label to 13px on desktop and at least 12px on tablet, widen the axis columns to fit, and open on the `u2764-fe0f--mascot` cell instead of the first catalog cell (hash and query URLs still win).
282
+ - `brand/tray.svg` gained one broad transparent eye cut so the macOS alpha template keeps a face; the receipt and contract hashes were re-bound and the tray outputs re-shipped (web/Tauri/Electron outputs were byte-identical).
283
+ - Setup now installs the Codex/Open Agent Skills user copy only under
284
+ `~/.agents/skills/iconflow/` and removes the legacy
285
+ `~/.codex/skills/iconflow/` duplicate that current Codex also discovers.
286
+ - The promotional site's canonical host is now `ai-iconflow.com`. Canonical
287
+ links, Open Graph URLs, structured data, `robots.txt`, and the sitemap point
288
+ at the apex, and exactly one host serves content. `www.ai-iconflow.com` and
289
+ `iconflow.pages.dev` redirect through the shell project's `_redirects`;
290
+ `iconflow.pages.dev` redirects through a Pages Functions middleware, because
291
+ Pages supports no domain-level `_redirects` rule and a project cannot
292
+ host-match its own default host. Deployment previews still serve, so they
293
+ stay testable. `rel=canonical` was not sufficient on its own: it advises
294
+ crawlers, while root-relative internal links kept a visitor who landed on the
295
+ old host there for the whole session.
296
+ - The site's CSP drops its two pinned inline-script hashes for plain
297
+ `script-src 'self'`. A Chromium probe confirmed that `application/ld+json`
298
+ raises no `securitypolicyviolation` under `script-src 'self'` and stays
299
+ readable from the DOM, so the hashes protected nothing while invalidating the
300
+ CSP on every structured-data edit. Every executable script is an external
301
+ file, so the policy is now strictly tighter: no inline allowance at all, with
302
+ a test that fails if an executable inline script is ever added.
303
+ - Site deploys go through `scripts/deploy-site.ps1`, which pins each directory
304
+ to its Pages project and verifies the host contract afterwards. The mapping is
305
+ easy to get wrong in both directions: deploying the content tree from the
306
+ repository root silently ships no Functions bundle, and deploying the redirect
307
+ shell to the content project would make the apex redirect to itself.
308
+ - Manual review approvals are bound to the complete source, project, target,
309
+ color, Electron, and semantic tray-source transform contract.
310
+ - `iconflow new` refuses to overwrite an existing destination unless `--force`
311
+ is explicit.
312
+ - CI uses least-privilege permissions, immutable action revisions, timeouts,
313
+ Python 3.10 through 3.14 coverage, and installed-wheel browser tests.
314
+ - Automated QA can reuse one isolated Chromium rasterizer across a collection,
315
+ avoiding one browser startup per SVG without weakening any check.
316
+ - Source-bound SVG hashes normalize line endings, keeping review receipts valid
317
+ across LF and CRLF worktrees, and distribution verification runs without
318
+ importing the uninstalled source package.
319
+ - Casebook metadata is normalized across the full corpus, with strict lint and
320
+ the generated Atlas covering 181 reviewed or shipped cases.
321
+ - Windows package guidance now treats manifest-defined dimensions and filenames
322
+ as part of the reviewed asset contract instead of relying on implicit scaling.
323
+ - The release-candidate clean-wheel smoke now installs its Chromium runtime
324
+ before exercising render-backed checks.
325
+
326
+ ### Fixed
327
+
328
+ - The unit-test matrix had failed on every push since 2026-08-20 because the
329
+ review CLI test let the tray-template audit launch Chromium inside a job that
330
+ has none; the audit is mocked like the other renderers, and the contract
331
+ tests compare paths canonically (macOS `/private` symlinks, Windows 8.3 temp
332
+ names) and patch `iconflow.build.build` through the module object.
333
+ - The homepage hero's decorative rail looked like a slider and did nothing; it
334
+ is now a labelled range input that previews the mark at native sizes. The
335
+ floating archive marks no longer occlude the stage labels.
336
+
337
+ ### Security
338
+
339
+ - SVG input now rejects DTD/entity declarations, malformed or non-SVG XML,
340
+ documents over 4 MiB, more than 50,000 elements, or nesting over 128 levels.
341
+ - Build output rejects existing symlinks, junctions, and reparse points before
342
+ generated files are written.
343
+ - Windows shortcut scripts now use securely created unique temporary files.
344
+
345
+ ## 0.4.0 - 2026-07-21
346
+
347
+ - Introduced the brief-to-concept-to-review workflow, multi-target icon engine,
348
+ six-axis quality gate, Review Lab receipts, and evolving casebook.
349
+
350
+ `0.4.0` was the package version while the work above accumulated; nothing was
351
+ tagged or published under it. The package now carries `0.5.0` as the first
352
+ public release candidate (see `docs/MILESTONE_v0.5.md`); the *Unreleased*
353
+ section folds into `0.5.0` when the owner tags it.