Skip to content

Commit f90ea9c

Browse files
committed
release: 0.0.4 phase A — courses, paths, claim codes, DA modules live
2 parents da163ea + 920f790 commit f90ea9c

108 files changed

Lines changed: 4287 additions & 58 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/validate.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,5 @@ jobs:
6161

6262
- name: Verify course folders
6363
run: .venv/bin/python tools/verify_courses.py
64+
- name: Verify learning-path contracts
65+
run: .venv/bin/python tools/verify_paths.py

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,6 @@ reports/
4646
# Course scenario output written by learners running report_tool.py
4747
courses/*/scenario/*/report.json
4848
courses/*/scenario/*/report.json.tmp
49+
courses/*/out/
50+
paths/*/capstone/out/
51+
courses/*/scenario/*/results.json

Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.PHONY: help check export render manifest test verify courses lint typecheck all
1+
.PHONY: help check export render manifest test verify courses paths lint typecheck all
22

33
PYTHON ?= python3
44

@@ -11,6 +11,7 @@ help:
1111
@echo " make test - Run pytest test suite"
1212
@echo " make verify - Verify all runnable examples"
1313
@echo " make courses - Verify all course folders"
14+
@echo " make paths - Verify all learning-path contracts"
1415
@echo " make all - Regenerate all exports and run all checks and tests"
1516

1617
check:
@@ -20,6 +21,7 @@ check:
2021
$(PYTHON) tools/build_content_manifest.py --check
2122
$(PYTHON) tools/verify_examples.py
2223
$(PYTHON) tools/verify_courses.py
24+
$(PYTHON) tools/verify_paths.py
2325

2426
export:
2527
$(PYTHON) tools/export_catalog.py --target both
@@ -39,4 +41,7 @@ verify:
3941
courses:
4042
$(PYTHON) tools/verify_courses.py
4143

44+
paths:
45+
$(PYTHON) tools/verify_paths.py
46+
4247
all: export render manifest test check

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
[English](README.md) · [中文](README_cn.md) · [🌐 Online Portal](https://flypython.com)
88

9-
> **New — agent-taught courses with objective verification.** Download a
10-
> folder from [`courses/`](courses/), open it in your coding agent, and say
11-
> *"start lesson 1"*. Every course ends with a `verify.py` command that
12-
> proves what you built. Continue the same journey on
13-
> [flypython.com](https://flypython.com/).
9+
> **Challenge courses with objective verification.** Pick a folder from
10+
> [`courses/`](courses/), solve the contract in `TASK.md` with your coding
11+
> agent as the tool, and prove it with `verify.py` — which prints a claim
12+
> code per checkpoint. Prefer a guided path? `COURSE.md` still runs an
13+
> agent-taught mode, and [`paths/`](paths/) sequences courses into badge
14+
> routes. Continue on [flypython.com](https://flypython.com/).
1415
1516
FlyPython is a practical, bilingual repository for writing good Python and
1617
turning it into products people can rely on. It combines AI-coding methods,
@@ -41,7 +42,7 @@ to a coding agent (Cursor, Windsurf, Claude Code, Copilot) and make the starter
4142

4243
| Goal | Start here | What you will produce |
4344
| --- | --- | --- |
44-
| Learn hands-on with your coding agent | [Agent-taught courses](courses/) | A verified project: task contract → bounded change → `verify.py` evidence |
45+
| Learn by solving challenges | [Challenge courses](courses/) · [Learning paths](paths/) | A verified project + checkpoint claim codes from `verify.py` |
4546
| Write and change Python safely | [AI Coding workflow](guides/ai-coding/workflow.md) | A bounded change with explicit context and evidence |
4647
| Turn Python into a reliable product | [Product quality guide](guides/python-engineering/product-quality.md) | A tested, observable, reversible product path |
4748
| Finish a recurring engineering task | [Playbooks](playbooks/README.md) | A bug fix, API change, integration, dependency upgrade, or release |

README_cn.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ python examples/product-slug/verify.py solution
3838

3939
| 目标 | 从这里开始 | 最终产出 |
4040
| --- | --- | --- |
41-
| 跟随编码 Agent 动手实战 | [Agent 授课课程](courses/) | 一个通过验证的项目:任务契约 → 边界修改 → `verify.py` 证据 |
41+
| 解题式动手实战 | [挑战课程](courses/) · [学习路线](paths/) | 一个通过验证的项目 + `verify.py` 的检查点认领码 |
4242
| 安全地编写和修改 Python | [AI Coding 工作方法](guides/ai-coding/workflow_cn.md) | 上下文明确、有证据的边界修改 |
4343
| 把 Python 变成可靠产品 | [产品质量指南](guides/python-engineering/product-quality_cn.md) | 可测试、可观测、可回退的产品路径 |
4444
| 完成反复出现的工程任务 | [Playbook](playbooks/README_cn.md) | Bug 修复、API 修改、外部集成、依赖升级或发布 |

content-manifest.json

Lines changed: 153 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
{
5151
"id": "course-agent-rules",
5252
"type": "course",
53-
"content_version": 1,
53+
"content_version": 2,
5454
"status": "reviewed",
5555
"reviewed_on": "2026-09-12",
5656
"locales": [
@@ -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": "41aaa6f0681ea5a40263dd5372f0d4bf402c947b6727486c4ff5ba7f0a2a9cee"
62+
"sha256": "d7dd7ed26db699c576046c2e103d6d94a2299805dca0d6b6153a4d6ccafcba6e"
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": "5b90d5556cdff097812ef25ab9134b3939f677f6106c162c28ea15f1986091ee"
69+
"sha256": "bf81ca5856328e1ef4f204707ad002f49704486ab2589d3b52cf366285e8222f"
7070
}
7171
]
7272
},
@@ -188,7 +188,7 @@
188188
{
189189
"id": "course-claude-code",
190190
"type": "course",
191-
"content_version": 1,
191+
"content_version": 2,
192192
"status": "reviewed",
193193
"reviewed_on": "2026-09-12",
194194
"locales": [
@@ -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": "048b8f210dedc9d60bffb98a8347c89586295e5be3c16abd6be20ea50ef48563"
200+
"sha256": "50165b3b9aa9979d565ab34057977b7b7264cec739be1900ec3988876731c132"
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": "96c3287051153c42678be558538b9be16cc9835296fc8947711e48ea6ee0a145"
207+
"sha256": "8c73c31d5901ff9bbe9e79e97342688b6737657ab05f1b71a767125ca398e2d3"
208208
}
209209
]
210210
},
@@ -326,7 +326,7 @@
326326
{
327327
"id": "course-codex-cli",
328328
"type": "course",
329-
"content_version": 1,
329+
"content_version": 2,
330330
"status": "reviewed",
331331
"reviewed_on": "2026-09-12",
332332
"locales": [
@@ -335,14 +335,14 @@
335335
"path": "courses/hands-on-with-openai-codex-cli/COURSE.md",
336336
"title": "Hands-on with OpenAI Codex CLI",
337337
"summary": "The same verified Python workflow as the Claude Code course — task contract, bounded change, objective verify.py evidence — taught hands-on with the OpenAI Codex CLI instead.",
338-
"sha256": "aa223ff4356ab25c32f55344362a5133fcba0f25851e05c6bd3c6bde9189a8aa"
338+
"sha256": "48e81f530f58ef69fe92e6312b08f01b4661f311cf07371809ce206e2eecd474"
339339
},
340340
{
341341
"lang": "zh-CN",
342342
"path": "courses/hands-on-with-openai-codex-cli/COURSE_cn.md",
343343
"title": "OpenAI Codex CLI 实战",
344344
"summary": "与 Claude Code 课程相同的已验证 Python 工作流——任务契约、最小变更、客观 verify.py 证据——改用 OpenAI Codex CLI 完成实战。",
345-
"sha256": "4a31ae97c205ee1e28008f1149aadf1488d4d305176678da1c475475174944d5"
345+
"sha256": "bbdf5d8a71d8243f1cb7a3c30d2aa4ddb656cb932d36aaae3d543e3b5f7ea3c2"
346346
}
347347
]
348348
},
@@ -462,25 +462,94 @@
462462
]
463463
},
464464
{
465-
"id": "course-mcp-tools",
465+
"id": "course-da-eda",
466+
"type": "course",
467+
"content_version": 1,
468+
"status": "reviewed",
469+
"reviewed_on": "2026-09-12",
470+
"locales": [
471+
{
472+
"lang": "en-US",
473+
"path": "courses/da-eda/COURSE.md",
474+
"title": "Exploratory Data Analysis with an Agent",
475+
"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.",
476+
"sha256": "3d5a7d05b6b48a667eeca51f7c6232e95c231d7cb4f78d3826de02c6a0a55b85"
477+
},
478+
{
479+
"lang": "zh-CN",
480+
"path": "courses/da-eda/COURSE_cn.md",
481+
"title": "用 Agent 做探索性数据分析",
482+
"summary": "挑战式课程——让你的 Agent 处理一份脏的商店导出数据,产出一份经过真值校验的 EDA 摘要(results.json)。目录中第一门非标准库课程;pandas 由 uv 管理。",
483+
"sha256": "ef5272a728fc540f4bedb3c650a1789d50a32cc90883aacd3202ba10360b4f00"
484+
}
485+
]
486+
},
487+
{
488+
"id": "course-da-report",
489+
"type": "course",
490+
"content_version": 1,
491+
"status": "reviewed",
492+
"reviewed_on": "2026-09-12",
493+
"locales": [
494+
{
495+
"lang": "en-US",
496+
"path": "courses/da-report/COURSE.md",
497+
"title": "From Analysis to Report with an Agent",
498+
"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.",
499+
"sha256": "d2b978ad0e561b90734d747c4551cda91dddf8619e4d388799b67a4b59344496"
500+
},
501+
{
502+
"lang": "zh-CN",
503+
"path": "courses/da-report/COURSE_cn.md",
504+
"title": "用 Agent 从分析到报告",
505+
"summary": "挑战课程——把经过验证的 EDA 摘要变成结构化报告(report.json + report.md),其中每个数字都可回溯到输入。验证检查结构与数字一致性,不评价文笔。",
506+
"sha256": "c825ca0039fd828e4133a1a14956907a7cf8a74ff0c2e736f387c16fd26723e7"
507+
}
508+
]
509+
},
510+
{
511+
"id": "course-da-visualization",
466512
"type": "course",
467513
"content_version": 1,
468514
"status": "reviewed",
469515
"reviewed_on": "2026-09-12",
516+
"locales": [
517+
{
518+
"lang": "en-US",
519+
"path": "courses/da-visualization/COURSE.md",
520+
"title": "Data Visualization with an Agent",
521+
"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.",
522+
"sha256": "950c213e5093c415a6a78988fa7bb1c0056fd23b2d27225a762b977a70af3a5f"
523+
},
524+
{
525+
"lang": "zh-CN",
526+
"path": "courses/da-visualization/COURSE_cn.md",
527+
"title": "用 Agent 做数据可视化",
528+
"summary": "挑战课程——把干净的销售数据变成三张有规格的图和一份 summary.json,其中数字会与数据集校验。图必须由数据生成,不许硬编码。",
529+
"sha256": "6c614cb91314a2b75b51e677d50a6d214355047eeb48def66fa0fc3105c3a690"
530+
}
531+
]
532+
},
533+
{
534+
"id": "course-mcp-tools",
535+
"type": "course",
536+
"content_version": 2,
537+
"status": "reviewed",
538+
"reviewed_on": "2026-09-12",
470539
"locales": [
471540
{
472541
"lang": "en-US",
473542
"path": "courses/mcp-server-in-python/COURSE.md",
474543
"title": "Give your agent tools with MCP (Python)",
475544
"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.",
476-
"sha256": "bab5f79922a15ac52c736a549bc69a392718fff274e20cae0ad7c3428e00c4f6"
545+
"sha256": "de677071dab7c06244ad0634a7266372619af38a8de60b8257af0570de1b9cb4"
477546
},
478547
{
479548
"lang": "zh-CN",
480549
"path": "courses/mcp-server-in-python/COURSE_cn.md",
481550
"title": "用 MCP 给你的 Agent 装上工具(Python)",
482551
"summary": "用纯 Python 构建一个无状态的 Model Context Protocol 工具服务——JSON-RPC 2.0 分发、schema 校验、错误隔离与 2026-07-28 的 input_required 多轮交互——并理解真正的工具该放在哪里。",
483-
"sha256": "a11236fcd046e9e84e54b22ebcce7e01b925ef71f12014ebb1f1b8bcb536cb63"
552+
"sha256": "d125779e096e3b76b97caf51db25577869ee9fadd23447e02f9aea1d5d5066ee"
484553
}
485554
]
486555
},
@@ -602,7 +671,7 @@
602671
{
603672
"id": "course-verify-ship",
604673
"type": "course",
605-
"content_version": 1,
674+
"content_version": 2,
606675
"status": "reviewed",
607676
"reviewed_on": "2026-09-12",
608677
"locales": [
@@ -611,14 +680,14 @@
611680
"path": "courses/verifying-ai-generated-code/COURSE.md",
612681
"title": "From \"it runs\" to \"it ships\": verifying AI-generated code",
613682
"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.",
614-
"sha256": "7765ea8ad032cc16eb5d34b0f65401c28c8c56cc1f44c496c9cc298f44cb7cd3"
683+
"sha256": "88b1a775241a69b11b868bfae72e2954ad93b608789a9230a46431549444e9ed"
615684
},
616685
{
617686
"lang": "zh-CN",
618687
"path": "courses/verifying-ai-generated-code/COURSE_cn.md",
619688
"title": "从「能跑」到「能上线」:验证 AI 写的代码",
620689
"summary": "为你的 AI 项目补上缺失的发布证据机器——一个 ship check:运行测试、解析实际跑了什么、拒绝零测试项目,并写出诚实的交付记录。",
621-
"sha256": "55eda6add807fff2147c7829da190e8c7cdfdbb537d3dcfdb85b461e2c0a21f2"
690+
"sha256": "fe2cc54cd9e37ddebb2c80c2cba52f40f5ce272566fd818c448b97e80c03c8ba"
622691
}
623692
]
624693
},
@@ -898,6 +967,75 @@
898967
}
899968
]
900969
},
970+
{
971+
"id": "path-da-capstone",
972+
"type": "path",
973+
"content_version": 1,
974+
"status": "reviewed",
975+
"reviewed_on": "2026-09-12",
976+
"locales": [
977+
{
978+
"lang": "en-US",
979+
"path": "paths/data-analysis/modules/capstone.md",
980+
"title": "Capstone: verified analysis of a real dataset",
981+
"summary": "Data Analysis path capstone — end-to-end clean, explore, and report on orders.csv with verify.py checking the numbers.",
982+
"sha256": "814507300283d9c7c27409138e35ebc57ab85dcc04a1f468e11b486783b580f1"
983+
},
984+
{
985+
"lang": "zh-CN",
986+
"path": "paths/data-analysis/modules/capstone_cn.md",
987+
"title": "综合项目:真实数据集的验证分析",
988+
"summary": "数据分析路线综合项目——在 orders.csv 上端到端完成清洗、探索与报告,verify.py 校验数字。",
989+
"sha256": "5f2af0b8b6c384e5fd430e603df573bee3c8cdfb564c500ad7d733d813b4778e"
990+
}
991+
]
992+
},
993+
{
994+
"id": "path-foundation-challenge",
995+
"type": "path",
996+
"content_version": 1,
997+
"status": "reviewed",
998+
"reviewed_on": "2026-09-12",
999+
"locales": [
1000+
{
1001+
"lang": "en-US",
1002+
"path": "paths/foundation/modules/route-challenge.md",
1003+
"title": "Route challenge: dual-agent, double-verified",
1004+
"summary": "Foundation path capstone — run the same task through Claude Code and Codex CLI and verify both outputs yourself.",
1005+
"sha256": "12390205b366d179afd34fc60fc557ed3aca53d10f6474a73d922b2cbbf3045a"
1006+
},
1007+
{
1008+
"lang": "zh-CN",
1009+
"path": "paths/foundation/modules/route-challenge_cn.md",
1010+
"title": "路线挑战:双 Agent、双重验证",
1011+
"summary": "基础路线收官挑战——同一任务分别用 Claude Code 与 Codex CLI 完成并亲手双重验证。",
1012+
"sha256": "86add318cc3094155f0a3f05eb05947d351af312c7f78f777f290be953cf27ab"
1013+
}
1014+
]
1015+
},
1016+
{
1017+
"id": "path-foundation-m0",
1018+
"type": "path",
1019+
"content_version": 1,
1020+
"status": "reviewed",
1021+
"reviewed_on": "2026-09-12",
1022+
"locales": [
1023+
{
1024+
"lang": "en-US",
1025+
"path": "paths/foundation/modules/m0-orientation.md",
1026+
"title": "The agent tool landscape",
1027+
"summary": "Foundation path module 0 — orientation on Claude Code, Codex CLI, and Cursor; install one agent and observe its evidence habits.",
1028+
"sha256": "2c40a01bff3ab9cf40c6f453201a381d4a4d02ebc7246af46984b2548496f40f"
1029+
},
1030+
{
1031+
"lang": "zh-CN",
1032+
"path": "paths/foundation/modules/m0-orientation_cn.md",
1033+
"title": "Agent 工具生态总览",
1034+
"summary": "基础路线模块 0——Claude Code、Codex CLI、Cursor 生态导览;装一个 Agent 并观察它的证据习惯。",
1035+
"sha256": "4d6b4ecbc2eb0d0ef5c2e9522466f0c9ace056bd4ad8db4a9e116aa5916e64bb"
1036+
}
1037+
]
1038+
},
9011039
{
9021040
"id": "product-slug-example",
9031041
"type": "example",

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ type: course
44
title: One source of truth for agent rules
55
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.
66
lang: en-US
7-
content_version: 1
7+
content_version: 2
88
status: reviewed
99
reviewed_on: 2026-09-12
10+
badge:
11+
id: course-agent-rules
12+
name_en: Measure the drift
13+
name_zh: 规则漂移检测
14+
requires: All five checkpoints claimed (L01–L05)
15+
course_id: course-agent-rules
1016
---
1117

1218
# One source of truth for agent rules
@@ -58,8 +64,17 @@ and the AGENTS.md guide on flypython.com), multi-repo setups, or
5864
machine-policy enforcement. The checker is deliberately narrow: one
5965
directory, three file names, one truth.
6066

67+
68+
## Badge contract
69+
70+
- Badge: **Measure the drift Badge** (badge id `course-agent-rules`) - earned by claiming all five checkpoints.
71+
- Challenges: L01-L05 checkpoints, 10 points each; +50 course-badge bonus when all five are claimed on flypython.com.
72+
- Evidence: `python verify.py progress` - L03 (bounded change) and L04 (verify & review) are objectively gated by the suite; L01/L02/L05 are learner-attested.
73+
- Submission: each passed checkpoint prints a deterministic claim code; record it on flypython.com against your account. Self-reported evidence, never a certificate.
74+
6175
## Folder map
6276

77+
6378
`COURSE.md`/`COURSE_cn.md`, bilingual `lessons/`, `scenario/` repositories,
6479
`TASK.md`/`TASK_cn.md` (the code contract), `starter/`, `solution/`, `tests/`
6580
(11 tests), `verify.py`, `REVIEW.md`.

0 commit comments

Comments
 (0)