--- name: Jira Ticket Estimator description: This skill should be used when estimating development time for Jira tickets. It provides both manual and AI-assisted estimates with T-shirt sizes, story points, and phase-by-phase time breakdowns based on task type classification, complexity scoring, and project architecture (monolithic/serverless/frontend/fullstack/mobile/test_automation). --- # Jira Ticket Estimator Estimate manual and AI-assisted development time for Jira tickets using an 8-phase manual workflow and 8-phase AI-assisted workflow that mirror real development processes. ## When to Use This Skill Invoke when: - Estimating a Jira ticket before work starts - Sprint planning requires story point assignments - Stakeholders need time estimates for features/bugs/refactors - Comparing estimates across different project types - Understanding time savings with AI-assisted development ## Inputs **Required** (one of): - Jira ticket ID/URL (e.g., PROJ-123) - Free-form description of work - User story with acceptance criteria **Optional Flags**: - `--project-type`: monolithic|serverless|frontend|fullstack|mobile|test_automation (default: monolithic) - `--task-type-override`: Manual override for task classification - `--team-velocity`: Velocity factor for story points (default: 1.0) - `--has-infrastructure-changes`: Flag for infrastructure changes ## Estimation Workflow ### 1. Fetch Ticket Details Use Atlassian MCP tools to retrieve ticket information: ```bash mcp__atlassian_fetch_jira_ticket --ticket-id= ``` Extract: title, description, acceptance criteria, issue type, labels. If MCP unavailable, prompt user for ticket details. ### 2. Classify Task Type Classify into one of 5 types using keywords and issue type: - **Bug Fix**: Keywords: fix, bug, error | Issue Type: Bug - **Refactor**: Keywords: refactor, improve, optimize, harden - **Enhancement**: Keywords: add, extend, enhance (without "new") - **Net-New**: Keywords: new, create, build, implement - **Spike**: Keywords: investigate, research, spike See `references/task-type-classification.md` for complete classification guide. ### 3. Repository Reconnaissance Scan codebase to understand scope and **COUNT FILES**: - Use Grep/Glob to find related files - **CRITICAL: Count unique files across all searches for file_touch_overhead** - **Track file count to pass to estimator - affects manual workflow time significantly** - Estimate LOC changes - Identify integration points - Check test coverage in affected areas **File Counting Strategy:** ```python # Run multiple searches messaging_files = Grep("messagingSync", output_mode="files_with_matches") model_files = Grep("extendables", type="php", output_mode="files_with_matches") test_files = Glob("tests/**/*Relevant*.php") command_files = Glob("app/Console/Commands/**/*Relevant*.php") # Combine and deduplicate all_files = set() all_files.update(messaging_files or []) all_files.update(model_files or []) all_files.update(test_files or []) all_files.update(command_files or []) file_count = len(all_files) # This file_count MUST be passed to estimator.estimate_ticket() ``` **File Count Impact (file_touch_overhead):** - **< 20 files**: No overhead - **20-30 files (low complexity <3.0)**: ~100-150 min overhead (1.7-2.5h) - **30-50 files (medium complexity 3.0-6.0)**: ~150-375 min overhead (2.5-6.3h) - **50-60 files (high complexity >6.0)**: ~450-540 min overhead (7.5-9h, may hit cap at 5h/300min) **Why this matters**: Manual development has mechanical overhead (opening files, reading context, making changes). AI can batch process efficiently, so overhead only applies to manual workflow. ### 4. Detect Manual Time Adjustments Scan ticket title and description for explicit time additions: **Supported patterns:** - `(+4h)`, `(4h)`, `(+4 hours)` - Parentheses format (recommended) - `+4h`, `+4 hours` - Plus prefix format - `(+30m)`, `(30m)`, `(+30 minutes)` - Minutes notation - `+2.5h`, `+1.5 hours` - Decimal values supported **Examples:** - "ensure qa automation run is not affected (+4h)" - "manual testing required +2h" - "coordinate with DevOps team (30m)" **Intelligent Phase Distribution:** The system analyzes the context around each time adjustment and intelligently distributes it to the appropriate workflow phase: | Adjustment Context | Destination Phase | Example | |-------------------|------------------|---------| | QA, manual testing, smoke test, verification | **Verification** (Phase 7) | "QA self run (+2h)" | | Unit test, integration test, test coverage | **Testing** (Phase 4) | "write unit tests (+1h)" | | Code review, peer review, PR review | **Code Review** (Phase 5) | "security review (+45m)" | | Self review | **Self Review** (Phase 3) | "self review (+30m)" | | Planning, design, architecture | **Planning & Design** (Phase 1) | "architecture planning (+1h)" | | Implementation, coding, development | **Implementation** (Phase 2) | "additional coding (+2h)" | | Deployment, deploy | **Deployment** (Phase 6) | "deployment steps (+30m)" | | Feedback, iteration, refinement | **Feedback & Iterations** (Phase 8) | "incorporate feedback (+1h)" | | **Unmatched** (coordination, meetings, etc.) | **Phase 9: Overhead Activities** | "coordinate with DevOps (+1h)" | **Phase 9 only appears if there are unmatched adjustments** that don't fit into any of the standard workflow phases. ### 5. Score Complexity Factors Score each factor on 1-10 scale: 1. **Scope Size**: Files, LOC, API changes 2. **Technical Complexity**: Algorithms, integrations 3. **Testing Requirements**: Coverage needs, test complexity 4. **Risk & Unknowns**: New tech, ambiguity, breaking changes 5. **Dependencies**: Blockers, coordination, impact radius See `references/complexity-scoring-guide.md` for detailed scoring guide. ### 6. Calculate Estimates Using Python Script Execute the estimation script with gathered inputs: ```bash cd .claude/skills/jira-ticket-estimator python3 scripts/estimator.py <", "description": "", "project_type": "", "issue_type": "", "complexity_scores": { "scope_size": <1-10>, "technical_complexity": <1-10>, "testing_requirements": <1-10>, "risk_and_unknowns": <1-10>, "dependencies": <1-10> }, "has_infrastructure_changes": } EOF ``` Or use Python directly: ```python from scripts.estimator import TicketEstimator import json estimator = TicketEstimator('heuristics.json') # Option 1: Auto-detect manual adjustments from title/description result = estimator.estimate_ticket( title="", description="Manual testing required (+2h)", # Auto-detected project_type="", issue_type="", complexity_scores={ 'scope_size': , 'technical_complexity': , 'testing_requirements': , 'risk_and_unknowns': , 'dependencies': }, has_infrastructure_changes=, file_count= # IMPORTANT: Pass file count from reconnaissance ) # Option 2: Explicitly pass manual adjustments (overrides auto-detection) manual_adjustments = [ {"context": "Manual testing", "hours": 2.0, "phase": "verification"}, {"context": "QA coordination", "hours": 1.5, "phase": "verification"}, {"context": "Extra planning", "hours": 1.0, "phase": "planning_design"} ] result = estimator.estimate_ticket( title="", description="", project_type="", issue_type="", complexity_scores={...}, has_infrastructure_changes=, file_count=, manual_adjustments=manual_adjustments # Explicit adjustments (NEW!) ) print(json.dumps(result, indent=2)) ``` **Manual Adjustments - Two Methods**: 1. **Auto-detection** (default): Include patterns like `(+2h)`, `+2h`, `(2h)` in title/description 2. **Explicit parameter** (new): Pass `manual_adjustments` list with context, hours, and target phase Valid phases for adjustments: - `verification` - Test verification phase - `testing` - Testing phase - `code_review` - Code review & revisions phase - `self_review` - Self review phase - `planning_design` - Planning & design phase - `implementation` - Implementation phase - `deployment_to_test` - Deployment phase - `feedback_iterations` - Feedback & iterations phase - `overhead` - Unmatched overhead (creates Phase 9) Script outputs JSON with complete estimate breakdown including both manual and AI-assisted workflows, plus detected/explicit manual time adjustments. ### 7. Parse and Format Results Extract from JSON output: - Project type and task type classification - T-shirt size (XS/S/M/L/XL) - Story points (Fibonacci) - Raw and adjusted complexity scores - Manual workflow phase-by-phase time breakdown - AI-assisted workflow phase-by-phase time breakdown - Detected manual time adjustments - Time savings comparison - Total time (calculated and rounded) ### 8. Present Estimate to User #### Formatting Rules for Display Convert `total_hours_rounded` (bucket value) to days/hours format: **Day size**: 1 day = 8 hours (configured in heuristics.json) **Conversion formula**: - `days = total_hours_rounded ÷ 8` (integer division) - `remaining_hours = total_hours_rounded % 8` (modulo) **Display format**: - If `total_hours_rounded < 8`: Show as "Xh" (e.g., "4h", "6h") - If `remaining_hours = 0`: Show as "Xd" (e.g., "2d" for 16h, "4d" for 32h) - If `remaining_hours > 0`: Show as "Xd Xh" (e.g., "2d 4h" for 20h, "3d 6h" for 30h) **Examples**: - 32h bucket → 32 ÷ 8 = 4d (remainder 0) → **"4d (32.84h)"** - 30h bucket → 30 ÷ 8 = 3d remainder 6h → **"3d 6h (30.17h)"** - 6h bucket → **"6h (5.89h)"** - 16h bucket → 16 ÷ 8 = 2d (remainder 0) → **"2d (16.51h)"** - 20h bucket → 20 ÷ 8 = 2d remainder 4h → **"2d 4h (19.23h)"** Format output as markdown table: ```markdown # Estimate: **Project Type**: **Task Type**: () **T-Shirt Size**: **Story Points**: **Complexity**: /10 → /10 (scale factor: ) **Files Affected**: **Manual Development Total**: Xd Xh (or Xh if < 8h) - Breakdown: X.XXh (includes overhead if any) → Xh rounded **AI-Assisted Development Total**: Xd Xh (or Xh if < 8h) - Breakdown: X.XXh (includes overhead if any) → Xh rounded **Time Savings**: XX.X% ## Manual Development Time Breakdown | Phase | Time | Details | |-------|------|---------| | 1. Planning & Design | X min | | | 2. Implementation | X min | × | | 3. Self Review | 30 min | Review own code before testing | | 4. Testing | X min | % of implementation | | 5. Code Review & Revisions | X min | | | 6. Deployment to Test | X min | Deploy to test environment | | 7. Test Verification | X min | Smoke tests, verification (scales with complexity) | | 8. Feedback & Iterations | X min | Incorporate stakeholder feedback, iterate on changes | | **9. Overhead Activities** | **X min** | **+Xh from title, +Xm from description** (if detected) | | **TOTAL (calculated)** | **X.XXh** | | | **TOTAL (rounded)** | **Xh** | Snapped to bucket | ## AI-Assisted Development Time Breakdown | Phase | Time | Details | |-------|------|---------| | 1. AI Planning | X min | AI generates architecture, API contracts (X% savings) | | 2. AI Implementation | X min | AI generates code, tests (X% savings) | | 3. AI Review | X min | AI reviews for bugs, improvements | | 4. Human Review & Testing | X min | Validate AI output, run tests | | 5. Iterations & Vibe Coding | X min | Fix AI mistakes, refine prompts | | 6. Deploy to Test | X min | Deploy to test environment | | 7. Test Verification | X min | Smoke tests, E2E verification | | 8. Feedback & Iterations | X min | Incorporate stakeholder feedback, iterate on AI-generated changes | | **9. Overhead Activities** | **X min** | **+Xh from title, +Xm from description** (if detected) | | **TOTAL (calculated)** | **X.XXh** | | | **TOTAL (rounded)** | **Xh** | Snapped to bucket | ## Complexity Scores | Factor | Score | Rationale | |--------|-------|-----------| | Scope Size | X/10 | | | Technical Complexity | X/10 | | | Testing Requirements | X/10 | | | Risk & Unknowns | X/10 | | | Dependencies | X/10 | | ## Assumptions 1. 2. 3. ## Confidence Level **** - ## Next Steps 1. Review estimate with stakeholders 2. Validate complexity scores and task type 3. Approval gate: proceed, modify scope, or reject 4. Choose development approach (manual vs AI-assisted) 5. Track actual vs estimated time for calibration ``` ### 9. Optional: Update Jira If `--update-jira` flag provided: ```bash mcp__atlassian_update_jira_issue --ticket-id= --story-points= ``` ## Project Types Five project types with customized workflow phases: ### Monolithic (Laravel, Rails, Django) - Planning: 90 min @ complexity 5 - Testing: 40% of implementation - Deployment to Test: 25 min (50 min with infra) - Test Verification: 20 min @ complexity 5 (scales with complexity) - Feedback & Iterations: 30 min @ complexity 5 (scales with complexity) ### Serverless (AWS Lambda, Cloud Functions) - Planning: 120 min @ complexity 5 (more for IaC) - Testing: 35% of implementation - Deployment to Test: 25 min (60 min with infra) - Test Verification: 20 min @ complexity 5 (scales with complexity) - Feedback & Iterations: 30 min @ complexity 5 (scales with complexity) ### Frontend (React, Vue, Angular) - Planning: 75 min @ complexity 5 - Testing: 45% of implementation (includes E2E) - Deployment to Test: 25 min (35 min with infra) - Test Verification: 20 min @ complexity 5 (scales with complexity) - Feedback & Iterations: 30 min @ complexity 5 (scales with complexity) ### Full-Stack (Backend + Frontend) - Planning: 120 min @ complexity 5 - Testing: 50% of implementation (most comprehensive) - Deployment to Test: 25 min (60 min with infra) - Test Verification: 20 min @ complexity 5 (scales with complexity) - Feedback & Iterations: 30 min @ complexity 5 (scales with complexity) ### Mobile (Android, iOS, React Native, Flutter) - Planning: 100 min @ complexity 5 (screen flows, offline support) - Testing: 50% of implementation (device testing critical) - Deployment to Test: 25 min (40 min with infra) - TestFlight/Internal Testing - Test Verification: 20 min @ complexity 5 (scales with complexity) - Feedback & Iterations: 30 min @ complexity 5 (scales with complexity) ### Test Automation (Serenity BDD, Playwright, Cypress) - **Custom 8-Phase Workflow**: Analysis & Test Planning → Environment Setup → Page Objects & Locators → Step Implementations → Gherkin Integration → Testing & Evidence → Documentation → Feedback & Iterations - Phase 1 - Analysis & Test Planning: 145 min @ complexity 5 - Phase 2 - Environment Setup: 63 min @ complexity 5 - Phase 3 - Page Objects & Locators: 199 min @ complexity 5 - Phase 4 - Step Implementations: Task-type based - Phase 5 - Gherkin Integration: 136 min @ complexity 5 - Phase 6 - Testing & Evidence: 72 min @ complexity 5 - Phase 7 - Documentation: 54 min @ complexity 5 - Phase 8 - Feedback & Iterations: 35 min @ complexity 5 (scales with complexity) - **AI-Assisted**: 45% time savings across all phases All phase times scale with complexity. See `references/workflow-formulas.md` for complete formulas. ## The 8-9 Phase Manual Workflow Estimates follow real development phases: 1. **Planning & Design** - Architecture, DB schema, API contracts 2. **Implementation** - Core development work 3. **Self Review** - Review own code for bugs, edge cases, code quality 4. **Testing** - Unit, integration, E2E tests 5. **Code Review & Revisions** - Peer review, addressing feedback 6. **Deployment to Test** - Deploy to test environment (fixed time, infra-aware) 7. **Test Verification** - Smoke tests, verification (scales with complexity) 8. **Feedback & Iterations** - Incorporate stakeholder feedback, iterate on changes, address edge cases found in verification 9. **Overhead Activities** - Unmatched overhead from ticket (optional, only if detected) **Intelligent Adjustment Distribution**: When time adjustments like `(+4h)` are detected, they're intelligently distributed to the appropriate phase based on context: - "QA self run (+2h)" → **Test Verification** phase - "Code review with security team (+45m)" → **Code Review & Revisions** phase - "Coordinate with DevOps (+1h)" → **Phase 9** (unmatched overhead) **Phase 9 only appears if there are unmatched adjustments** that don't fit into standard workflow phases (e.g., coordination, meetings, external dependencies). ## The 8-9 Phase AI-Assisted Workflow AI-assisted development follows these phases: 1. **AI Planning** - AI generates architecture, DB schema, API contracts (60-70% time savings) 2. **AI Implementation** - AI generates code, controllers, models, tests (60-70% time savings) 3. **AI Review** - AI reviews generated code for bugs and improvements 4. **Human Review & Testing** - Developer validates AI output and runs tests 5. **Iterations & Vibe Coding** - Fix AI mistakes, regenerate code, refine prompts 6. **Deploy to Test** - Deploy to test environment 7. **Test Verification** - Smoke tests, E2E verification, validation 8. **Feedback & Iterations** - Incorporate stakeholder feedback, iterate on AI-generated changes, refine based on verification 9. **Overhead Activities** - Unmatched overhead from ticket (optional, only if detected) **Intelligent Adjustment Distribution**: Same intelligent distribution logic applies to AI-assisted workflow. Adjustments are added to their appropriate phases based on context. **Note**: Overhead activities (Phase 9) are the same for manual and AI-assisted development. Only the core workflow phases (1-8) benefit from AI acceleration. Typical time savings: 40-50% compared to manual development. ## Configuration All parameters stored in `heuristics.json`: ### Customizable per Project Type - Workflow phase base times (manual and AI-assisted) - Testing percentages - Deploy times with/without infrastructure changes - AI time savings percentages ### Overhead Activities (Phase 9) - Automatic detection of explicit time additions in ticket content - Supports patterns: `(+4h)`, `+2h`, `(30m)`, `+15 minutes` - Supports hours and minutes notation - Supports decimal values: `+2.5h` - All detected adjustments are summed and added as Phase 9 to both workflows - Appears in phase breakdown tables when detected - Can be disabled by setting `"enabled": false` in heuristics.json ### Bucket Rounding Final estimates are snapped to standardized time buckets using a threshold-based approach. **Buckets (hours)**: 0, 1, 2, 3, 4, 6, 8 (1d), 12 (1.5d), 16 (2d), 20 (2.5d), 24 (3d), 28 (3.5d), 32 (4d), 36 (4.5d), 40 (5d) **Day size**: 1d = 8h **Rule**: Compute the precise grand total (workflow phases 1-9, which includes overhead in Phase 9 if detected), then snap to the nearest bucket using a **threshold-based approach**. - For each bucket, calculate the threshold as **current + 75% of gap to next bucket** - If calculated total ≤ threshold, stay at current bucket; otherwise, jump to next bucket - If result > 5d (40h) → Split the scope (ticket too large) **Formula**: `threshold = currentBucket + ((nextBucket - currentBucket) × 0.75)` #### Threshold Table | Current Bucket | Next Bucket | Gap | Threshold | Range | | -------------- | ----------- | --- | --------- | --------------------------- | | 0h | 1h | 1h | 0.63h | 0-0.63h → 0h | | 1h | 2h | 1h | 1.63h | 0.64-1.63h → 1h | | 2h | 3h | 1h | 2.63h | 1.64-2.63h → 2h | | 3h | 4h | 1h | 3.63h | 2.64-3.63h → 3h | | 4h | 6h | 2h | 5h | 3.64-5h → 4h | | 6h | 8h | 2h | 7h | 5.01-7h → 6h | | 8h | 12h | 4h | 10h | 7.01-10h → 8h | | 12h | 16h | 4h | 14h | 10.01-14h → 12h | | 16h | 20h | 4h | 18h | 14.01-18h → 16h | | 20h | 24h | 4h | 22h | 18.01-22h → 20h | | 24h | 28h | 4h | 26h | 22.01-26h → 24h | | 28h | 32h | 4h | 30h | 26.01-30h → 28h | | 32h | 36h | 4h | 34h | 30.01-34h → 32h | | 36h | 40h | 4h | 38h | 34.01-38h → 36h | | 40h | - | - | - | 38.01h+ → 40h (split scope) | **Examples**: - **4.07h** → threshold for 4h is 5h → 4.07 ≤ 5 → **stays at 4h** ✓ - **5.5h** → threshold for 4h is 5h → 5.5 > 5 → **jumps to 6h** - **12.59h** → threshold for 12h is 14h → 12.59 ≤ 14 → **stays at 12h** ✓ - **14.5h** → threshold for 12h is 14h → 14.5 > 14 → **jumps to 16h** - **16.5h** → threshold for 16h is 18h → 16.5 ≤ 18 → **stays at 16h** ✓ - **23.2h** → threshold for 20h is 22h → 23.2 > 22 → **jumps to 24h** When presenting estimates, show both: - Calculated total (e.g., 4.07h) - Rounded total (e.g., 4h) - Note: "snapped to bucket (threshold: Xh)" ### Global Settings - Task type definitions and keywords - Complexity factor scoring guides - Complexity weights by task type - T-shirt sizing ranges - Story points mapping - Bucket rounding thresholds (see Bucket Rounding section above) ### Calibration To customize for your team: 1. Start with defaults (monolithic) 2. Track estimated vs actual for 10-20 tickets 3. Adjust phase base times in `heuristics.json` 4. Recalibrate quarterly Example adjustment: ```json { "monolithic": { "workflow_phases": { "planning_design": { "base_minutes_at_complexity_5": 120 } } } } ``` ## Bundled Resources - `heuristics.json` - Complete estimation configuration - `scripts/estimator.py` - Python calculation engine - `references/task-type-classification.md` - Detailed task type guide - `references/complexity-scoring-guide.md` - Factor-by-factor scoring guide - `references/workflow-formulas.md` - Complete formulas and examples ## Example Usage **User**: "Estimate LOOM-4156 for our Laravel monolith" **Agent**: 1. Fetch ticket via MCP 2. Classify as "Bug Fix" (keywords: "fix", "error") 3. Scan repository - find LoginController.php 4. Score complexity: Scope=2, Technical=2, Testing=4, Risk=2, Dependencies=3 5. Execute estimator script 6. Present formatted estimate: ```markdown # Estimate: LOOM-4156 **Project Type**: Monolithic Application **Task Type**: Bug Fix (keywords: "fix", "validation", "error") **T-Shirt Size**: XS **Story Points**: 1 **Complexity**: 3.0/10 → 1.26/10 (scale factor: 0.252) ## Manual Development Time Breakdown | Phase | Time | Details | |-------|------|---------| | 1. Planning & Design | 23 min | Architecture review, edge cases | | 2. Implementation | 16 min | Fix validation logic | | 3. Self Review | 30 min | Review own code before testing | | 4. Testing | 6 min | Unit tests for validation | | 5. Code Review & Revisions | 11 min | Peer review | | 6. Deployment to Test | 25 min | Deploy to test environment | | 7. Verification | 5 min | Smoke test, verify fix | | **Total (calculated)** | **1.93h** | | | **Total (rounded)** | **2h** | Snapped to bucket | ## AI-Assisted Development Time Breakdown | Phase | Time | Details | |-------|------|---------| | 1. AI Planning | 7 min | AI generates fix approach (70% savings) | | 2. AI Implementation | 6 min | AI generates validation fix (65% savings) | | 3. AI Review | 5 min | AI reviews for edge cases | | 4. Human Review & Testing | 8 min | Validate fix, run tests | | 5. Iterations & Vibe Coding | 3 min | Refine if needed | | 6. Deploy to Test | 25 min | Deploy to test environment | | 7. Test Verification | 10 min | Verify fix works | | **Total (calculated)** | **1.15h** | | | **Total (rounded)** | **1h** | Snapped to bucket | ## Time Savings - **Manual Development**: 1.93h → 2h rounded - **AI-Assisted Development**: 1.15h → 1h rounded - **Time Savings**: 1h (50% faster) ``` 7. Track in backlog for calibration ## Estimation Checklist Before calling `estimator.estimate_ticket()`, ensure you have: - [ ] Fetched ticket details (title, description, issue type) - [ ] Classified task type (bug_fix, refactor, enhancement, net_new, spike) - [ ] Scored all 5 complexity factors (1-10 scale) - [ ] **Counted unique files to be modified** (CRITICAL for file_touch_overhead) - [ ] Detected infrastructure changes (boolean) - [ ] Reviewed ticket for manual time adjustments **File Count Sources:** - Files from Grep searches (deduplicated) - Files from Glob patterns (deduplicated) - Test files to be modified - New files to be created - Artisan commands/scripts affected - **Always remove duplicates across searches** **Common mistake**: Forgetting to pass `file_count` parameter results in underestimating manual workflow by 2-5 hours for large refactors! ## Notes - **Estimates are predictive** - refine after reconnaissance - **Both workflows calculated automatically** - choose based on your development approach - **AI-assisted estimates assume**: Effective prompt engineering, experienced with AI tools, quality review process - **Manual time adjustments detected automatically** - use `(+Xh)` or `+Xh` format in ticket content - **File touch overhead is CRITICAL** - always count files during reconnaissance, adds 2.5 min/file to manual workflow - **Track actual vs estimated** by phase and adjustments for calibration - **Adjust `heuristics.json`** based on team historical data - **Use `--update-jira`** to persist story points automatically - **Open-source ready** - all team-specific configs in heuristics.json