🧠 STATE_MACHINES.md - System State Machines (āļ•āļēāļĢāļēāļ‡āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļĢāļ°āļšāļš)

This document maps out the state transitions, allowed events, invalid operations, and error recovery paths for key SplitDee domain workflows.
āđ€āļ­āļāļŠāļēāļĢāļ‰āļšāļąāļšāļ™āļĩāđ‰āđāļŠāļ”āļ‡āđāļœāļ™āļœāļąāļ‡āļŠāļ–āļēāļ™āļ° āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļ•āļēāļĄāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ āļāļīāļˆāļāļĢāļĢāļĄāļ—āļĩāđˆāļŦāđ‰āļēāļĄāļ—āļģ āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āđāļāđ‰āđ„āļ‚āļ„āļ§āļēāļĄāđ€āļŠāļĩāļĒāļŦāļēāļĒāļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„āļŠāļģāļŦāļĢāļąāļšāļĢāļ°āļšāļšāļ‡āļēāļ™āļŦāļĨāļąāļāļ‚āļ­āļ‡ SplitDee


ðŸ‡đ🇭 āļ āļēāļĐāļēāđ„āļ—āļĒ (āļŠāļģāļŦāļĢāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™)

1. āļ§āļ‡āļˆāļĢāļŠāļĩāļ§āļīāļ•āļšāļīāļĨāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒ (Bill Lifecycle State Machine)

āļ•āļīāļ”āļ•āļēāļĄāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāđˆāļēāļ™āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļšāļīāļĨāļ•āļąāđ‰āļ‡āđāļ•āđˆāļĢāļīāđ€āļĢāļīāđˆāļĄāļŠāļĢāđ‰āļēāļ‡āļˆāļ™āļ–āļķāļ‡āļŠāļģāļĢāļ°āđ€āļ„āļĨāļĩāļĒāļĢāđŒāļĒāļ­āļ”āļ„āļĢāļšāļ–āđ‰āļ§āļ™:

  • āļ āļēāļžāļĢāļ§āļĄāļĨāļģāļ”āļąāļšāļŠāļ–āļēāļ™āļ°: āļĢāđˆāļēāļ‡āļˆāļ” (Draft) ➔ āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™ (Active) ➔ āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ›āļĢāļ°āļĄāļ§āļĨāļ•āļĢāļ§āļˆāļŠāļ­āļš (Processing) ➔ āļŠāļģāļĢāļ°āđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ (Settled) ➔ āļĨāđ‡āļ­āļāļšāļīāļĨāļ–āļēāļ§āļĢ (Locked)
  • āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•:
    • Draft -> Active āđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āļŠāļĢāđ‰āļēāļ‡āļšāļīāļĨāļāļ”āļ›āļļāđˆāļĄāđ€āļœāļĒāđāļžāļĢāđˆ
    • Active -> Processing āđ€āļĄāļ·āđˆāļ­āļĨāļđāļāļŦāļ™āļĩāđ‰āļ„āļ™āđāļĢāļāđ€āļĢāļīāđˆāļĄāļāļ”āļ­āļąāļ›āđ‚āļŦāļĨāļ”āļ āļēāļžāļŦāļĨāļąāļāļāļēāļ™āļāļēāļĢāđ‚āļ­āļ™āđ€āļ‡āļīāļ™āļŠāļĨāļīāļ›
    • Processing -> Settled āđ€āļĄāļ·āđˆāļ­āļĢāļ°āļšāļšāļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļĒāļ·āļ™āļĒāļąāļ™āļœāđˆāļēāļ™āļŠāļĨāļīāļ›āļ‚āļ­āļ‡āļŠāļĄāļēāļŠāļīāļāļ—āļļāļāļ„āļ™āļ„āļĢāļšāļ–āđ‰āļ§āļ™
    • Settled -> Locked āļšāļīāļĨāļˆāļ°āļ–āļđāļāļŠāļąāđˆāļ‡āļĨāđ‡āļ­āļāđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļ–āļēāļ§āļĢāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī 7 āļ§āļąāļ™āļŦāļĨāļąāļ‡āļˆāļēāļāļŠāļģāļĢāļ°āļ„āļĢāļšāđāļĨāđ‰āļ§
  • āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļ—āļĩāđˆāđ„āļĄāđˆāļ­āļ™āļļāļāļēāļ•:
    • Active -> Draft (āđ€āļœāļĒāđāļžāļĢāđˆāđāļĨāđ‰āļ§āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāđ„āļ›āđāļāđ‰āđ„āļ‚āđƒāļ™āļŠāļąāđ‰āļ™āļĢāđˆāļēāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰)
    • Settled -> Active (āļŠāļģāļĢāļ°āļŦāļ™āļĩāđ‰āļ„āļĢāļšāļ–āđ‰āļ§āļ™āđāļĨāđ‰āļ§ āļŠāļąāđˆāļ‡āđ€āļ›āļīāļ”āđ€āļ„āļĨāļĩāļĒāļĢāđŒāđƒāļŦāļĄāđˆāđ„āļĄāđˆāđ„āļ”āđ‰)
  • āđāļ™āļ§āļ—āļēāļ‡āļāļđāđ‰āļŠāļ–āļēāļ™āļ°: āļŦāļēāļāļāļēāļĢāđ€āļŠāđ‡āļāļŠāļĨāļīāļ›āļ–āļđāļāļ›āļāļīāđ€āļŠāļ˜ (āđ€āļŠāđˆāļ™ āļŠāļĨāļīāļ›āļ›āļĨāļ­āļĄāļŦāļĢāļ·āļ­āļĒāļ­āļ”āđ€āļ‡āļīāļ™āđ„āļĄāđˆāļ•āļĢāļ‡) āļĒāļ­āļ”āļŦāļ™āļĩāđ‰āļ‚āļ­āļ‡āļ„āļ™āļ™āļąāđ‰āļ™āļˆāļ°āļ”āļĩāļ”āļāļĨāļąāļšāđ„āļ›āđ€āļ›āđ‡āļ™āļĢāļ­āļŠāļģāļĢāļ° Active āļ—āļąāļ™āļ—āļĩāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļĢāļēāļĒāļāļēāļĢāđ‚āļ­āļ™āļŠāđāļāļ™āđƒāļŦāļĄāđˆ

2. āļŠāļ–āļēāļ™āļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļĨāļīāļ›āļ˜āļ™āļēāļ„āļēāļĢ (Payment Verification State Machine)

āļ„āļ§āļšāļ„āļļāļĄāļŠāļ–āļēāļ™āļ°āļāļēāļĢāđāļŠāļāļ™āļ„āļīāļ§āļ­āļēāļĢāđŒāđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļŠāļĨāļīāļ›āđ‚āļ­āļ™āđ€āļ‡āļīāļ™āļ˜āļ™āļēāļ„āļēāļĢ:

  • āļ āļēāļžāļĢāļ§āļĄāļĨāļģāļ”āļąāļšāļŠāļ–āļēāļ™āļ°: āļ­āļąāļ›āđ‚āļŦāļĨāļ”āļŦāļĨāļąāļāļāļēāļ™ (Pending) ➔ āļāļģāļĨāļąāļ‡āļ•āļĢāļ§āļˆāļŠāđāļāļ™āļ„āļģ (Scanning) ➔ āļŠāđˆāļ‡āļ›āļĢāļ°āđ€āļĄāļīāļ™āļāļąāļšāļ˜āļ™āļēāļ„āļēāļĢ (QueryingBank) ➔ āļŠāļģāđ€āļĢāđ‡āļˆ (Verified) / āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ (Failed)
  • āļāļēāļĢāļāļđāđ‰āļŠāļ–āļēāļ™āļ°āļŦāļĨāļąāļ‡āļĨāđ‰āļĄāđ€āļŦāļĨāļ§: āļŦāļēāļāļĒāļ­āļ”āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™ Failed (āđ€āļŠāđˆāļ™ āļĒāļ­āļ”āđ„āļĄāđˆāļ•āļĢāļ‡āļˆāļĢāļīāļ‡āļŦāļĢāļ·āļ­āļĢāļ°āļšāļšāđāļšāļ‡āļāđŒāļĨāđˆāļĄ) āļĨāļđāļāļŦāļ™āļĩāđ‰āļāļ”āļ›āļļāđˆāļĄāļŠāđˆāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ”āđ‰āļ§āļĒāļĄāļ·āļ­āđ„āļ”āđ‰ (Manual Review) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļāļēāļĢāđŒāļ”āđ€āļ”āđ‰āļ‡āđ„āļ›āļ—āļĩāđˆāļŦāļ™āđ‰āļēāļˆāļ­āđ€āļˆāđ‰āļēāļŦāļ™āļĩāđ‰āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāđ€āļŠāđ‡āļāļĒāļ­āļ”āđāļĨāļ°āļāļ”āļ­āļ™āļļāļĄāļąāļ•āļīāļ”āđ‰āļ§āļĒāļ•āļ™āđ€āļ­āļ‡

3. āļŠāļ–āļēāļ™āļ°āļžāļĨāļąāļ‡āļŠāļĩāļ§āļīāļ•āļŠāļąāļ•āļ§āđŒāđ€āļĨāļĩāđ‰āļĒāļ‡āđ‚āļĄāļˆāļī (Pet Health State Machine)

āļ„āļ§āļšāļ„āļļāļĄāļŠāđ€āļ•āļ•āļąāļŠāļ„āļ§āļēāļĄāļĢāļđāđ‰āļŠāļķāļāđāļĨāļ°āļŠāļļāļ‚āļ āļēāļžāļ‚āļ­āļ‡āļ™āđ‰āļ­āļ‡ Mochi āļ•āļēāļĄāļ™āļīāļŠāļąāļĒāļāļēāļĢāļŠāļģāļĢāļ°āđ€āļ‡āļīāļ™āļ‚āļ­āļ‡āđ€āļžāļ·āđˆāļ­āļ™āļĢāđˆāļ§āļĄāļŦāđ‰āļ­āļ‡:

  • āļ āļēāļžāļĢāļ§āļĄāļĨāļģāļ”āļąāļšāļŠāļ–āļēāļ™āļ°: āđāļ‚āđ‡āļ‡āđāļĢāļ‡āļŦāļĢāļĢāļĐāļē (Healthy) ➔ āļžāļ­āđƒāļˆāļ—āļąāđˆāļ§āđ„āļ› (Content) ➔ āđ€āļĻāļĢāđ‰āļēāļāļąāļ‡āļ§āļĨ (Sad) ➔ āļ›āđˆāļ§āļĒāđ„āļ‚āđ‰ (Sick - āđ€āļĄāļ·āđˆāļ­āļžāļĨāļąāļ‡ HP āļ–āļķāļ‡ 0)
  • āļāļēāļĢāļāļđāđ‰āļžāļĨāļąāļ‡āļŠāļĩāļ§āļīāļ•: āļ™āđ‰āļ­āļ‡āđ‚āļĄāļˆāļīāļˆāļ°āļŦāļēāļĒāļ›āđˆāļ§āļĒāđ„āļ‚āđ‰āļāļĨāļąāļšāļĄāļēāļŸāļ·āđ‰āļ™āļŸāļđāļ•āļēāļĄāđ€āļāļ“āļ‘āđŒāđ€āļ›āđ‡āļ™ Sad āļŦāļĢāļ·āļ­ Healthy āļ•āļēāļĄāļĨāļģāļ”āļąāļš āđ€āļĄāļ·āđˆāļ­āļŠāļĄāļēāļŠāļīāļāđ€āļ„āļĨāļĩāļĒāļĢāđŒāļŦāļ™āļĩāđ‰āļ—āļĩāđˆāļ„āđ‰āļēāļ‡āļŠāļģāđ€āļĢāđ‡āļˆ āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļžāļ­āļĒāļ—āđŒāļāļĨāļļāđˆāļĄāđāļĨāļāļ‚āļ™āļĄāļŸāļĩāļ”āļ›āđ‰āļ­āļ™āđ‚āļĄāļˆāļī

4. āļŠāļ–āļēāļ™āļ°āļ„āļīāļ§āļ‡āļēāļ™ AI āđƒāļ™āļĢāļ°āļšāļšāđ€āļšāļ·āđ‰āļ­āļ‡āļŦāļĨāļąāļ‡ (AI Reminder Job State Machine)

āļšāļąāļ™āļ—āļķāļāļ„āļīāļ§āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ‡āļēāļ™āļ āļēāļžāļĄāļĩāļĄāļ—āļ§āļ‡āđ€āļ‡āļīāļ™āļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™:

  • āļ āļēāļžāļĢāļ§āļĄāļĨāļģāļ”āļąāļšāļŠāļ–āļēāļ™āļ°: āđ€āļ‚āđ‰āļēāļ„āļīāļ§āļĢāļąāļ™āļ‡āļēāļ™ (Queued) ➔ āļāļģāļĨāļąāļ‡āļ›āļĢāļ°āļĄāļ§āļĨ (Running) ➔ āļˆāļąāļ”āļŠāđˆāļ‡āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™ (Success) / āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ (Failed)
  • āđāļœāļ™āļāļđāđ‰āļ„āļ·āļ™āļ‡āļēāļ™āļĨāđ‰āļĄāđ€āļŦāļĨāļ§: āļĢāļ°āļšāļšāļĨāļ­āļ‡āļŠāđˆāļ‡āđƒāļŦāļĄāđˆāđāļšāļš Retry āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī 3 āļ„āļĢāļąāđ‰āļ‡ āļŦāļēāļāļĒāļąāļ‡āļžāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ„āļĨāļēāļ§āļ”āđŒāļˆāļ°āđ‚āļ­āļ™āđ€āļ‚āđ‰āļēāļ„āļīāļ§āļ„āđ‰āļēāļ‡āļĢāļąāļ™āđ€āļžāļ·āđˆāļ­āđ€āļŠāđ‡āļāļŠāļ„āļĢāļīāļ›āļ•āđŒ (DLQ)

5. āļŠāļ–āļēāļ™āļ°āļ­āļēāļĒāļļāđ€āļ‹āļŠāļŠāļąāļ™āļāļēāļĢāļĨāđ‡āļ­āļāļ­āļīāļ™ (User Session State Machine)

āļšāļĢāļīāļŦāļēāļĢāļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļ™āđāļĨāļ°āļ­āļēāļĒāļļāļāļēāļĢāđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĢāļ°āļšāļš:

  • āļ āļēāļžāļĢāļ§āļĄāļĨāļģāļ”āļąāļšāļŠāļ–āļēāļ™āļ°: āļĒāļąāļ‡āđ„āļĄāđˆāđ„āļ”āđ‰āļĨāđ‡āļ­āļāļ­āļīāļ™ (Unauthenticated) ➔ āļĨāđ‡āļ­āļāļ­āļīāļ™āļĒāļ·āļ™āļĒāļąāļ™āļ•āļ™āļŠāļģāđ€āļĢāđ‡āļˆ (Authenticated) ➔ āđ‚āļ—āđ€āļ„āđ‡āļ™āļŦāļĄāļ”āļ­āļēāļĒāļļāđƒāļ™ 15 āļ™āļēāļ—āļĩ (Expired) ➔ āļŠāļĨāļąāļšāļŦāļĄāļļāļ™āđ‚āļ—āđ€āļ„āđ‡āļ™āļ­āļ­āđ‚āļ•āđ‰āļ”āđ‰āļ§āļĒ Refresh Token ➔ āļŦāļĨāļļāļ”āļĨāđ‡āļ­āļāļ­āļīāļ™āļ­āļ­āļāļˆāļēāļāļĢāļ°āļšāļš (Logout)

🇎🇧 English (For AI Agents)

1. Bill Lifecycle State Machine

  • Allowed Transitions:
    • Draft -> Active when the creator clicks “Publish”.
    • Active -> Processing when a debtor submits a payment slip.
    • Processing -> Settled when all shares are verified as paid.
    • Settled -> Locked automatically 7 days after settlement.
  • Invalid Transitions:
    • Active -> Draft (cannot un-publish).
    • Settled -> Active (cannot re-open settled bills).
  • Recovery Paths: If a payment is invalid, the share transitions back to Active (unpaid) to allow the user to retry.

2. Payment Verification State Machine

  • Allowed Transitions:
    • Pending -> Scanning -> QueryingBank -> Verified (Normal flow).
    • QueryingBank -> Failed on bank service failure or data mismatch.
  • Invalid Transitions:
    • Failed -> Verified (without creator’s explicit manual override).
  • Recovery Paths: If the bank API goes offline, the transaction is marked Failed but moves to ManualReview so the creditor can check their bank statement manually.

3. Pet Health State Machine

  • Allowed Transitions:
    • Healthy -> Sad -> Sick based on the elapsed time of overdue shares.
    • Sick -> Sad -> Healthy as debts are cleared or XP is spent.
  • Invalid Transitions:
    • Sick -> Healthy directly (must pass through recovery thresholds).

4. AI Reminder Job State Machine

  • Allowed Transitions:
    • Failed -> Queued up to 3 times.
    • Failed -> DLQ after max retries are exhausted.
  • Invalid Transitions:
    • Success -> Failed.
  • Recovery Paths: If generating a custom meme fails, the job falls back to sending a standard Polite notification.

5. User Session State Machine

  • Allowed Transitions:
    • Unauthenticated -> Authenticated via login/signup.
    • Authenticated -> Expired after access token age exceeds 15 minutes.
    • Expired -> Authenticated via silent refresh token rotation.
    • Expired -> Unauthenticated if refresh token is expired or revoked.
    • Authenticated -> Unauthenticated via logout.