Persistent worktrees (server, client, copy, audio, visual, ci, planning,
maintenance) caused agents crossing boundaries, stuck agents leaving
uncommitted work, and index.lock collisions. Replaced with ephemeral
sprint branches (sprint-{N}/{team}) and worktrees created on demand.
Changes:
- New start-sprint script replaces start-session (dynamic tabs per active team)
- Sprint teardown integrated into sprint-start skill (A1c step)
- SR_DB_PATH env var for database access from any directory
- CLAUDE.md team boundaries rewritten (scope-based, not directory-based)
- Agent Rule 0 updated to team scope dirs instead of worktree isolation
- PR review uses git show instead of cross-directory reads
- Briefing template updated for sprint-{N}/{team} branch naming
- Deleted worktree-update skill (obsolete)
- Removed WORKTREE_TEAM env var and cross-directory Read permissions
- All 8 persistent worktrees removed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.0 KiB
3.0 KiB
DevOps
Build, test, lint, and CI procedures for {Project Name}.
Quick Start
make setup # Initialize dev environment
make # Show all available targets
Database
The project uses SQLite for ticketing and decision tracking.
Initialize
tooling/db/sqlite-init
Query
tooling/db/sqlite-query "SELECT * FROM tickets WHERE status='in_progress'"
tooling/db/sqlite-exec "UPDATE tickets SET status='done' WHERE id=1"
Never use the sqlite3 CLI — it crashes in Claude Code (std::bad_alloc). Use the wrapper scripts.
Ticket CLI
tooling/db/ticket list [--status S] [--sprint N] [--team T]
tooling/db/ticket show <id>
tooling/db/ticket create --title "Title" --team T --priority P
tooling/db/ticket assign <id> --agent name
Sprint CLI
tooling/db/sprint status # Current sprint progress
tooling/db/sprint status --team T # Team-scoped view
tooling/db/sprint start-work [--team T] # Full context dump for starting work
tooling/db/sprint prepare # Prepare next sprint
tooling/db/sprint start # Activate a planned sprint
tooling/db/sprint stop # Complete an active sprint
Decision Tracking
Decisions live in decisions/*.md domain files and sync to SQLite:
make decisions-sync # Parse decisions/*.md into SQLite
make decisions-coverage # Decision-to-ticket coverage report
make decisions-active # List all active confirmed decisions
make decisions-orphan # Decisions without associated tickets
Document Search (optional)
If Qdrant + Ollama are configured for semantic search:
tooling/db/qdrant-health # Check service status
tooling/db/qdrant-search "query text" # Semantic search
tooling/db/qdrant-index path/to/doc.md # Index a document
tooling/db/qdrant-count # Collection stats
Git Hooks
Install hooks:
make setup-hooks
Hook directory: .config/hooks/
The pre-commit hook runs project-specific validation checks. Add new checks by editing .config/hooks/pre-commit and adding run_check calls.
Pre-PR Checklist
make pre-pr
This runs:
- Decision sync (ensures SQLite index is current)
- {Add project-specific checks as needed}
Sprint Branch Workflow
Teams work on ephemeral sprint branches (sprint-{N}/{team}). The start-sprint
script creates worktrees under .sprint/ for parallel team work:
{parent}/
main/ # Permanent — integration branch
.sprint/sprint-{N}/{team}/ # Ephemeral — created per sprint, deleted after close
{db_name} # Shared ticketing database
Branch management
# Start sprint session (creates worktrees + terminal tabs)
./start-sprint [sprint-number]
# Clean up after sprint close
.claude/skills/sprint-start/scripts/sprint-teardown.sh {N}
Protected branches (never delete): main.