Learning Skedge: the trainer¶
puppet-strings train
opens Skedge Training, a practice window for new Puppet Masters. In the app, Open
trainer in the Configure pane starts it too, before anybody has signed in. It holds a couple of
hundred plain-English requests, in levels that each introduce one idea — a single task, sets
of people, ANY and ANY n, splitting with EACH, dates, FREE, BUSY and NOT,
clinics and cabin acts, set arithmetic, counting and lengths, WITH, PREFER, bindings
and mappings, IF / UNLESS with
AND / OR, GAP and EXCLUDE — and ends with requests that combine several of them.
It runs entirely offline, on a copy of 2026 Main Season, Session 6 bundled with the app: the real staff, categories, blocks, clinics, cabin act boards and mappings. Nothing written in it goes near a real schedule.
The window¶
| Pane | What it is for |
|---|---|
| The trail, on the left | Every level and problem, ticked off as it is solved. Progress is saved as you go. |
| The problem, in the middle | What camp asks for, the priority it is asked at and the day being scheduled; a Skedge box with the same name suggestions as the request manager; and what the checker made of your answer. |
| Names and Calendar, on the right | The same two panes as the request manager. Search the names by any part of them; double-click one to see what it stands for; click a day to put its date in your answer. |
Each level has a cheat sheet. Each problem has hints, and an answer to peek at.
How an answer is marked¶
An answer is never compared with the expected text: most requests can be written several ways, and any of them is right. It is marked by what it does.
- Both are resolved against the session, which turns every spelling of a set into the same people, blocks and dates. If they come out the same, the answer is right.
- Otherwise the solver builds days of Session 6 — the emptiest ones each request allows, the fullest, and many in between — and holds each against the other request. A day that meets one and not the other is shown to you as a small schedule: the clearest way to see what your request says that you didn't mean.
- A few things no single day shows are compared directly:
PREFERagainstREQUEST, the dates a request is about, how long aFORtask lasts, what aMAXIMIZEscores, what anEXCLUDEtakes out, and belowMUST_HAPPENhow many separate requestsEACHmakes.
Adding problems¶
Problems live in puppet_strings/training/problems/, one TOML file per level:
[[problem]]
id = "first-rob-lunch-break"
title = "Rob's lunch break"
prompt = "Rob should take a 'break' during lunch."
answer = "REQUEST staff.rob DO 'break' DURING blocks.lunch"
priority = "HIGH" # optional; HIGH by default
day = "2026-08-04" # optional; the level's day by default
hints = ["…", "…"]
explain = "Shown once it is solved."
alternatives = ["other answers that must be marked right"]
wrong = ["near misses that must be marked wrong"]
The test suite holds every problem to its answer, its alternatives and its near misses, so a
new problem is checked the moment it is written. tools/snapshot_training.py refreshes the
bundled session from the sheets.