Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ reviewed catalog data, and stable public JSON contracts.
- Verify every runnable example with `python tools/verify_examples.py`,
every course folder with `python tools/verify_courses.py`, and every
learning path with `python tools/verify_paths.py`.
- Course display metadata lives in `courses/<slug>/website.json`; regenerate
`course-registry.json` with `make registry` after course/verifier edits.
Claim constants remain canonical in verify.py; never hand-edit the export.
- Website consumers must pin a full repository commit and verify the catalog
checksum. Do not make production builds depend on a moving branch.
- Keep external-link checks read-only, rate-limited, retryable, and blocked from
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ This file records notable catalog-contract and maintenance changes.

## [Unreleased]

- Add Coach P / 小P老师 guided-learning disclosures and learner confirmation
rules to all 15 English/Chinese course pairs. This is an editorial change,
not evidence of a completed in-tool teaching run.
- Export `course-registry.json` from per-course `website.json`, bilingual
manifest metadata and statically parsed verifier constants. Website consumers
can generate course pages and claim contracts at an immutable pin; legacy
aliases and existing claim codes are preserved. Validate with `make registry`
and `make generated-check`. No Pro metadata is published here.


## [0.1.3] - 2026-11-06

Repository-only release. The `v0.1.2` tag is restored on the original
Expand Down
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ ifeq ($(and $(wildcard pyproject.toml),$(wildcard tools/validate_catalog.py),$(w
endif

.DEFAULT_GOAL := help
.PHONY: help setup check generated-check generate export render manifest solutions test verify courses paths lint lock lock-check all
.PHONY: help setup check generated-check generate export render manifest registry solutions test verify courses paths lint lock lock-check all

PYTHON ?= python3
UV ?= uv
Expand All @@ -29,6 +29,7 @@ help:
@echo " make export - Regenerate catalog.json and radar.json"
@echo " make render - Regenerate root and catalog README indexes plus the Radar table"
@echo " make manifest - Regenerate content-manifest.json"
@echo " make registry - Regenerate public course metadata and claim contracts"
@echo " make solutions - Regenerate course-solutions.json"
@echo " make lint - Run ruff"
@echo " make test - Run pytest test suite"
Expand All @@ -54,6 +55,7 @@ generated-check:
$(PYTHON) tools/render_readmes.py --check
$(PYTHON) tools/build_content_manifest.py --check
$(PYTHON) tools/build_solution_hashes.py --check
$(PYTHON) -m tools.build_course_registry --check

# Keep writers sequential even under make -j: README/manifest checks must not
# race against a producer. No automatic commit, content-pin update or deploy.
Expand All @@ -62,6 +64,7 @@ generate:
$(MAKE) render
$(MAKE) manifest
$(MAKE) solutions
$(MAKE) registry

export:
$(PYTHON) tools/export_catalog.py --target both
Expand All @@ -72,6 +75,9 @@ render:
manifest:
$(PYTHON) tools/build_content_manifest.py

registry:
$(PYTHON) -m tools.build_course_registry

solutions:
$(PYTHON) tools/build_solution_hashes.py

Expand Down
120 changes: 60 additions & 60 deletions content-manifest.json

Large diffs are not rendered by default.

1,913 changes: 1,913 additions & 0 deletions course-registry.json

Large diffs are not rendered by default.

27 changes: 25 additions & 2 deletions courses/agent-rules-single-source/COURSE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ type: course
title: One source of truth for agent rules
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.
lang: en-US
content_version: 3
content_version: 4
status: reviewed
reviewed_on: 2026-09-12
reviewed_on: 2026-11-07
badge:
id: course-agent-rules
name_en: Measure the drift
Expand All @@ -17,6 +17,29 @@ course_id: course-agent-rules

# One source of truth for agent rules

## Coach P — guided learning

When the learner asks to start a lesson or requests guided help, act as
Coach P. At your first introduction in that session, say:

> I'm Coach P, an AI coach running inside your own agent, using your model.
> I'll help you reason through the task; `verify.py` checks the objective gates.
> Reflection checkpoints still need your own answers and explicit confirmation.

Ask what the learner tried and what they expect before suggesting a change.
Give the smallest useful hint, then wait for their answer. Name the failing test
and explain which contract it checks; do not paste a solution or edit `solution/`.
Follow this course's lesson order and file boundaries. If the learner cannot
explain a result, return to that test and ask them to predict the next run.
Before `--attest` or a claim submission, obtain the learner's own answers and
confirmation for those checkpoints; never answer or attest on their behalf.
The Skill's authorization and human-confirmation gates still apply. For a
verification-only or progress request, perform that workflow without forcing a
lesson. Coach P is an AI teaching style, not a human teacher or a certification;
do not promise learning or career outcomes. FlyPython does not run the model
or receive the chat conversation through this workflow; course-file, account,
and claim requests are separate API data.

> TL;DR: install the FlyPython Skill in your coding agent and let it fetch
> this course, then say **"start lesson 1"**. (Lesson files arrive via
> the Skill — you download nothing by hand.) You finish with a working rule-consistency checker
Expand Down
22 changes: 20 additions & 2 deletions courses/agent-rules-single-source/COURSE_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ type: course
title: Agent 规则的单一真源
summary: 不再同时维护彼此打架的 AGENTS.md、CLAUDE.md 与 .cursorrules——亲手构建一个能证明仓库只有一处规则真源的检查器,由你的编码 Agent 授课。
lang: zh-CN
content_version: 3
content_version: 4
status: reviewed
reviewed_on: 2026-09-12
reviewed_on: 2026-11-07
badge:
id: course-agent-rules
name_en: Measure the drift
Expand All @@ -17,6 +17,24 @@ course_id: course-agent-rules

# Agent 规则的单一真源

## 小P老师——引导学习

学员要求开始一课或需要引导时,采用小P老师的教学方式。在本次会话首次介绍时说:

> 我是小P老师,一个运行在你自己 Agent 里的 AI 教练,使用你自己的模型。
> 我会陪你分析任务,`verify.py` 检查客观关卡。
> 反思检查点仍需要你亲自回答并明确确认。

先问学员试过什么、预期是什么,再建议修改。每次只给一个有用的小提示,然后等学员回答。
指出失败测试的名称,解释它对应的契约,不直接贴完整答案,也不修改 `solution/`。
遵守本课的课次顺序与文件边界;学员讲不清结果时,回到该测试,让学员先预测下一次运行。
执行 `--attest` 或提交认领前,必须取得学员对相应检查点的亲自回答与明确确认,
不能代答或代作自报声明。Skill 中的授权与人在环关卡继续适用。
只要求验证或查进度时,完成相应流程,不强行开始授课。
小P老师是 AI 教学方式,不是真人教师,也不代表资格认证;不承诺学习或职业结果。
FlyPython 不运行这个模型,本流程不会向 FlyPython 上传聊天内容;取课、账号和认领请求
属于另外的 API 数据。

> 摘要:在你的编码 Agent 里装上 FlyPython Skill,让它取回本课文件,再
> 说一句 **“开始第 1 课”**(课程文件由 Skill 取回——你不用手动下载)。
> 课程结束时你拥有一个可运行的规则一致性检查器(`rules_check.py`)——
Expand Down
111 changes: 111 additions & 0 deletions courses/agent-rules-single-source/website.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
{
"order": 7,
"agentTool": false,
"aliases": [],
"id": "agent-rules-single-source",
"tool": "Any coding agent (Claude Code 2.x / Codex CLI 0.x / Cursor)",
"toolZh": "任一编码 Agent(Claude Code 2.x / Codex CLI 0.x / Cursor)",
"title": "One source of truth for agent rules",
"titleZh": "Agent 规则的单一真源",
"summary": "Stop maintaining diverging AGENTS.md, CLAUDE.md, and .cursorrules files — build a checker that proves your repository has exactly one rule source.",
"summaryZh": "不再同时维护彼此打架的 AGENTS.md、CLAUDE.md 与 .cursorrules——亲手构建一个能证明仓库只有一处规则真源的检查器。",
"outcome": "A working rule-consistency checker (rules_check.py) that fails CI the moment a rule file drifts from AGENTS.md — plus the single-source setup applied to your own repository.",
"outcomeZh": "一个可运行的规则一致性检查器(rules_check.py)——任何规则文件偏离 AGENTS.md 的那一刻,CI 就会失败——外加应用到你自己仓库的单一真源配置。",
"prerequisites": [
"Python 3.11 or newer available on your PATH",
"Any coding agent that reads AGENTS.md, CLAUDE.md, or .cursorrules",
"Comfort running shell commands; standard library only"
],
"prerequisitesZh": [
"PATH 中有 Python 3.11 或更新版本",
"任一会读 AGENTS.md、CLAUDE.md 或 .cursorrules 的编码 Agent",
"能运行 shell 命令;仅用标准库"
],
"lessons": [
{
"id": "l01",
"title": "Measure the drift you already have",
"titleZh": "量化你已经存在的漂移",
"objective": "Run the checker against three scenario repositories and read drift as a test failure, not a vibe.",
"objectiveZh": "对三个场景仓库运行检查器,把漂移读成测试失败,而不是一种感觉。"
},
{
"id": "l02",
"title": "Decide the source of truth",
"titleZh": "确定唯一真源",
"objective": "AGENTS.md becomes the one file agents read; everything else is a pointer or a copy.",
"objectiveZh": "AGENTS.md 成为 Agent 唯一阅读的文件;其余都只能是指针或副本。"
},
{
"id": "l03",
"title": "Drive a bounded change, test by test",
"titleZh": "按测试驱动一次有边界的变更",
"objective": "Make the starter detect source, pointer, copy, and drift — one failing test group at a time.",
"objectiveZh": "让 starter 依次识别真源、指针、副本与漂移——一次一组失败测试。"
},
{
"id": "l04",
"title": "Verify and wire it in",
"titleZh": "验证并接入流程",
"objective": "Prove both verifier directions, run all three skins, then add the checker to your review loop.",
"objectiveZh": "证明验证器双向通过、跑完三个皮肤,然后把检查器接入你的审查环。"
},
{
"id": "l05",
"title": "Apply this to your repository",
"titleZh": "把这套方法带回你的仓库",
"objective": "One AGENTS.md, thin pointers everywhere else, and a failing check when it breaks.",
"objectiveZh": "一个 AGENTS.md,其余全是瘦指针,一旦破坏检查就失败。"
}
],
"scenarios": [
{
"id": "thin-pointer",
"title": "Healthy: thin pointers",
"titleZh": "健康:瘦指针",
"dataFile": "AGENTS.md + CLAUDE.md",
"blurb": "AGENTS.md plus two thin pointer files that defer to it.",
"blurbZh": "AGENTS.md 加两个指向它的瘦指针文件。"
},
{
"id": "single-copy",
"title": "Healthy: exact copy",
"titleZh": "健康:精确副本",
"dataFile": "AGENTS.md + CLAUDE.md",
"blurb": "AGENTS.md plus one byte-identical copy in CLAUDE.md.",
"blurbZh": "AGENTS.md 加一份逐字节一致的 CLAUDE.md 副本。"
},
{
"id": "drifted",
"title": "Broken: drifted .cursorrules",
"titleZh": "故障:漂移的 .cursorrules",
"dataFile": ".cursorrules",
"blurb": "A stale full ruleset that contradicts AGENTS.md — the drift to catch.",
"blurbZh": "一份与 AGENTS.md 矛盾的过期完整规则集——要捕获的漂移。"
}
],
"verification": {
"method": "An 11-test suite pins pointer detection, the source requirement, copy and drift classification, and CLI exit codes; the starter reproduces six named failures, the solution passes 11/11.",
"methodZh": "11 个测试的套件锚定指针识别、真源要求、副本与漂移分类及 CLI 退出码;starter 复现六个具名失败,solution 通过 11/11。",
"starterCommand": "python verify.py starter --expect-failure",
"starterExpectFailure": "python verify.py starter --expect-failure",
"solutionCommand": "python verify.py solution"
},
"badge": {
"id": "course-agent-rules",
"nameEn": "Measure the drift",
"nameZh": "规则漂移检测"
},
"difficulty": "intermediate",
"shippedAt": "2026-09-12",
"duration": "1–2 hours",
"level": "Maintains rule files for multiple tools",
"levelZh": "为多个工具维护规则文件",
"searchTerms": [
"agents.md tutorial",
"claude code rules",
"cursorrules",
"agents.md vs claude.md",
"agent 规则"
]
}
27 changes: 25 additions & 2 deletions courses/da-eda/COURSE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ type: course
title: Exploratory Data Analysis with an Agent
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 pinned in requirements.txt.
lang: en-US
content_version: 1
content_version: 2
status: reviewed
reviewed_on: 2026-09-12
reviewed_on: 2026-11-07
badge:
id: course-da-eda
name_en: EDA Challenger
Expand All @@ -17,6 +17,29 @@ course_id: course-da-eda

# Exploratory Data Analysis with an Agent

## Coach P — guided learning

When the learner asks to start a lesson or requests guided help, act as
Coach P. At your first introduction in that session, say:

> I'm Coach P, an AI coach running inside your own agent, using your model.
> I'll help you reason through the task; `verify.py` checks the objective gates.
> Reflection checkpoints still need your own answers and explicit confirmation.

Ask what the learner tried and what they expect before suggesting a change.
Give the smallest useful hint, then wait for their answer. Name the failing test
and explain which contract it checks; do not paste a solution or edit `solution/`.
Follow this course's lesson order and file boundaries. If the learner cannot
explain a result, return to that test and ask them to predict the next run.
Before `--attest` or a claim submission, obtain the learner's own answers and
confirmation for those checkpoints; never answer or attest on their behalf.
The Skill's authorization and human-confirmation gates still apply. For a
verification-only or progress request, perform that workflow without forcing a
lesson. Coach P is an AI teaching style, not a human teacher or a certification;
do not promise learning or career outcomes. FlyPython does not run the model
or receive the chat conversation through this workflow; course-file, account,
and claim requests are separate API data.

> TL;DR: this is a **challenge course** — you solve it, your agent is the
> tool. Point it at `scenario/shop-export/transactions.csv` (142 messy
> rows), implement the contract in `starter/eda.py`, and finish with a
Expand Down
22 changes: 20 additions & 2 deletions courses/da-eda/COURSE_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ type: course
title: 用 Agent 做探索性数据分析
summary: 挑战式课程——让你的 Agent 处理一份脏的商店导出数据,产出一份经过真值校验的 EDA 摘要(results.json)。目录中第一门非标准库课程;pandas 版本固定在 requirements.txt。
lang: zh-CN
content_version: 1
content_version: 2
status: reviewed
reviewed_on: 2026-09-12
reviewed_on: 2026-11-07
badge:
id: course-da-eda
name_en: EDA Challenger
Expand All @@ -17,6 +17,24 @@ course_id: course-da-eda

# 用 Agent 做探索性数据分析

## 小P老师——引导学习

学员要求开始一课或需要引导时,采用小P老师的教学方式。在本次会话首次介绍时说:

> 我是小P老师,一个运行在你自己 Agent 里的 AI 教练,使用你自己的模型。
> 我会陪你分析任务,`verify.py` 检查客观关卡。
> 反思检查点仍需要你亲自回答并明确确认。

先问学员试过什么、预期是什么,再建议修改。每次只给一个有用的小提示,然后等学员回答。
指出失败测试的名称,解释它对应的契约,不直接贴完整答案,也不修改 `solution/`。
遵守本课的课次顺序与文件边界;学员讲不清结果时,回到该测试,让学员先预测下一次运行。
执行 `--attest` 或提交认领前,必须取得学员对相应检查点的亲自回答与明确确认,
不能代答或代作自报声明。Skill 中的授权与人在环关卡继续适用。
只要求验证或查进度时,完成相应流程,不强行开始授课。
小P老师是 AI 教学方式,不是真人教师,也不代表资格认证;不承诺学习或职业结果。
FlyPython 不运行这个模型,本流程不会向 FlyPython 上传聊天内容;取课、账号和认领请求
属于另外的 API 数据。

> 速览:这是一门**挑战课程**——解题的是你,Agent 是手里的工具。让它
> 处理 `scenario/shop-export/transactions.csv`(142 行脏数据),实现
> `starter/eda.py` 里的契约,最终产出一份 `results.json`,其中每个
Expand Down
Loading
Loading