install
source · Clone the upstream repo
git clone https://github.com/Upsonic/Upsonic
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Upsonic/Upsonic "$T" && mkdir -p ~/.claude/skills && cp -r "$T/prebuilt_autonomous_agents/applied_scientist/skills/progress" ~/.claude/skills/upsonic-upsonic-progress && rm -rf "$T"
manifest:
prebuilt_autonomous_agents/applied_scientist/skills/progress/SKILL.mdsource content
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)
is one of:status
,"RUNNING"
,"COMPLETED"
. Uppercase. Nothing else."FAILED"
is a JSON array, never an object. Exactly six elements, in order: Setup, Analyze Current, Research, Benchmark, Implement, Evaluate. Use those exactphases
values.name
is one of:phases[].status
,"done"
,"current"
,"pending"
. Lowercase. Do not use"failed"
,"completed"
,"in_progress"
, or any other synonym."todo"
is a 0-based integer matching the position in the array.phases[].index- Exactly one phase may have
while the top-levelstatus == "current"
. Onstatus == "RUNNING"
/COMPLETED
, no phase should beFAILED
."current"
is one short sentence, orphases[].summary
if the phase has not run yet.null
is one or two sentences describing what is happening right now.current_activity
is an array of short strings; useissues
when clean, never[]
.null- Do not add extra top-level keys (e.g.
), and do not use dict-of-phases shapes likecurrent_phase
.{"phase_0_setup": {...}}
Rules
- Overwrite, don't append. The file is a snapshot, not a log.
is the log.log.json - 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
, mark the current phasestatus = "FAILED"
, and append a message to"failed"
.issues - Always refresh
— a stale timestamp tells the user nothing is moving.updated_at
Lifecycle
| Moment | Action |
|---|---|
| Phase 0 starts | Create , , all phases , Phase 0 → , set + |
| Phase N starts | Previous phase → with one-line ; Phase N → ; refresh + |
| Long operation starts | Update (e.g. ) + |
| Phase N ends | Mark Phase N → with one-line |
| Experiment completes | All phases , , |
| Experiment fails | , current phase → , populated, describes the error |