fix(ship): log Step 20 metrics through gstack-review-log

Step 20 built ~/.gstack/projects/$SLUG/$BRANCH-reviews.jsonl by hand and
also carried a literal BRANCH token in the JSON payload. A slash branch
turned the redirect into a subdirectory write, or failed outright when
the directory did not exist.

gstack-review-log takes no path argument and already resolves the slug
and branch, creates the directory, validates the JSON, and enqueues for
gbrain sync. The BRANCH placeholder is replaced by a shell expansion.

Refs #1127
This commit is contained in:
Shaked Eyal 2026-08-06 18:29:45 +03:00
parent af9fe63b0c
commit 7d78033381
1 changed files with 12 additions and 9 deletions

View File

@ -464,16 +464,17 @@ git push -u origin <branch-name>
## Step 20: Persist ship metrics
Log coverage and plan completion data so `/retro` can track trends:
Log coverage and plan completion data so `/retro` can track trends.
Route the append through `gstack-review-log`. It resolves the project slug and
the canonical branch form itself, creates the directory, validates the JSON, and
enqueues the row for gbrain sync. It takes **no path argument** — never build a
`<branch>-reviews.jsonl` path by hand. A branch with a `/` in it turns a
hand-built path into a subdirectory write, and the row goes somewhere `/retro`
will never look.
```bash
eval "$(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)" && mkdir -p ~/.gstack/projects/$SLUG
```
Append to `~/.gstack/projects/$SLUG/$BRANCH-reviews.jsonl`:
```bash
echo '{"skill":"ship","timestamp":"'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'","coverage_pct":COVERAGE_PCT,"plan_items_total":PLAN_TOTAL,"plan_items_done":PLAN_DONE,"verification_result":"VERIFY_RESULT","version":"VERSION","branch":"BRANCH"}' >> ~/.gstack/projects/$SLUG/$BRANCH-reviews.jsonl
~/.claude/skills/gstack/bin/gstack-review-log '{"skill":"ship","timestamp":"'"$(date -u +%Y-%m-%dT%H:%M:%SZ)"'","coverage_pct":COVERAGE_PCT,"plan_items_total":PLAN_TOTAL,"plan_items_done":PLAN_DONE,"verification_result":"VERIFY_RESULT","version":"VERSION","branch":"'"$(git rev-parse --abbrev-ref HEAD)"'"}'
```
Substitute from earlier steps:
@ -482,7 +483,9 @@ Substitute from earlier steps:
- **PLAN_DONE**: count of DONE + CHANGED items from Step 8 (0 if no plan file)
- **VERIFY_RESULT**: "pass", "fail", or "skipped" from Step 8.1
- **VERSION**: from the VERSION file
- **BRANCH**: current branch name
The branch name is filled in by the shell — there is no `BRANCH` placeholder to
substitute.
This step is automatic — never skip it, never ask for confirmation.