/progress
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.
$ npx -y skills add Upsonic/Upsonic --skill progress --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/progress
Context preview
The summary Claude sees to decide when to auto-load this skill.
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.
SKILL.md
progress.SKILL.mdProgress 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:
1. **Phase start** — when you begin a new phase 2. **Phase end** — when you complete a phase 3. **Before long operations** — before training a model, installing dependencies, reading a large PDF 4. **On failure** — immediately when something goes wrong 5. **On completion** — when the full experiment finishes
File Location
experiments/{research_name}/progress.jsonFormat (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
1. **Overwrite, don't append.** The file is a snapshot, not a log. `log.json` is the log. 2. **Valid JSON only.** Never write partial/invalid JSON. Write to a temp file and rename if needed. 3. **Update before, not after.** Update progress BEFORE starting a long operation. The user wants to know what's happening now, not what already happened. 4. **Be honest about failures.** On error, immediately set `status = "FAILED"`, mark the current phase `"failed"`, and append a message to `issues`. 5. **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 |
Read more
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:
1. **Phase start** — when you begin a new phase 2. **Phase end** — when you complete a phase 3. **Before long operations** — before training a model, installing dependencies, reading a large PDF 4. **On failure** — immediately when something goes wrong 5. **On completion** — when the full experiment finishes
File Location
experiments/{research_name}/progress.jsonFormat (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
1. **Overwrite, don't append.** The file is a snapshot, not a log. `log.json` is the log. 2. **Valid JSON only.** Never write partial/invalid JSON. Write to a temp file and rename if needed. 3. **Update before, not after.** Update progress BEFORE starting a long operation. The user wants to know what's happening now, not what already happened. 4. **Be honest about failures.** On error, immediately set `status = "FAILED"`, mark the current phase `"failed"`, and append a message to `issues`. 5. **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 |
Other skills on upsonic.
- /analyze_current
Read and understand the current baseline implementation. Extract all relevant information about the existing approach without modifying anything, and record the analysis as a structured JSON entry.
Open skill - /benchmark
Define the comparison metrics and extract baseline values from the current implementation. Record them as a structured JSON entry so downstream phases and final evaluation can read them directly.
Open skill - /evaluate
Compare baseline and new implementation results. Produce the machine-readable final report `result.json`, update `experiments.json`, and append a row to `comparison.json`.
Open skill - /experiment_management
Set up and manage the experiment folder structure. This is Phase 0 — it runs before any analysis begins. All bookkeeping files are JSON (never markdown).
Open skill - /implement
Create a new Jupyter notebook implementing the method from the research paper, using the same data as the baseline. Record implementation details and measured metrics as a structured JSON entry.
Open skill - /research
Read the materialized research source and extract actionable information needed to implement the proposed method. Record the findings as a structured JSON entry.
Open skill

