PR #523 follow-ups: /release transfer baseline, sync delete semantics, presubmit gate, README pointer nf-39so ← Beads

open priority 2 task unassigned

Twinned from https://github.com/cfsh/ninefold/issues/526 by tools/beads/import_github.py's reconcile pass.

Suggestions from ninefold-reviewer's review of #523 (/release: push a public release of main to R2). All were below the review gate's severity floor — #523 was CONVERGED, not blocked. Every item is in .claude/commands/release.md unless noted.

1. Step 4's transfer baseline disagrees with itself, and the extra file is the diagnostic. The prose names four files as routine ("the exe, the game .pck, Ninefold.dll, and manifest.json"), the bullet below says "~2 MB, 3 files — normal". export_presets.cfg has binary_format/embed_pck=false and include_filter="version.txt", so the stamp rides in the .pck and the exe is the unmodified export template — byte-stable across a code-only release and skipped by --checksum. The routine set is .pck + Ninefold.dll + manifest.json; an exe in the transfer is exactly the Godot-version / export-template change the *next* bullet teaches you to read. Pin the list against the rclone output of a real run. (The same slip is in #523's body and in this issue's parent report.)

2. Step 3 should say that rclone sync deletes remote files absent locally. The doc's risk line is "a killed sync leaves the remote half-updated"; tools/release/release.sh:12-15 has the sharper version — a sync pointed at the wrong prefix *deletes* remote files, i.e. a live outage on every itch download link. This is the doc's own point (it is the guard around an irreversible public push), so it does not need to wait on #522.

3. Step 2 names the pre-presubmit.py gate. It prescribes dotnet build Ninefold.sln + ./run_tests.sh; CLAUDE.md's "Validating changes" now names ./presubmit.py as the gate, and it also runs the python and shellcheck lanes — release.sh being itself a tracked script the shellcheck lane covers.

4. README.md:68-83 still documents the ritual independently. #523's stated motive was consolidating a procedure split between README and the script header; it landed a third home without a pointer either way. One line in README's Distribution section ("the ritual is /release") closes the loop.

5. Once #522 lands, name the .py. #522 leaves release.sh as an exec shim so Step 3 stays correct either way — but CLAUDE.md's f5 precedent is to tell people the .py and keep the .sh as compatibility. #523's own comment already proposed this as a follow-up.

Dependencies

None.

Comments

No comments.

Add a comment