Today a server rejection sends a bare STATUS_ERROR and the reason only
reaches the server log, so the client cannot say why a transfer was
refused. Add an optional, bounded server->client error-detail frame:
- Status gains STATUS_ERROR_DETAIL appended LAST so existing wire
values are unchanged.
- send_error_detail(fd, msg) sends STATUS_ERROR_DETAIL followed by the
existing length-prefixed string primitive, slicing over-long messages
to MAX_ERROR_DETAIL_BYTES (4096).
- receive_status() (and the timed/keepalive status readers) always
consume the detail body and map the status back to STATUS_ERROR,
capturing the text into a thread-local buffer exposed by
protocol_last_error(); a bare STATUS_ERROR leaves it cleared. Every
existing call site keeps working and the stream cannot desync.
- Upgrade the daemon module gate / config validation (config.c), the
final transfer failure (server.c) and receiver-side path/node
validation (file_receive.c) to send a concrete reason; surface it on
the client in client_send.c/config.c.
- Bump PROTOCOL_VERSION to 2.21.0 (CMake VERSION, CHANGELOG, docs) and
update the pinned config wire golden hash / CLI-version tests.
- Add tests/test_protocol_error.c covering mapping+capture, the
over-long bound, bare-error clearing, and thread-locality.
2.8 KiB
2.8 KiB
name, description
| name | description |
|---|---|
| release | Prepares a FastSync release — version bump, changelog, build verification, and git tagging. Use when the user says "prepare release", "bump version", "tag release", or wants to cut a new version. |
Release Skill
Prepares a new release of FastSync. This skill CAN edit files, commit, and tag.
Workflow
Step 1: Determine Version
Ask the user or determine from context:
- Major (X.0.0) — breaking protocol changes, incompatible CLI changes
- Minor (x.Y.0) — new features, backward compatible
- Patch (x.y.Z) — bug fixes, no protocol changes
Current version: PROTOCOL_VERSION "2.21.0" in src/shared/config.h
Step 2: Check Protocol Version
If the wire protocol changed, bump PROTOCOL_VERSION in src/shared/config.h:
#define PROTOCOL_VERSION "1.2.0" // or "2.0.0" for breaking
Protocol version changes require:
- Both client and server to be updated together
- Backward compatibility considerations documented
- Migration path clear
Step 3: Verify Build and Tests
rm -rf build
cmake -B build -S .
cmake --build build -j$(nproc)
./build/tests
python3 -m pytest tests/integration/ -n 4 --dist=load -m "not setpriv"
ALL tests must pass before release.
Step 4: Run Sanitizer Checks
# ASan
rm -rf build-asan
cmake -B build-asan -S . -DSANITIZER=address
cmake --build build-asan -j$(nproc)
./build-asan/tests
Step 5: Update README (If Needed)
Check if README needs updates:
- New features documented
- New CLI flags documented
- Benchmark results updated
- Build instructions current
Step 6: Create Release Commit
git add -A
git commit -m "Release vX.Y.Z
- <list of changes>
- Protocol version: X.Y.Z
- Tested: unit tests, integration tests, ASan"
Step 7: Tag the Release
git tag -a vX.Y.Z -m "Release vX.Y.Z"
Step 8: Push and Open dev → main PR
main is protected and only receives changes via dev → main PRs (see AGENTS.md). Never push directly to main.
# Push the release commit and tag to dev
git push origin dev
git push origin vX.Y.Z
# Open the dev → main release PR for review + CI
tea pr create --repo TapTap/FastSync --head dev --base main \
--title "Release vX.Y.Z" \
--description "Release vX.Y.Z"
Then wait for the full CI to pass and request review before the PR is merged to main.
Step 9: Report
=== RELEASE SUMMARY ===
Version: vX.Y.Z
Protocol: X.Y.Z
Commit: <hash>
Tag: vX.Y.Z
Changes:
- <list of changes in this release>
Build: PASS
Tests: PASS (<passed>/<total>)
ASan: CLEAN
Rules
- DO verify all tests pass before release
- DO run sanitizer checks before release
- DO update README if features changed
- DO tag releases with annotated tags
- DON'T release if tests fail
- DON'T skip sanitizer checks
- DON'T change code during release (only version bump + docs)