@blackbelt-technology/pi-dashboard-cost-estimator
Software cost & effort estimation from use cases, functional and non-functional requirements and a tech stack. Sizes with Use Case Points + COCOMO II scale, routes NFRs to derived scope or a residual multiplier, distributes effort across 11 roles, compare
Package details
Install @blackbelt-technology/pi-dashboard-cost-estimator from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@blackbelt-technology/pi-dashboard-cost-estimator- Package
@blackbelt-technology/pi-dashboard-cost-estimator- Version
0.8.0- Published
- Aug 26, 2026
- Downloads
- 195/mo · 58/wk
- Author
- mbotond
- License
- MIT
- Types
- skill
- Size
- 230.3 KB
- Dependencies
- 3 dependencies · 1 peer
Pi manifest JSON
{
"skills": [
".pi/skills/software-cost-estimator"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@blackbelt-technology/pi-dashboard-cost-estimator
Estimate software cost and effort from use cases, functional and non-functional requirements, and a technology stack — then calibrate the model against what actually happened, using real pi session telemetry.
Ships three things:
- A skill (
.pi/skills/software-cost-estimator) — the workflow, references and rules the agent follows when producing an estimate. - A zero-dependency engine (
src/engine/) — the arithmetic, so the numbers are reproducible and auditable rather than model-generated. - A dashboard plugin (
src/client/,src/server/) — measured steering hours, agent cost and subscription leverage per project.
Why the split matters
The LLM does judgment: decomposing use cases, counting transactions, rating TCF/ECF factors, routing NFRs, classifying which work AI is actually good at.
The engine does arithmetic: UCP → COCOMO II scale → role distribution → four delivery modes → Monte Carlo → NPV.
That separation is what makes an estimate defensible to a client. Every number has a derivation someone can check.
Quick start
# estimate
node bin/estimate.mjs input.yaml --out ./out
# calibrate scope productivity from a delivered project
node bin/calibrate.mjs input.yaml --actual-days 479 --exclude-contingency
# calibrate agent cost + steering time from real session telemetry
node bin/calibrate-sessions.mjs --plans
node bin/calibrate-sessions.mjs --plan anthropic-max-20x --seats 2
node bin/calibrate-sessions.mjs --project my-repo --actual-days 120
Outputs: estimate-report.md, delivery-mode-comparison.md, business-case.md,
estimate.xlsx.
The four delivery modes
| Mode | Who writes the code |
|---|---|
human_only |
People, no assistance |
human_with_ai |
People with inline assistance |
ai_steered_human_supervised |
Agents, steered and reviewed by a person |
agentic_hitl |
Agents, with human-in-the-loop oversight at an intensity level |
AI compresses build effort only (~60% of a project). PM, client iteration, compliance, manual QA and security sign-off do not shrink because a model writes the code. That single constraint is why "AI is 10× faster" collapses into single-digit project savings.
Cost basis: subscription vs metered
Session logs record a metered API-price computation. Most teams do not pay that — they buy flat seat plans. The two bases have different shapes:
| Metered | Subscription | |
|---|---|---|
| Cost scales with | work volume | seats × calendar months |
| Marginal cost of more agent use | linear | zero, until quota |
| Overrun risk lands on | cost | schedule (throttling) |
So under a subscription, schedule is a cost driver and quota exhaustion is a schedule
risk, not a cost overrun. Set ai.cost_basis: subscription and list your seat plans.
Leverage (meter-equivalent ÷ seat cost) is reported as leverage — never as a saving passed to a client. It is on-demand value the flat plan captured, not a discount.
Dependency split (load-bearing)
| Layer | Dependencies |
|---|---|
src/engine/ |
none — hand-rolled YAML parser, Monte Carlo, XLSX writer |
src/telemetry/ |
pi-dashboard-shared, pi-dashboard-session-distiller |
The engine must run in any project with no dashboard installed. Only the telemetry adapter
touches the session store, and it reads through the dashboard's own readers so a
session-schema change lands in one place. If engine code imports from telemetry/,
portability is gone.
Dashboard plugin
| Slot | Component | Purpose |
|---|---|---|
command-route |
CostView |
cost command → steering hours, meter-equivalent, actual subscription cost, leverage, per-project table |
settings-section |
CostSettings |
Seat plan, seat count, break threshold |
Server route: GET /api/cost-estimator/telemetry (read-only, 60s cache).
No content-view claim. forSession() keeps every predicate-less claim, so an
unpredicated content-view claim replaces ChatView for every session, always,
with no chrome to dismiss it. CostView is a global report — the cost
command-route is its entry point.
Tests
npx vitest run packages/cost-estimator # from the monorepo root
43 tests covering the published formulas (Karner's worked example, COCOMO II.2000 constants, Beta-PERT), the NFR double-counting guard, the correlated-risk shape, the subscription cost basis, and the gap-capping rule.
License
MIT