harness/harness/assets/claude/skills/box-up-role/SKILL.md
Package an Ansible role into a GitLab iteration with worktree, issues, and MR
npx skillsauth add tinyland-inc/ansible-dag-harness box-up-roleInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are packaging the Ansible role $ARGUMENTS for GitLab iteration management.
The dag-harness LangGraph engine handles the full workflow. The harness CLI is the
primary entry point; script-based fallback is available when the harness package is
not installed.
Run a version check to determine whether the harness CLI is available.
harness --version 2>/dev/null
If harness is available (exit 0): proceed to Step 2.
If harness is NOT available (exit non-zero): install it first:
pip install dag-harness
# or: uv tool install dag-harness
Before running the workflow, verify basic prerequisites.
# Verify role exists
ls -d ansible/roles/$ARGUMENTS/ || { echo "ERROR: Role '$ARGUMENTS' not found"; exit 1; }
# Verify glab authentication
glab auth status
# Check SSH tunnels for tunneled targets
npm run tunnels:status
You can also use the harness to check role status and dependencies:
harness status $ARGUMENTS
harness deps $ARGUMENTS --transitive
harness deps $ARGUMENTS --reverse
Execute the full box-up-role DAG workflow. The harness orchestrates all steps: analyze, validate dependencies, create worktree, run tests, commit, push, create issue, create MR, and request human approval.
harness box-up-role $ARGUMENTS
Dry run (show what would happen without making changes):
harness box-up-role $ARGUMENTS --dry-run
With breakpoints (pause before specific nodes for inspection):
harness box-up-role $ARGUMENTS --breakpoints "create_commit,push_branch"
The workflow produces structured output. Watch for these result statuses:
The workflow prints:
Issue URL: <url> -- the GitLab issue created for this roleMR URL: <url> -- the merge request with closing patternWorktree: <path> -- the isolated worktree pathRecord these URLs for the summary report.
When the workflow reaches the human_approval node, it pauses with an
interrupt() and prints:
Workflow paused at: human_approval
Resume with: harness resume <execution-id>
The execution ID is a numeric identifier. Note it for the next step.
If you used --breakpoints, the workflow pauses before the named node:
Workflow paused at: <node-name>
Resume with: harness resume <execution-id>
On failure, the workflow prints:
Workflow failed: <error-message>
Failed at node: <node-name>
Check the error, fix the issue, and re-run the workflow.
If the workflow paused at human_approval, review the current state and
ask the user whether to approve or reject.
Show current state:
harness status $ARGUMENTS
Approve and continue to merge train:
harness resume <execution-id> --approve
Reject with a reason:
harness resume <execution-id> --reject --reason "Tests need more coverage"
Resume from a breakpoint (no approval needed):
harness resume <execution-id>
You can also set additional breakpoints on resume:
harness resume <execution-id> --breakpoints "create_mr"
After the workflow completes (either directly or after resume), present the user with a formatted summary:
==========================================
BOX UP ROLE COMPLETE: $ARGUMENTS
==========================================
Worktree Path: ../sid-$ARGUMENTS
Branch: sid/$ARGUMENTS
Wave: <wave_number> (<wave_name>)
GitLab Issue: <issue_url>
Merge Request: <mr_url>
Iteration: <iteration_name>
Test Commands:
cd ../sid-$ARGUMENTS
npm run molecule:role --role=$ARGUMENTS
npm run deploy:<target> -- --tags <role-tags>
Next Steps:
1. Review MR in GitLab
2. Request code review
3. Merge when approved (auto-squash)
==========================================
| Command | Purpose |
|---------|---------|
| harness --version | Check harness availability |
| harness box-up-role <role> | Execute full DAG workflow |
| harness box-up-role <role> --dry-run | Show what would happen |
| harness box-up-role <role> --breakpoints <nodes> | Pause at specific nodes |
| harness resume <id> | Resume paused workflow |
| harness resume <id> --approve | Approve at human_approval node |
| harness resume <id> --reject --reason "..." | Reject with reason |
| harness status [role] | Show role/workflow status |
| harness deps <role> --transitive | Show dependency tree |
| harness deps <role> --reverse | Show reverse dependencies |
| harness list-roles --wave N | List roles by wave |
| harness sync --gitlab | Sync state from GitLab |
| harness graph | Show workflow DAG |
| harness check | Run self-checks |
The box-up-role graph executes these nodes in order:
interrupt() for human reviewVisualize the graph:
harness graph
harness graph --format mermaid
harness graph --format json
ERROR: Role '$ARGUMENTS' not found in ansible/roles/
Usage: /box-up-role <role-name>
ERROR: Cannot box up '$ARGUMENTS' yet.
The following roles depend on '$ARGUMENTS' and must be boxed up first.
ERROR: Molecule tests FAILED
Fix the failing tests before proceeding.
ERROR: GitLab API request failed.
Check: glab auth status, network connectivity, rate limits.
Resume failed: <error>
Check harness status $ARGUMENTS and the execution state in the database.
When the harness CLI is not installed, use the legacy script-based workflow.
This requires the scripts in the scripts/ directory.
python scripts/analyze-role-deps.py $ARGUMENTS --json
scripts/create-role-worktree.sh $ARGUMENTS
scripts/create-role-worktree.sh $ARGUMENTS --force
scripts/validate-role-tests.sh $ARGUMENTS
scripts/validate-role-tests.sh $ARGUMENTS --molecule-only
scripts/create-gitlab-issues.sh $ARGUMENTS
scripts/create-gitlab-mr.sh $ARGUMENTS --issue <issue_iid>
See .claude/skills/box-up-role/config.yml for:
Templates for issues and MRs are in .claude/skills/box-up-role/templates/.
development
Debug and monitor platform services, IIS, and application health
tools
Human-on-the-loop autonomous batch processing for Ansible roles
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------