### wai-quantum-writer: WAI Quantum writes a program for a task, on its own model

A new crate, `wai/wai-quantum-writer`, holds the loop the job service will write programs with.
- **The task:** an exercise in the course's form (`wai.quantum.exercise/1`), shown to the model through
  `engine::course::task_of`. `task_of` and `engine::course::exercise` are new; `lesson` shows the same fields through it.
  The loop reads a task in its canonical form (RFC 8785, the form its digest is taken over), so one `task_digest` names
  one prompt and one check, and holds it to the course's form (`engine::course::exercise_form`) before the model is
  asked anything.
- **The loop:** the model writes a program, the engine checks it as it checks a lesson's answer, and what went wrong
  goes back for the next round, until a program passes or the rounds run out.
- **The model:** North Mini Code 1.0 (Apache-2.0) on the pure-Rust runtime (`jouleclaw-loader-gguf`). Decoding is
  greedy, and the conversation is held in the model's cache, so a repair round reads only what is new. The loop takes
  only the answer that follows the model's thinking, without the markers around it. A reply still thinking at its cap
  (two thirds of its tokens unless `--think-max` says otherwise) has its thinking closed for it and answers in the
  tokens left, so a model that would think through its whole budget still writes a program. The cap never takes a reply
  past `max_new`: with fewer than 64 tokens left for an answer, the reply ends with no answer instead; a reply that thinks
  again after the close is closed again; and an empty answer is no program.
- **Its files:** the model loads exactly the files its manifest (`wai.quantum.model/1`) lists, and refuses a manifest
  that lists none and a directory with a model file it does not list or without one it lists. Opening checks their
  sizes, and `--verify` hashes every byte through the mapping the model then reads, each file opened once; the model's
  identity says which (`"checked": "sizes"` or `"blake3"`).
- **The transcript** (`wai.quantum.write/1`) names the task, the model and the prompt by digest (the model by the
  digest of its file manifest, with how far its files were checked), the decoding with its thinking cap, the memory
  each check's run was planned in (`check_memory_bytes`, which decides what a check runs), and each attempt by its
  program's digest, the engine's check, and whether its thinking was closed. The same model files, task, options and
  engine give the same bytes in the same arithmetic, which the model's identity names (architecture, operating system,
  maths library and matmul kernel): on another, the logits can differ in their low bits and a near tie go the other way.
  `--check-memory-bytes` gives the command line the check's memory a service planned in.
- **The command line:** `wai-quantum-writer write`, `course` (which also counts the replies that gave no program and
  those whose thinking was closed), `manifest` and `verify`.
