{
  "config": {
    "step": {
      "user": {
        "title": "Welcome to TaskMate!",
        "description": "Set up your family chore management system. You can customize the points currency that children will earn.",
        "data": {
          "points_name": "Points Currency Name (e.g., Stars, Coins, Bucks)",
          "points_icon": "Points Icon"
        }
      }
    },
    "error": {
      "name_required": "Name is required"
    },
    "abort": {
      "already_configured": "TaskMate is already configured"
    }
  },
  "selector": {
    "chore_action": {
      "options": {
        "save": "Save Changes",
        "re_enable": "Re-enable Chore",
        "disable": "Disable Chore",
        "delete": "Delete This Chore"
      }
    },
    "reward_action": {
      "options": {
        "save": "Save Changes",
        "delete": "Delete Reward"
      }
    },
    "time_category": {
      "options": {
        "morning": "Morning",
        "afternoon": "Afternoon",
        "evening": "Evening",
        "night": "Night",
        "anytime": "Anytime"
      }
    },
    "schedule_mode": {
      "options": {
        "specific_days": "Specific days of the week",
        "recurring": "Recurring (every N days/weeks/months)",
        "one_shot": "One-time task (single day)"
      }
    },
    "due_days_option": {
      "options": {
        "monday": "Monday",
        "tuesday": "Tuesday",
        "wednesday": "Wednesday",
        "thursday": "Thursday",
        "friday": "Friday",
        "saturday": "Saturday",
        "sunday": "Sunday"
      }
    },
    "recurrence": {
      "options": {
        "every_2_days": "Every 2 days",
        "weekly": "Weekly",
        "every_2_weeks": "Every 2 weeks",
        "monthly": "Monthly",
        "every_3_months": "Every 3 months",
        "every_6_months": "Every 6 months"
      }
    },
    "recurrence_day_option": {
      "options": {
        "monday": "Monday",
        "tuesday": "Tuesday",
        "wednesday": "Wednesday",
        "thursday": "Thursday",
        "friday": "Friday",
        "saturday": "Saturday",
        "sunday": "Sunday",
        "any_day": "Any day"
      }
    },
    "first_occurrence_mode": {
      "options": {
        "available_immediately": "Available immediately",
        "wait_for_first_occurrence": "Wait for first scheduled occurrence"
      }
    },
    "streak_reset_mode": {
      "options": {
        "reset": "Reset — streak goes to 0 on missed day",
        "pause": "Pause — streak preserved until next completion"
      }
    },
    "visibility_operator": {
      "options": {
        "none": "No filter — Always show chore",
        "equals": "Equals — Show when entity state matches exactly",
        "not_equals": "Not Equal — Show when entity state does not match",
        "gte": "Greater than or equal (≥) — Show when numeric value is ≥ target",
        "lte": "Less than or equal (≤) — Show when numeric value is ≤ target",
        "gt": "Greater than (>) — Show when numeric value is > target",
        "lt": "Less than (<) — Show when numeric value is < target"
      }
    },
    "assignment_mode": {
      "options": {
        "everyone": "Everyone — every assigned child sees the chore",
        "alternating": "Alternating — rotate through the assigned children, one per day",
        "random": "Random — pick one assigned child at random each day",
        "balanced": "Balanced — split today's balanced chores evenly across the assigned children",
        "first_come": "First come, first served — first child to complete it wins; it hides for the rest",
        "unassigned": "Unassigned — no child sees this chore"
      }
    },
    "task_group_policy": {
      "options": {
        "sticky": "Sticky — same child for all chores in the group",
        "spread": "Spread — different children across the group today"
      }
    },
    "task_group_action": {
      "options": {
        "save": "Save Changes",
        "delete": "Delete Group"
      }
    }
  },
  "services": {
    "complete_chore": {
      "name": "Complete Chore",
      "description": "Mark a chore as completed by a child",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the chore to complete"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child completing the chore"
        }
      }
    },
    "complete_bonus_subtask": {
      "name": "Complete Bonus Sub-task",
      "description": "Complete a bonus sub-task after the parent chore is done",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the parent chore"
        },
        "bonus_subtask_id": {
          "name": "Bonus Sub-task ID",
          "description": "The ID of the bonus sub-task to complete"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child completing the bonus sub-task"
        }
      }
    },
    "approve_chore": {
      "name": "Approve Chore",
      "description": "Approve a completed chore and award points",
      "fields": {
        "completion_id": {
          "name": "Completion ID",
          "description": "The ID of the chore completion to approve"
        }
      }
    },
    "approve_all_chores": {
      "name": "Approve All Chores",
      "description": "Approve all pending chore completions (or a specific set) and award points",
      "fields": {
        "completion_ids": {
          "name": "Completion IDs",
          "description": "Specific completion IDs to approve; omit to approve all pending"
        }
      }
    },
    "reject_chore": {
      "name": "Reject Chore",
      "description": "Reject a completed chore",
      "fields": {
        "completion_id": {
          "name": "Completion ID",
          "description": "The ID of the chore completion to reject"
        }
      }
    },
    "undo_chore_approval": {
      "name": "Undo Chore Approval",
      "description": "Reverse an accidental chore approval — removes the awarded points and returns the completion to pending so it can be approved again.",
      "fields": {
        "completion_id": {
          "name": "Completion ID",
          "description": "The ID of the approved chore completion to revert to pending"
        }
      }
    },
    "undo_transaction": {
      "name": "Undo Transaction",
      "description": "Reverse a points transaction by its ID — penalties, bonuses, manual add/remove adjustments and gifts (both legs). Automatic transactions (weekend/streak/perfect-week bonuses, pool moves, decay, interest) can't be undone.",
      "fields": {
        "transaction_id": {
          "name": "Transaction ID",
          "description": "The ID of the points transaction to reverse"
        }
      }
    },
    "claim_reward": {
      "name": "Claim Reward",
      "description": "Child claims a reward using their points",
      "fields": {
        "reward_id": {
          "name": "Reward ID",
          "description": "The ID of the reward to claim"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child claiming the reward"
        }
      }
    },
    "approve_reward": {
      "name": "Approve Reward",
      "description": "Approve a reward claim",
      "fields": {
        "claim_id": {
          "name": "Claim ID",
          "description": "The ID of the reward claim to approve"
        }
      }
    },
    "allocate_points_to_pool": {
      "name": "Allocate Points to Pool",
      "description": "Move points from a child's spendable balance into a reward's savings pool (locked).",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child making the allocation"
        },
        "reward_id": {
          "name": "Reward ID",
          "description": "The ID of the reward pool to deposit into"
        },
        "points": {
          "name": "Points",
          "description": "Number of points to allocate (capped at pool capacity and spendable balance)"
        }
      }
    },
    "add_points": {
      "name": "Add Points",
      "description": "Add bonus points to a child",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child to add points to"
        },
        "points": {
          "name": "Points",
          "description": "The number of points to add"
        },
        "reason": {
          "name": "Reason",
          "description": "Optional reason for the bonus"
        }
      }
    },
    "remove_points": {
      "name": "Remove Points",
      "description": "Remove points from a child (penalty)",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child to remove points from"
        },
        "points": {
          "name": "Points",
          "description": "The number of points to remove"
        },
        "reason": {
          "name": "Reason",
          "description": "Optional reason for the penalty"
        }
      }
    },
    "reject_reward": {
      "name": "Reject Reward",
      "description": "Reject a reward claim",
      "fields": {
        "claim_id": {
          "name": "Claim ID",
          "description": "The ID of the reward claim to reject"
        }
      }
    },
    "preview_sound": {
      "name": "Preview Sound",
      "description": "Preview a completion sound effect in the browser",
      "fields": {
        "sound": {
          "name": "Sound",
          "description": "The sound to preview"
        }
      }
    },
    "set_chore_order": {
      "name": "Set Chore Order",
      "description": "Set the display order of chores for a child",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child to set chore order for"
        },
        "chore_order": {
          "name": "Chore Order",
          "description": "Ordered list of chore IDs"
        }
      }
    },
    "add_penalty": {
      "name": "Add Penalty",
      "description": "Create a new penalty definition",
      "fields": {
        "name": {
          "name": "Name",
          "description": "The name of the penalty"
        },
        "points": {
          "name": "Points",
          "description": "The number of points to deduct when applied"
        },
        "description": {
          "name": "Description",
          "description": "Optional description of the penalty"
        },
        "icon": {
          "name": "Icon",
          "description": "MDI icon for the penalty"
        },
        "assigned_to": {
          "name": "Assigned To",
          "description": "List of child IDs this penalty applies to"
        }
      }
    },
    "update_penalty": {
      "name": "Update Penalty",
      "description": "Update an existing penalty definition",
      "fields": {
        "penalty_id": {
          "name": "Penalty ID",
          "description": "The ID of the penalty to update"
        },
        "name": {
          "name": "Name",
          "description": "New name for the penalty"
        },
        "points": {
          "name": "Points",
          "description": "New points value"
        },
        "description": {
          "name": "Description",
          "description": "New description"
        },
        "icon": {
          "name": "Icon",
          "description": "New icon"
        },
        "assigned_to": {
          "name": "Assigned To",
          "description": "New list of child IDs"
        }
      }
    },
    "remove_penalty": {
      "name": "Remove Penalty",
      "description": "Remove a penalty definition",
      "fields": {
        "penalty_id": {
          "name": "Penalty ID",
          "description": "The ID of the penalty to remove"
        }
      }
    },
    "apply_penalty": {
      "name": "Apply Penalty",
      "description": "Apply a penalty to a child, deducting points",
      "fields": {
        "penalty_id": {
          "name": "Penalty ID",
          "description": "The ID of the penalty to apply"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child to apply the penalty to"
        }
      }
    },
    "add_bonus": {
      "name": "Add Bonus",
      "description": "Create a new bonus definition",
      "fields": {
        "name": {
          "name": "Name",
          "description": "The name of the bonus"
        },
        "points": {
          "name": "Points",
          "description": "The number of points to award when applied"
        },
        "description": {
          "name": "Description",
          "description": "Optional description of the bonus"
        },
        "icon": {
          "name": "Icon",
          "description": "MDI icon for the bonus"
        },
        "assigned_to": {
          "name": "Assigned To",
          "description": "List of child IDs this bonus applies to"
        }
      }
    },
    "update_bonus": {
      "name": "Update Bonus",
      "description": "Update an existing bonus definition",
      "fields": {
        "bonus_id": {
          "name": "Bonus ID",
          "description": "The ID of the bonus to update"
        },
        "name": {
          "name": "Name",
          "description": "New name for the bonus"
        },
        "points": {
          "name": "Points",
          "description": "New points value"
        },
        "description": {
          "name": "Description",
          "description": "New description"
        },
        "icon": {
          "name": "Icon",
          "description": "New icon"
        },
        "assigned_to": {
          "name": "Assigned To",
          "description": "New list of child IDs"
        }
      }
    },
    "remove_bonus": {
      "name": "Remove Bonus",
      "description": "Remove a bonus definition",
      "fields": {
        "bonus_id": {
          "name": "Bonus ID",
          "description": "The ID of the bonus to remove"
        }
      }
    },
    "apply_bonus": {
      "name": "Apply Bonus",
      "description": "Apply a bonus to a child, awarding points",
      "fields": {
        "bonus_id": {
          "name": "Bonus ID",
          "description": "The ID of the bonus to apply"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child to apply the bonus to"
        }
      }
    },
    "add_chore": {
      "name": "Add Chore",
      "description": "Create a new chore dynamically, typically from an automation or script",
      "fields": {
        "name": {
          "name": "Name",
          "description": "The name of the chore"
        },
        "description": {
          "name": "Description",
          "description": "Optional description of the chore"
        },
        "points": {
          "name": "Points",
          "description": "Points awarded when this chore is completed"
        },
        "assigned_to": {
          "name": "Assigned To",
          "description": "List of child IDs to assign this chore to. Leave empty to assign to all children"
        },
        "time_category": {
          "name": "Time Category",
          "description": "When this chore should be completed: morning, afternoon, evening, night, or anytime"
        },
        "one_shot": {
          "name": "One-Shot",
          "description": "If true, this is a one-time chore that expires after being completed or at the end of the day"
        },
        "requires_approval": {
          "name": "Requires Approval",
          "description": "If true, a parent must approve the completion before points are awarded"
        }
      }
    },
    "skip_chore": {
      "name": "Skip Chore",
      "description": "Advance today's rotation past the current assignee. Ephemeral — tomorrow's rotation resumes as normal.",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the chore to skip"
        }
      }
    },
    "set_chore_manual_start": {
      "name": "Set Manual Start Child",
      "description": "Set which child starts a rotating chore. For alternating mode this reorders the pool; for random/balanced it only overrides today's assignee.",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the chore to update"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child who should start the rotation"
        }
      }
    },
    "add_task_group": {
      "name": "Add Task Group",
      "description": "Create a task group (sticky = same child, spread = different children).",
      "fields": {
        "name": {
          "name": "Name",
          "description": "Display name for the group"
        },
        "policy": {
          "name": "Policy",
          "description": "sticky (same child) or spread (different children)"
        },
        "chore_ids": {
          "name": "Chore IDs",
          "description": "List of chore IDs in the group. For sticky, the first chore is the leader."
        }
      }
    },
    "update_task_group": {
      "name": "Update Task Group",
      "description": "Update a task group's name, policy, or membership.",
      "fields": {
        "group_id": {
          "name": "Group ID",
          "description": "The ID of the group to update"
        },
        "name": {
          "name": "Name",
          "description": "New display name"
        },
        "policy": {
          "name": "Policy",
          "description": "New policy (sticky or spread)"
        },
        "chore_ids": {
          "name": "Chore IDs",
          "description": "Replacement chore ID list. For sticky, the first chore is the leader."
        }
      }
    },
    "remove_task_group": {
      "name": "Remove Task Group",
      "description": "Delete a task group. Member chores are not affected.",
      "fields": {
        "group_id": {
          "name": "Group ID",
          "description": "The ID of the group to delete"
        }
      }
    },
    "start_timed_task": {
      "name": "Start Timed Task",
      "description": "Start or resume the timer on a timed task",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the timed chore"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child starting the timer"
        }
      }
    },
    "pause_timed_task": {
      "name": "Pause Timed Task",
      "description": "Pause a running timed task timer",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the timed chore"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child pausing the timer"
        }
      }
    },
    "stop_timed_task": {
      "name": "Stop Timed Task",
      "description": "Stop a timed task timer and submit for approval",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the timed chore"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child stopping the timer"
        }
      }
    },
    "add_badge": {
      "name": "Add Badge",
      "description": "Create a custom badge.",
      "fields": {
        "name": {
          "name": "Name",
          "description": "The display name of the badge"
        },
        "description": {
          "name": "Description",
          "description": "Description of how the badge is earned"
        },
        "icon": {
          "name": "Icon",
          "description": "Icon for the badge (e.g. mdi:beach)"
        },
        "tier": {
          "name": "Tier",
          "description": "Badge tier: bronze, silver, gold or platinum"
        },
        "point_bonus": {
          "name": "Point bonus",
          "description": "Points credited to the child when the badge is earned"
        },
        "criteria": {
          "name": "Criteria",
          "description": "List of metric / operator / value dicts. Empty = manual-award only."
        },
        "assigned_to": {
          "name": "Assigned to",
          "description": "List of child IDs (empty = all)"
        },
        "notify_on_earn": {
          "name": "Notify on earn",
          "description": "Send a notification when the badge is earned"
        }
      }
    },
    "update_badge": {
      "name": "Update Badge",
      "description": "Update an existing badge. For built-ins, only point_bonus, tier, assigned_to, enabled, notify_on_earn are editable.",
      "fields": {
        "badge_id": {
          "name": "Badge ID",
          "description": "The ID of the badge to update"
        },
        "name": {
          "name": "Name",
          "description": "New display name of the badge"
        },
        "description": {
          "name": "Description",
          "description": "New description of the badge"
        },
        "icon": {
          "name": "Icon",
          "description": "New icon for the badge"
        },
        "tier": {
          "name": "Tier",
          "description": "Badge tier: bronze, silver, gold or platinum"
        },
        "point_bonus": {
          "name": "Point bonus",
          "description": "Points credited to the child when the badge is earned"
        },
        "criteria": {
          "name": "Criteria",
          "description": "List of metric / operator / value dicts. Empty = manual-award only."
        },
        "assigned_to": {
          "name": "Assigned to",
          "description": "List of child IDs (empty = all)"
        },
        "enabled": {
          "name": "Enabled",
          "description": "Whether the badge is active"
        },
        "notify_on_earn": {
          "name": "Notify on earn",
          "description": "Send a notification when the badge is earned"
        }
      }
    },
    "remove_badge": {
      "name": "Remove Badge",
      "description": "Remove a custom badge. Built-ins cannot be removed.",
      "fields": {
        "badge_id": {
          "name": "Badge ID",
          "description": "The ID of the badge to remove"
        }
      }
    },
    "award_badge_manually": {
      "name": "Award Badge Manually",
      "description": "Manually award a badge to a child.",
      "fields": {
        "badge_id": {
          "name": "Badge ID",
          "description": "The ID of the badge to award"
        },
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child receiving the badge"
        }
      }
    },
    "revoke_badge": {
      "name": "Revoke Badge",
      "description": "Revoke an awarded badge. If a point bonus was credited, it is reversed.",
      "fields": {
        "awarded_badge_id": {
          "name": "Awarded Badge ID",
          "description": "The ID of the awarded badge record to revoke"
        }
      }
    },
    "rebuild_badges": {
      "name": "Rebuild Badges",
      "description": "Re-evaluate all badges across all children silently (no notifications, no point bonuses)."
    },
    "apply_mandatory_penalty": {
      "name": "Apply Mandatory Penalty",
      "description": "Deduct the configured penalty points for a missed mandatory chore and clear the review item.",
      "fields": {
        "miss_id": {
          "name": "Miss ID",
          "description": "The ID of the mandatory-miss review item"
        }
      }
    },
    "choose_avatar": {
      "name": "Choose Avatar",
      "description": "A child switches to an avatar they have unlocked.",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child"
        },
        "icon": {
          "name": "Avatar icon",
          "description": "The mdi icon of an unlocked catalogue avatar (e.g. mdi:rocket-launch)."
        }
      }
    },
    "dismiss_mandatory_chore": {
      "name": "Dismiss Mandatory Chore",
      "description": "Clear a missed mandatory chore review item with no penalty.",
      "fields": {
        "miss_id": {
          "name": "Miss ID",
          "description": "The ID of the mandatory-miss review item"
        }
      }
    },
    "gift_points": {
      "name": "Gift Points",
      "description": "Transfer spendable points from one child to another (parent-controlled).",
      "fields": {
        "from_child_id": {
          "name": "From child ID",
          "description": "The ID of the child sending points"
        },
        "to_child_id": {
          "name": "To child ID",
          "description": "The ID of the child receiving points"
        },
        "points": {
          "name": "Points",
          "description": "The number of points to transfer"
        }
      }
    },
    "postpone_mandatory_chore": {
      "name": "Postpone Mandatory Chore",
      "description": "Give a missed mandatory chore another period (or tomorrow) without a penalty, and clear the review item.",
      "fields": {
        "miss_id": {
          "name": "Miss ID",
          "description": "The ID of the mandatory-miss review item"
        }
      }
    },
    "request_swap": {
      "name": "Request Chore Swap",
      "description": "A child requests to take over today's rotation assignment of a chore (pending parent approval).",
      "fields": {
        "chore_id": {
          "name": "Chore ID",
          "description": "The ID of the chore to take over"
        },
        "requester_id": {
          "name": "Requester child ID",
          "description": "The ID of the child requesting the swap"
        }
      }
    },
    "test_notification": {
      "name": "Test Notification",
      "description": "Send a sample notification of the given type to its enabled recipients (ignores the master on/off so routing can be verified).",
      "fields": {
        "type_id": {
          "name": "Notification type",
          "description": "Notification type id, e.g. pending_chore_approval, badge_earned, streak_milestone"
        }
      }
    },
    "record_allowance_payout": {
      "name": "Record Allowance Payout",
      "description": "Deduct points and record a real-money allowance payout in the ledger (fixed conversion rate; parent-controlled).",
      "fields": {
        "child_id": {
          "name": "Child ID",
          "description": "The ID of the child receiving the payout"
        },
        "points": {
          "name": "Points",
          "description": "Points to convert to cash and deduct"
        }
      }
    }
  },
  "entity": {
    "sensor": {
      "child_stats": {
        "unit_of_measurement": "chores"
      },
      "child_badges": {
        "unit_of_measurement": "badges"
      }
    },
    "number": {
      "weekend_multiplier": {
        "name": "Weekend multiplier"
      },
      "perfect_week_bonus": {
        "name": "Perfect week bonus"
      }
    },
    "select": {
      "streak_reset_mode": {
        "name": "Streak reset mode"
      },
      "card_design": {
        "name": "Card design"
      }
    }
  }
}
