budget
Token-based budget management for task scheduling
Capacity planning system using token budgets. Define token types (deep work, admin, social), allocate tokens per period (day/week), and schedule tasks by reserving tokens. Supports rollover policies, debt/borrowing, and automatic rebalancing. Integrates with Todos component for task references.
2
Ports
10
Schemas
0
Hooks
17
Events
01
Ports
02
Schemas
03
Hooks
No hooks declared
04
Events
- TokenTypeCreated v1
- TokenTypeUpdated v1
- TokenTypeDeleted v1
- BudgetPlanCreated v1
- BudgetPlanUpdated v1
- BudgetGranted v1
- TaskScheduled v1
- TaskUnscheduled v1
- TaskRescheduled v1
- BudgetSpent v1
- BudgetBorrowed v1
- DebtRepaid v1
- DebtForgiven v1
- TaskSplit v1
- BudgetRolledOver v1
- BudgetAutoBalanced v1
- TransactionRecorded v1
05
Stories
06
Examples
from uuid import uuid4
from datetime import date
from psp.components.budget.application.use_cases import ScheduleTask
from psp.components.budget.domain import Period, PeriodType, TaskCost
from psp.platform.clock import SystemClock
from psp.platform.eventbus import InMemoryEventBus
# Wire dependencies
schedule_task = ScheduleTask(
scheduled_task_repo=scheduled_task_repo,
budget_plan_repo=budget_plan_repo,
ledger_repo=ledger_repo,
clock=SystemClock(),
event_bus=InMemoryEventBus(),
)
# Schedule task for today
result = schedule_task.execute(
task_id=task_id,
owner_id=current_user_id,
period=Period.today(PeriodType.DAY),
cost=TaskCost(costs={deep_work_token_id: 2}),
)
print(f"Scheduled: {result.scheduled_task_id}")
Use ScheduleTask use case to reserve budget for a task.
from psp.components.budget.application.use_cases import CheckBudget
from psp.components.budget.domain import Period, PeriodType, TaskCost
check = CheckBudget(
budget_plan_repo=budget_plan_repo,
scheduled_task_repo=scheduled_task_repo,
ledger_repo=ledger_repo,
)
result = check.execute(
owner_id=current_user_id,
period=Period.today(PeriodType.DAY),
cost=TaskCost(costs={deep_work_token_id: 3}),
)
if result.can_schedule:
print("Budget available!")
else:
print(f"Over budget by: {result.shortfall}")
Use CheckBudget to see if a task can be scheduled.
from psp.components.budget.application.use_cases import GetPeriodSnapshot
from psp.components.budget.domain import Period, PeriodType
get_snapshot = GetPeriodSnapshot(
budget_plan_repo=budget_plan_repo,
scheduled_task_repo=scheduled_task_repo,
ledger_repo=ledger_repo,
)
snapshot = get_snapshot.execute(
owner_id=current_user_id,
period=Period.today(PeriodType.DAY),
)
for token_id, remaining in snapshot.remaining.items():
print(f"Token {token_id}: {remaining} remaining")
View budget status for a period.
API Reference
This component mounts routes under /v1/budget.
View OpenAPI specification