上手 GitHub Copilot · 第 03 题

第 3 课:有界改动,一轮一审

检查点 l0310 分测试套件判定VS Code 中的 GitHub Copilot

通过有界的轮次把 starter 推到全绿——每轮先审 diff 再发下一轮,用 Restore Checkpoint 和 Git 守住每一处改动。

七门 Agent 工具课共用同一道题。VS Code 中的 GitHub Copilot 专属步骤仍在补写——补齐并通过审核前,本页 canonical 指向主课程的对应题目。

在用 Agent 做题?一句话开始整门课程:

Read https://flypython.com/skills/flypython/SKILL.md and start the FlyPython course `hands-on-with-github-copilot`.

第 3 课:有界改动,一轮一审

目标

starter 通过一串有界改动让九个测试全绿,并且不看 solution,你也 讲得清 Agent 产出的每一个 diff。

为什么有这节课

这节课最容易被跳过——也恰恰是长本事的那节。放任 Agent 把文件一次 重写,什么也学不到,只留下一份你没底气审查的 diff。监督一连串小 diff、 各自钉在一条契约行上,才能让代码仍然是你的。

Copilot 有一点你必须知道:在 Copilot(Agent Host)会话里,Agent 直接 应用并保存编辑。Manual permissions 让命令和工具调用等你批准;它不会 扣住文件编辑等你批准。所以边界不是一个「接受」按钮——而是你在每轮 之后、发下一条提示词之前做的审查。

先铺好安全网(一次)

  1. Git 基线。 如果工作目录还不是 Git 仓库,先跑 git init,再 git add -A 和 git commit -m "baseline"。之后 Source Control 视图 会准确显示每一轮改了什么。

  2. 逐请求的改动摘要。 在设置里打开 chat.checkpoints.showFileChanges。 每次请求完成后都会列出它改的文件和行数,View All File Changes 打开多文件 diff。

  3. (可选)动只读文件前先问。 chat.tools.edits.autoApprove 设置 接受 glob;设成 false 的文件在编辑生效前会显示 diff 并等你批准。 写进 .vscode/settings.json:

    {
      "chat.tools.edits.autoApprove": {
        "**/*": true,
        "**/tests/**": false,
        "**/solution/**": false,
        "**/scenario/**": false
      }
    }
    

本课内容

开一个新的对话会话(已完结任务的对话带着过期上下文),保持 Agent 角色和 Manual permissions,说:

“按 TASK.md 改 starter/report_tool.py。一次只修一组失败测试: 先 JSON 加载,再无效行隔离,再舍入,再原子写,最后是端到端测试。 每修完一组跑 python verify.py starter,然后停下来等我,再做下一组。”

每一轮之后、回复之前:

  • 打开这一轮改动的文件(或 Source Control),逐块读完。只应有 starter/report_tool.py 变了。tests/、solution/、scenario/ 里 任何东西动了,就把鼠标悬停在那次请求上选 Restore Checkpoint, 再问为什么。
  • 标准库之外不加 import——连与本改动无关的 import 也不要。
  • 每处改动朝一条契约行推进。顺手重构(「我顺便重命名了……」)就恢复 检查点,用更窄的提示词重问。
  • Agent 想改测试,答案是不行。测试是契约;动的是代码。
  • 一组变绿、diff 讲得通,就在 Source Control 里提交。这个提交是你的 永久记录;检查点是临时的。

命令批准请求也要读:python verify.py starter 安全;pip install 任何 东西都是停止信号。Restore Checkpoint 回滚文件和对话历史,但不会撤销 已经跑过的命令——这正是 Manual permissions 替你扣住命令的原因。

预期失败数逐组下降:7 → 5 → 4 → 3 → 2 → 0。

练习

挑 Agent 产出的一个 hunk——最好是「无效行隔离」那段——在对话里 讲回给它听:「第 N 行做了 X,满足契约行 Y」。讲不清就先让它走读 自己的 diff,再发下一组。

检查点

运行 python verify.py。本检查点的码只在 starter 套件 全绿时出现。不看材料能回答即算通过:

  1. 这次有界改动走了几轮,是什么让每轮保持有界?
  2. 你回滚或收窄过哪个 diff 或命令,用的是什么——检查点、拒绝批准, 还是更窄的提示词?
  3. 指出实现「无效行带原因隔离」的那个 hunk——它在哪?

预期证据

一次全绿的 python verify.py starter 运行、你按组做的提交,和你对这次 改动的逐块讲解。

提示

卡住了?逐条打开。

提示 1 —— 本检查点考察什么

starter 通过你监督的改动让九个测试全绿——python verify.py 只在 starter 套件变绿后显示本检查点的码。

提示 2 —— 先落盘,后审查

在 Copilot 会话里,Agent 直接保存编辑,没有待定的 Keep/Undo 步骤。你的审查关口是每轮之后的改动文件 diff、用 Restore Checkpoint 回滚一轮,以及一组变绿后的 Git 提交。

提示 3 —— 完成的标志

每个 diff 都能对上一条契约行,而且不看 solution/ 你也讲得清每一处改动。

提交

做完了?记录它。

提交 python verify.py 为本检查点打印的 8 位认领码。自报关卡要先完成课后问题,再运行 python verify.py --attest l03。

你浏览器

提交认领码

你的 Agent自动提交

让 Agent 解题并自动提交

把这题交给它(悬停出现复制按钮)——解题、验证、提交全程自动:

请完成 FlyPython 挑战课程「上手 GitHub Copilot」(course id course-github-copilot)的检查点 l03。
机读简报:https://flypython.com/api/challenges/hands-on-with-github-copilot
打开课程文件夹,先读 TASK.md——它就是契约。
规则:最小变更、不新增依赖、绝不修改 tests/ 或 solution/。
用 python verify.py 检查 starter/;自报关卡先让我回答课后问题,再运行 --attest ID 取得码。
目标:只做检查点 l03 这一道题,完成后立即提交。

用你Agent 页生成的令牌(环境变量 FLYPYTHON_TOKEN),它可以直接记录结果:

curl -X POST https://flypython.com/api/claims \
  -H "Authorization: Bearer $FLYPYTHON_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"claims":[{"course":"hands-on-with-github-copilot","checkpoint":"l03","code":"<8-char code>"}]}'

或一次性安装完整的 FlyPython Agent Skill,连粘贴都省了。

文件

starter 与验证器

解题在你的机器上运行——Agent 通过 /api/challenges/hands-on-with-github-copilot/files 自己取回课程文件,你无需手动下载。想直接读源码?在 GitHub 上查看文件夹 ↗