openup-start-iteration

Begin a new OpenUP iteration with proper phase context and task selection

6 stars

Best use case

openup-start-iteration is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Begin a new OpenUP iteration with proper phase context and task selection

Teams using openup-start-iteration should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/openup-start-iteration/SKILL.md --create-dirs "https://raw.githubusercontent.com/GermanDZ/open-up-for-ai-agents/main/docs-eng-process/.claude-templates/skills/openup-start-iteration/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/openup-start-iteration/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How openup-start-iteration Compares

Feature / Agentopenup-start-iterationStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Begin a new OpenUP iteration with proper phase context and task selection

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Start Iteration

Initialize a new OpenUP iteration: read project state, create a task branch, and begin work.

## Success Criteria

After this skill completes, ALL of these must be true:

- [ ] **BLOCKING (full track only, when a team is requested)**: If the `full` track (or an explicit `team:` / `deploy_team: true`) calls for a team, it is deployed and coordinating before implementation begins. `quick` and `standard` default to solo sequential work — no team required.
- [ ] Project status is updated with new iteration
- [ ] **BLOCKING**: `git rev-parse --abbrev-ref HEAD` returns a non-trunk branch name. If it returns trunk, the skill has FAILED — do not proceed.
- [ ] Iteration goal is defined
- [ ] Answered input requests are processed
- [ ] Log entry is created
- [ ] `.openup/state.json` created

## Process

### 1. Read Project Status

Read `docs/project-status.md` to establish context:
- Current phase (inception | elaboration | construction | transition)
- Current iteration number
- Previous iteration status

### 2. Read Roadmap and Identify Task

Read `docs/roadmap.md` to:
- Find the task specified by `$ARGUMENTS[task_id]`
- Extract task details: title, description, task type (feature, bugfix, refactor, etc.)
- Determine priority, dependencies, and the `Value` rationale (if present)
- **If task_id not found**: Ask user to specify which task from the roadmap

**The roadmap's pending order is product-manager input — consume it as given.**
If the requested task sits below other READY pending entries, that is fine (the
human chose it), but do not yourself substitute a "more valuable" task or
re-order entries here: an item may be passed over only for mechanical reasons
(unmet dependency, collision, lease, missing spec). If the ordering looks wrong,
surface that to the product-manager role (`.claude/teammates/product-manager.md`)
— never re-prioritize from inside an execution skill.

### 3. Select Track

Choose the ceremony track that matches the task's scope. Use `$ARGUMENTS[track]` if
provided; otherwise auto-select from the task description / `docs/changes/{task_id}/plan.md`
scope using this decision table:

| Track | When | Ceremony applied |
|---|---|---|
| `quick` | docs / config / typo / comment / ≤ ~50 LOC, single file | state file + auto-log only — **no plan gate, no team, no readiness** |
| `standard` | single-feature work | plan gate + scribe logging + `/openup-readiness` check; team optional |
| `full` | multi-role / architectural / cross-cutting | standard **+ team deployment + rubric assessment** at complete-task |

The intake hook (`on-task-request.py`) prints a `Suggested track: …` line — treat it as the
default unless the actual scope differs. The selected track drives two things below: the
**Deploy-Team** step (step 4) and the `--track` flag passed to `openup-state.py init`
(step 6). See [tracks.md](../../../../docs-eng-process/tracks.md) for the full wiring.

### 3b. Check Retro Cadence (T-011)

The retrospective cadence is enforced by a durable counter, not a convention. Read it:

```bash
python3 scripts/openup-state.py retro get   # N = completed tasks since the last retrospective
```

**If `N >= 5` AND the selected track is `full`: REFUSE to start.** Do not create a branch
or deploy a team. Print the redirect and stop:

> ⛔ Retrospective overdue — N iterations since the last one. Run `/openup-retrospective`
> before starting `full`-track work (it resets the cadence). Or, if this work is genuinely
> lighter, re-run with `track: standard`.

**If `N >= 5` and the track is `quick`/`standard`:** proceed, but surface a **non-blocking**
reminder in your summary: "Heads-up: retrospective overdue (N since last) — consider running
`/openup-retrospective` soon." The hard gate intentionally targets only the heavy track
(WS6b); see [design.md](../../../../docs/changes/T-011/design.md) DD2.

(`gates.retro_due` is set to `N >= 5` by `retro check` in step 6 below — this step is the
human-facing decision; step 6 records the gate.)

### 4. Deploy Team — OPT-IN (default-on for `full` only)

**The default is solo, sequential work — one agent assumes roles as needed (analyst →
developer → tester) and persists progress to the repo between steps.** A team is deployed
only when the track or an explicit argument calls for it; you do not need a team to start.

Track determines the team default:
- **`quick`** ⇒ **no team** (proceed straight to step 5).
- **`standard`** ⇒ **no team by default** — work solo and sequentially. Deploy a team only
  if `$ARGUMENTS[team]` is set or `$ARGUMENTS[deploy_team]` is `"true"` (e.g. you want
  parallel specialists or independent review).
- **`full`** ⇒ **team default-on** — deploy the phase default unless `$ARGUMENTS[deploy_team]`
  is `"false"` or `$ARGUMENTS[team]` is `none`.

The explicit `$ARGUMENTS[deploy_team]` / `$ARGUMENTS[team]` args override the track default.
When a team IS deployed:

1. **Auto-select team type** if `$ARGUMENTS[team]` is not specified:
   - Check task description for keywords:
     - "investigate", "research", "spike" → `openup-investigation-team`
     - "plan", "roadmap", "prioritize" → `openup-planning-team`
   - Otherwise fall back to phase default:
     - `inception` → `openup-inception-team` (analyst + project-manager)
     - `elaboration` → `openup-elaboration-team` (architect + developer)
     - `construction` → `openup-construction-team` (developer + tester) ← most common
     - `transition` → `openup-transition-team` (developer + tester + project-manager)

2. **Team type override**: if `$ARGUMENTS[team]` is provided, use it directly:
   - **feature**: analyst, architect, developer, tester
   - **investigation**: architect, developer, tester
   - **construction**: developer, tester
   - **elaboration**: architect, developer, tester
   - **inception**: analyst, project-manager
   - **transition**: tester, project-manager, developer
   - **planning**: project-manager, analyst
   - **full**: all roles
   - **none**: skip team deployment (same as `deploy_team: false`)

3. Deploy the team using the Agent tool — spawn each role with:
   - Iteration goal and task ID
   - Current phase and phase objectives
   - Relevant project docs (project-status.md, roadmap.md)
   - The PM's orchestrator role: decompose the task, brief each specialist, collect and synthesize outputs

4. **PM takes the lead**: after spawning, the project-manager agent coordinates all subsequent work for this iteration. Specialists (developer, architect, tester, analyst) receive focused subtasks from the PM.

5. **Record the team gate** — once the team is up, flip the gate in iteration state (created in step 6 below; if the branch/state does not exist yet, do this right after step 6):

   ```bash
   python3 scripts/openup-state.py set-gate team_deployed true
   ```

### 5. Create Task Branch (+ Worktree, default-on)

**Worktree-per-task is the default** (T-009 design D6): each iteration gets an isolated
sibling worktree so parallel sessions never share a working tree. Pass `worktree: false`
to use a legacy in-place checkout (e.g. when a sibling path is impractical, or for a task
— like T-009 itself — that bootstraps the worktree feature).

```bash
# 1. Detect trunk
TRUNK=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
[ -z "$TRUNK" ] && TRUNK="main"
git rev-parse --verify "$TRUNK" 2>/dev/null || TRUNK="master"
REPO=$(basename "$(git rev-parse --show-toplevel)")
BRANCH={type}/{task_id}-{short-description}

# 2. Refresh trunk
git checkout "$TRUNK" && git pull origin "$TRUNK" 2>/dev/null || true

# 3a. DEFAULT (worktree-on): isolated worktree on a new branch (worktree FIRST — D6)
git worktree add "../${REPO}-{task_id}" -b "$BRANCH" "$TRUNK"
#    → continue all subsequent work inside ../${REPO}-{task_id}

# 3b. OPT-OUT (worktree: false): in-place branch
git checkout -b "$BRANCH"

# 4. VERIFY — this must NOT return trunk
git rev-parse --abbrev-ref HEAD
```

**If the branch already exists**, check its status:
- No unmerged commits → delete and recreate from trunk
- Has unmerged commits → create PR or merge first, then create new branch

### 6. Initialize Iteration State

Write the machine-readable iteration state file. This is what hooks read to enforce process gates (see [state-file.md](../../../../docs-eng-process/state-file.md)). Fill in the iteration's actual values — pass the **track selected in step 3** to `--track`:

```bash
python3 scripts/openup-state.py init \
  --task-id "{task_id}" \
  --iteration {iteration_number} \
  --phase {inception|elaboration|construction|transition} \
  --track {selected track: quick|standard|full} \
  --branch "$(git rev-parse --abbrev-ref HEAD)" \
  --worktree "$(git rev-parse --show-toplevel)" \
  --iterations-since-retro "$(python3 scripts/openup-state.py retro get)" \
  [--plan docs/plans/{plan}.md]    # standard/full only; the quick track has no plan gate
```

The `--iterations-since-retro` flag **seeds the new state's mirror from the durable
counter** (`.openup/retro.json`), carrying the cadence forward across the iteration that
`/openup-complete-task` archived. Then record `gates.retro_due` from the threshold:

```bash
python3 scripts/openup-state.py retro check   # sets gates.retro_due = (count >= 5)
```

If the team was already deployed in step 4, also run `python3 scripts/openup-state.py set-gate team_deployed true` now.

### 6b. Pre-flight + write the worktree claim

Live lease claims coordinate parallel sessions (one file per claim under
`<git-common-dir>/openup/claims/`, never committed). See
[parallel-work.md](../../../../docs-eng-process/parallel-work.md). The claim's collision
surface (`touches`) and `depends-on` come from the task's `docs/changes/{task_id}/plan.md`
frontmatter, so persist the plan **before** claiming.

```bash
# 1. PRE-FLIGHT (read-only): refuse early on an unmet dependency or a touches collision
#    with a live claim. Exit 3 = unmet dep; exit 4 = collision (owner named); 0 = clear.
python3 scripts/openup-claims.py preflight --task-id {task_id} || {
  echo "Pre-flight refused — do NOT proceed. Resolve the dependency/collision above."; exit 1; }

# 2. WRITE THE CLAIM (worktree already created in step 5 — worktree-first, claim-second; D6).
#    On failure AFTER the worktree exists, roll back: git worktree remove "../${REPO}-{task_id}"
python3 scripts/openup-claims.py claim \
  --task-id {task_id} \
  --session-id "$(python3 scripts/openup-state.py get session_id 2>/dev/null || echo "$BRANCH")" \
  --branch "$(git rev-parse --abbrev-ref HEAD)" \
  --worktree "$(git rev-parse --show-toplevel)"
```

Claims **never expire** — an abandoned claim blocks its surface until a human removes the
file (`rm <git-common-dir>/openup/claims/{task_id}.json`); there is no TTL and no `--steal`.
`/openup-complete-task` releases the claim and removes the worktree.

### 7. Check for Answered Input Requests

Check `docs/input-requests/` for files with `status: answered`. Process any answered requests before continuing.

### 8. Initialize Iteration

> **Scribe step** — delegate to the `openup-scribe` agent (Agent tool,
> subagent_type: "openup-scribe"). You determine the values (iteration number,
> goal, task_id); the scribe only writes. Brief it with:
>
> ```
> Agent(subagent_type="openup-scribe", description="Initialize project-status for new iteration",
>   prompt="In docs/project-status.md update these fields:
>   - **Iteration**: [new number]
>   - **Iteration Goal**: [goal text]
>   - **Status**: in-progress
>   - **Current Task**: [task_id]
>   - **Iteration Started**: [YYYY-MM-DD]
>   - **Last Updated**: [YYYY-MM-DD]
>   - **Updated By**: openup-start-iteration
>   Report: each field changed from → to.")
> ```

### 9. Log Initialization

> **Scribe step** — delegate to the `openup-scribe` agent (Agent tool,
> subagent_type: "openup-scribe"). You determine the values; the scribe only
> writes. Brief it with:
>
> ```
> Agent(subagent_type="openup-scribe", description="Log iteration start",
>   prompt="Append a JSONL record to docs/agent-logs/agent-runs.jsonl:
>   {\"run_id\":\"[id]\",\"event\":\"iteration_start\",\"task_id\":\"[task_id]\",
>    \"goal\":\"[goal]\",\"branch\":\"[branch]\",\"phase\":\"[phase]\",\"ts\":\"[ts]\"}
>   Report: record appended.")
> ```

## Output

Returns a summary of:
- Current phase and iteration number
- Task being worked on (task_id, title)
- Iteration goal
- Active branch name (must be a non-trunk task branch)

## See Also

- [openup-next](../next/SKILL.md) - The sequential continue-loop; picks the top board lane and delegates here to claim + init it
- [openup-complete-task](../complete-task/SKILL.md) - Complete iteration tasks
- [openup-create-iteration-plan](../../openup-artifacts/create-iteration-plan/SKILL.md) - Plan iteration before starting

Related Skills

openup-transition

6
from GermanDZ/open-up-for-ai-agents

Initialize and manage Transition phase activities - deploy to users

openup-tdd-workflow

6
from GermanDZ/open-up-for-ai-agents

Guide Test-Driven Development cycle adapted for AI agents with a pragmatic approach

openup-sync-spec

6
from GermanDZ/open-up-for-ai-agents

Back-propagate pure refactors to stale artifacts; classify the diff, refuse behaviour-changes, propose targeted edits for approval (read-only by default)

openup-shared-vision

6
from GermanDZ/open-up-for-ai-agents

Create shared technical vision for team alignment

openup-retrospective

6
from GermanDZ/open-up-for-ai-agents

Generate iteration retrospective with feedback and action items

openup-request-input

6
from GermanDZ/open-up-for-ai-agents

Create an input request document for asynchronous stakeholder communication

openup-readiness

6
from GermanDZ/open-up-for-ai-agents

Compute the change-folder dependency DAG and print READY/BLOCKED/collision report for PM intake

openup-quick-task

6
from GermanDZ/open-up-for-ai-agents

Fast iteration mode for small changes - simplified workflow with minimal overhead

openup-plan-feature

6
from GermanDZ/open-up-for-ai-agents

Generate iteration plan and roadmap entry for a feature idea

openup-phase-review

6
from GermanDZ/open-up-for-ai-agents

Check phase completion criteria and prepare for phase review

openup-orchestrate

6
from GermanDZ/open-up-for-ai-agents

Run a full orchestrated iteration — PM decomposes the goal, delegates to specialist roles, collects outputs, and synthesizes results

openup-next

6
from GermanDZ/open-up-for-ai-agents

Run ONE OpenUP delivery cycle — read the derived board, claim the top READY lane, execute it, tick its progress, and exit through a legal exit. The sequential continue-loop.