Hands-on with ZCode · Challenge 02 · 中文版

Lesson 2: Write the task contract, let Goal Mode hold the plan

Checkpoint l0210 ptsself-reported — code from verify.pyZCode desktop app

Turn "make it better" into a bounded, testable contract — then let Goal Mode decompose it into tasks you can watch land one by one.

Six agent-tool courses share this challenge. ZCode desktop app-specific steps are still being written — until they land and pass review, this page defers its canonical to the primary course's copy.

Doing this with your agent? One sentence starts the whole course:

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

Lesson 2: Write the task contract, let Goal Mode hold the plan

Objective

You can read TASK.md as a set of testable statements, trace each statement to a test in tests/test_report_tool.py, and watch a goal decompose into tasks before any file is touched.

Why this lesson exists

Vague requests produce vague code. “Handle bad rows better” gives an agent permission to guess; “invalid rows are collected in errors with index and reason, valid rows still produce a report” gives it a target and gives you a way to check. In ZCode the decomposition is a first-class surface: Goal Mode turns your objective into a task list and manages recovery when a step stalls. The contract you write is what it decomposes — a precise contract becomes a precise task list.

The lesson

Open TASK.md. Notice what every line has in common: it names an observable behavior, not an implementation. Four statements from the contract, and the tests that pin them:

Contract lineTest
“a JSON file loads into the same record list as CSV”test_load_json_records_returns_list_of_dicts
“invalid rows land in errors with index and reason; valid rows still aggregate”test_invalid_records_are_isolated_with_reasons
“group totals are rounded to two decimals”test_group_totals_are_rounded_to_two_decimals
“the report write is atomic and creates missing parents”test_write_report_creates_missing_parent_directories

Now set the goal. Give the agent an objective that is already decomposed by the contract:

“Goal: make starter/report_tool.py satisfy TASK.md. Work one failing test group at a time — JSON loading, then validation isolation, then rounding, then atomic writes, then the end-to-end tests — running python verify.py starter after each task. Only starter/report_tool.py may change; tests/, solution/, scenario/ are read-only; standard library only.”

Read the task list Goal Mode produces before letting it execute. Each task should name a contract line and a verification step — if a task says “improve error handling,” tighten the goal; that is not a contract line. The task list is the deliverable of this lesson: it is your contract, executable.

Exercise

Write one contract line for a script you actually own, using the same shape: inputs, outputs, error cases, and “done means <command> exits 0”. Then write the goal statement you would give ZCode for it — with the same boundaries this lesson used.

Checkpoint

Run python verify.py — this checkpoint’s claim code prints when you can answer:

  1. Which TASK.md line does test_invalid_records_are_isolated_with_reasons pin, in your own words?
  2. What does Goal Mode do with your objective — and what does it do when a step stalls?
  3. Why should the goal statement carry the boundaries, not just the task?

Expected evidence

Your drafted contract line, your goal statement, and the task list it produced (or the version you tightened and why).

Hints

Stuck? Open one at a time.

Hint 1 — What this checkpoint tests

That you can read TASK.md as testable statements, not prose. Every sentence that starts with a function name is a contract line the suite can assert.

Hint 2 — Goal Mode is the objective manager

ZCode's Goal Mode decomposes an objective into a task list the agent works through — and manages recovery when a step stalls. The contract you write is what it decomposes; vague in, vague out.

Hint 3 — The testability check

If you cannot tell whether a statement is testable, ask: could a suite assert it without reading your mind? Numbers, exit codes, files on disk — never vibes.

Submit

Done? Record it.

The 8-character code verify.py progress printed for this checkpoint — from the browser, or straight from your agent.

Youbrowser

Submit the claim code

Your agentauto-submit

Let the agent solve and submit

Hand it this checkpoint (copy button on hover) — it solves, verifies, and submits on its own:

Work on the FlyPython challenge "Hands-on with ZCode" (course id course-zcode), checkpoint l02.
Machine-readable brief: https://flypython.com/api/challenges/hands-on-with-zcode
Open the course folder and read TASK.md first — it is the contract.
Rules: smallest change, no new dependencies, never edit tests/ or solution/.
Check with python verify.py until its gates pass, then report each claim code to me.
Target: solve only checkpoint l02, and submit it as soon as it passes.

With a token from your agent page (env FLYPYTHON_TOKEN), it records the result directly:

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

Or install the full FlyPython agent skill once and skip the paste.

Files

The starter and verifier

Solving runs on your machine — your agent fetches the course files itself via /api/challenges/hands-on-with-zcode/files; you download nothing by hand. Prefer reading the source? Browse the folder on GitHub ↗