From 7d78033381ccb1aed22be07fee1dc6a498d4603f Mon Sep 17 00:00:00 2001 From: Shaked Eyal Date: Thu, 6 Aug 2026 18:29:45 +0300 Subject: [PATCH] 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 --- ship/SKILL.md.tmpl | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl index 068ac4fe5..0267accea 100644 --- a/ship/SKILL.md.tmpl +++ b/ship/SKILL.md.tmpl @@ -464,16 +464,17 @@ git push -u origin ## 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 +`-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.