{ "name": "MotoVaultPro Solo Sprint Workflow", "version": "1.0", "principles": [ "Issues are the source of truth.", "One status label per issue.", "Work is timeboxed into 14-day sprints using milestones.", "Every PR must link to at least one issue and satisfy its acceptance criteria." ], "sprints": { "length_days": 14, "milestone_naming": "Sprint YYYY-MM-DD (start date)", "default_start_day": "Monday", "calendar_reference": ".gitea/SPRINTS.md", "process": [ "If a milestone for the current sprint does not exist, create it.", "Assign selected issues to the current sprint milestone." ] }, "labels": { "status_prefix": "status/", "status_values": [ "status/backlog", "status/ready", "status/in-progress", "status/review", "status/blocked", "status/done" ], "type_prefix": "type/", "type_values": [ "type/feature", "type/bug", "type/chore", "type/docs" ], "rules": [ "Exactly one status/* label must be present on open issues.", "Exactly one type/* label must be present on issues.", "When moving status, remove the previous status/* label first." ] }, "sub_issues": { "when": "Multi-file features (3+ files) or features that benefit from smaller AI context windows.", "parent_issue": "The original feature issue. Tracks overall status. Only the parent gets status label transitions.", "sub_issue_title_format": "{type}: {summary} (#{parent_index})", "sub_issue_body": "First line must be 'Relates to #{parent_index}'. Each sub-issue is a self-contained unit of work.", "sub_issue_labels": "status/backlog + same type/* as parent. Sub-issues stay in backlog; parent issue tracks status.", "sub_issue_milestone": "Same sprint milestone as parent.", "rules": [ "ONE branch for the parent issue. Never create branches per sub-issue.", "ONE PR for the parent issue. The PR closes the parent and all sub-issues.", "Commits reference the specific sub-issue index they implement.", "Sub-issues should be small enough to fit in a single AI context window.", "Plan milestones map 1:1 to sub-issues." ], "examples": { "parent": "#105 'feat: Add Grafana dashboards and alerting'", "sub_issues": [ "#106 'feat: Grafana dashboard provisioning infrastructure (#105)'", "#107 'feat: Application Overview Grafana dashboard (#105)'" ] } }, "branching": { "branch_format": "issue-{parent_index}-{slug}", "target_branch": "main", "note": "Always use the parent issue index. When sub-issues exist, the branch is for the parent.", "examples": [ "issue-42-add-fuel-efficiency-report (standalone issue)", "issue-105-add-grafana-dashboards (parent issue with sub-issues #106-#111)" ] }, "commit_conventions": { "message_format": "{type}: {short summary} (refs #{index})", "allowed_types": ["feat", "fix", "chore", "docs", "refactor", "test"], "note": "When working on a sub-issue, {index} is the sub-issue number. For standalone issues, {index} is the issue number.", "examples": [ "feat: add fuel efficiency calculation (refs #42)", "fix: correct VIN validation for pre-1981 vehicles (refs #1)", "feat: add dashboard provisioning infrastructure (refs #106)", "feat: add API performance dashboard (refs #108)" ] }, "pull_requests": { "title_format": "{type}: {summary} (#{parent_index})", "note": "PR title always uses the parent issue index.", "body_requirements": [ "Link parent issue using 'Fixes #{parent_index}'.", "Link all sub-issues using 'Fixes #{sub_index}' on separate lines.", "Include test plan and results.", "Confirm acceptance criteria completion." ], "body_example": "Fixes #105\nFixes #106\nFixes #107\nFixes #108\nFixes #109\nFixes #110\nFixes #111", "merge_policy": "squash_or_rebase_ok", "template_location": ".gitea/PULL_REQUEST_TEMPLATE.md" }, "execution_loop": [ "List repo issues in current sprint milestone with status/ready; if none, pull from status/backlog and promote the best candidate to status/ready.", "Select one issue (prefer smallest size and highest priority).", "Move parent issue to status/in-progress.", "[SKILL] Codebase Analysis if unfamiliar area.", "[SKILL] Problem Analysis if complex problem.", "[SKILL] Decision Critic if uncertain approach.", "If multi-file feature (3+ files): decompose into sub-issues per sub_issues rules. Each sub-issue = one plan milestone.", "[SKILL] Planner writes plan as parent issue comment. Plan milestones map 1:1 to sub-issues.", "[SKILL] Plan review cycle: QR plan-completeness -> TW plan-scrub -> QR plan-code -> QR plan-docs.", "Create ONE branch issue-{parent_index}-{slug} from main.", "[SKILL] Planner executes plan, delegates to Developer per milestone/sub-issue.", "[SKILL] QR post-implementation per milestone (results in parent issue comment).", "Open ONE PR targeting main. Title uses parent index. Body lists 'Fixes #N' for parent and all sub-issues.", "Move parent issue to status/review.", "[SKILL] Quality Agent validates with RULE 0/1/2 (result in parent issue comment).", "If CI/tests fail, iterate until pass.", "When PR is merged, parent and all sub-issues move to status/done. Close any not auto-closed.", "[SKILL] Doc-Sync on affected directories." ], "skill_integration": { "planning_required_for": ["type/feature with 3+ files", "architectural changes"], "planning_optional_for": ["type/bug", "type/chore", "type/docs"], "quality_gates": { "plan_review": ["QR plan-completeness", "TW plan-scrub", "QR plan-code", "QR plan-docs"], "execution_review": ["QR post-implementation per milestone"], "final_review": ["Quality Agent RULE 0/1/2"] }, "plan_storage": "gitea_issue_comments", "tracking_storage": "gitea_issue_comments", "issue_comment_operations": { "create_comment": "mcp__gitea-mcp__create_issue_comment", "edit_comment": "mcp__gitea-mcp__edit_issue_comment", "get_comments": "mcp__gitea-mcp__get_issue_comments_by_index" }, "unified_comment_format": { "header": "## {Type}: {Title}", "meta": "**Phase**: {phase} | **Agent**: {agent} | **Status**: {status}", "sections": "### {Section}", "footer": "*Verdict*: {verdict} | *Next*: {next_action}", "types": ["Plan", "QR Review", "Milestone", "Final Review"], "phases": ["Planning", "Plan-Review", "Execution", "Review"], "statuses": ["AWAITING_REVIEW", "IN_PROGRESS", "PASS", "FAIL", "BLOCKED"], "verdicts": ["PASS", "FAIL", "NEEDS_REVISION", "APPROVED", "BLOCKED"] } }, "gitea_mcp_tools": { "repository": { "owner": "egullickson", "repo": "motovaultpro" }, "issue_operations": { "list_issues": "mcp__gitea-mcp__list_repo_issues", "get_issue": "mcp__gitea-mcp__get_issue_by_index", "create_issue": "mcp__gitea-mcp__create_issue", "edit_issue": "mcp__gitea-mcp__edit_issue" }, "label_operations": { "list_labels": "mcp__gitea-mcp__list_repo_labels", "add_labels": "mcp__gitea-mcp__add_issue_labels", "remove_label": "mcp__gitea-mcp__remove_issue_label", "replace_labels": "mcp__gitea-mcp__replace_issue_labels" }, "milestone_operations": { "list_milestones": "mcp__gitea-mcp__list_milestones", "create_milestone": "mcp__gitea-mcp__create_milestone", "get_milestone": "mcp__gitea-mcp__get_milestone" }, "branch_operations": { "list_branches": "mcp__gitea-mcp__list_branches", "create_branch": "mcp__gitea-mcp__create_branch" }, "pr_operations": { "list_prs": "mcp__gitea-mcp__list_repo_pull_requests", "create_pr": "mcp__gitea-mcp__create_pull_request", "get_pr": "mcp__gitea-mcp__get_pull_request_by_index" } }, "fallbacks": { "if_label_update_not_available_in_mcp": [ "Use REST API issue label endpoints to add/replace labels.", "If REST is unavailable, add a comment 'STATUS: ' and proceed, but do not leave multiple status labels." ], "if_milestone_ops_not_available_in_mcp": [ "Use REST API to create/list milestones and assign issues to the sprint milestone.", "If milestone cannot be set, add a comment 'SPRINT: '." ] } }