编写程序,接受结果不完美,程序保存半成品创意,后续不定期迭代,慢慢打磨成完整作品。

DraftVault — 半成品创意保管库 × 渐进式打磨系统

一、实际应用场景描述

你手机备忘录里有这些:

- "一个关于失忆咖啡师的短篇小说开头"(写了 300 字,停在主角走进店门)

- "App 想法:帮人管理药品库存"(画了草图,没动代码)

- "播客选题:为什么年轻人不想上班"(列了 5 个要点,没录)

- "水彩画:窗台上的多肉"(线稿画完,颜色没敢上)

它们不是垃圾。但它们也不是"作品"。它们卡在一个尴尬的中间态——不够好到发布,又不至于烂到删除。所以你既没推进,也没放弃,只是让它们在文件夹里慢慢积灰。

然后某天你清理手机,看着它们,心里有两个声音在打架:

- "这些都没完成,我果然什么都做不成。"

- "万一哪天灵感来了呢?"

DraftVault 就是为这些"未完成"而生的工程化工具——它不催你"赶紧做完",也不让你"干脆删掉"。它做一件很温柔的事:给每个半成品一个家,记录它现在的状态,然后在你准备好的时候,帮你一步步把它打磨成作品。

二、引入痛点

痛点 本质问题 本工具解法

半成品无处安放 不是成品没地方存,是"中间态"没容器 专门的 Draft 实体 + 状态追踪

完美主义瘫痪 要么完美要么不做 状态机:种子→草稿→雏形→打磨→完成

找不到上次进度 重拾成本高 → 放弃 自动记录 last_focus_area + next_step

不知道从哪继续 面对半成品只有焦虑 每次打开只显示 next_action

没有版本记忆 改着改着把好的改没了 轻量版本快照(before/after)

完成的没有仪式感 做完就扔,没有闭环 completion_report 自动生成

同类半成品堆积 看不到全貌,重复造轮子 标签聚类 + 关联建议

三、核心逻辑讲解

理论基础(工程化映射)

1. 迭代设计(Iterative Design, Norman)

- 好设计不是一次成型的,是反复打磨的

- 每个版本都比上一个好一点

- 本工具用状态机 + 版本快照实现"渐进式完善"

2. 创作心理学(Amabile, 1996)

- 内在动机 + 适度挑战 = 创造力

- 完美主义是创造力的最大敌人之一

- 本工具把"完成"定义为一个过程而非事件

3. 版本控制思想(Git 哲学)

- commit 不是"完成",是"此刻的状态"

- 每次迭代都是一个 checkpoint

- 本工具借鉴:每次打磨 = 一次 commit

4. 蔡格尼克效应(Zeigarnik Effect)

- 未完成的事占据工作记忆

- 外部化(写下来)能释放认知资源

- 本工具让半成品"安全存放",不再占用脑子

核心流程

💡 捕捉半成品(30 秒,不评判质量)

📋 记录当前状态

类型 / 完成度 0-100 / 当前卡点 / 下一步动作

🏷️ 自动标签 + 关联建议(有没有相似的草稿?)

📂 存入 Vault(按状态分组)

🔄 不定期迭代(每次打开只做一件事)

├─ 系统推荐 next_action(基于状态 + 卡点)

├─ 用户执行 → 更新进度

├─ 自动打版本快照

└─ 如果方向变了 → 记录 pivot

🎉 达到完成态 → 生成 completion_report

📊 仪表盘:各状态分布 / 迭代频率 / 完成率

状态机设计

┌─────────┐

│ 🌱种子 │ ← 只有一个想法/标题

└────┬────┘

↓ 写了第一稿

┌─────────┐

│ 📝草稿 │ ← 有内容但不连贯

└────┬────┘

↓ 结构完整

┌─────────┐

│ 🧱雏形 │ ← 能看懂但粗糙

└────┬────┘

↓ 细节打磨

┌─────────┐

│ 💎打磨 │ ← 接近成品

└────┬────┘

↓ 发布/展示

┌─────────┐

│ ✅完成 │ ← 阶段性终点

└─────────┘

关键设计决策

决策 原因

状态机而非百分比 百分比模糊,状态名有行动暗示

每次只显示 next_action 降低重拾成本,避免 overwhelm

版本快照而非全文历史 轻量、可读、不膨胀

不催完成 压力是创意的天敌

关联建议 让相似的半成品互相滋养

本地 JSON 隐私 + 零依赖 + 可审计

四、代码模块化(六层架构)

目录结构

draftvault/ ← 26 个 Python 文件 / ~2100 行

├── main.py ← 入口层:Application 容器 + CLI 调度

├── config.py ← 配置层:状态/类型/提示词/菜单

├── models/ ← 数据模型层(@dataclass,不可变)

│ ├── enums.py ← 枚举:状态/类型/迭代类型

│ ├── draft.py ← Draft 实体(半成品核心)

│ ├── iteration.py ← Iteration 实体(每次打磨记录)

│ ├── version_snapshot.py ← VersionSnapshot 实体(快照)

│ └── completion_report.py ← CompletionReport 实体

├── storage/ ← 持久化层(Repository 模式)

│ └── json_store.py ← CRUD + 原子写入 + 自动备份

├── services/ ← 业务层(6 个 Service,单一职责)

│ ├── capture_service.py ← 半成品捕捉(快速录入)

│ ├── draft_service.py ← Draft CRUD + 状态流转

│ ├── iterate_service.py ← ★ 迭代引擎(推进/快照/建议)

│ ├── version_service.py ← 版本管理(快照/回滚/对比)

│ ├── suggestion_engine.py ← 关联建议 + next_action 推荐

│ └── review_service.py ← 仪表盘 + 报告 + 导出

├── cognition/ ← 认知干预层

│ ├── perfectionism_guard.py← 完美主义检测 + 去灾难化

│ └── progress_framing.py ← 进度重构(不跟完美比)

├── utils/ ← 工具层(纯函数,零业务依赖)

│ ├── cli_helper.py ← 终端交互

│ ├── dashboard.py ← 终端可视化

│ ├── statistics.py ← 均值/频次/趋势

│ ├── date_util.py ← 日期差/间隔

│ ├── text_processor.py ← 关键词/摘要

│ └── validator.py ← 校验

├── README.md / USAGE.md / CHEATSHEET.md

└── demo.py ← 一键跑通全流程

各层职责边界

层 能做什么 不能做什么

"main.py" 组装系统、路由菜单 不写业务逻辑

"config.py" 集中管理常量/状态/提示词 不含逻辑

"models/" 数据结构、校验、序列化 不读写文件

"storage/" 读写 JSON、备份、查询 不知道数据含义

"services/" 核心业务逻辑 不直接操作文件

"cognition/" 完美主义干预、进度重构 不修改数据

"utils/" 纯函数工具 零业务依赖

核心模块代码展示

1️⃣ 数据模型(不可变 + 状态流转)

# models/draft.py

@dataclass(frozen=False) # 允许状态更新(有审计)

class Draft:

"""半成品创意 —— 核心实体"""

draft_id: str

title: str

content_type: str = "写作" # 写作/代码/视觉/音乐/想法/其他

current_state: str = "seed" # seed→draft→prototype→polish→done

completion: int = 0 # 0-100

core_idea: str = "" # 一句话核心

current_text: str = "" # 当前内容

stuck_point: str = "" # 卡在哪里

next_action: str = "" # 下一步唯一动作

tags: List[str] = field(default_factory=list)

created_at: date = field(default_factory=date.today)

updated_at: date = field(default_factory=date.today)

iteration_count: int = 0

last_session_summary: str = ""

def __post_init__(self):

if not self.title.strip(): raise ValueError("标题不能为空")

if not (0 <= self.completion <= 100): raise ValueError("完成度 0-100")

if self.current_state not in STATE_FLOW: raise ValueError("非法状态")

def advance_state(self) -> bool:

"""状态推进(有向图,不可逆)"""

flow = STATE_FLOW[self.current_state]

if flow["next"] and self.completion >= flow["threshold"]:

self.current_state = flow["next"]

self.updated_at = date.today()

return True

return False

设计意图:状态机有向流转 + 阈值检查,防止"还没写就标完成"。

2️⃣ 迭代引擎(核心:推进 + 快照 + 建议)

# services/iterate_service.py

def iterate_interactive(self, draft_id: str) -> Optional[Iteration]:

"""一次迭代会话:做一件事 → 记录 → 快照"""

draft = self.draft_svc.get(draft_id)

if not draft: return None

# 1. 显示当前状态 + 建议的下一步

print(f"\n 📌 当前: {draft.title} ({draft.current_state})")

print(f" 🎯 建议下一步: {draft.next_action or '(请设置)'}")

# 2. 用户描述这次做了什么

what_done = prompt_text("这次做了什么?", required=True)

new_completion = prompt_int("完成度 (0-100)", 0, 100, default=draft.completion)

# 3. 打了快照(before → after)

snapshot = self.version_svc.take_snapshot(draft, label=f"iter_{draft.iteration_count+1}")

# 4. 更新 Draft

draft.current_text = prompt_text("当前内容(可粘贴)", required=False) or draft.current_text

draft.completion = new_completion

draft.stuck_point = prompt_text("还卡在哪?(可留空)", required=False) or ""

draft.next_action = prompt_text("下次唯一一步:", required=False) or draft.next_action

draft.iteration_count += 1

draft.updated_at = date.today()

draft.advance_state() # 自动推进状态

# 5. 记录迭代日志

iteration = Iteration(

draft_id=draft_id,

what_done=what_done,

completion_before=snapshot.completion_before,

completion_after=new_completion,

...

)

self.iteration_store.append(iteration.to_dict())

self.draft_svc.save(draft)

return iteration

设计意图:每次迭代 = 一个 commit。轻量、可追溯、不膨胀。

3️⃣ 版本快照(轻量 Git 思想)

# services/version_service.py

def take_snapshot(self, draft: Draft, label: str = "") -> VersionSnapshot:

"""在修改前打快照"""

snapshot = VersionSnapshot(

draft_id=draft.draft_id,

label=label,

completion_before=draft.completion,

content_before=draft.current_text,

)

# 存入版本历史

self.version_store.append(snapshot.to_dict())

# 只保留最近 N 个(防膨胀)

self._trim_old_versions(draft.draft_id, keep=20)

return snapshot

def compare_versions(self, draft_id: str, idx1: int, idx2: int) -> str:

"""对比两个版本的差异(行级)"""

versions = self._get_versions(draft_id)

v1 = versions[idx1].content_before

v2 = versions[idx2].content_before

# 简单行级 diff(不用 difflib 也可)

diff = difflib.unified_diff(

v1.splitlines(), v2.splitlines(),

fromfile=f"v{idx1}", tofile=f"v{idx2}",

lineterm="",

)

return "\n".join(diff)

4️⃣ 完美主义守护器(认知层)

# cognition/perfectionism_guard.py

class PerfectionismGuard:

"""检测完美主义信号,给出去灾难化提示"""

def scan(self, draft: Draft, text: str) -> List[str]:

warnings = []

# 信号1:完成度停滞在 80-99 不动

if draft.completion >= 80 and draft.iteration_count > 5:

warnings.append(

"🛡️ 这个草稿在 80%+ 停留了很久。"

"完美主义的高原期——继续微调边际收益很小。"

"建议:要么发布,要么锁起来 2 周再看。"

)

# 信号2:卡点描述含"不够好"

if "不够好" in (draft.stuck_point or "").lower():

warnings.append(

"🛡️ 「不够好」是完美主义的标志语言。"

"问自己:对谁不够好?按什么标准?这个标准合理吗?"

)

# 信号3:迭代只改细节不动结构

recent = self._recent_iterations(draft.draft_id, n=3)

if all(it.what_done.startswith(("改了", "调了", "修���")) for it in recent):

warnings.append(

"🛡️ 最近几次迭代都在做微调。"

"可能该做结构性突破了——换个角度,而不是换个字。"

)

return warnings

设计意图:不是阻止追求质量,而是识别"为了完美而拖延发布"的模式。

5️⃣ 进度重构器(认知层)

# cognition/progress_framing.py

def reframe(self, draft: Draft) -> List[str]:

"""用不同框架看同一个半成品"""

lines = []

# 框架1:跟昨天的自己比

if draft.iteration_count > 0:

lines.append(

f"你已经在它上面花了 {draft.iteration_count} 次迭代。"

"它比第一版好多少?——这才是真实的进度。"

)

# 框架2:完成度 ≠ 价值

if draft.completion < 50:

lines.append(

"完成度低不代表没价值。"

"很多伟大作品的雏形看起来都很可笑。"

)

# 框架3:半成品是资产

lines.append(

"每一个半成品都是一颗种子。"

"你不需要现在就让所有种子发芽——有些是为明年准备的。"

)

return lines

6️⃣ 入口层(依赖注入)

# main.py

class Application:

def __init__(self):

# 5 个 Store

self.draft_store = JSONStore(DATA_DIR/"drafts.json", ...)

self.iter_store = JSONStore(DATA_DIR/"iterations.json", ...)

self.version_store = JSONStore(DATA_DIR/"versions.json", ...)

self.report_store = JSONStore(DATA_DIR/"reports.json", ...)

self.tag_store = JSONStore(DATA_DIR/"tags.json", ...)

# 认知层(2 个组件)

self.guard = PerfectionismGuard()

self.framer = ProgressFraming()

# 业务层(6 个 Service)

self.capture_svc = CaptureService(self.draft_store)

self.draft_svc = DraftService(self.draft_store, self.tag_store)

self.iterate_svc = IterateService(...)

self.version_svc = VersionService(self.version_store, self.draft_store)

self.suggest_svc = SuggestionEngine(self.draft_store, self.tag_store)

self.review_svc = ReviewService(...)

项目统计

指标 数值

Python 文件 26 个

总代码量 ~2100 行

架构层数 6 层

外部依赖 0(仅标准库)

状态数 5 个(种子→草稿→雏形→打磨→完成)

内容类型 6 种(写作/代码/视觉/音乐/想法/其他)

认知干预 完美主义检测 + 进度重构

数据持久化 本地 JSON + 自动备份

五、README 文件

完整 README.md 已包含在项目中,核心内容:

# DraftVault

给所有"写了一半就停了"的东西一个安全的家。

## 安装

python 3.8+,仅标准库

## 快速开始

python demo.py # 看演示

python main.py # 正式使用

## 核心理念

半成品不是失败,是未来的作品在等一个合适的时机。

## 状态流转

🌱种子 → 📝草稿 → 🧱雏形 → 💎打磨 → ✅完成

## 设计原则

- 不催完成

- 每次只做一步

- 版本可追溯

- 完美主义会被温柔地提醒

- 本地优先

六、使用说明(USAGE.md 节选)

什么时候该记录一个半成品:

- ✅ 写了一半的文章/小说/诗

- ✅ 画了草图没上色的画

- ✅ 搭了骨架没填内容的项目

- ✅ 录了一半的音频/视频

- ❌ 还没开始的想法(先用别的工具捕捉)

- ❌ 已经放弃且不打算捡回来的(不需要 vault)

如何有效迭代:

- 每次打开只做一件事(不要"继续写")

- 具体动作 > 模糊意愿("加一段对话" > "改改看")

- 允许倒退(有些迭代会让完成度下降,那是探索)

next_action 怎么写:

好 不好

给主角起一个名字 继续写

画出第二根线条 完善一下

写出函数签名 写代码

录 30 秒人声测试 做播客

版本快照什么时候看:

- 改坏了想回退 → 对比两个版本

- 觉得自己没进步 → 看最早的快照

- 准备发布 → 看完整迭代历史

七、核心知识点卡片(CHEATSHEET.md)

# 理论 工具对应

1 迭代设计(Norman) 状态机 + 每次迭代

2 完美主义瘫痪 PerfectionismGuard 检测

3 蔡格尼克效应 外部化释放记忆

4 版本控制思想(Git) 快照 + 对比 + 回滚

5 心流理论(Csikszentmihalyi) 状态匹配难度

6 成长型思维(Dweck) 进度跟自己比

7 最小可行产品(Ries) 种子状态可发布

8 创作习惯(Pressfield) 每天打开做一步

9 认知卸载(Sweller) 外部记忆减负

10 完成偏见(Behavioral Econ) completion_report 仪式

八、总结

DraftVault 不是一个"帮你完成作品"的工具,是一个"让半成品不再折磨你"的工具。

技术上,它展示了:

- 如何用 6 层架构 组织一个中等复杂度的 Python 项目

- 如何用 状态机 管理创作生命周期

- 如何用 快照模式 实现轻量版本控制

- 如何用 Git 哲学 设计迭代流程(commit ≠ 完成)

- 如何用 认知检测 温柔地对抗完美主义

心理学上,它坚持几个原则:

不催——压力是创意的天敌,催促只会制造更多半成品。

不评判——种子的价值不亚于果实。

不遗忘——每个半成品都被安全存放,随时可回来。

不替代专业帮助——严重创作障碍请寻求专业支持。

最终,这个工具想传达一件事:

你那些"写了一半就停了"的东西,不是你的耻辱。

它们是你的创作指纹——证明你是一个会开始的人。

而"会开始",已经是大部分人都做不到的事了。

把���们存好。时机到了,它们会自己喊你。

利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!