Skip to content

Commit 39a3e79

Browse files
committed
Make learner verification require explicit checkpoint attestation
1 parent db85cdd commit 39a3e79

40 files changed

Lines changed: 763 additions & 142 deletions

File tree

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@ python examples/product-slug/verify.py starter --expect-failure
5353
python examples/product-slug/verify.py solution
5454
```
5555

56+
## Verify and record a course
57+
58+
In the course folder, run `python verify.py` after each change. It tests only
59+
`starter/`: `[open]` means the task is unfinished, `[passed]` gives a claim
60+
code, and `[pending]` is a reflection checkpoint. Answer that lesson's
61+
questions, then run `python verify.py --attest l01` (repeat for each completed
62+
reflection) to get its code. Submit only `[passed]` and `[attested]` codes
63+
through your agent or the dashboard. `check --json` is the versioned v2
64+
interface; `progress --json` remains for older signed-receipt integrations.
65+
5666
## Choose what you need to accomplish
5767

5868
| Goal | Start here | What you will produce |

README_cn.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ python examples/product-slug/verify.py starter --expect-failure
4949
python examples/product-slug/verify.py solution
5050
```
5151

52+
## 验证并记录课程进度
53+
54+
在课程文件夹里,每次修改后运行 `python verify.py`。它只测试 `starter/`
55+
`[open]` 表示任务未完成,`[passed]` 会给出认领码,`[pending]` 是需要
56+
本人回答课后问题的自报检查点。回答后运行 `python verify.py --attest l01`
57+
(每个已完成的自报检查点分别确认),取得 `[attested]` 认领码。只通过
58+
Agent 或工作台提交 `[passed]``[attested]` 的码。`check --json`
59+
版本化的 v2 接口;`progress --json` 只为旧版签名回执集成保留。
60+
5261
## 选择你现在要完成的事
5362

5463
| 目标 | 从这里开始 | 最终产出 |

content-manifest.json

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@
5959
"path": "courses/agent-rules-single-source/COURSE.md",
6060
"title": "One source of truth for agent rules",
6161
"summary": "Stop maintaining diverging AGENTS.md, CLAUDE.md, and .cursorrules files — build a checker that proves your repository has exactly one rule source, taught hands-on with your coding agent.",
62-
"sha256": "ea30434d93440708952bd4acb895efb5c8b59bf9764ccddeaab53f97eaa283e8"
62+
"sha256": "b75cb686586e3ae0ecb92d9b68c220212e9364b752808b5ba63c273da339fe87"
6363
},
6464
{
6565
"lang": "zh-CN",
6666
"path": "courses/agent-rules-single-source/COURSE_cn.md",
6767
"title": "Agent 规则的单一真源",
6868
"summary": "不再同时维护彼此打架的 AGENTS.md、CLAUDE.md 与 .cursorrules——亲手构建一个能证明仓库只有一处规则真源的检查器,由你的编码 Agent 授课。",
69-
"sha256": "5b11e590514fe81dc01b6ad4555a55abfc3b730ca4d14ff1fa4cd5b50fb15bb9"
69+
"sha256": "9d5efe0d5ee5615be9d90001fe8a53c209b285a9e7ca6364222f71779d83eedf"
7070
}
7171
]
7272
},
@@ -197,14 +197,14 @@
197197
"path": "courses/hands-on-python-with-claude-code/COURSE.md",
198198
"title": "Hands-on Python with Claude Code",
199199
"summary": "An agent-taught course that takes you from a cloned folder to a tested, verified Python report tool using Claude Code — including the task contract, the bounded change, and the objective pass/fail evidence.",
200-
"sha256": "44b874c07240c58bf7d3b240fa45fe52a0981802d2b4bbe95900567f20c12d69"
200+
"sha256": "3076ed936b16ecae0891ecfa881b6bb553080175639e270b1bc0031a01753006"
201201
},
202202
{
203203
"lang": "zh-CN",
204204
"path": "courses/hands-on-python-with-claude-code/COURSE_cn.md",
205205
"title": "用 Claude Code 实战 Python",
206206
"summary": "一门由 Agent 授课的课程:从下载课程文件夹到交付一个经过测试与验证的 Python 报表工具——包括任务契约、最小变更和客观的通过/失败证据。",
207-
"sha256": "6c385a6554c914efabb37ec5b94f7f65c194094cb75d353db0bba2a35da0c6d4"
207+
"sha256": "a7cb245d0247f6057f11e07e58963513358e698dde1eaf63e52633a4eea2b829"
208208
}
209209
]
210210
},
@@ -335,14 +335,14 @@
335335
"path": "courses/hands-on-with-openai-codex/COURSE.md",
336336
"title": "Hands-on with the OpenAI Codex App",
337337
"summary": "The verified Python workflow — task contract, bounded change, objective verify.py evidence — taught hands-on in the Codex desktop app, where an agent thread runs the loop and you supervise diffs and approvals.",
338-
"sha256": "da4f82fcfce2751c335d1a140cc2e55fafa9f6b1b5353f7925f5ca342ebc6da7"
338+
"sha256": "597bb0d7a6e4529dcbf63a755d4516793ceac21681fa78728540aa42c430c688"
339339
},
340340
{
341341
"lang": "zh-CN",
342342
"path": "courses/hands-on-with-openai-codex/COURSE_cn.md",
343343
"title": "上手 OpenAI Codex 应用",
344344
"summary": "经过验证的 Python 工作流——任务契约、有界改动、客观 verify.py 证据——在 Codex 桌面应用里手把手教:由 Agent 线程跑闭环,你监督 diff 与审批。",
345-
"sha256": "481e2e7fa7873b9695f5ad4c9427ea68f456b54ce6901cb9f01ac57b3f2cf6a3"
345+
"sha256": "60bdd00ee11995fbefe8f46aded4878e936efbf437586fcdcd543fa50b7d0956"
346346
}
347347
]
348348
},
@@ -473,14 +473,14 @@
473473
"path": "courses/hands-on-with-cursor/COURSE.md",
474474
"title": "Hands-on with Cursor",
475475
"summary": "The verified Python workflow — task contract, bounded change, objective verify.py evidence — taught hands-on in Cursor, where Agent mode runs the loop and you supervise diffs and project rules.",
476-
"sha256": "242e0a0838ba61eadf6ed1b2e88c87989e34cd47dfc5b569f6b1455b3139c3b6"
476+
"sha256": "ae57993829cf1c271f1b1ad5d723103d484acb7dcb2dd4a03c318f2b5b012bc7"
477477
},
478478
{
479479
"lang": "zh-CN",
480480
"path": "courses/hands-on-with-cursor/COURSE_cn.md",
481481
"title": "上手 Cursor",
482482
"summary": "经过验证的 Python 工作流——任务契约、有界改动、客观 verify.py 证据——在 Cursor 里手把手教:由 Agent 模式跑闭环,你监督 diff 与项目规则。",
483-
"sha256": "567a8e1a76d5be9b72aa0dd445af38159132cb5660246a74053d634dc75b8d9d"
483+
"sha256": "1e6536d0e6ef22d9152615d1c6a3af6d9a17dba5253a4383748abf6c03786886"
484484
}
485485
]
486486
},
@@ -611,14 +611,14 @@
611611
"path": "courses/da-eda/COURSE.md",
612612
"title": "Exploratory Data Analysis with an Agent",
613613
"summary": "A challenge course — point your agent at a messy shop export and produce a verified EDA summary (results.json) whose numbers are checked against ground truth. First non-stdlib course in the catalog; pandas is managed with uv.",
614-
"sha256": "d36b48bd7f5ee3864fd7b2653dff42703469f64728c440d343a9a5c8076fa99b"
614+
"sha256": "e50b0ca1ec8d3dcccfeb8a9597a31bf3a9b351a869be95c72495a9861ee0b224"
615615
},
616616
{
617617
"lang": "zh-CN",
618618
"path": "courses/da-eda/COURSE_cn.md",
619619
"title": "用 Agent 做探索性数据分析",
620620
"summary": "挑战式课程——让你的 Agent 处理一份脏的商店导出数据,产出一份经过真值校验的 EDA 摘要(results.json)。目录中第一门非标准库课程;pandas 由 uv 管理。",
621-
"sha256": "693d2da589858d6716c0dabf34042ac012875620092eefdea688ba5601e7a41b"
621+
"sha256": "83b2a03bbb124d95b81e3d537b8a6a89b0b7be4600e43e3585dbbc5b07af18c1"
622622
}
623623
]
624624
},
@@ -749,14 +749,14 @@
749749
"path": "courses/da-report/COURSE.md",
750750
"title": "From Analysis to Report with an Agent",
751751
"summary": "Challenge course — turn a verified EDA summary into a structured report (report.json + report.md) where every number traces back to its input. Verification checks structure and number consistency, not writing quality.",
752-
"sha256": "f0aea2909ed3e187497e9a79cf008d88324cf22e0ffc4251540825ecd8f08a46"
752+
"sha256": "3c80de32162187285964142406f1b482dc6c422608de63825783e0444a0f582a"
753753
},
754754
{
755755
"lang": "zh-CN",
756756
"path": "courses/da-report/COURSE_cn.md",
757757
"title": "用 Agent 从分析到报告",
758758
"summary": "挑战课程——把经过验证的 EDA 摘要变成结构化报告(report.json + report.md),其中每个数字都可回溯到输入。验证检查结构与数字一致性,不评价文笔。",
759-
"sha256": "f141a356b60de463d329fc72bb13374a8194cdbe5ecfc973a4f6f8c0e13c64c1"
759+
"sha256": "40e0e079eaa4c9419b0ff72756a6ee28936bfe5c31cbcc530c48082574b2bd5a"
760760
}
761761
]
762762
},
@@ -887,14 +887,14 @@
887887
"path": "courses/da-visualization/COURSE.md",
888888
"title": "Data Visualization with an Agent",
889889
"summary": "Challenge course — turn a clean sales dataset into three spec'd charts plus a summary.json whose numbers are verified against the data. Charts must be generated from data, never hardcoded.",
890-
"sha256": "8f2dba8784b18a8ca15ac578629f5099245299e8a80184a82bea2e29b3e4545c"
890+
"sha256": "fe7a7d00197b676cff35f62b1f098b39501c529b8dff93f034f716e623cd467b"
891891
},
892892
{
893893
"lang": "zh-CN",
894894
"path": "courses/da-visualization/COURSE_cn.md",
895895
"title": "用 Agent 做数据可视化",
896896
"summary": "挑战课程——把干净的销售数据变成三张有规格的图和一份 summary.json,其中数字会与数据集校验。图必须由数据生成,不许硬编码。",
897-
"sha256": "80f412edb8375f5e2027285a6b27f828e7670cf536d149400fde4cf2948d297b"
897+
"sha256": "d4e4447b9f31c9c31936b94cc0985e9f37e36090da3c562dd6450dbf1147c7f8"
898898
}
899899
]
900900
},
@@ -1025,14 +1025,14 @@
10251025
"path": "courses/hands-on-with-deepseek-harness/COURSE.md",
10261026
"title": "Hands-on with DeepSeek Harness",
10271027
"summary": "The verified Python workflow — task contract, bounded change, objective verify.py evidence — taught hands-on in DeepSeek Harness, where the agent loop is composed from plugins and every step lands in an inspectable trajectory.",
1028-
"sha256": "fb3b25a0f5233613b96f51e44f31292e1ba844603b12d9b1baeac34bd9e8504f"
1028+
"sha256": "f3e928e96dfa6f45547bc2b07ba151271551af6cdd22dff4281d032df5276186"
10291029
},
10301030
{
10311031
"lang": "zh-CN",
10321032
"path": "courses/hands-on-with-deepseek-harness/COURSE_cn.md",
10331033
"title": "上手 DeepSeek Harness",
10341034
"summary": "经过验证的 Python 工作流——任务契约、有界改动、客观 verify.py 证据——在 DeepSeek Harness 里手把手教:Agent 闭环由插件组装,每一步都落进可检查的轨迹日志。",
1035-
"sha256": "cabe3a68415798d70463afcfa1051d76a247793611b041b0077bba9fcb8cbbae"
1035+
"sha256": "3bef27e9425c37709924781f53d12f42b883cd5174eb94cc32675c01f5d1bfac"
10361036
}
10371037
]
10381038
},
@@ -1163,14 +1163,14 @@
11631163
"path": "courses/hands-on-with-kimi-code/COURSE.md",
11641164
"title": "Hands-on with Kimi Code",
11651165
"summary": "The verified Python workflow — task contract, bounded change, objective verify.py evidence — taught hands-on in Kimi Code, where built-in subagents split read-only exploration, planning, and the edits you approve.",
1166-
"sha256": "749ea832bc28f7074f99770e0c827255d221159cef48a79a316a8de9c2b55296"
1166+
"sha256": "d574ba24d74c189cbc4cfa599f14d64ed327a65299272564300c2e85e6d6a272"
11671167
},
11681168
{
11691169
"lang": "zh-CN",
11701170
"path": "courses/hands-on-with-kimi-code/COURSE_cn.md",
11711171
"title": "上手 Kimi Code",
11721172
"summary": "经过验证的 Python 工作流——任务契约、有界改动、客观 verify.py 证据——在 Kimi Code 里手把手教:内置子代理把只读勘察、规划和经你批准的编辑分在三条道上。",
1173-
"sha256": "b080c36ac7ffbb1bfaeaad98db2ef68ca61a5f6c72f445c860a5801acf57e762"
1173+
"sha256": "a7c09dafda26d905430d182258485d6792b43a55703822a3438ce552518c5815"
11741174
}
11751175
]
11761176
},
@@ -1301,14 +1301,14 @@
13011301
"path": "courses/mcp-server-in-python/COURSE.md",
13021302
"title": "Give your agent tools with MCP (Python)",
13031303
"summary": "Build a stateless Model Context Protocol tool server in pure Python — JSON-RPC 2.0 dispatch, schema validation, error isolation, and the 2026-07-28 input_required round-trip — and learn where a real tool belongs.",
1304-
"sha256": "33af5c6245ce1dc1f9fbba6431ba6fa911c63ee2b7137d9e91600370685f44d8"
1304+
"sha256": "6df68da45b69a9a62ba46cdba2b39963edc443759cdfdea00f94b9cdd1f4de40"
13051305
},
13061306
{
13071307
"lang": "zh-CN",
13081308
"path": "courses/mcp-server-in-python/COURSE_cn.md",
13091309
"title": "用 MCP 给你的 Agent 装上工具(Python)",
13101310
"summary": "用纯 Python 构建一个无状态的 Model Context Protocol 工具服务——JSON-RPC 2.0 分发、schema 校验、错误隔离与 2026-07-28 的 input_required 多轮交互——并理解真正的工具该放在哪里。",
1311-
"sha256": "322660423993cb400ec53c8b0c79b55a276229765fbc1c3fa1891729d7c1c72c"
1311+
"sha256": "197797063a2f01da277d2c51a3cb3816077feca8eae9dfa00b76706bc0ef4887"
13121312
}
13131313
]
13141314
},
@@ -1439,14 +1439,14 @@
14391439
"path": "courses/verifying-ai-generated-code/COURSE.md",
14401440
"title": "From \"it runs\" to \"it ships\": verifying AI-generated code",
14411441
"summary": "Build the release-evidence machine your AI-written project is missing — a ship check that runs the tests, parses what actually ran, refuses zero-test projects, and writes an honest delivery record.",
1442-
"sha256": "f329af811dee9fb767f0789c5b176fef435e6bf9a2bd6e36a86e98992e232d6d"
1442+
"sha256": "f21f75bd6a716245b614ee2d9b8d782354e33d890694683a66fbd7a1fe53f46b"
14431443
},
14441444
{
14451445
"lang": "zh-CN",
14461446
"path": "courses/verifying-ai-generated-code/COURSE_cn.md",
14471447
"title": "从「能跑」到「能上线」:验证 AI 写的代码",
14481448
"summary": "为你的 AI 项目补上缺失的发布证据机器——一个 ship check:运行测试、解析实际跑了什么、拒绝零测试项目,并写出诚实的交付记录。",
1449-
"sha256": "4e9f9675fd80851670b5585a48161b78be080640d832b1a4f40a0ad75078b83d"
1449+
"sha256": "ade471c2a4f88526bdb5630b67791b4b5c0757e2a6daf59d2a56566b72f34da9"
14501450
}
14511451
]
14521452
},
@@ -1577,14 +1577,14 @@
15771577
"path": "courses/hands-on-with-zcode/COURSE.md",
15781578
"title": "Hands-on with ZCode",
15791579
"summary": "The verified Python workflow — task contract, bounded change, objective verify.py evidence — taught hands-on in the ZCode desktop workspace, where Goal Mode decomposes the work and the Git state shows every change.",
1580-
"sha256": "f1549e06594afe047d386bbf379467006df7dcaad24a9e3b848d8be0451e8f6c"
1580+
"sha256": "051fee38652ea32840258ec50e304190124bdef5965309c0e24578ecbf5c5481"
15811581
},
15821582
{
15831583
"lang": "zh-CN",
15841584
"path": "courses/hands-on-with-zcode/COURSE_cn.md",
15851585
"title": "上手 ZCode",
15861586
"summary": "经过验证的 Python 工作流——任务契约、有界改动、客观 verify.py 证据——在 ZCode 桌面工作区里手把手教:Goal 模式拆解任务,Git 状态展示每一处改动。",
1587-
"sha256": "38a1ede3d23dc65fd44e0b764914d4a5f637aa1156c5b07a3d6ed5c1c141c034"
1587+
"sha256": "a3c9916af904b3c054bab2ae84c486d8ee629c699ec024ddbb8c7e993c8fe3a5"
15881588
}
15891589
]
15901590
},

courses/agent-rules-single-source/COURSE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ directory, three file names, one truth.
7171
- Badge: **Measure the drift Badge** (badge id `course-agent-rules`) - earned by claiming all five checkpoints.
7272
- Challenges: L01-L05 checkpoints, 10 points each; +50 course-badge bonus when all five are claimed on flypython.com.
7373
- Evidence: `python verify.py` - L03 (bounded change) and L04 (verify & review) are objectively gated by the suite; L01/L02/L05 are learner-attested.
74-
- Submission: each passed checkpoint prints a deterministic claim code; record it on flypython.com against your account. Self-reported evidence, never a certificate.
74+
- Submission: each test-passed checkpoint prints a deterministic claim code; a reflection checkpoint prints one only after you answer its questions and run `python verify.py --attest ID`; record it on flypython.com against your account. Self-reported evidence, never a certificate.
7575

7676
## Folder map
7777

courses/agent-rules-single-source/COURSE_cn.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ flypython.com 上的 AGENTS.md 指南)、多仓库配置、机器策略强制
6666
- 徽章:**量化漂移徽章**(徽章 id `course-agent-rules`)——认领全部五个检查点后获得。
6767
- 挑战:L01–L05 检查点各 10 分;五项全部在 flypython.com 认领后另加 50 分课程徽章奖励。
6868
- 证据:`python verify.py` —— L03(边界修改)与 L04(验证与审查)由测试套件客观判定;L01/L02/L05 为学习者自报。
69-
- 提交:每个通过的检查点会打印确定性认领码,在 flypython.com 上记入你的账号。这是自我报告的证据,绝不是证书。
69+
- 提交:测试通过的检查点打印确定性认领码;自报检查点要先回答课后问题,再运行 `python verify.py --attest ID` 才打印码,在 flypython.com 上记入你的账号。这是自我报告的证据,绝不是证书。
7070

7171
## 文件夹结构
7272

0 commit comments

Comments
 (0)