Bin Buddy
📊 View as Living Diagram →Trust-first trash and recycle bin movement service. W-2 employee drivers, before-and-after photo proof of every movement, recurring billing, and a back-office that runs the operation from one screen — Scottsdale launch, designed to scale.
How to use Bin Buddy
Trust-first trash and recycle bin movement service. W-2 employee drivers, before-and-after photo proof of every movement, recurring billing, and a back-office that runs the operation from one screen — Scottsdale launch, designed to scale.
-
1
Register as System — Cascade target of AuthIdentityCreated — attach a bin-buddy role to an existing AuthIdentity. The route handler / PM that orchestrates signup dispatches AuthIdentity.SignUp first, then this once the identity exists. → Account Registered
Account
-
2
Change Role as Owner — Promote or demote an Account between roles. Audit-logged via AuditLog (i94). → Account Role Changed
Account
-
3
Request as Customer — Customer adds a Royalty service from the homeowner portal. Charges through Stripe ; on success the AddOn lands here and a ServiceTask is generated. → Add On Requested
Add On
-
4
Complete as System — ServiceTask the AddOn produced was completed — close the AddOn so it stops generating new tasks (one_time only). → Add On Completed
Add On
-
5
Cancel as Admin — Cancel a recurring AddOn (monthly bin cleaning). Customer or admin can dispatch. → Add On Canceled
Add On
-
6
Set Inventory as Customer — Captured during signup — customer declares how many trash and recycle bins they have and where they're stored. Defaults to 1 of each if customer doesn't specify. → Bin Inventory Set
Bin Inventory
-
7
Update Bin Count as Admin — Adjust the bin count — used when a driver reports extra unregistered bins, or the customer adds bins themselves and asks for the account update. → Bin Count Updated
Bin Inventory
-
8
Add Extra Bin as Admin — Increment extra_bin_count when an extra bin lives at the property beyond the plan baseline. Triggers the Royalty add-on flow (i91) for monthly billing. → Extra Bin Added
Bin Inventory
-
9
Update Storage Location as Customer — Customer updates where the bins live (e.g. moved them from the side of the garage to behind the gate). Driver app reads this on every stop. → Storage Location Updated
Bin Inventory
-
10
Refresh as System — Pull the latest published schedule from the city's open-data source and replace the cached row for this street range. Triggered weekly by a scheduled cadence ; the :city_schedule adapter handles the per-city HTTP fetch and normalization. → City Calendar Refreshed
City Calendar
-
11
Lookup By Address as Public — Signup-time lookup : given an address line and zip, return the trash and recycle days for the matching street range. The :city_schedule adapter intercepts and routes to the per-city backend ; on hit it cascades into ServiceAddress.UpdatePickupDays. Miss falls through to the manual day picker. → City Calendar Looked Up
City Calendar
-
12
Create Customer as System — Register a customer record at the payment processor. Tonight (i83 walking skeleton) the application service composition is imperative in the worker route handler ; once i268 lands, the runtime walks the hecksagon binding → :stripe family → framework/providers/stripe.hecksagon's create_customer endpoint and the dispatch chain runs declaratively. → Processor Customer Created
Credit Card Processing
-
13
Attach Payment Method as System — Link a tokenized payment method (from the frontend Stripe Elements form, never raw card data) to the processor customer. → Processor Payment Method Attached
Credit Card Processing
-
14
Create Subscription as System — Start a recurring charge schedule. Returns the processor's subscription id which lands on the Subscription aggregate (when ServiceAddress + Plan flows ship to give Subscription.Subscribe its required cross-references). → Processor Subscription Created
Credit Card Processing
-
15
Register Customer as Public — Create a Customer profile during the homeowner-portal signup flow. Dispatches after Account.Register lands so the account_email is known. The CustomerSignup application service supplies stripe_customer_id after the CreditCardProcessing.CreateCustomer operation lands ; Stripe sub_… ids land on Subscription records (which are identified_by sub_…) — a Customer can have many Subscriptions but one Stripe customer. → Customer Registered
Customer
-
16
Update Contact as Self — Customer updates their own contact info from the homeowner portal. Admin can also do this from the admin portal on the customer's behalf. → Customer Contact Updated
Customer
-
17
Add Note as Support — Append a back-office note to the customer record (e.g. 'prefers driver to use side gate', 'past dispute resolved'). → Customer Note Added
Customer
-
18
Submit as Public — Applicant fills out the form on the driver portal (i47) and submits. Captures contact + DL info ; the PM picks up from here. → Driver Application Submitted
Driver Application
-
19
Request Background Check as Admin — Admin (or V2 adapter) starts the background check. V1.1 ships with admin manually clicking after they've initiated the off-system check. → Background Check Requested
Driver Application
-
20
Approve as Admin — Background check passed ; admin approves the applicant. The PM cascades AuthIdentity.SignUp → Account.Register with role=driver (i264 split). → Driver Approved
Driver Application
-
21
Reject as Admin — Disqualifier surfaced ; reject the applicant with reason. Terminal. → Driver Rejected
Driver Application
-
22
Mark Active as System — Account.Register completed (cascade from Approve via AuthIdentity ; i264) ; the application moves to active. Terminal happy state. → Driver Activated
Driver Application
-
23
Send Sms as System — Send an SMS message via the configured :sms provider (Twilio today). The hecksagon binding resolves the call ; the provider's message SID lands on the SmsSent event for audit + delivery tracing. → Sms Sent
Notifications
-
24
Send Email as System — Send an email via the configured :email provider (Resend today). The hecksagon binding resolves the call ; the provider's message id lands on the EmailSent event for audit + delivery tracing. Mirrors the SendSms surface : domain code carries just to + subject + body, the world's resend block + the framework provider hecksagon handle credentials and HTTP shape. → Email Sent
Notifications
-
25
Send Welcome Email as System — Send the homeowner welcome email — fires from the WelcomeOnRegister policy after Account.Register. The :email adapter (Resend) composes subject + body from the welcome template and delivers ; EmailSent records the provider's response id. → Welcome Email Sent
Notifications
-
26
Send Route Assignment Pending as System — Send the 'we're currently assigning your route' email — fires from the RouteAssigningOnSubscribe policy after Subscription.Subscribe. Reassures the homeowner their first pickup is being scheduled. The :email adapter composes subject + body and delivers ; RouteAssignmentPendingEmailSent records the provider's response id. → Route Assignment Pending Email Sent
Notifications
-
27
Upload as Driver — Driver-app POSTs the image to the upload endpoint ; the :object_store adapter writes to S3 (or wherever the world points) and returns a URL. This command records the row. → Photo Uploaded
Photo
-
28
Flag as Owner — Owner flags a photo for review (e.g. driver photographed wrong address). Flagged photos hide from customer until reviewed. → Photo Flagged
Photo
-
29
Register Plan as Owner — Create a new plan in the catalog. Owner-only ; existing subscribers aren't affected. → Plan Registered
Plan
-
30
Reprice as Owner — Change the monthly price. Existing subscribers keep their snapshotted price (grandfathered) ; new signups get the new price. → Plan Repriced
Plan
-
31
Retire as Owner — Remove a plan from the catalog so new signups can't pick it. Existing subscribers continue ; they switch only via explicit ChangePlan. → Plan Retired
Plan
-
32
Build as Dispatcher — Create a draft route for one worker on one date. → Route Built
Route
-
33
Publish as Dispatcher — Publish the route to the driver app. → Route Published
Route
-
34
Start as Driver — Driver clocks in (i20 WorkerShift cascade) and starts the route — actual_start stamped. → Route Started
Route
-
35
Finish as Driver — All tasks resolved (completed or failed) — route closes. → Route Finished
Route
-
36
Add Address as Customer — Customer adds their service address during signup. Geocodes via the maps adapter ; pickup days auto-populate from i85 city-schedule integration when available, otherwise manual. → Service Address Added
Service Address
-
37
Update Pickup Days as Customer — Update the trash/recycle days — used when the city changes its schedule or the customer corrects an auto-populate mistake. → Pickup Days Updated
Service Address
-
38
Update Access Notes as Customer — Customer updates gate code or access instructions (i10). Driver app reads these on every task. → Access Notes Updated
Service Address
-
39
Activate as Admin — Mark the address as dispatchable — tasks will be generated. Driven by Subscription PM observing payment success, or admin override. → Service Address Activated
Service Address
-
40
Deactivate as Admin — Stop generating tasks for this address. Driven by Subscription PM observing payment failure past grace period, or admin override (vacation hold, cancel, etc.). → Service Address Deactivated
Service Address
-
41
Generate as System — Nightly task generation : for each active Subscription, produce per-day per-direction ServiceTasks. Driven by a cadence at midnight local. → Service Task Generated
Service Task
-
42
Assign To Route as Dispatcher — Place a generated task on a route. Admin builds routes by zone ; this is the per-task placement. → Task Assigned To Route
Service Task
-
43
Start as Driver — Driver opens the stop card in the route view ; status moves to in_progress. → Worker Started
Service Task
-
44
Mark Complete as Driver — Driver completes the task with before+after photos (i18). → Service Task Completed
Service Task
-
45
Report Exception as Driver — Driver picks one of nine enumerated reasons (i19) instead of completing. Optional note + optional photo. → Service Task Failed
Service Task
-
46
Reassign as Dispatcher — Move the task to a different worker / route — used when one driver is overloaded or a stop is in the wrong zone. → Task Reassigned
Service Task
-
47
Subscribe as Customer — Customer signs up — Stripe charge succeeds, this command records the new subscription. operational_status starts active. → Subscribed
Subscription
-
48
Record Payment Failed as System — Stripe webhook (invoice.payment_failed) lands here. Starts the grace-period clock ; the Subscription PM observes and transitions to inactive after 3 retries / 7 days per the bin-buddy.world default. → Payment Failed
Subscription
-
49
Record Payment Succeeded as System — Stripe webhook (invoice.payment_succeeded). Re-activates an inactive subscription if grace period was in flight. → Payment Succeeded
Subscription
-
50
Activate as Admin — Mark the subscription as dispatchable. Driven by Subscription PM observing PaymentSucceeded, or admin override. → Subscription Activated
Subscription
-
51
Deactivate as Admin — Stop generating tasks. Driven by Subscription PM after grace period expires, or admin override (vacation hold, cancel). → Subscription Deactivated
Subscription
-
52
Cancel as Customer — Customer cancels via the homeowner portal. Stripe subscription cancels via the cascade ; tasks stop generating from cancel_date forward. → Subscription Canceled
Subscription
-
53
Mark Grace Elapsed as System — Daily cadence walks `in_grace_period` ; for any subscription whose grace_period_ends_at is past, dispatches this to emit GraceElapsed. The Subscription PM observes and transitions past_due → inactive. → Grace Elapsed
Subscription
-
54
Change Plan as Customer — Switch to a different Plan. Stripe subscription updates via the cascade ; the new monthly_price snapshots in. → Plan Changed
Subscription
-
55
Fetch Sms Status as System — Query the configured :sms provider for the current delivery status of a previously-sent message (by its provider SID). Used for verifying message delivery during smoke tests + operational diagnostics. The hecksagon binding routes the dispatch to the same family that send_message uses, just for the GET-status endpoint. → Sms Status Fetched
System Test
-
56
Fetch Email Status as System — Query the configured :email provider for the current delivery status of a previously-sent message (by its provider message id). Used for verifying email delivery during smoke tests + operational diagnostics. The hecksagon binding routes the dispatch to the same family that send_message uses, just for the status-probe endpoint. Resend exposes per-message state via its GET /emails/{id} endpoint ; this command's response normalises across providers (SendGrid, Mailgun, Postmark would carry their own status strings). → Email Status Fetched
System Test
-
57
Clock In as Driver — Driver taps Clock In at the start of shift. Timestamp + GPS captured. Triggers Route.Start cascade if the driver has a route assigned for the date. → Shift Clocked In
Worker Shift
-
58
Clock Out as Driver — Driver taps Clock Out at end of shift. total_minutes computed in the policy ; payroll reads this field. → Shift Clocked Out
Worker Shift
-
59
Admin Edit as Admin — Back-office corrects a forgot-to-clock-out case or other anomaly. The change lands in the AuditLog (i94) with the actor and the before/after. → Shift Admin Edited
Worker Shift
Rules
- Complete requires active
- Complete requires one_time
- Cancel requires active
- Request Background Check requires submitted
- Approve requires background_check_pending
- Reject requires background_check_pending
- Mark Active requires approved
- Reprice requires active
- Retire requires active
- Publish requires draft
- Start requires published
- Finish requires in_progress
- Activate requires inactive
- Deactivate requires active
- Assign To Route requires pending
- Start requires pending
- Mark Complete requires in_progress
- Report Exception requires in_progress
- Reassign requires pending
- Record Payment Failed requires active
- Activate requires inactive
- Deactivate requires active
- Mark Grace Elapsed requires past_due
- Clock Out requires active
👤 Account
Bin-buddy user with a role. References an AuthIdentity for credentials.
📋 Add On
One Royalty service attached to a Subscription.
📦 Bin Inventory
Bin counts + storage info for one ServiceAddress.
📋 City Calendar
One street-range row of a city's pickup schedule — trash and recycle day for addresses in that range.
📋 Credit Card Processing
Stateless application service. Operations compose payment-processor calls through the hecksagon adapter binding.
📋 Customer
Homeowner profile attached to a customer-role Account.
📋 Driver Application
One driver applicant moving through the onboarding pipeline.
📋 Notifications
Stateless application service. Operations compose notification-provider calls through the hecksagon adapter binding.
📋 Photo
One photo attached to a ServiceTask.
📋 Plan
One catalog SKU.
📋 Route
One driver's daily route.
📋 Service Address
One serviceable property — address, pickup days, access notes, geographic data.
📋 Service Task
One bin movement — the atomic unit of operations.
📋 Subscription
One customer's monthly subscription on one ServiceAddress.
📋 System Test
Stateless application service. Operator/admin operations probe configured providers through the hecksagon adapter binding.
📋 Worker Shift
One driver's clock-in/clock-out for one shift.
Account, Add On, Bin Inventory, City Calendar, Credit Card Processing, Customer, Driver Application, Notifications, Photo, Plan, Route, Service Address, Service Task, Subscription, System Test, Worker Shift
No records yet — use the palette above to dispatch a command