Copy reports with the skore CLI. Switch the default destination
only when the user asked to. Do not evaluate, audit, or invent
Project.sync Python.
Human-facing prose
Details: setup-workspace references/human_facing_prose.md.
Ask where reports live (disk, Hub, MLflow) in those words. Do not
name G-SKORE-MODE, skill ids, or the wrapper CLI in the
question. skore sync output may appear in the close as the
sync table.
Procedure
-
Run
python -m skore_skills status. Readpolicy.skore_modeandskills. Openexperiments/andaudit/for theskore.Project(...)init block:name=, Hubworkspace=, MLflowtracking_uri=. Local store is always the workspacereports/directory (absolute path). Never omit--from-workspace/--to-workspaceon a local endpoint. -
If
policy.skore_modeis unset: STOP. First pick is G-SKORE-MODE inevaluate-ml-pipeline. Do not ask local / hub / mlflow here. Load that skill only ifstatus.skills.evaluate-ml-pipelineis true and the user asked to evaluate; else one-line skip. The close is only this stop: the destination is not chosen yet and is picked when a report is stored. Do not list local, Hub, or MLflow, a workspace name, or a tracking URI. Do not use the source-to-destination close below. -
AskUserQuestion for any answer not already in the request. Ahead of each question, state in 2–4 lines what the answer authorizes — which reports move where, whether
skore_modeand the Project init lines get rewritten — and the facts it rests on: the current mode, the discovered report count, the endpoint. A file link is an addition, never the context.- Intent. Switch default destination (sync, then persist
skore_modeand rewrite every Project init) vs copy only (sync, leave policy and experiment files). - Destination — same three options as G-SKORE-MODE:
local(disk, no account),hub(https://skore.probabl.ai),mlflow(tracking server). Hub: ask the workspace name; it MUST NOT contain/. MLflow: asktracking_uri; confirm a barehost:portashttp://host:port. Do not default the URI. - Project name if
name=is missing or disagrees across files. - Dry-run first vs transfer now.
If intent is switch and destination equals
policy.skore_mode, stop in one line. - Intent. Switch default destination (sync, then persist
-
Destination extras: load
add-python-packageonly ifstatus.skills.add-python-packageis true, for Skore at the destination mode (env add-skore --mode <dest>). If that skill is missing, name Skore for the destination and stop. Do not splicepip install/skore[...]here. -
If Hub is source or destination: require
SKORE_HUB_API_KEYin the environment. Missing → name it and stop. Do not open a browser login. Do not read.skorefor the key. -
Build
skore sync. Ifskoreis not on PATH, nameskore-cliand stop. Do not callskore.Project.syncin Python.skore sync <project> --from=<source_mode> --to=<dest_mode>Source mode is
policy.skore_mode. Add:Endpoint Flags local --from-workspaceor--to-workspace= resolvedreports/hub --from-workspaceor--to-workspace= Hub workspace name (required)mlflow --tracking-uri=...; never*-workspace--to-projectonly if the destination name differs.--hub-urlonly whenSKORE_HUB_URI(or the user) names a non-default Hub.--bothonly if the user asked to copy missing reports both ways. Otherwise one-way.If the user picked dry-run first, run with
--dry-run, show the plan, then ask to transfer. Live run omits--dry-run.Usage/auth/backend errors: name stdout/stderr and stop. Do not invent a Python fallback. Empty output
No reports to synchronize.is success (nothing to copy; a switch may still continue). -
Switch intent only, after a successful (or empty) sync:
python -m skore_skills policy set skore_mode <dest>. Rewrite every Project init inexperiments/andaudit/to the destination form inevaluate-ml-pipeline/references/g_skore_mode.md(audit must match the paired experiment, byte-for-byte modulo formatting). If dest is local,mkdir reports(exist_ok); no README. If hub or mlflow, do not createreports/. Ifjournal/JOURNAL.mdexists, insert a---under History and one lineskore_mode: <old> → <dest> (sync-ml-reports). Missing journal → skip in one line; do not paste a JOURNAL body.Copy-only: do not
policy set, rewrite init, mkdir, or edit JOURNAL.
Stop conditions
- Do not steal first G-SKORE-MODE when
skore_modeis unset. - Do not silently change a recorded mode; switch requires the switch intent (or an explicit user request to switch).
- Do not
git commit. - Do not evaluate,
project.put, or audit. - Do not pass
*-workspaceon an MLflow endpoint. - Do not omit
*-workspaceon a local or Hub endpoint.
End of turn
User-facing close
This close applies only after a sync. An unset policy.skore_mode
uses the step-2 stop instead.
Short story: source → destination, whether policy changed, and
the skore sync table or No reports to synchronize. Do not
dump experiment files.
Then python -m skore_skills git end-turn --stage evaluate
(the persist bucket for this work; this is not a CV run). If
JSON action is invoke, load persist-ml-git only if
status.skills.persist-ml-git is true and stop; that skill
returns to triage. If persist is missing, name the pending
staged paths and stop. Otherwise load triage-ml-task only if
status.skills.triage-ml-task is true; else stop. No git commit.