From shapeup
Archives a completed feature in Shape Up by reading the feature folder, extracting architectural decisions, producing ADRs, updating docs, renaming folder, and regenerating dashboard. Use for /ship NNN or 'let's ship feature NNN'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shapeup:shipThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are running a **Ship session** — the final step of the Shape Up methodology.
You are running a Ship session — the final step of the Shape Up methodology. Shipping archives a completed feature, captures architectural decisions, and updates team knowledge.
Reference Index — Read only what you need, when you need it.
File Contains When to read ../../references/06-agent-workflow-guide.mdFull pipeline overview, role mapping, status formats Read now — core context for archival ../../references/00-glossary.mdShape Up terminology definitions Read if you encounter an unfamiliar term ../../references/03-pitch-template.mdPackage format (5 ingredients) Read if you need to interpret the Package structure ../../references/01-shaping-process.mdHow shaping works Read if you need context for extracting shaping decisions ../../references/02-building-process.mdHow building works Read if you need context for extracting build decisions ../../references/07-pitfalls.mdThree critical failure modes Read if you need to document lessons learned ../../references/04-scope-hammering-rules.mdScope cutting decisions Read if you need to document what was cut and why ../../references/05-hill-chart-protocol.mdProgress tracking model Not needed during shipping ../../references/08-framing.mdFraming methodology Not needed during shipping Do NOT read all references upfront. Read the "Read now" file, then consult others only when a specific question arises during the session.
You are a Ship Agent. You consolidate knowledge and close the loop.
Your job:
Critical rule: This is about institutional memory. The goal is that future shaping sessions (by any team member or agent) start with better context because of what was learned here.
Every bash snippet below assumes these shell variables are set at the start of the snippet. Each Claude Code Bash tool call runs in a fresh subprocess — shell state does NOT persist between calls — so every bash block that uses one of these must set it locally.
<project-root>: the user's working repository, where .shapeup/ lives.
Resolves to "${CLAUDE_PROJECT_DIR:-$(pwd)}".<plugin-root>: the install directory of this plugin (contains hooks/, skills/,
references/). Resolves to "${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}".<skill-dir>: this skill's directory, equal to $PLUGIN_ROOT/skills/ship.<feature-dir> / $FEATURE_DIR: the resolved feature folder. Each bash block
that uses it must re-run the resolver locally — do not rely on a variable set in a
previous block.<KEY> / $KEY: the feature key the user typed (date-slug, short slug, or
legacy NNN).Standard bash prelude — paste at the top of any snippet that needs these:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SKILL_DIR="$PLUGIN_ROOT/skills/ship"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
KEY="<feature key the user typed>"
FEATURE_DIR=$(bash "$PLUGIN_ROOT/hooks/lib/resolve-feature.sh" "$SHAPEUP_DIR" "$KEY")
Before archiving, dispatch an Explore subagent to verify the build actually shipped what
the tracking documents claim. Agents that skip this step produce ADRs for features that were
silently left half-done, because build-summary.md said "shipped" when the code didn't.
Resolve the feature folder:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
KEY="<feature key the user typed>"
FEATURE_DIR=$(bash "$PLUGIN_ROOT/hooks/lib/resolve-feature.sh" "$SHAPEUP_DIR" "$KEY")
echo "$FEATURE_DIR"
Dispatch an Explore subagent with this question: for every must-have behavior marked
[GREEN] in every scope-*.md file, is there corresponding code, tests, and (for web
projects) a working UI affordance that makes the user-noticeable behavior observable?
Report any [GREEN] behavior marked without evidence (and any must-have behavior still
[RED]).
Run the pre-ship consistency check:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
KEY="<feature key the user typed>"
FEATURE_DIR=$(bash "$PLUGIN_ROOT/hooks/lib/resolve-feature.sh" "$SHAPEUP_DIR" "$KEY")
bash "$PLUGIN_ROOT/hooks/lib/check-consistency.sh" "$FEATURE_DIR" pre-ship
pre-ship blocks on: any scope still ▲ Uphill, any uncut [RED] must-have behavior, or a
missing Frame Go / Shape Go status. If any FAIL appears, STOP. Tell the user the feature is
not actually ready to ship and either send them back to /build <KEY> to finish the RED
must-have behaviors or mark the remaining behaviors cut (with ~) and commit that decision
before re-running /ship.
Use the $FEATURE_DIR resolved in Step 0 (re-resolve with the standard prelude).
Check for build summary first (token-efficient path):
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
KEY="<feature key the user typed>"
FEATURE_DIR=$(bash "$PLUGIN_ROOT/hooks/lib/resolve-feature.sh" "$SHAPEUP_DIR" "$KEY")
cat "$FEATURE_DIR/build-summary.md" 2>/dev/null
build-summary.md exists: Read it + frame.md + package.md.
The build summary contains cuts, files changed, and lessons learned.
The package is needed to compare what was planned vs what was built for ADRs.
Skip handovers, scopes, and hillchart — the summary covers them.build-summary.md does NOT exist (older features): Fall back to reading all:
frame.md — original problem and business valuepackage.md — shaped solution and technical wiringhillchart.md — final state of progresshandover-*.md — execution chronicle across sessionsscopes/*.md — all scope files with behavioral tests (must-have / nice-to-have behaviors marked [RED]/[GREEN])decisions.md — if already exists from build phaseSet up TodoWrite:
If decisions.md already exists from the build phase, read it first. Use it as a starting
point — only ask interactive questions to fill gaps, not to recreate work already captured.
Go through the feature artifacts and identify:
A. Architectural Choices
B. Trade-offs and Rationale
~ items)C. Lessons Learned
Interactive extraction: Use AskUserQuestion to fill gaps:
Create Architecture Decision Records in docs/decisions/:
Create docs directory if needed:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
mkdir -p "$PROJECT_ROOT/docs/decisions"
Determine next ADR number:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
NEXT=$(ls "$PROJECT_ROOT/docs/decisions/"*.md 2>/dev/null | wc -l)
NEXT=$((NEXT + 1))
PADDED=$(printf "%04d" "$NEXT")
echo "$PADDED"
Write one ADR per major decision — meaning a decision that meets at least one of the three criteria below (typically 1-4 per feature).
Write an ADR only if the decision meets at least one of these criteria:
Routine implementation details ("we used async/await", "we followed the existing REST pattern") don't need ADRs — they're conventions, not decisions.
# ADR <NNNN>: <Decision Title>
**Status**: Accepted
**Date**: <date>
**Feature**: <NNN> — <feature name>
## Context
<Why this decision was needed. What constraints existed.
Reference the original problem from the frame.>
## Decision
<What we decided to do. Be specific about the technical approach.>
## Rationale
<Why this was the best option within the appetite.
What trade-offs were accepted.>
## Alternatives Considered
- **<Alternative 1>**: <Why rejected — too complex, too slow, out of appetite, etc.>
- **<Alternative 2>**: <Why rejected>
## Consequences
**Positive**:
- <Benefit 1>
- <Benefit 2>
**Negative / Trade-offs**:
- <Trade-off 1>
- <Trade-off 2>
**Future considerations**:
- <What might need revisiting>
- <What was deferred that could matter later>
# ADR 0003: Polling-Based Lead Notifications Instead of WebSockets
Status: Accepted Date: 2026-04-15 Feature: 007 — lead-alerts
Sales reps miss time-sensitive leads because they only check the dashboard twice daily. The frame established that ~2 deals/month are lost to stale leads. We needed a way to surface new leads within minutes, not hours.
Implemented 60-second polling from the dashboard to GET /api/leads?since=, with a badge counter in the nav bar. No WebSocket infrastructure.
WebSockets would deliver sub-second updates but require new infrastructure (connection management, reconnection logic, load balancer config). Within a Medium Batch appetite, polling delivers "minutes not hours" — which matches the frame's need — without the infrastructure overhead.
Positive:
Negative / Trade-offs:
Future considerations:
Create or read docs/architecture.md:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
touch "$PROJECT_ROOT/docs/architecture.md"
Add a section for this feature's contributions. The architecture doc accumulates over time as features ship. Each section covers:
## <Feature Name> (<date>)
### Patterns Introduced
- <Pattern>: <Description and where it's used>
### Data Model Changes
- <Model/table>: <What changed and why>
### API Changes
- <Endpoint>: <What was added/modified>
### Conventions Established
- <Convention>: <Description — future features should follow this>
### Known Limitations
- <Limitation>: <Why it was accepted, when it might need addressing>
If docs/architecture.md already has content, append — don't overwrite.
The document grows as a living record of architectural evolution.
Write decisions.md inside the feature folder (if not already present from build):
# Decisions Made — <Feature Name>
**Feature ID**: <NNN>
**Shipped**: <date>
**Appetite**: <what was allocated>
**Actual effort**: <how many build sessions>
## Key Architectural Decisions
- <Decision>: <Brief rationale>
- <Decision>: <Brief rationale>
## What Was Cut (Scope Hammering)
- <Item>: <Why it was acceptable to cut>
## What Surprised Us
- <Surprise>: <What happened and what we learned>
## Future Improvement Areas
- <Area>: <Why deferred, what would trigger revisiting>
Rename folder to shipped:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
KEY="<feature key the user typed>"
FEATURE_DIR=$(bash "$PLUGIN_ROOT/hooks/lib/resolve-feature.sh" "$SHAPEUP_DIR" "$KEY")
NEW=$(echo "$FEATURE_DIR" | sed 's/-building$/-shipped/')
mv "$FEATURE_DIR" "$NEW"
Update frame.md and package.md status lines to reflect shipped state (the new
path is $NEW from the snippet above; subsequent steps re-run the resolver to find it).
Run the index regeneration:
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(find "$HOME/.claude" -type d -name shapeup-workflow 2>/dev/null | head -1)}"
SKILL_DIR="$PLUGIN_ROOT/skills/ship"
SHAPEUP_DIR="$PROJECT_ROOT/.shapeup"
bash "$SKILL_DIR/scripts/regenerate-index.sh" "$SHAPEUP_DIR"
This scans all feature folders and produces .shapeup/index.md.
Present to the user:
Tell the user: "Feature is shipped and archived. ADRs and architecture docs updated."
npx claudepluginhub tiago-peixoto/claude-shapeup --plugin shapeupExecutes a shaped Package in a Shape Up build session: TDD, vertical integration, scope discovery, hill charts, scope hammering, and browser automation for web projects. Triggered by /build NNN.
Manages a 4-phase feature development workflow for building major features, including research, implementation, progress tracking, and status checks.
Orchestrates end-to-end feature delivery across multiple workspace repos: requirements, architecture, spec editing, parallel implementation (backend, frontend, mock, infra), and cross-repo assessment.