skills/szkocot/skills/project-estimation

project-estimation

SKILL.md

Project Estimation Guide

Overview

This skill helps create accurate software development estimates by systematically breaking down projects into estimable tasks and assigning effort by role. Output can be delivered as Excel spreadsheets using the xlsx skill, and tasks can be pushed directly to Jira to create a project backlog.

Estimation Workflow

Step 1: Clarify Project Scope

ALWAYS ask the user about project maturity level before estimating:

Level Description Multiplier
PoC Proof of Concept - minimal viable functionality, no production concerns 0.3-0.5x
MVP Minimum Viable Product - core features, basic quality, limited scale 0.6-0.8x
Production Full production - complete features, security, scalability, monitoring 1.0x

Key questions to ask:

  • Is this PoC, MVP, or production-ready system?
  • What are the non-functional requirements (users, load, compliance)?
  • Are there existing systems to integrate with?
  • What is the team's familiarity with the tech stack?
  • Are there hard deadlines or constraints?

Step 2: Hierarchical Task Breakdown

Break down from high-level to lowest estimable units (1-3 days max per task).

Level 0: Project
└── Level 1: Epic/Module
    └── Level 2: Feature
        └── Level 3: Task
            └── Level 4: Subtask (if needed)

Example breakdown:

E-commerce Platform
├── User Management (Epic)
│   ├── Registration (Feature)
│   │   ├── Registration form UI (Task) - FE: 1.5d
│   │   ├── Email verification API (Task) - BE: 1d
│   │   ├── Email templates (Task) - BE: 0.5d
│   │   └── Registration tests (Task) - QA: 1d
│   ├── Authentication (Feature)
│   │   ├── Login/logout UI (Task) - FE: 1d
│   │   ├── JWT auth endpoints (Task) - BE: 1.5d
│   │   ├── Password reset flow (Task) - BE: 1.5d, FE: 1d
│   │   └── Auth tests (Task) - QA: 1.5d
│   └── User Profile (Feature)
│       └── ...
├── Product Catalog (Epic)
│   └── ...
└── Checkout (Epic)
    └── ...

Step 3: Assign Effort by Role

Standard roles and responsibilities:

Role Code Responsibilities
Backend Engineer BE APIs, business logic, database, integrations
Frontend Engineer FE UI components, state management, UX implementation
AI/ML Engineer AI Model development, training, inference pipelines
QA Engineer QA Test planning, automation, manual testing
DevOps Engineer DevOps Infrastructure, CI/CD, monitoring, deployment
Project Manager PM Coordination, documentation, stakeholder communication
Designer Design UI/UX design, prototypes, design system
Tech Lead TL Architecture, code review, technical decisions

Step 4: Apply Risk Factors

Risk Factor Multiplier
New technology for team 1.3-1.5x
Unclear requirements 1.2-1.5x
External API dependencies 1.2-1.4x
Legacy system integration 1.3-1.6x
Tight deadline 1.2-1.4x
Distributed team 1.1-1.3x

Step 5: Add Contingency Buffer

Confidence Level Buffer
High (clear scope, known tech) 10-15%
Medium (some unknowns) 20-30%
Low (many unknowns) 30-50%

Baseline Estimates by Component

Frontend Components

Component FE Effort Notes
Simple page 0.5-1d Static content
Form (simple) 1-2d 3-5 fields, basic validation
Form (complex) 3-5d Multi-step, conditional logic
Data table 2-4d Sort, filter, pagination
Dashboard 3-5d Multiple widgets
Admin panel 5-10d CRUD operations, filters

Backend Components

Component BE Effort Notes
CRUD endpoint 0.5-1d Standard operations
Complex endpoint 1-3d Business logic, validation
Third-party integration 2-5d Per API
Background job 1-3d With retry logic
Auth system 3-5d JWT, sessions, permissions

AI/ML Components

Component AI Effort Notes
LLM integration 2-4d Prompt engineering, API setup
RAG pipeline 5-10d Embeddings, vector DB, retrieval
Custom model training 10-20d Data prep, training, evaluation
ML inference API 3-5d Model serving, optimization

QA Effort Guidelines

Coverage QA Multiplier
Minimal (smoke tests) 0.1x of dev
Standard (core flows) 0.2-0.3x of dev
Comprehensive 0.4-0.5x of dev
Critical system 0.5-0.7x of dev

PM/Coordination Overhead

Project Size PM Overhead
Small (<1 month) 10-15%
Medium (1-3 months) 15-20%
Large (3+ months) 20-25%

Output Format

Excel Spreadsheet (Recommended)

Use the xlsx skill to create estimates in Excel format with:

Sheet 1: Summary

Role Days Rate Cost
BE 45 $X $Y
FE 30 $X $Y
QA 15 $X $Y
Total 90 $Z

Sheet 2: Detailed Breakdown

Epic Feature Task BE FE AI QA DevOps PM Total
User Mgmt Registration Form UI - 1.5 - - - - 1.5
User Mgmt Registration API 1 - - - - - 1
User Mgmt Registration Tests - - - 1 - - 1

Sheet 3: Assumptions & Risks

  • Document all assumptions made
  • List identified risks with mitigation strategies
  • Note excluded items

Markdown Table (Quick Estimates)

## Estimate Summary

| Phase | BE | FE | QA | DevOps | PM | Total |
|-------|----|----|----|----|-----|-------|
| Phase 1 | 20d | 15d | 8d | 5d | 5d | 53d |
| Phase 2 | 15d | 10d | 6d | 3d | 4d | 38d |
| Buffer (20%) | | | | | | 18d |
| **Total** | **35d** | **25d** | **14d** | **8d** | **9d** | **109d** |

Common Pitfalls to Avoid

Underestimation causes:

  • Forgetting testing, code review, deployment time
  • Not accounting for meetings (add 10-20%)
  • Missing error handling and edge cases
  • Ignoring documentation needs
  • Assuming ideal conditions

Items often forgotten:

  • Authentication and authorization
  • Error handling and logging
  • Data migration
  • Environment setup
  • API documentation
  • Security hardening
  • Performance optimization
  • Monitoring and alerting

Quick Reference

T-Shirt to Days Conversion

Size PoC MVP Production
XS 0.25d 0.5d 1d
S 0.5d 1d 2d
M 1d 2-3d 4-5d
L 2d 4-5d 8-10d
XL 3-5d 8-10d 15-20d

Story Points to Days (per developer)

Points Days
1 0.25-0.5
2 0.5-1
3 1-2
5 2-3
8 3-5
13 5-8

Jira Integration

Push estimated tasks directly to Jira to create a project backlog.

Prerequisites

Before pushing to Jira, gather from the user:

  1. Jira instance URL (e.g., https://company.atlassian.net)
  2. Project key (e.g., PROJ)
  3. API token - user can generate at https://id.atlassian.com/manage-profile/security/api-tokens
  4. Email associated with the Jira account

Task to Jira Mapping

Estimation Level Jira Issue Type
Epic Epic
Feature Story
Task Task or Sub-task
Subtask Sub-task

Field Mapping

Estimate Field Jira Field
Epic name Epic Name (custom field)
Feature/Task name Summary
Description Description
Total effort (days) Original Estimate (convert to hours: days × 8)
Role assignments Labels or custom field
Story points Story Points (if using points)

Push to Jira Workflow

Step 1: Confirm with user

Before pushing to Jira, confirm:
- Jira URL: [user provides]
- Project key: [user provides]
- Create Epics? (yes/no)
- Estimate format: (days/hours/story points)

Step 2: Create issues via API

Use bash with curl to create issues. First, set up authentication:

# Store credentials (ask user for these values)
JIRA_URL="https://company.atlassian.net"
JIRA_EMAIL="user@company.com"
JIRA_TOKEN="your-api-token"
PROJECT_KEY="PROJ"

Create an Epic:

curl -X POST "$JIRA_URL/rest/api/3/issue" \
  -H "Content-Type: application/json" \
  -u "$JIRA_EMAIL:$JIRA_TOKEN" \
  -d '{
    "fields": {
      "project": {"key": "'"$PROJECT_KEY"'"},
      "summary": "User Management",
      "issuetype": {"name": "Epic"},
      "description": {
        "type": "doc",
        "version": 1,
        "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Epic for user management features"}]}]
      }
    }
  }'

Create a Story linked to Epic:

curl -X POST "$JIRA_URL/rest/api/3/issue" \
  -H "Content-Type: application/json" \
  -u "$JIRA_EMAIL:$JIRA_TOKEN" \
  -d '{
    "fields": {
      "project": {"key": "'"$PROJECT_KEY"'"},
      "summary": "User Registration",
      "issuetype": {"name": "Story"},
      "parent": {"key": "PROJ-1"},
      "description": {
        "type": "doc",
        "version": 1,
        "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Implement user registration flow"}]}]
      },
      "timetracking": {
        "originalEstimate": "24h"
      },
      "labels": ["BE", "FE", "QA"]
    }
  }'

Create a Task/Sub-task:

curl -X POST "$JIRA_URL/rest/api/3/issue" \
  -H "Content-Type: application/json" \
  -u "$JIRA_EMAIL:$JIRA_TOKEN" \
  -d '{
    "fields": {
      "project": {"key": "'"$PROJECT_KEY"'"},
      "summary": "Registration form UI",
      "issuetype": {"name": "Sub-task"},
      "parent": {"key": "PROJ-2"},
      "timetracking": {
        "originalEstimate": "12h"
      },
      "labels": ["FE"]
    }
  }'

Batch Creation Script

For large estimates, generate a bash script that creates all issues:

#!/bin/bash
# Auto-generated Jira import script

JIRA_URL="https://company.atlassian.net"
JIRA_EMAIL="$JIRA_EMAIL"
JIRA_TOKEN="$JIRA_TOKEN"
PROJECT_KEY="PROJ"

create_issue() {
  local json="$1"
  response=$(curl -s -X POST "$JIRA_URL/rest/api/3/issue" \
    -H "Content-Type: application/json" \
    -u "$JIRA_EMAIL:$JIRA_TOKEN" \
    -d "$json")
  echo "$response" | grep -o '"key":"[^"]*"' | cut -d'"' -f4
}

# Create Epics first, capture keys
echo "Creating Epics..."
EPIC_USER_MGMT=$(create_issue '{"fields":{"project":{"key":"'"$PROJECT_KEY"'"},"summary":"User Management","issuetype":{"name":"Epic"}}}')
echo "Created: $EPIC_USER_MGMT"

# Create Stories under Epics
echo "Creating Stories..."
STORY_REGISTRATION=$(create_issue '{"fields":{"project":{"key":"'"$PROJECT_KEY"'"},"summary":"User Registration","issuetype":{"name":"Story"},"parent":{"key":"'"$EPIC_USER_MGMT"'"},"timetracking":{"originalEstimate":"24h"}}}')
echo "Created: $STORY_REGISTRATION"

# Create Sub-tasks under Stories
echo "Creating Tasks..."
create_issue '{"fields":{"project":{"key":"'"$PROJECT_KEY"'"},"summary":"Registration form UI","issuetype":{"name":"Sub-task"},"parent":{"key":"'"$STORY_REGISTRATION"'"},"timetracking":{"originalEstimate":"12h"},"labels":["FE"]}}'

echo "Done!"

CSV Export for Jira Import

Alternatively, create a CSV file for Jira's CSV import feature:

Summary,Issue Type,Parent,Description,Original Estimate,Labels
User Management,Epic,,"Epic for user management features",,
User Registration,Story,User Management,"Implement user registration",24h,"BE,FE,QA"
Registration form UI,Sub-task,User Registration,"Build the registration form",12h,FE
Email verification API,Sub-task,User Registration,"API endpoint for email verification",8h,BE
Registration tests,Sub-task,User Registration,"Write tests for registration",8h,QA

CSV Import Steps:

  1. Go to Jira > Project Settings > External System Import
  2. Select "CSV"
  3. Upload the CSV file
  4. Map columns to Jira fields
  5. Review and import

Estimate to Hours Conversion

When pushing to Jira, convert days to hours:

Days Hours (8h/day)
0.25 2h
0.5 4h
1 8h
1.5 12h
2 16h
3 24h
5 40h

Jira Custom Fields

Common custom fields that may need configuration:

Field API Field Name Notes
Story Points customfield_10016 ID varies by instance
Epic Link customfield_10014 For older Jira versions
Sprint customfield_10020 ID varies by instance

To find custom field IDs for a project:

curl -s "$JIRA_URL/rest/api/3/field" \
  -u "$JIRA_EMAIL:$JIRA_TOKEN" | jq '.[] | {name, id}'

Error Handling

Common issues when pushing to Jira:

Error Cause Solution
401 Unauthorized Invalid credentials Verify email and API token
400 Bad Request Invalid field values Check issue type names, project key
403 Forbidden Insufficient permissions User needs project write access
Field not found Custom field ID wrong Look up correct field ID

Jira Cloud vs Server

The API examples above use Jira Cloud (Atlassian Document Format for descriptions). For Jira Server/Data Center:

# Jira Server uses plain text descriptions
curl -X POST "$JIRA_URL/rest/api/2/issue" \
  -H "Content-Type: application/json" \
  -u "$JIRA_EMAIL:$JIRA_TOKEN" \
  -d '{
    "fields": {
      "project": {"key": "'"$PROJECT_KEY"'"},
      "summary": "Task name",
      "issuetype": {"name": "Task"},
      "description": "Plain text description here"
    }
  }'
Weekly Installs
3
Repository
szkocot/skills
First Seen
Jan 28, 2026
Installed on
cursor3
mcpjam2
roo2
gemini-cli2
junie2
windsurf2