Frame ML Problem
SkillCloud & infraLets your agent pin down the machine learning problem definition, metrics, baselines, and validation plan in a shared journal before coding.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Frame ML Problem skill
About this skill
Lock the problem, the deployment setting, the comparison metric, the baseline, and the fold count in the journal before any model code. Ask every missing decision in one turn, from `frame show`. Does not write Python, estimator hyperparameters, or splitter constructors.
What this skill tells your AI
The instructions your AI receives, as published by probabl-ai/skills in skills/frame-ml-problem/SKILL.md and read by ahel’s review.
Write ## Modeling decisions in journal/JOURNAL.md. The table
is the contract. This skill does not declare a learner and does
not evaluate one.
Human-facing prose
Details: setup-workspace references/human_facing_prose.md.
Journal cells describe this dataset. Do not name the skills
framework, the CLI, or a splitter class in the table. Questions
use data-science language — not skill ids, G-* names, or the
wrapper CLI.
Procedure
- Run
python -m skore_skills status. Ifhas_journalis false, send the user to setup and stop. Ifdata_analysisismissingandexplore-ml-datais installed, AskUserQuestion: explore first (default) or continue from facts the user stated. Explore loadsexplore-ml-dataand stops. Do not invent dataset facts. Do not ask this again oncedata_analysisispresentorskipped. - Run
python -m skore_skills frame show. When the user is changing a locked constraint and named one cell, add--revise. When they are changing a constraint and did not name a cell, ask which filled decision to change (skipn/a) and stop. Do not--revise, do notframe clear, and do not edit the journal on that turn. JSONactionis authoritative. Do not invent a menu. If the command is missing or exits without JSON, readreferences/fallback.mdand follow it. Do not open another reference. Do not guess candidates. stop— say the JSONreasonand stop.ask/uncovered— readreferences/fallback.mdonly. Write Prediction goaluncoveredand the prose cells it names. Set Status todraft. Stop this turn.ask/missing_keys— read each distinctreferenceinquestionsonce before asking. Do not open any other file underreferences/. Ask every key inmissingin one message. For a question that hascandidates, those are the options. Whencandidatesis absent, ask for the value the reference describes. Draw on three sources, and only what they actually say: the EDA report, free-form text that came with the data if any is present (notes, a dictionary, or a README beside the raw files), and facts the user stated. If none of that text is present, do not invent it. When one of them already states the fact, quote it in the question. Write every Value cell the user answered in this turn. Do not rename Variable cells. Do not stop after the first cell. When the deployment makes other rows inapplicable, set those cells ton/ain the same edit. Horizon, gap, and time role aren/aunless deployment is time. Generalize-to isn/aunless deployment is groups. A fold count of1is one train/test split. Once any decision cell is filled and Status is notlocked, set Status todraft. Stop this turn.- When the user named one cell and Status is
draft, do not use the lock menu as the change. Runpython -m skore_skills frame clear --cell <key>for that cell and stop. Do not write the new value. Do not name any other cell as cleared. The command's JSONblankedlist is the record. Status staysdraft. The nextframe showasks only keys that are still empty or invalid. ask/confirm_lockorask/revise— quote JSONcontextinline, then offer JSONchoicesonly and stop. The user sentence that opened this screen is not a choice. Do not set Status tolockedin that same turn.lockon a later turn sets Status tolocked.modifyon a revise, when the user named one cell: runpython -m skore_skills frame clear --cell <key>and stop. Do not write the new value. Do not blank any other cell by hand. The nextframe showasks only keys that are still empty or invalid.modifywith no named cell writes nothing and does notframe clear: ask which filled decision to change and stop.keepleaves the locked table unchanged.stopwrites nothing further.
proceed— the table is locked. Iftranslationis null, say that this lock has no splitter translation. Do not loadbuild-ml-pipelineand do not return tomodel-ml-pipeline. Stop. Ifmodel-ml-pipelinedispatched this turn, return to that coordinator and stop. Do not start build, write a design note, or run the git close from here. Otherwise runpython -m skore_skills git end-turn --stage implement. If JSONactionisinvoke, loadpersist-ml-gitonly ifstatus.skills.persist-ml-gitis true and stop. Otherwise loadtriage-ml-taskonly if that skill is installed.
Stop conditions
- Do not write Python, a pipeline, a test, or a design note.
- Do not put a class name or a constructor argument in the journal.
TimeSeriesSplit,KFold,GroupKFold, andgap=stay out of the table. - Do not re-ask a key that is absent from
missing. - Do not add an option that is absent from
candidates. - Do not open a reference the JSON did not name, except
references/fallback.mdwhen the command is missing. - A locked table changes only through
frame show --revise, then the same fill and confirm gates.keepdoes not edit it. - On
modify,frame clearis the only journal edit, and only for the cell the user named. Do not rewriteexperiments/,audit/, or a report in this skill. - After a cell is blanked, do not run an existing experiment script. Say that it still uses the previous splitter and metric. The next build or evaluate rewrites it after the table is locked again.
Signals
- GitHub stars
- 132
- Forks
- 9
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
frame-ml-problem- Source
- github.com/probabl-ai/skills