Set Up Git
Pre-change snapshot
Run this section only when setup-ml-project loaded this skill
for the pre-change snapshot. Do not run Lookup. Do not scaffold.
Do not ask whether later stages commit. Then return to
setup-ml-project.
-
Run
python -m skore_skills git snapshot. -
actionskipandreasonalready: return. Do not persist again. -
actionskipandreasoncleanornothing_to_commit: persistpython -m skore_skills policy set git.snapshot skipped, then return. Do not ask. Do notgit commit. -
actionask: AskUserQuestion. Recommend committing. In 2–4 lines, say this commit records the workspace as it is now, so the user can return to it before setup changes anything. It does not change whether later stages commit. A file link is an addition, never the context.- No: persist
python -m skore_skills policy set git.snapshot declined. Do notgit init,git add, orgit commit. Return. - Yes: continue. Persist
python -m skore_skills policy set git.snapshot committedafter the commit exits 0.
- No: persist
-
On yes, if
repois false, rungit init -b mainbefore adding files. The initial branch ismain. Do notgit config. Do not name that branchmaster. -
If
ambiguous_dotfilesorreview_pathsis non-empty, ask once which of those paths to keep tracked. List every hidden path and each reviewpathwith itskind. Say that paths they do not keep are ignored. Do not ask a second question for the other list. Copy paths from the JSON. Then:ambiguous_dotfileswas non-empty →python -m skore_skills git ignore-merge --decideplus--keep <path>for each chosen hidden path (no--keepif they keep none).review_pathswas non-empty →python -m skore_skills git review-decidewith--keep <path>for each chosen path and--ignore <path>for every other path in that list (no--keepif they keep none). Pass a folder path through with its trailing slash.
Empty lists: do not ask, and do not run
git ignore-merge. Never--keep.envor.skore. Exit code 2 from those commands is structured JSON, not a command failure. -
git status.git add -- <paths>onlystagedpaths that are not still listed inreview_paths, plus hidden paths the user kept. Never stage.env,.skore,.venv,.pixi, or another must-ignore tool directory. Never stage a review path that was not kept. -
git commit -m "<one-line subject>". The subject states that this is the workspace before setup changes it. Only this section uses that subject.
Lookup
Run status first. Take the first row that matches, then run its
steps from the Sequence below. Do not stop after reading the table.
policy.git.autocommit | Situation | Steps | Ask | Commit |
|---|---|---|---|---|
on or off, user asks to change it | HEAD exists, or the new value is off | 1, 9 | the autocommit question only | no |
on or off, user asks to change it | new value on, no HEAD | 1, 7, 8, 9 | autocommit, then one keep question if review_paths is non-empty | yes |
null | any | 2, 3, 4, then only the Ask and Commit of the row for the persisted answer. Do not run steps 2 or 3 again | autocommit once | per that row |
off | any | 2, 3, 5, 9 | nothing | no |
on | policy.git.snapshot is committed and git status is dirty | 2, 3, 7, 8, 9 | one keep question only if ambiguous_dotfiles or review_paths is non-empty | yes, the setup changes only |
on | HEAD exists | 2, 3, 6, 9 | nothing | no |
on | no HEAD | 2, 3, 7, 8, 9 | one keep question only if ambiguous_dotfiles or review_paths is non-empty | yes |
The keep question is one question. After step 3 it lists every
hidden path and every review path with its kind. The
change-to-on row did not run ignore-merge: list only
review_paths. Exit code 2 from git ignore-merge,
git review, or git review-decide is structured JSON, not a
command failure.
Sequence
-
Run
python -m skore_skills status. If the user asked to change the commit choice andpolicy.git.autocommitis alreadyonoroff, re-ask that question and persistonoroff. Do notgit init. Do notgit ignore-merge. If the new value isonand the repo has no HEAD yet, continue at the first-commit review (step 7). If the new value isoff, oronand HEAD exists, stop this sequence: use the return rule in step 9 and do not continue at step 2. Do not invent another commit. Later stages follow the new value. Otherwise, if autocommit is alreadyonoroff, do not ask that question again. -
If there is no
.gitdirectory, rungit init -b main. The initial branch ismain. Do not rungit config. Do not name that branchmaster. Do not rename a branch that already exists. -
Run
python -m skore_skills git ignore-merge. Keep the JSONambiguous_dotfileslist. Exit code 2 is that structured list, not a command failure. Do not ask yet. -
If
policy.git.autocommitisnull, ask once: should later stages persist withgit commit(on) or never (off)? State in 2–4 lines what the answer authorizes — commits at the end of later stages, starting with the first commit this turn — and which paths stay ignored; a file link is an addition, never the context. Persist withpython -m skore_skills policy set git.autocommit onoroff. That answer is also consent for the first commit. It does not authorize trackingambiguous_dotfilesorreview_paths. Whensetup-ml-projectalready persistedonoroffthis turn, do not ask again. -
If autocommit is
off, stop. Do not ask which files to keep. Do notgit commit. Use the return rule in step 9. -
If autocommit is
onand HEAD exists, stop after ignore-merge. Do not use this step whenpolicy.git.snapshotiscommittedandgit statusis dirty; that row commits the setup changes. Do not ask which files to keep. Do not invent another commit. Later stages usepython -m skore_skills git end-turn --stage <stage>thenpersist-ml-git, where<stage>issetup,data_analysis,implement,evaluate, orbacklog. When that skill is not installed, those stages report the pending paths instead of committing. -
If autocommit is
onand (this repo has no HEAD yet, orpolicy.git.snapshotiscommittedandgit statusis dirty), runpython -m skore_skills git review. Whengit.snapshotiscommitted, the step 8 commit is only the changes since that snapshot. Do not ask to snapshot again. When this step is reached from step 1, ignore-merge did not run: use onlyreview_paths. Ifambiguous_dotfilesandreview_pathsare both empty, do not ask. If either list is non-empty, ask once which of those paths to keep tracked. List every hidden path and each reviewpathwith itskind. Say that paths they do not keep are ignored. Do not ask a second question for the other list. Copy paths from the JSON; do not reclassify them. Do not ask about file size, artifacts, or datasets whenreview_pathsis empty, and do not ask about hidden files whenambiguous_dotfilesis empty. Then:ambiguous_dotfileswas non-empty → re-runpython -m skore_skills git ignore-merge --decideplus--keep <path>for each chosen hidden path (no--keepif they keep none).review_pathswas non-empty →python -m skore_skills git review-decidewith--keep <path>for each chosen path and--ignore <path>for every other path in that list (no--keepif they keep none). Pass a folder path through with its trailing slash so the ignore line is that folder. Exit code 2 fromgit revieworgit review-decideis the structured review outcome, not a generic command failure: read its JSON. The question in this step is that decision; do not ask again. Ifreview-decidestill lists paths, rerun it with the same choices.
Run only the command for a list that was non-empty. Do not re-ask paths gone from the next JSON. Never
--keep.envor.skore. -
Then
git status.git add -- <paths>only paths that are not still listed inreview_paths, andgit commit -m "<one-line subject>"from this setup turn. The subject describes the files committed now. It does not say this commit is the state before setup changes. Do not ask a second time about autocommit. Never stage.envor.skore. -
When
setup-ml-projectdispatched this turn and is in this session, return control to it. Otherwise loadtriage-ml-taskifstatus.skillsreports it installed, else stop.
Stop conditions
- Never overwrite
.gitignore;git ignore-mergeunions packaged rules. - Never stage
.env,.skore, or a review path that was not kept. - Never split hidden files and review paths into two questions before the first commit.
- Never push, create a remote, amend, rebase, or set git identity.
- The initial branch is
main. Do not name itmaster. Do not rename a branch that already exists. - Do not call
python -m skore_skills git end-turn --stage …to create the first commit. - The pre-change snapshot does not
scaffold. It does not rungit ignore-mergeunlessambiguous_dotfileswas non-empty. - Lookup does not use the pre-change snapshot commit subject.


