--- name: persist-ml-git description: > Commit the current loop stage when the end-turn hook says invoke. Trigger after `python -m skore_skills git end-turn --stage ` returns action invoke, or when the user asks to commit this turn's work. metadata: modelTier: small --- # Persist ML Git The hook already ran this turn. Follow its JSON. Run `git` yourself. 1. If `action` is `skip`, stop. Do not nag. Load `triage-ml-task` if installed, else stop. 2. If `reason` is `resolve-dotfiles` and `ambiguous_dotfiles` is non-empty, ask once which hidden paths to keep. Include an explicit **Keep none** option. An empty multi-select is not an answer. Then `python -m skore_skills git ignore-merge --decide` plus `--keep ` for each chosen path (no `--keep` if they keep none, including when they pick **Keep none**). Do not re-ask names gone from the next JSON. Never keep `.env` or `.skore`. If `ambiguous_dotfiles` is empty or `reason` is `persist`, do not ask about hidden paths. Exit code 2 from `git ignore-merge` is the structured `dotfile decision required` outcome, not a generic command failure: read its JSON, ask the decision, and rerun with `--decide`. 3. If `review_paths` is non-empty, ask once which of those paths to keep tracked. Include an explicit **Keep none** option. An empty multi-select is not an answer. List each JSON `path` and `kind`, and say that the rest are ignored. Then `python -m skore_skills git review-decide` with `--keep ` for each chosen path and `--ignore ` for every other path in the list (no `--keep` if they keep none, including when they pick **Keep none**). Pass a folder path through with its trailing slash so the ignore line is that folder. Copy paths and kinds from the JSON; do not invent them. Do not re-ask paths gone from the next JSON. Never `--keep` `.env` or `.skore`. If `review_paths` is empty, do not ask about file size, artifacts, or datasets. Do this when `reason` is `resolve-review`, and also after step 2 when `reason` is `resolve-dotfiles` and that payload lists `review_paths`. Exit code 2 from `git review` or `git review-decide` is the structured `review decision required` outcome, not a generic command failure: read its JSON, ask the decision, and rerun `review-decide`. 4. Run `git status`. Stage only non-secret paths that are not still listed in `review_paths`: `git add -- `. Never `.env` or `.skore`. 5. Commit with a **one-line** subject from this turn's files and intent: `git commit -m "…"`. Do not use a canned stage slogan. 6. Load `triage-ml-task` if installed, else stop. ## Stop conditions - Do not `git push`, amend, rebase, or `git config`. - Do not invent a commit when the hook was `skip` (`off`, `unanswered`, `no_repo`, `clean`). - Do not call `python -m skore_skills git end-turn --stage ` to perform the commit; that command only prints facts.