Progress Skill
Purpose
Maintain a machine-readable progress file so dashboards, CLIs, and notebooks can poll the experiment's state at any time. The file is a JSON document — never markdown, never human-prose-first.
When to Use
Constantly. This skill is not a phase — it runs alongside every phase. You must overwrite progress.json at these moments:
- Phase start — when you begin a new phase
- Phase end — when you complete a phase
- Before long operations — before training a model, installing dependencies, reading a large PDF
- On failure — immediately when something goes wrong
- On completion — when the full experiment finishes
File Location
experiments/{research_name}/progress.json
Format (CANONICAL — emit exactly)
The file is overwritten each time (not appended). It is always the full current snapshot. Use UTC ISO-8601 timestamps. Match this schema byte-for-byte — do not invent alternative field names, do not use a dict where a list is specified, do not translate status values to synonyms.
{
"name": "{research_name}",
"status": "RUNNING",
"started_at": "2026-04-17T10:00:00Z",
"updated_at": "2026-04-17T10:25:00Z",
"phases": [
{"index": 0, "name": "Setup", "status": "done", "summary": "Copied notebook, data, paper."},
{"index": 1, "name": "Analyze Current", "status": "done", "summary": "Baseline is XGBoost, 85.3% accuracy."},
{"index": 2, "name": "Research", "status": "current", "summary": null},
{"index": 3, "name": "Benchmark", "status": "pending", "summary": null},
{"index": 4, "name": "Implement", "status": "pending", "summary": null},
{"index": 5, "name": "Evaluate", "status": "pending", "summary": null}
],
"current_activity": "Reading research.pdf — extracting method summary and requirements.",
"issues": []
}
Field rules (strict)
status is one of: "RUNNING", "COMPLETED", "FAILED". Uppercase. Nothing else.
phases is a JSON array, never an object. Exactly six elements, in order: Setup, Analyze Current, Research, Benchmark, Implement, Evaluate. Use those exact name values.
phases[].status is one of: "done", "current", "pending", "failed". Lowercase. Do not use "completed", "in_progress", "todo", or any other synonym.
phases[].index is a 0-based integer matching the position in the array.
- Exactly one phase may have
status == "current" while the top-level status == "RUNNING". On COMPLETED / FAILED, no phase should be "current".
phases[].summary is one short sentence, or null if the phase has not run yet.
current_activity is one or two sentences describing what is happening right now.
issues is an array of short strings; use [] when clean, never null.
- Do not add extra top-level keys (e.g.
current_phase), and do not use dict-of-phases shapes like {"phase_0_setup": {...}}.
Rules
- Overwrite, don't append. The file is a snapshot, not a log.
log.json is the log.
- Valid JSON only. Never write partial/invalid JSON. Write to a temp file and rename if needed.
- Update before, not after. Update progress BEFORE starting a long operation. The user wants to know what's happening now, not what already happened.
- Be honest about failures. On error, immediately set
status = "FAILED", mark the current phase "failed", and append a message to issues.
- Always refresh
updated_at — a stale timestamp tells the user nothing is moving.
Lifecycle
| Moment |
Action |
| Phase 0 starts |
Create progress.json, status="RUNNING", all phases pending, Phase 0 → current, set started_at + updated_at |
| Phase N starts |
Previous phase → done with one-line summary; Phase N → current; refresh current_activity + updated_at |
| Long operation starts |
Update current_activity (e.g. "Training model — this may take a few minutes") + updated_at |
| Phase N ends |
Mark Phase N → done with one-line summary |
| Experiment completes |
All phases done, status="COMPLETED", current_activity="Done. See result.json." |
| Experiment fails |
status="FAILED", current phase → "failed", issues populated, current_activity describes the error |
1---2name: progress3description: Progress Skill4---5# Progress Skill67## Purpose8Maintain a **machine-readable** progress file so dashboards, CLIs, and notebooks can poll the experiment's state at any time. The file is a JSON document — never markdown, never human-prose-first.910## When to Use11**Constantly.** This skill is not a phase — it runs alongside every phase. You must overwrite `progress.json` at these moments:12131. **Phase start** — when you begin a new phase142. **Phase end** — when you complete a phase153. **Before long operations** — before training a model, installing dependencies, reading a large PDF164. **On failure** — immediately when something goes wrong175. **On completion** — when the full experiment finishes1819## File Location20```21experiments/{research_name}/progress.json22```2324## Format (CANONICAL — emit exactly)2526The file is **overwritten** each time (not appended). It is always the full current snapshot. Use UTC ISO-8601 timestamps. Match this schema **byte-for-byte** — do not invent alternative field names, do not use a dict where a list is specified, do not translate status values to synonyms.2728```json29{30 "name": "{research_name}",31 "status": "RUNNING",32 "started_at": "2026-04-17T10:00:00Z",33 "updated_at": "2026-04-17T10:25:00Z",34 "phases": [35 {"index": 0, "name": "Setup", "status": "done", "summary": "Copied notebook, data, paper."},36 {"index": 1, "name": "Analyze Current", "status": "done", "summary": "Baseline is XGBoost, 85.3% accuracy."},37 {"index": 2, "name": "Research", "status": "current", "summary": null},38 {"index": 3, "name": "Benchmark", "status": "pending", "summary": null},39 {"index": 4, "name": "Implement", "status": "pending", "summary": null},40 {"index": 5, "name": "Evaluate", "status": "pending", "summary": null}41 ],42 "current_activity": "Reading research.pdf — extracting method summary and requirements.",43 "issues": []44}45```4647### Field rules (strict)4849- **`status`** is one of: `"RUNNING"`, `"COMPLETED"`, `"FAILED"`. Uppercase. Nothing else.50- **`phases`** is a **JSON array**, never an object. Exactly six elements, in order: Setup, Analyze Current, Research, Benchmark, Implement, Evaluate. Use those exact `name` values.51- **`phases[].status`** is one of: `"done"`, `"current"`, `"pending"`, `"failed"`. Lowercase. Do **not** use `"completed"`, `"in_progress"`, `"todo"`, or any other synonym.52- **`phases[].index`** is a 0-based integer matching the position in the array.53- Exactly one phase may have `status == "current"` while the top-level `status == "RUNNING"`. On `COMPLETED` / `FAILED`, no phase should be `"current"`.54- **`phases[].summary`** is one short sentence, or `null` if the phase has not run yet.55- **`current_activity`** is one or two sentences describing what is happening **right now**.56- **`issues`** is an array of short strings; use `[]` when clean, never `null`.57- Do **not** add extra top-level keys (e.g. `current_phase`), and do not use dict-of-phases shapes like `{"phase_0_setup": {...}}`.5859## Rules60611. **Overwrite, don't append.** The file is a snapshot, not a log. `log.json` is the log.622. **Valid JSON only.** Never write partial/invalid JSON. Write to a temp file and rename if needed.633. **Update before, not after.** Update progress BEFORE starting a long operation. The user wants to know what's happening now, not what already happened.644. **Be honest about failures.** On error, immediately set `status = "FAILED"`, mark the current phase `"failed"`, and append a message to `issues`.655. **Always refresh `updated_at`** — a stale timestamp tells the user nothing is moving.6667## Lifecycle6869| Moment | Action |70|--------|--------|71| Phase 0 starts | Create `progress.json`, `status="RUNNING"`, all phases `pending`, Phase 0 → `current`, set `started_at` + `updated_at` |72| Phase N starts | Previous phase → `done` with one-line `summary`; Phase N → `current`; refresh `current_activity` + `updated_at` |73| Long operation starts | Update `current_activity` (e.g. `"Training model — this may take a few minutes"`) + `updated_at` |74| Phase N ends | Mark Phase N → `done` with one-line `summary` |75| Experiment completes | All phases `done`, `status="COMPLETED"`, `current_activity="Done. See result.json."` |76| Experiment fails | `status="FAILED"`, current phase → `"failed"`, `issues` populated, `current_activity` describes the error |