Skip to content

Commit eb64870

Browse files
committed
feat: 0.0.4 phase A — DA course track, learning paths, capstone (FP-413/416/417/418)
- Three new challenge courses: da-eda (pandas EDA, 12 tests), da-visualization (matplotlib charts, 5 tests), da-report (structured report, 6 tests) — first non-stdlib courses, deps pinned via requirements.txt and dev lock (pandas 2.3.3, matplotlib 3.10.9) - paths/foundation + paths/data-analysis path contracts (path.json) with M0 orientation, dual-agent route challenge, and a 303-row capstone challenge with ground-truth verify.py + claim code - Structured badge metadata (badge + course_id frontmatter) on all eight courses for website rendering (FP-413) - tools/verify_paths.py: path contract checks (bilingual fields, badge block, sequential orders, course/module ref resolution) wired into make check and validate.yml - manifest type 'path' + schema enum; paths/**/*.md in CONTENT_GLOBS; CURATION_POLICY scope + bilingual README narrative updated for the challenge model; output artifacts gitignored
1 parent 8c303fb commit eb64870

101 files changed

Lines changed: 3733 additions & 30 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: 148 additions & 10 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": "b09497cd76bea0191c3944dec61cc9bb89f245a21750fcf5013f4c4d4db7d51c"
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": "245fc0cc40f3103ed5fed99f6f656e9b04ff7093bd0d0782203a0dbafa647864"
69+
"sha256": "bf81ca5856328e1ef4f204707ad002f49704486ab2589d3b52cf366285e8222f"
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": "aec892c18cd7446b9d08c69b116d8c00a0bffc6b6ea6d715dfc969298708d5a3"
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": "185e21a796cac870969f2fff73b3f103eb4a43e215c11be9f0044dc3ec0e7e22"
207+
"sha256": "8c73c31d5901ff9bbe9e79e97342688b6737657ab05f1b71a767125ca398e2d3"
208208
}
209209
]
210210
},
@@ -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": "a0dfd154f544fee2eedfc5a34546286af344afd7e6901abef6dec9ba0967fb76"
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": "058985bd5e3f274df28de5ab12ba400eb3ea1367be7daee25a3b98424d4656b3"
345+
"sha256": "bbdf5d8a71d8243f1cb7a3c30d2aa4ddb656cb932d36aaae3d543e3b5f7ea3c2"
346346
}
347347
]
348348
},
@@ -461,6 +461,75 @@
461461
}
462462
]
463463
},
464+
{
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",
512+
"type": "course",
513+
"content_version": 1,
514+
"status": "reviewed",
515+
"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+
},
464533
{
465534
"id": "course-mcp-tools",
466535
"type": "course",
@@ -473,14 +542,14 @@
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": "7cf318f04fd92925789d11cff48afc249fbe4f96b02e68bfa30fe054f0b6da22"
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": "74af520640128e8df445f5e7af6f8391eb525af26698871b560fd98a6816961e"
552+
"sha256": "d125779e096e3b76b97caf51db25577869ee9fadd23447e02f9aea1d5d5066ee"
484553
}
485554
]
486555
},
@@ -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": "d4f2b0448f3c637acfdff97e76ab72e622833f4904376d0fad4e54dbe189ef23"
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": "50b2624cdae9a7597b841ec8f70339d928b431ceff4638e9c3e1e67d90a06188"
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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ lang: en-US
77
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

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ lang: zh-CN
77
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: 全部五个检查点认领通过(L01–L05)
15+
course_id: course-agent-rules
1016
---
1117

1218
# Agent 规则的单一真源

0 commit comments

Comments
 (0)