Estimates implementation time for web development tasks (frontend and/or backend) by analyzing the existing codebase and calibrating for an AI coding agent as executor — not a human developer. Use when the user asks about effort, sizing, or feasibility: 'how long', 'how much work', 'estimate this', 'what is the effort', 'breakdown this task', 'can we do this in X days', 'is this a big task', 'how complex is', 'what's involved in', 'fits in the sprint', 'rough sizing', 't-shirt size', 'story points'. Also use when the user describes a feature and implicitly wants to know scope — e.g. 'we need to add X to the app', 'thinking about building Y', 'is this feasible by Friday'. Supports batch estimation from any structured source (BMAD output, spec folders, PRDs, backlogs, task lists) — use when the user mentions 'estimate the stories', 'estimate the epic', 'scan the backlog', 'estimate all tasks', 'estimate the specs', or points to a folder of task/story/spec files.
95
94%
Does it follow best practices?
Impact
98%
1.40xAverage score across 5 eval scenarios
Passed
No known issues
We have an internal analytics platform built with Python and FastAPI. The backend serves JSON endpoints for business metrics (revenue, user signups, churn rate) aggregated from a PostgreSQL database. Currently, all data is consumed via API calls by downstream tools — there is no visualization layer in the app itself.
The product team wants to add an interactive dashboard page with charts showing metrics over time (line charts, bar charts), a date range picker for filtering, plan-type filters (free vs paid), and a button to export the currently displayed data as CSV. The frontend is served by FastAPI's Jinja2 templates with plain HTML/CSS and vanilla JavaScript — there is no React, Vue, or any frontend framework. There is no chart library installed.
Produce a complete estimation document and save it to estimate.md. The estimate should cover all work needed to build this dashboard feature, broken into sub-tasks with time estimates calibrated for an AI coding agent.
The following files describe the current state of the project. Extract them before beginning.
=============== FILE: inputs/pyproject.toml =============== [project] name = "analytics-platform" version = "1.4.0" requires-python = ">=3.11" dependencies = [ "fastapi>=0.111.0", "uvicorn>=0.30.0", "sqlalchemy>=2.0.30", "psycopg2-binary>=2.9.9", "pydantic>=2.7.0", "jinja2>=3.1.4", "python-dotenv>=1.0.0", "alembic>=1.13.0", ]
[project.optional-dependencies] dev = [ "pytest>=8.2.0", "httpx>=0.27.0", "ruff>=0.4.0", ]
=============== FILE: inputs/file-tree.txt =============== app/ ├── main.py ├── config.py ├── models/ │ ├── user.py │ ├── subscription.py │ └── event.py ├── routers/ │ ├── auth.py │ ├── metrics.py │ └── admin.py ├── services/ │ ├── analytics.py │ └── export.py ├── templates/ │ ├── base.html │ ├── login.html │ └── admin.html ├── static/ │ ├── css/style.css │ └── js/admin.js tests/ ├── test_metrics.py └── test_auth.py alembic/ └── versions/
=============== FILE: inputs/analytics.py =============== from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.event import Event from app.models.subscription import Subscription from datetime import date
async def get_revenue_by_month(db: AsyncSession, start: date, end: date): query = ( select( func.date_trunc('month', Event.created_at).label('month'), func.sum(Event.amount).label('total') ) .where(Event.type == 'payment') .where(Event.created_at.between(start, end)) .group_by('month') .order_by('month') ) result = await db.execute(query) return result.all()
async def get_signups_by_month(db: AsyncSession, start: date, end: date): query = ( select( func.date_trunc('month', Subscription.created_at).label('month'), func.count().label('count') ) .where(Subscription.created_at.between(start, end)) .group_by('month') .order_by('month') ) result = await db.execute(query) return result.all()
_refs
bin
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5