483 lines
12 KiB
Markdown
483 lines
12 KiB
Markdown
# Sprint Status Sync - Complete Guide
|
|
|
|
**Created:** 2026-01-02
|
|
**Purpose:** Prevent drift between story files and sprint-status.yaml
|
|
**Status:** PRODUCTION READY
|
|
|
|
---
|
|
|
|
## 🚨 THE PROBLEM WE SOLVED
|
|
|
|
**Before Fix (2026-01-02):**
|
|
- 78% of story files (435/552) had NO `Status:` field
|
|
- 30+ completed stories not reflected in sprint-status.yaml
|
|
- Epic 19: 28 stories done, sprint-status said "in-progress"
|
|
- Epic 16d: 3 stories done, sprint-status said "backlog"
|
|
- Last verification: 32+ hours old
|
|
|
|
**Root Cause:**
|
|
- Autonomous workflows prioritized velocity over tracking
|
|
- Manual workflows didn't enforce status updates
|
|
- No automated sync mechanism
|
|
- sprint-status.yaml manually maintained
|
|
|
|
---
|
|
|
|
## ✅ THE SOLUTION (Full Workflow Fix)
|
|
|
|
### Component 1: Automated Sync Script
|
|
|
|
**Script:** `scripts/sync-sprint-status.sh`
|
|
**Purpose:** Scan story Status: fields → Update sprint-status.yaml
|
|
|
|
**Usage:**
|
|
```bash
|
|
# Update sprint-status.yaml
|
|
pnpm sync:sprint-status
|
|
|
|
# Preview changes (no modifications)
|
|
pnpm sync:sprint-status:dry-run
|
|
|
|
# Validate only (exit 1 if out of sync)
|
|
pnpm validate:sprint-status
|
|
```
|
|
|
|
**Features:**
|
|
- Only updates stories WITH explicit Status: fields
|
|
- Skips stories without Status: (trusts sprint-status.yaml)
|
|
- Creates automatic backups (.sprint-status-backups/)
|
|
- Preserves all comments and structure
|
|
- Returns clear pass/fail exit codes
|
|
|
|
---
|
|
|
|
### Component 2: Workflow Enforcement
|
|
|
|
**Modified Files:**
|
|
1. `_bmad/bmm/workflows/4-implementation/dev-story/instructions.xml`
|
|
2. `_bmad/bmm/workflows/4-implementation/autonomous-epic/instructions.xml`
|
|
|
|
**Changes:**
|
|
- ✅ HALT if story not found in sprint-status.yaml (was: warning)
|
|
- ✅ Verify sprint-status.yaml update persisted (new validation)
|
|
- ✅ Update both story Status: field AND sprint-status.yaml
|
|
- ✅ Fail loudly if either update fails
|
|
|
|
**Before:** Workflows logged warnings, continued anyway
|
|
**After:** Workflows HALT if tracking update fails
|
|
|
|
---
|
|
|
|
### Component 3: CI/CD Validation
|
|
|
|
**Workflow:** `.github/workflows/validate-sprint-status.yml`
|
|
**Trigger:** Every PR touching docs/sprint-artifacts/
|
|
|
|
**Checks:**
|
|
1. sprint-status.yaml exists
|
|
2. All changed story files have Status: fields
|
|
3. sprint-status.yaml is in sync (runs validation)
|
|
4. Blocks merge if validation fails
|
|
|
|
**How to fix CI failures:**
|
|
```bash
|
|
# See what's wrong
|
|
./scripts/sync-sprint-status.sh --dry-run
|
|
|
|
# Fix it
|
|
./scripts/sync-sprint-status.sh
|
|
|
|
# Commit
|
|
git add docs/sprint-artifacts/sprint-status.yaml
|
|
git commit -m "chore: sync sprint-status.yaml"
|
|
git push
|
|
```
|
|
|
|
---
|
|
|
|
### Component 4: pnpm Scripts
|
|
|
|
**Added to package.json:**
|
|
```json
|
|
{
|
|
"scripts": {
|
|
"sync:sprint-status": "./scripts/sync-sprint-status.sh",
|
|
"sync:sprint-status:dry-run": "./scripts/sync-sprint-status.sh --dry-run",
|
|
"validate:sprint-status": "./scripts/sync-sprint-status.sh --validate"
|
|
}
|
|
}
|
|
```
|
|
|
|
**When to run:**
|
|
- `pnpm sync:sprint-status` - After manually updating story Status: fields
|
|
- `pnpm validate:sprint-status` - Before committing changes
|
|
- Automatically in CI/CD - Validates on every PR
|
|
|
|
---
|
|
|
|
## 🎯 NEW WORKFLOW (How It Works Now)
|
|
|
|
### When Creating a Story
|
|
|
|
```
|
|
/create-story workflow
|
|
↓
|
|
1. Generate story file with Status: ready-for-dev
|
|
↓
|
|
2. Add entry to sprint-status.yaml with status "ready-for-dev"
|
|
↓
|
|
3. HALT if sprint-status.yaml update fails
|
|
↓
|
|
✅ Story file and sprint-status.yaml both updated
|
|
```
|
|
|
|
### When Implementing a Story
|
|
|
|
```
|
|
/dev-story workflow
|
|
↓
|
|
1. Load story, start work
|
|
↓
|
|
2. Mark tasks complete [x]
|
|
↓
|
|
3. Run tests, validate
|
|
↓
|
|
4. Update story Status: "in-progress" → "review"
|
|
↓
|
|
5. Update sprint-status.yaml: "in-progress" → "review"
|
|
↓
|
|
6. VERIFY sprint-status.yaml update persisted
|
|
↓
|
|
7. HALT if verification fails
|
|
↓
|
|
✅ Both updated and verified
|
|
```
|
|
|
|
### When Running Autonomous Epic
|
|
|
|
```
|
|
/autonomous-epic workflow
|
|
↓
|
|
For each story:
|
|
1. Run super-dev-pipeline
|
|
↓
|
|
2. Check all tasks complete
|
|
↓
|
|
3. Update story Status: "done"
|
|
↓
|
|
4. Update sprint-status.yaml entry to "done"
|
|
↓
|
|
5. Verify update persisted
|
|
↓
|
|
6. Log failure if verification fails (don't halt - continue)
|
|
↓
|
|
After all stories:
|
|
7. Mark epic "done" in sprint-status.yaml
|
|
↓
|
|
8. Verify epic status persisted
|
|
↓
|
|
✅ All stories and epic status updated
|
|
```
|
|
|
|
---
|
|
|
|
## 🛡️ ENFORCEMENT MECHANISMS
|
|
|
|
### 1. Required Fields (Create-Story)
|
|
- **Enforcement:** Story MUST be added to sprint-status.yaml during creation
|
|
- **Validation:** Workflow HALTS if story not found after creation
|
|
- **Result:** No orphaned stories
|
|
|
|
### 2. Status Updates (Dev-Story)
|
|
- **Enforcement:** Both Status: field AND sprint-status.yaml MUST update
|
|
- **Validation:** Re-read sprint-status.yaml to verify update
|
|
- **Result:** No silent failures
|
|
|
|
### 3. Verification (Autonomous-Epic)
|
|
- **Enforcement:** Sprint-status.yaml updated after each story
|
|
- **Validation:** Verify update persisted, log failure if not
|
|
- **Result:** Tracking stays in sync even during autonomous runs
|
|
|
|
### 4. CI/CD Gates (GitHub Actions)
|
|
- **Enforcement:** PR merge blocked if validation fails
|
|
- **Validation:** Runs `pnpm validate:sprint-status` on every PR
|
|
- **Result:** Drift cannot be merged
|
|
|
|
---
|
|
|
|
## 📋 MANUAL SYNC PROCEDURES
|
|
|
|
### If sprint-status.yaml Gets Out of Sync
|
|
|
|
**Scenario 1: Story Status: fields updated but sprint-status.yaml not synced**
|
|
```bash
|
|
# See what needs updating
|
|
pnpm sync:sprint-status:dry-run
|
|
|
|
# Apply updates
|
|
pnpm sync:sprint-status
|
|
|
|
# Verify
|
|
pnpm validate:sprint-status
|
|
|
|
# Commit
|
|
git add docs/sprint-artifacts/sprint-status.yaml
|
|
git commit -m "chore: sync sprint-status.yaml with story updates"
|
|
```
|
|
|
|
**Scenario 2: sprint-status.yaml has truth, story files missing Status: fields**
|
|
```bash
|
|
# Create script to backfill Status: fields FROM sprint-status.yaml
|
|
./scripts/backfill-story-status-fields.sh # (To be created if needed)
|
|
|
|
# This would:
|
|
# 1. Read sprint-status.yaml
|
|
# 2. For each story entry, find the story file
|
|
# 3. Add/update Status: field to match sprint-status.yaml
|
|
# 4. Preserve all other content
|
|
```
|
|
|
|
**Scenario 3: Massive drift after autonomous work**
|
|
```bash
|
|
# Option A: Trust sprint-status.yaml (if it was manually verified)
|
|
# - Backfill story Status: fields from sprint-status.yaml
|
|
# - Don't run sync (sprint-status.yaml is source of truth)
|
|
|
|
# Option B: Trust story Status: fields (if recently updated)
|
|
# - Run sync to update sprint-status.yaml
|
|
pnpm sync:sprint-status
|
|
|
|
# Option C: Manual audit (when both are uncertain)
|
|
# - Review SPRINT-STATUS-AUDIT-2026-01-02.md
|
|
# - Check git commits for completion evidence
|
|
# - Manually correct both files
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 TESTING
|
|
|
|
### Test 1: Validate Current State
|
|
```bash
|
|
pnpm validate:sprint-status
|
|
# Should exit 0 if in sync, exit 1 if discrepancies
|
|
```
|
|
|
|
### Test 2: Dry Run (No Changes)
|
|
```bash
|
|
pnpm sync:sprint-status:dry-run
|
|
# Shows what WOULD change without applying
|
|
```
|
|
|
|
### Test 3: Apply Sync
|
|
```bash
|
|
pnpm sync:sprint-status
|
|
# Updates sprint-status.yaml, creates backup
|
|
```
|
|
|
|
### Test 4: CI/CD Simulation
|
|
```bash
|
|
# Simulate PR validation
|
|
.github/workflows/validate-sprint-status.yml
|
|
# (Run via act or GitHub Actions)
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 METRICS & MONITORING
|
|
|
|
### How to Check Sprint Health
|
|
|
|
**Check 1: Discrepancy Count**
|
|
```bash
|
|
pnpm sync:sprint-status:dry-run 2>&1 | grep "discrepancies"
|
|
# Should show: "0 discrepancies" if healthy
|
|
```
|
|
|
|
**Check 2: Last Verification Timestamp**
|
|
```bash
|
|
head -5 docs/sprint-artifacts/sprint-status.yaml | grep last_verified
|
|
# Should be within last 24 hours
|
|
```
|
|
|
|
**Check 3: Stories Missing Status: Fields**
|
|
```bash
|
|
grep -L "^Status:" docs/sprint-artifacts/*.md | wc -l
|
|
# Should decrease over time as stories get Status: fields
|
|
```
|
|
|
|
### Alerts to Set Up (Future)
|
|
|
|
- ⚠️ If last_verified > 7 days old → Manual audit recommended
|
|
- ⚠️ If discrepancy count > 10 → Investigate why sync not running
|
|
- ⚠️ If stories without Status: > 50 → Backfill campaign needed
|
|
|
|
---
|
|
|
|
## 🎓 BEST PRACTICES
|
|
|
|
### For Story Creators
|
|
1. Always use `/create-story` workflow (adds to sprint-status.yaml automatically)
|
|
2. Never create story .md files manually
|
|
3. Always include Status: field in story template
|
|
|
|
### For Story Implementers
|
|
1. Use `/dev-story` workflow (updates both Status: and sprint-status.yaml)
|
|
2. If manually updating Status: field, run `pnpm sync:sprint-status` after
|
|
3. Before marking "done", verify sprint-status.yaml reflects your work
|
|
|
|
### For Autonomous Workflows
|
|
1. autonomous-epic workflow now includes sprint-status.yaml updates
|
|
2. Verifies updates persisted after each story
|
|
3. Logs failures but continues (doesn't halt entire epic for tracking issues)
|
|
|
|
### For Code Reviewers
|
|
1. Check that PR includes sprint-status.yaml update if stories changed
|
|
2. Verify CI/CD validation passes
|
|
3. If validation fails, request sync before approving
|
|
|
|
---
|
|
|
|
## 🔧 MAINTENANCE
|
|
|
|
### Weekly Tasks
|
|
- [ ] Review discrepancy count: `pnpm sync:sprint-status:dry-run`
|
|
- [ ] Run sync if needed: `pnpm sync:sprint-status`
|
|
- [ ] Check backup count: `ls -1 .sprint-status-backups/ | wc -l`
|
|
- [ ] Clean old backups (keep last 30 days)
|
|
|
|
### Monthly Tasks
|
|
- [ ] Full audit: Review SPRINT-STATUS-AUDIT template
|
|
- [ ] Backfill missing Status: fields (reduce count to <10)
|
|
- [ ] Verify all epics have correct status
|
|
- [ ] Update this guide based on learnings
|
|
|
|
---
|
|
|
|
## 📝 FILE REFERENCE
|
|
|
|
**Core Files:**
|
|
- `docs/sprint-artifacts/sprint-status.yaml` - Single source of truth
|
|
- `scripts/sync-sprint-status.sh` - Bash wrapper script
|
|
- `scripts/lib/sprint-status-updater.py` - Python updater logic
|
|
|
|
**Workflow Files:**
|
|
- `_bmad/bmm/workflows/4-implementation/dev-story/instructions.xml`
|
|
- `_bmad/bmm/workflows/4-implementation/autonomous-epic/instructions.xml`
|
|
- `_bmad/bmm/workflows/4-implementation/create-story-with-gap-analysis/step-03-generate-story.md`
|
|
|
|
**CI/CD:**
|
|
- `.github/workflows/validate-sprint-status.yml`
|
|
|
|
**Documentation:**
|
|
- `SPRINT-STATUS-AUDIT-2026-01-02.md` - Initial audit findings
|
|
- `docs/workflows/SPRINT-STATUS-SYNC-GUIDE.md` - This file
|
|
|
|
---
|
|
|
|
## 🐛 TROUBLESHOOTING
|
|
|
|
### Issue: "Story not found in sprint-status.yaml"
|
|
|
|
**Cause:** Story file created outside of /create-story workflow
|
|
**Fix:**
|
|
```bash
|
|
# Manually add to sprint-status.yaml under correct epic
|
|
vim docs/sprint-artifacts/sprint-status.yaml
|
|
# Add line: story-id: ready-for-dev
|
|
|
|
# Or re-run create-story workflow
|
|
/create-story
|
|
```
|
|
|
|
### Issue: "sprint-status.yaml update failed to persist"
|
|
|
|
**Cause:** File system permissions or concurrent writes
|
|
**Fix:**
|
|
```bash
|
|
# Check file permissions
|
|
ls -la docs/sprint-artifacts/sprint-status.yaml
|
|
|
|
# Check for file locks
|
|
lsof | grep sprint-status.yaml
|
|
|
|
# Manual update if needed
|
|
vim docs/sprint-artifacts/sprint-status.yaml
|
|
```
|
|
|
|
### Issue: "85 discrepancies found"
|
|
|
|
**Cause:** Story Status: fields not updated after completion
|
|
**Fix:**
|
|
```bash
|
|
# Review discrepancies
|
|
pnpm sync:sprint-status:dry-run
|
|
|
|
# Apply updates (will update sprint-status.yaml to match story files)
|
|
pnpm sync:sprint-status
|
|
|
|
# If story files are WRONG (Status: ready-for-dev but actually done):
|
|
# Manually update story Status: fields first
|
|
# Then run sync
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 SUCCESS CRITERIA
|
|
|
|
**System is working correctly when:**
|
|
- ✅ `pnpm validate:sprint-status` exits 0 (no discrepancies)
|
|
- ✅ Last verified timestamp < 24 hours old
|
|
- ✅ Stories with missing Status: fields < 10
|
|
- ✅ CI/CD validation passes on all PRs
|
|
- ✅ New stories automatically added to sprint-status.yaml
|
|
|
|
**System needs attention when:**
|
|
- ❌ Discrepancy count > 10
|
|
- ❌ Last verified > 7 days old
|
|
- ❌ CI/CD validation failing frequently
|
|
- ❌ Stories missing Status: fields > 50
|
|
|
|
---
|
|
|
|
## 🔄 MIGRATION CHECKLIST (One-Time)
|
|
|
|
If implementing this on an existing project:
|
|
|
|
- [x] Create scripts/sync-sprint-status.sh
|
|
- [x] Create scripts/lib/sprint-status-updater.py
|
|
- [x] Modify dev-story workflow (add enforcement)
|
|
- [x] Modify autonomous-epic workflow (add verification)
|
|
- [x] Add CI/CD validation workflow
|
|
- [x] Add pnpm scripts
|
|
- [x] Run initial sync: `pnpm sync:sprint-status`
|
|
- [ ] Backfill missing Status: fields (optional, gradual)
|
|
- [x] Document in this guide
|
|
- [ ] Train team on new workflow
|
|
- [ ] Monitor for 2 weeks, adjust as needed
|
|
|
|
---
|
|
|
|
## 📈 EXPECTED OUTCOMES
|
|
|
|
**Immediate (Week 1):**
|
|
- sprint-status.yaml stays in sync
|
|
- New stories automatically tracked
|
|
- Autonomous work properly recorded
|
|
|
|
**Short-term (Month 1):**
|
|
- Discrepancy count approaches zero
|
|
- CI/CD catches drift before merge
|
|
- Team trusts sprint-status.yaml as source of truth
|
|
|
|
**Long-term (Month 3+):**
|
|
- Zero manual sprint-status.yaml updates needed
|
|
- Automated reporting reliable
|
|
- Velocity metrics accurate
|
|
|
|
---
|
|
|
|
**Last Updated:** 2026-01-02
|
|
**Status:** Active - Production Ready
|
|
**Maintained By:** Platform Team
|