$npx -y skills add HLND2T/CS2_VibeSignatures --skill post-change-updateRun repository-mutating post-change maintenance in two ordered phases around C++ validation. Use phase=before-validation for formatting, candidate build, and candidate-backed gamedata, then use phase=after-validation to publish the same validated candidate bytes.
| 1 | # Post-Change Update |
| 2 | |
| 3 | Run the repository-maintenance commands that can change tracked content. This skill does not validate C++ |
| 4 | layouts and does not commit; callers must place `/post-change-validation` between its two phases. |
| 5 | |
| 6 | ## Inputs |
| 7 | |
| 8 | - `phase` — required; exactly `before-validation` or `after-validation`. |
| 9 | - `gamever` — use the caller-provided value. If omitted, read `CS2VIBE_GAMEVER` from `.env`. |
| 10 | - `candidate`, `session`, and `gamedata_session` — required for `after-validation`; use the paths returned by |
| 11 | `before-validation`. |
| 12 | |
| 13 | Stop if the phase is missing or invalid. Stop if no non-empty game version can be resolved. |
| 14 | Set `ANALYSIS_CONFIG="configs/$GAMEVER.yaml"` and stop if it is not a file. |
| 15 | |
| 16 | ## Safety Rules |
| 17 | |
| 18 | - Run from the repository root. |
| 19 | - Preserve unrelated pre-existing work and never stage or commit changes. |
| 20 | - Stop on the first failed command and report its command, exit code, and relevant output. |
| 21 | - Never run downstream validation directly from `bin` or fall back to a tracked head snapshot. |
| 22 | - Never rebuild or reserialize a candidate after downstream validation begins. |
| 23 | - Never run the after-validation phase without explicit success from `/post-change-validation` for the same |
| 24 | game version, candidate, and session in the current calling task. |
| 25 | |
| 26 | ## Phase: before-validation |
| 27 | |
| 28 | Record `git status --short`, then run these commands in order: |
| 29 | |
| 30 | ```bash |
| 31 | uv run python format_repo_files.py |
| 32 | uv run python format_repo_files.py --check |
| 33 | CANDIDATE_ROOT="$(mktemp -d "/tmp/gamesymbol-candidate-${GAMEVER}-XXXXXX")" |
| 34 | CANDIDATE="$CANDIDATE_ROOT/${GAMEVER}.yaml" |
| 35 | CANDIDATE_SESSION="$CANDIDATE_ROOT/${GAMEVER}.session.json" |
| 36 | GAMEDATA_ROOT="$CANDIDATE_ROOT/gamedata-candidate" |
| 37 | GAMEDATA_SESSION="$CANDIDATE_ROOT/${GAMEVER}.gamedata.session.json" |
| 38 | uv run gamesymbol_candidate.py build -gamever "$GAMEVER" -bindir bin -configyaml "$ANALYSIS_CONFIG" -output "$CANDIDATE" -session "$CANDIDATE_SESSION" |
| 39 | uv run gamesymbol_candidate.py guard -candidate "$CANDIDATE" -session "$CANDIDATE_SESSION" |
| 40 | uv run gamedata_candidate.py build -gamever "$GAMEVER" -build-id local-1 -snapshot "$CANDIDATE" -configyaml "$ANALYSIS_CONFIG" -candidate-root "$GAMEDATA_ROOT" -session "$GAMEDATA_SESSION" -debug |
| 41 | uv run gamedata_candidate.py guard -session "$GAMEDATA_SESSION" |
| 42 | uv run gamesymbol_candidate.py guard -candidate "$CANDIDATE" -session "$CANDIDATE_SESSION" |
| 43 | uv run gamesymbol_candidate.py mark -candidate "$CANDIDATE" -session "$CANDIDATE_SESSION" -step gamedata |
| 44 | ``` |
| 45 | |
| 46 | The write-mode formatter is intentional. The following `--check` proves the resulting tracked Python/YAML |
| 47 | files are clean. If formatting, the check, or gamedata generation fails, stop the calling task and report the |
| 48 | failure; do not continue to C++ validation. |
| 49 | |
| 50 | On success, report which tracked files changed plus the symbol candidate/session paths, gamedata session path, and |
| 51 | candidate SHA-256. Return control to the caller so it can pass those exact paths to `/post-change-validation`. |
| 52 | |
| 53 | ## Phase: after-validation |
| 54 | |
| 55 | First confirm that `/post-change-validation` passed for the same `GAMEVER`, candidate, and session during the current |
| 56 | calling task. If that evidence is absent or validation failed, stop without modifying the tracked snapshot. Then run: |
| 57 | |
| 58 | ```bash |
| 59 | uv run gamesymbol_candidate.py guard -candidate "$CANDIDATE" -session "$CANDIDATE_SESSION" |
| 60 | uv run gamedata_candidate.py guard -session "$GAMEDATA_SESSION" |
| 61 | uv run gamesymbol_candidate.py publish -candidate "$CANDIDATE" -session "$CANDIDATE_SESSION" -snapshot "gamesymbols/$GAMEVER.yaml" |
| 62 | uv run gamedata_candidate.py publish -session "$GAMEDATA_SESSION" -outputdir "gamedata/$GAMEVER" |
| 63 | ``` |
| 64 | |
| 65 | If publication fails, report the exit code and diagnostics, then stop before commit. On success, verify that the |
| 66 | published SHA-256 equals the candidate SHA-256, run `git status --short`, report the snapshot and other tracked files |
| 67 | changed by both phases, and return control to the caller's commit step. |