Hallmark 如何让连续生成的AI页面不重样:.hallmark/log.json 项目记忆完整机制
【免费下载链接】hallmarkAnti-AI-slop design skill for Claude Code, Cursor, and Codex.项目地址: https://gitcode.com/GitHub_Trending/hal/hallmark
Hallmark 是一款面向 Claude Code、Cursor、Codex 等 AI 编码工具的防 AI 味(anti-AI-slop)设计技能。它会在项目根目录维护一个.hallmark/log.json项目记忆文件,记录每次生成的页面结构与主题;每次生成前先读取这份记忆、自动排除最近用过的组合,让连续运行十次,产出的页面也各不相同。本文拆解这套"记忆"机制的完整运转逻辑。
为什么 AI 连续生成的页面总是一样
先问一个问题:AI 生成的页面,最大的毛病是什么?是"长得都一样"——顶部大标题 hero、中间三张功能卡片、CTA 按钮、四栏页脚,同一套字体、同一种版式节奏,换皮也认得出是同一个模板。
根源在于两点:其一,AI 在两次运行之间是无状态的,它不记得上次生成过什么;其二,模型被海量同构页面训练过,一旦没人约束,它就会退回到训练数据里出现频率最高的"默认答案"。🧠
Hallmark 的对策分两层:
- 换结构,而不只是换色——每次生成前必须从 21 种命名宏观结构(页面骨架)和 22 种命名主题(字体 + 配色)里各挑一个;
- 把记忆外置——把每次选择写进项目里的
.hallmark/log.json,下次生成前先读这个文件,知道"最近用过什么"并主动排除。
前者给它"不同"的能力,后者让"不同"成为硬规则。
项目记忆机制如何运转:读历史 → 排除重复 → 留记录
整套机制可以概括为三步循环,全程自动发生,不需要任何手动维护。
① 生成前,先读历史
当 Hallmark 接到设计任务时,如果发现项目根目录存在.hallmark/log.json,会先读取再挑选宏观结构和主题。文件是一个 JSON 数组,最新的生成记录排在最前面,每条包含 5 个字段(示例摘自 skills/hallmark/SKILL.md):
[ { "date": "2026-04-30", "macrostructure": "Bento Grid", "theme": "Linen", "enrichment": "E1 clipped-edge", "brief": "Tracejam · SaaS observability" }, { "date": "2026-04-28", "macrostructure": "Long Document", "theme": "Linen", "enrichment": "E5 hand-built SVG", "brief": "Maple Street Bread · bakery" }, { "date": "2026-04-25", "macrostructure": "Manifesto", "theme": "Manifesto", "enrichment": "none", "brief": "Meridian · studio manifesto" } ]| 字段 | 含义 |
|---|---|
date | 生成日期 |
macrostructure | 使用的页面骨架(21 种之一,如 Bento Grid、Manifesto、Letter) |
theme | 使用的主题(22 种之一,或 custom 定制主题) |
enrichment | 首屏视觉增强方式(E1–E8,或 none 纯排版) |
brief | 需求的一句话摘要 |
② 挑选结构时,执行排除
光读历史还不够,规则规定了挑选时的三条"不许"(见 SKILL.md Step 2.5):
- 结构不重复:宏观结构不得与最近 3 条记录中的任何一个相同;
- 主题"三轴不同":连续两次的主题,必须在 ① 纸张明度带(暗 / 中 / 亮)② 展示字体风格(斜体衬线 / 等宽 / 几何无衬线……)③ 强调色相(暖 / 冷 / 中性……)中至少有一个轴不同;
- 首屏增强不重复:enrichment 原型不得与上一次相同——连用两次同样的首屏处理,即使内容不同也会读起来像模板。
导航和页脚原型同样纳入轮换:连续两次输出不得共享同一个导航原型或页脚原型(见 SKILL.md)。
③ 生成后,留下记录
写完 CSS 文件后,Hallmark 把新记录追加到数组最前面,并把文件裁剪到最近20条(最老的被移出),规则见 SKILL.md Step 6。这个文件正是下一次运行 Step 2.5 要读的东西——形成闭环。文件不存在?第一次生成时自动创建.hallmark/目录和文件;用户不想把它提交进仓库,加进.gitignore即可,机制完全尊重用户选择。
为什么 AI 必须"把挑选说出来"
机制还要求 Hallmark 在挑选前用文字公开轮换过程,例如:
最近 5 次构建:Bento Grid(Tracejam)· Bento Grid(Foundry)· Long Document(Maple)· Manifesto(Meridian)· Quote-Led(Tide)。Bento Grid 用了 2/5 —— 这次从 {Marquee Hero, Stat-Led, Workbench, Letter} 里挑,我选 Marquee Hero。
这是给用户的"问责线":如果 AI 跳过这段声明,你一眼就能看出它是否在敷衍差异化规则。三种典型形态各有处理方式——首次运行(无 log.json)不声明、直接挑结构;成熟项目(5 条以上记录)按"频率统计 + 排除清单 + 选择"完整声明;用户明确要求"再来一次同样的结构"时,Hallmark 会保留结构但更换内部参数旋钮,做到"同骨架、不同指纹"。
真实轮换案例:Tide 播客页面两次生成的变化
仓库里有一个可直接阅读的实例:同一个需求"给我的独立播客 Tide 做个落地页"生成了两次,完整记录见 site/_tests/01-tide-podcast/brief.md。
| 维度 | 第一次(v1) | 第二次(v2) |
|---|---|---|
| 宏观结构 | Quote-Led(引言先行) | Letter(信件先行) |
| 主题 | Atelier | Salon |
| 主题三轴 | 亮 / 斜体衬线 / 暖 | 亮 / 等宽展示 / 暖 |
| 微交互 | 无 | 仅光标闪烁一处 |
同一个需求,产出了两个气质完全不同的页面:v1 用听众的引言来"框定"播客,v2 由主播第一人称写给听众的信;主题轮换在"展示字体风格"轴上不同(斜体衬线 → 等宽展示),顺利通过差异化门槛。官方测试报告还确认:八个不同需求在一次轮换会话中连跑,没有任何两个页面共享宏观结构或主题——见 site/_tests/README.md。
下面是官方示例集中的两个需求产出,一明一暗、骨架不同、首屏不同:
值得知道的细节:什么时候写、什么时候不写
几个边界情况 📝:
- 组件范围不写记忆:只让 AI 设计一个按钮、卡片、输入框时,页面级装置(宏观结构、页脚、项目记忆)整体不适用,
log.json不会写入任何条目——组件不参与轮换; - 定制主题条目多两个字段:
theme_axes(三轴的具体取值)和可选vibe(4–8 个词的氛围描述),格式见 custom-theme.md § F。差异化规则是"主题路由无关"的——定制主题对比目录主题,执行完全相同的检查,没有豁免通道; - 只有 CSS 戳记、没有 log.json:Hallmark 会从 CSS 戳记推断出一条记录,照常轮换;
- 多页面重设计只写一条:带
"scope": "app"标记,而不是每页一条,见 redesign.md。
项目记忆规则在哪里定义:模块路径
| 内容 | 路径 |
|---|---|
| 主规则文件(Step 2.5 读取 + Step 6 写入) | skills/hallmark/SKILL.md |
| 读历史与排除规则(Step 2.5) | skills/hallmark/SKILL.md#L292-L327 |
| 主题三轴定义(明度带 / 字体风格 / 色相) | skills/hallmark/SKILL.md#L272-L274 |
| 写入 log.json、裁剪至 20 条(Step 6) | skills/hallmark/SKILL.md#L457 |
| 定制主题条目格式 | skills/hallmark/references/custom-theme.md#L202-L218 |
| 22 个主题的三轴取值来源 | site/css/tokens.css |
| 真实轮换记录 | site/_tests/01-tide-podcast/brief.md |
| "同一配方跑两次应产出不同结构" | docs/recipes.md#L185 |
一句话总结
.hallmark/log.json是 Hallmark 的"生成台账":每次生成写一行,每次生成前读一遍,只保留最近 20 行。它把"别和上次一样"从一句口号,变成了可执行、可检查、可追溯的硬规则 ✅——这正是设计技能让连续 AI 生成页面"像做出来的,而非像生成的"的关键所在。
【免费下载链接】hallmarkAnti-AI-slop design skill for Claude Code, Cursor, and Codex.项目地址: https://gitcode.com/GitHub_Trending/hal/hallmark
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考