{
  "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/in-progress + same type/* as parent. Sub-issues move to in-progress as they are worked on.",
    "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: <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: <milestone name>'."
    ]
  }
}
