Skip to content

feat(ship): project-local /ship adaptation — checklist + runbook (closes #155)#159

Merged
dep0we merged 4 commits into
mainfrom
fix/ship-adaptation-155
May 13, 2026
Merged

feat(ship): project-local /ship adaptation — checklist + runbook (closes #155)#159
dep0we merged 4 commits into
mainfrom
fix/ship-adaptation-155

Conversation

@dep0we
Copy link
Copy Markdown
Owner

@dep0we dep0we commented May 13, 2026

Summary

Closes #155. Project-local /ship adaptation so the skill runs end-to-end on this project's tag+CHANGELOG release model. Three commits:

  1. feat(ship): project-local review checklist + release runbook (ed6c3d3) — adds the two new files that resolve the issue's first and third acceptance bullets:

    • .claude/skills/review/checklist.md — atomic-agents-shaped Pre-Landing Review checklist drawn from CLAUDE.md §"Design principles". Two-pass severity, confidence calibration matching gstack format, honest about semantic-vs-mechanical categories.
    • docs/deployment/release-runbook.md — two-mode workflow (PR-level update vs. release cut), prerequisite gstack patch + reapply procedure, anticipated Step 9.1 specialist false-positives, Codex-rate-limited reviewer-roster fallback, and the load-bearing Operator Manual Surface Check Before Merge section covering what /document-release misses (PR v0.13.0 release: LLMBackend protocol + arc closure + methodology drift recovery #157's 21 doc-sync gaps incident cited as the historical why).
  2. chore(changelog): note project-local /ship adaptation under [Unreleased] (d9abf30) — per docs/deployment/versioning.md "Per-PR expectations" — every PR adds its own bullet under [Unreleased].

  3. docs: link new release-runbook from README + CLAUDE.md (cba7ad6) — /document-release subagent dispatch in Step 18 caught two real doc-sync gaps: README's "six operator runbooks" claim (would have gone stale) and CLAUDE.md "Where things live" table (missing the new runbook row). Auto-fixed inline.

Paired local gstack patch (NOT in this PR)

A separate, local-only patch lives on the fix/ship-no-version-fallback branch in ~/.claude/skills/gstack/:

  • Step 9 falls back to a built-in default checklist when .claude/skills/review/checklist.md is missing (warn-and-continue rather than STOP).
  • Step 12 adds a NO_VERSION_FILE probe + dispatch (PR-level update vs. release cut) for projects without a VERSION file. Uses an awk state machine to extract CHANGELOG_VERSION while skipping fenced code-block examples (caught by Opus adversarial review — grep -m1 was picking up 0.2.0 from a ### BREAKING example).
  • Step 13 CHANGELOG resolver branches on SHIP_MODE (PR-level validates [Unreleased] has bullets and stops on empty; release-cut promotes [Unreleased] to a dated header).
  • Step 19 PR-title rule is mode-gated (PR-level mode keeps Conventional Commit prefixes; release-cut mode keeps the v<NEW_VERSION> mandate). This PR title is the first dogfood of PR-level mode.
  • Important Rules section updated to match.

The runbook in this PR documents the reapply procedure after gstack-upgrade. The patch is filed for upstream consideration as a separate design-discussion issue at garrytan/gstack, not blocking this PR.

Test Coverage

No new application code paths. uv run pytest shows 928 passed in 40.50s — unchanged from main. Coverage audit (Step 7) skipped per workflow rule for docs-only diffs.

Pre-Landing Review

Two rounds of Opus adversarial review per docs/methodology.md §"Reviewer roster" (Codex rate-limited):

  • Round 1 (on the plan) caught 3 P1 findings: (a) PR ordering invariant violation, (b) invented sidecar integration for /document-release, (c) wrong gstack patch target. All resolved in the revised plan.
  • Round 2 (on the implementation) caught 3 more P1 findings: (a) CHANGELOG regex picking up version from fenced code-block example, (b) Step 13 CHANGELOG resolver had zero NO_VERSION_FILE awareness, (c) Step 19 forcing nonsensical v<X.Y.Z> PR title prefix in PR-level mode. All resolved on the gstack feature branch in additional commits (791f04b fix(ship): address Opus adversarial-review findings).
  • Plus 5 P2 findings folded into the implementation (no-CHANGELOG STOP, Important-Rules contradiction fix, PR v0.13.0 release: LLMBackend protocol + arc closure + methodology drift recovery #157 citation, /document-release coverage clarification, specialist-pattern reframe as speculative).

Step 9 of /ship itself re-applied the now-landed project-local checklist against this diff: Pre-Landing Review: No issues found (the diff is pure markdown docs/config; load-bearing categories all N/A for this PR's surface).

Documentation

Doc-sync sweep alongside this PR's new artifacts:

  • README.md — added docs/deployment/release-runbook.md to the Deployment shapes list (now seven operator runbooks, not six).
  • CLAUDE.md — added a docs/deployment/release-runbook.md row to the §"Where things live" table so the new runbook is one-hop reachable from the canonical entry-point doc.

Verified surfaces that did NOT need updates (per the runbook's own operator manual surface check):

  • atomic_agents/__init__.py __version__ still 0.13.0; __all__ unchanged (no new public symbols this PR).
  • pyproject.toml version still 0.13.0; matches CHANGELOG's latest dated header.
  • README's What's shipped table + version badge + §Status — no change.
  • CLAUDE.md §Architecture-in-one-breath + §Status — no change.
  • Test count claims (928) and spec count claims (22 locked + 3 RFCs) — actual repo state still matches.

Acceptance criteria (issue #155)

  • /ship runs end-to-end on this project with no hard-failure step — confirmed by this PR's invocation.
  • docs/deployment/versioning.md is the source of truth for the project's versioning (no VERSION file) — runbook cross-links to it; no VERSION file added.
  • Project-local review checklist OR /ship fallback when no checklist is present — both delivered (project-local file in this PR + built-in fallback on the gstack branch).
  • /document-release equivalent for this project (or document the manual sync responsibility in the release runbook) — runbook's "Operator Manual Surface Check Before Merge" section covers the surfaces the subagent misses, with a per-surface checklist.

Follow-ups (filed inline, tracked, not blocking)

  • File a design-discussion issue at garrytan/gstack proposing platform-agnostic versioning (no-VERSION-file mode) per their own "Platform-agnostic design" ethos. Local gstack branch is reference. (Tracking in this repo as a follow-up; will file after this PR lands so the runbook can link to the upstream issue.)

Test plan

  • uv run pytest — 928 passed, 0 failed (Step 5)
  • /ship Step 12 NO_VERSION_FILE probe returns CHANGELOG_VERSION: 0.13.0 (not 0.2.0 from the fenced code-block example — awk fix working)
  • /ship Step 13 PR-level mode validates [Unreleased] has 2 lines of content; does not promote header
  • /ship Step 19 PR-level mode does NOT prefix title with v0.13.0 (this PR title is the proof)
  • gstack bun test test/skill-validation.test.ts test/gen-skill-docs.test.ts — 707 passed, 0 failed (after each gstack edit)

🤖 Generated with Claude Code

Dan Powers and others added 3 commits May 13, 2026 11:50
Implements issue #155 — project-local /ship adaptation. Two new files:

- .claude/skills/review/checklist.md — atomic-agents-shaped Pre-Landing
  Review checklist drawn from CLAUDE.md §"Design principles". Two-pass
  severity (CRITICAL: Backend Protocol Invariants, Cost Gate Placement,
  Audit Trail Shape, Atomic Write Discipline, LLM Output Trust Boundary,
  Schema/API Break Detection; INFORMATIONAL: Spec/Impl Drift, Public
  Surface Hygiene, Markdown-Config Aesthetic, Progressive Disclosure,
  Deprecation Shim Freshness, Test Conformance, CHANGELOG Hygiene,
  Documentation Match-to-Reality, One-Level Constraints, Concurrency,
  LLM Prompt Issues). Severity + confidence calibration matches gstack
  format. Honest about semantic-not-mechanical categories (tune
  confidence to 5-7 unless verified by reading source).

- docs/deployment/release-runbook.md — release runbook documenting the
  two-mode /ship workflow (PR-level update vs. release cut), the
  prerequisite local gstack /ship template patch + reapply procedure
  after gstack-upgrade, Step 9.1 anticipated specialist false-positive
  patterns, Codex-rate-limited reviewer roster fallbacks, and the
  load-bearing Operator Manual Surface Check Before Merge section
  covering what /document-release misses on this project (PR #157's
  21 doc-sync gaps incident cited verbatim as the historical why).

Pairs with the local-only gstack template patch on the
fix/ship-no-version-fallback branch in ~/.claude/skills/gstack/ that
adds Step 9 missing-checklist fallback + Step 12 NO_VERSION_FILE mode
+ Step 13 mode dispatch + Step 19 mode-aware PR title prefix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per docs/deployment/versioning.md "Per-PR expectations" — every PR adds
its own bullet under [Unreleased]. Bullet describes the project-local
review checklist + release runbook landed in the previous commit, plus
the paired local gstack template patch (NO_VERSION_FILE mode + missing-
checklist fallback) living on the fix/ship-no-version-fallback branch
in ~/.claude/skills/gstack/.

Closes #155.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds discoverability for `docs/deployment/release-runbook.md` (new in this
PR) — README's Deployment shapes list now includes it as the seventh
operator runbook, and CLAUDE.md's "Where things live" table gets a
row pointing at it. The bundled `/document-release` discoverability rule
caught the gap: every doc file should be reachable from README or
CLAUDE.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
CI's uv sync was missing --extra openai, so the OpenAI-compatible +
Moonshot backend tests added in v0.13.0 fail with `openai SDK not
installed; required for 'openai' backend`. 26 failures + 46 errors per
matrix entry; main has been red since the v0.13.0 backend commits
landed (e.g., eff6825 feat(llm): OpenAI + Moonshot backends; PR #157
v0.13.0 release merged red).

Local uv run pytest passes because dev .venv has openai installed.
CI's pip install -e . does not pull the extra. Fix is one line:
add --extra openai to the workflow's uv sync invocation.

Surfaced by /ship Step 17/19 on PR #159 (this PR). Per
feedback_always_ship.md, "Pre-existing without receipts is a lazy
claim" — receipts: PR #157 + last 3 commits on main all show pytest
FAILURE on both 3.11 and 3.12; first failure traces to the OpenAI
backend additions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@dep0we dep0we merged commit 6c12811 into main May 13, 2026
2 checks passed
@dep0we dep0we deleted the fix/ship-adaptation-155 branch May 13, 2026 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[tooling] /ship workflow adaptation gaps for atomic-agents — checklist + 4-digit VERSION + gstack bin/ deps

1 participant