Authorized testers only
Version: 1.0 | Date: March 30, 2026 | Status: Alpha
System rules and edge cases for testing ChoiceFlow. Each section states the rule, then the edge cases a tester should verify.
How the Business Ownership System's core game loop functions.
Tasks are the PRIMARY source of Business XP. No XP comes from clicking work alone.
| Task Type | Description | Base Target | XP Reward |
|---|---|---|---|
revenue | Generate yearly revenue | £25,000 | 150 × level |
csat | Maintain customer satisfaction | 55% | 100 × level |
sales_units | Sell product units | 100 units | 100 × level |
work_activities | Complete work sessions | 10 | 50 × level |
equipment_condition | Keep equipment above threshold | 70% | 75 × level |
profitable_years | Consecutive profitable years | 1 | 200 × level |
generateYearlyTasks(level, year) — Creates tasks at business founding & yearly refreshupdateTaskProgress(business, metrics) — Updates progress, returns completed tasks & XPgetTaskSummary(business) — Returns { total, completed, inProgress, xpAvailable }Work Activities are player actions, not auto-generated content.
isOpen: true)yearlyWorkActivities countercashcustomerSatisfaction (CSAT)When Age Up occurs and business is OPEN, the full yearly simulation runs.
processYearlyEquipmentDegradation(business, staffWear, seed)calculateEquipmentRevenuePenalty(equipmentList)applyEquipmentPenaltyToRevenue(baseRevenue, equipmentList)Staff contribute passively during yearly simulation.
sales or customer_service skill level (max 100%)year — Game yearunitsSold — Units sold that yearunitsRemaining — Stock left at year endrevenue — Revenue from this productupdateStockHistory(business, year, salesData) — Updates history during simulationgetProductStockHistory(business, productId) — Gets history for displayOpening a business requires a Business Bank Account.
hasBusinessBankAccount(player) — Returns { hasBusinessAccount, account }createBusinessBankAccount(player, bankId, initialDeposit) — Creates accountcanOpenBusiness(player) — Returns { canOpen, reason }| Level | Staff | Equipment | Stores | Features |
|---|---|---|---|---|
| 1 | 3 | 1 | 1 | basic_operations |
| 2 | 5 | 2 | 1 | product_designer |
| 3 | 8 | 3 | 2 | market_research |
| 5 | 18 | 6 | 5 | business_analyst |
| 10 | 100 | 32 | 100 | ipo_eligible |
Player Work Activity
|
v
processWorkActivity()
|
|-- Update yearlyWorkActivities
|-- Update cash
|-- Update CSAT
|-- Degrade equipment
'-- updateTaskProgress()
|
|-- Check task completion
'-- Award XP if completed
|
v
Check level up
Age Up (business OPEN)
|
v
runYearlyBusinessSimulation()
|
|-- calculateStaffContribution()
|-- processYearlyEquipmentDegradation()
|-- Calculate revenue/expenses/profit
|-- Update stock & history
|-- updateTaskProgress()
| |
| '-- Award XP from tasks
|-- Check level up
'-- Generate new tasks for next year
| System | Threshold | Value |
|---|---|---|
| Education | Passing exam score | 60 |
| Education | Expulsion GPA | < 1.0 |
| Education | Full scholarship | 3.8+ GPA |
| Career | Termination performance | 25%-50% (rep-based, default 40%) |
| Career | Interview pass | 60% score |
| Romance | Dating | Level 30+ |
| Romance | Marriage | Level 80+ |
| Romance | NPC breakup (dating) | Level < 0 for 2 years |
| Romance | NPC divorce | Level < -25 for 2 years |
| Crime | Min arrest chance | 5% |
| Crime | Max arrest chance | 75% |
| Crime | Prior conviction multiplier | +25% per prior |
| Health | Death hard cap | Age 130 |
| Energy | Exhausted threshold | <= 40 energy |
| Energy | Power nap daily limit | 2 |
| Housing | Eviction threshold | 3 years unpaid |
| NPC | High death rate age | 85+ (8% per annual check) |
| Events | Year hard cap | 3 events |