---
name: food_truck_operations
description: "Run a food truck as a repeatable operation: commissary and permit records kept current by jurisdiction, event and location booking judged by expected covers instead of hope, prep and par levels set from the last service at the same spot, service logs that record sales, waste, and weather together, and a weekly review that decides which stops earn a return. Use when setting up or running a food truck, building a permit or commissary register, scoring a booking or event, setting prep or par for a stop, writing a service log, or deciding whether a location stays on the schedule."
---

# Food Truck Operations

## Purpose

Run one truck as a system with five parts that feed each other: a permit and commissary register that never lapses quietly, a booking decision made from expected covers and full day cost, prep set from what the same spot sold last time, a service log that captures sales, waste, and weather in one place, and a weekly review that keeps, fixes, or cuts each stop on the numbers. Finder apps tell you where trucks are. Permit blog posts tell you how one city works. Neither one decides whether a stop earns a return visit. This skill does.

## Workflow

### 1. Keep the permit and commissary register current, by jurisdiction

A food truck answers to every jurisdiction it parks in, and the paperwork differs in each one. One register, one row per jurisdiction, holds all of it.

- Record for each jurisdiction: health permit for the vehicle (issuing health department, permit number, expiry, inspection date and result), city business or vending permit where the truck parks (issuer, number, expiry), fire inspection (issuer, date, next due, suppression service tag date), commissary agreement (facility name and address, facility own permit number and last inspection date, signed agreement date and expiry, services covered), insurance certificates, and any event or park permits that repeat.
- Name the commissary for what the law in most places actually requires: a licensed fixed food establishment, never a private residence, that provides some mix of food storage, prep space, potable water, wastewater and grease disposal, equipment cleaning including access to a three compartment sink, and parking. Get the agreement in writing and keep the facility most recent inspection report with the truck records. Some jurisdictions require both documents physically on the vehicle. Check yours and comply either way.
- Set a renewal alarm 30 days before every expiry in the register, and a second one 7 days before. An expired health permit, a lapsed commissary agreement, or an overdue suppression inspection can end a service day on the spot, and all three expire on dates you knew a year ahead.
- Before entering a new jurisdiction, add its row before the first service there: which health department permits the vehicle, whether the city wants its own vending permit on top, where the truck may legally park, and what the fire marshal wants to see. A permit from the county next door proves nothing across the line.
- Keep a Person in Charge named for every service. Under the FDA Food Code model, a Person in Charge is present during all hours of operation, and most local codes follow that pattern.
- Treat the FDA Food Code as what it is: a model code that states and local agencies adopt in whole or part. The 2022 edition plus its 2024 supplement is the current model. The edition your health department adopted is the rule, so write the local citation into the register row instead of citing the model as if it were law.

Working temperature numbers from the model code live in `references/method-and-sources.md`. The short set, for the log and the line: cold holding at 41F or below, hot holding at 135F or above, cooling from 135F to 70F within 2 hours and then to 41F or below within 6 hours total, reheating cooked and cooled food for hot holding to 165F.

### 2. Score every booking on expected covers and full day cost

Judge a stop before you take it, with the same math every time. Takings are the wrong score. A truck sells a day in a place, and the day has costs that run whether the line forms or not.

The booking scorecard, filled in for every new stop and every event offer:

- Spot and organizer, date, service hours, and who else is selling food there
- Expected covers, with the basis written down: organizer footfall claim discounted by your own judgment, a prior visit count, the host confirmed headcount for a private booking, or a first visit guess labeled as a guess
- Average ticket from your own recent services, not a hoped for menu average
- Flat fee, plus any revenue share stated as a percent of gross
- Full fixed day cost: flat fee, all paid labor including prep and cleanup hours, fuel and propane and generator cost, and one day share of commissary, insurance, permit, and truck cost
- Food cost percent and card percent from your own recent logs
- Distance and drive time, and what the drive does to prep holding and staff hours
- Weather exposure: covered or open, and what rain did to covers at a similar spot
- The breakeven result and the verdict below

Run the math:

    python3 scripts/food_truck_ops.py breakeven --ticket 14 --food-cost-pct 30 --card-pct 3 --fixed 640 --expected-covers 90
    # contribution_per_cover: $9.38
    # breakeven_covers: 69
    # expected_profit: $204.20 after the $640.00 fixed day cost
    # verdict: BOOK on the numbers

- Book when expected covers clear breakeven covers with room for a bad hour, roughly a quarter above breakeven or better. Between breakeven and that cushion, book only for a stated second reason: a first test of a spot you want for a regular slot, a private booking that pays a minimum, or a slow day that would otherwise sit empty.
- Pass, or renegotiate, when expected covers sit at or below breakeven. Renegotiation levers, in order: a lower flat fee or a fee that converts to a share only after a sales floor, shorter or better aligned hours, fewer competing trucks, and a guaranteed minimum for private work.
- For a first visit with no history, cap the risk in the plan itself: smaller prep, a shorter shift, and a log entry marked first test so the weekly review reads it as a test result, not a verdict on the spot.
- Private catering gets the same scorecard with the host headcount as expected covers and the contract minimum written into the fixed cost side as guaranteed revenue. A booking that pays even at zero walk up covers is a different risk from a public stop, and the scorecard should show why.

### 3. Set prep and par from the last service at the same spot

Prep is a bet placed before service. Place it from the last service at the same spot and day type, not from a standing sheet that treats a Tuesday office park and a Saturday festival as the same day.

- Keep one par line per menu item, per spot, per day type: spot, day type, last covers, last prep, last sold, last waste by item, and the current par.
- Scale from what sold, never from what was prepped. Prepping from last prep copies last time overproduction into this time plan.

    python3 scripts/food_truck_ops.py prep --last-covers 120 --last-prep 140 --last-sold 118 --expected-covers 150 --on-hand 12
    # scale_factor: 1.25 (expected 150 covers vs last 120)
    # last_sell_through: 84.3% of prep sold
    # prep_target: 148 units (this is the par for this spot and day type)
    # prep_now: 136 units after 12 units on hand

- Adjust the scaled target only for a named reason written on the prep sheet: weather turning, a competing truck added or removed, a menu or price change, a group booking inside the service. No named reason, no adjustment. Vibes are how pars drift upward and waste follows.
- Prep perishable and high cost items tightest. A planned sellout of one item near the end of service costs a few covers. The same item prepped heavy and thrown away costs its full ingredient value every single service.
- Work FIFO without exception: label every container with item and date made or received, use the oldest first, and cool and store by the temperature rules in the reference. Food held wrong is waste booked in advance, and ready-to-eat TCS food held cold has a 7 day limit under the model code.
- Record temperature checks in the service log at setup, mid service on long days, and close. A failed check is a decision made on the spot: fix the holding, move the food, or discard it. Write down which one happened.

### 4. Log every service the same night, sales, waste, and weather together

One log per service, filled in before the day is called done. A log rebuilt later in the week is fiction with numbers in it.

Fields, in order:

- Date, spot, jurisdiction, service hours, crew, and the Person in Charge
- Weather: conditions during service, temperature band, and whether weather changed mid service
- Covers, gross sales, card and cash split, average ticket, and sales by top menu items
- Fees paid: flat fee, revenue share amount, any parking or permit charge for the day
- Labor: names, hours including prep and cleanup, and total labor cost
- Fuel, propane, and generator cost for the day, plus miles driven
- Waste log: item, quantity, cost value, and reason in one word groups that stay consistent (overprep, spoilage, dropped or remade, unsold at close, temperature discard)
- Temperature checks with times and any corrective action
- Incidents and notes: equipment trouble, a complaint, an inspector visit, a neighboring truck that changed the day, anything the weekly review will need and nobody will remember
- Sellouts: which items ran out and at what time, because a sellout at 1 pm and a sellout at 15 minutes before close are opposite findings

Close the log with the day result from the calculator:

    python3 scripts/food_truck_ops.py stop --sales 1260 --covers 90 --food-cost 378 --card-cost 38 --labor 320 --fees 80 --fuel 95 --waste-cost 45 --other 145
    # net_profit: $159.00
    # net_margin: 12.6% of sales
    # waste: 3.6% of sales

Food cost in that command means the cost of food that went into items sold. Waste cost is its own line from the waste log. Keeping them apart is what lets the weekly review tell overprep apart from a pricing problem.

### 5. Run the weekly review and decide which stops earn a return

Same time every week, 30 to 45 minutes, working from the week service logs and nothing else.

- Total the week by stop, not by day of the week: covers, sales, full day cost, net profit, net per cover, waste percent, and sellouts, for every stop served.
- Rank stops by net profit and by net per cover together. A stop can win on one and lose on the other, and both facts matter: high profit at low per cover means volume is carrying weak pricing or heavy waste, and high per cover at tiny volume means a good spot that needs more hours or a better slot.
- Give every stop one decision, in writing, with the reason from the log:
  - Keep: profitable across its recent visits, waste in band, no fix needed before the next booking.
  - Keep with a fix: the stop earns, and one named change goes into the next visit plan, such as a lower prep target, different hours, or a renegotiated fee.
  - Test once more: a first or second visit with a result too close or too weather hit to judge, with the test conditions written down so the next result settles it.
  - Cut: losing money across repeat visits with no fix left untried, or a fee structure that cannot clear breakeven at any cover count the spot has ever produced. Cut it from the schedule and tell the organizer plainly and early.
- Read waste across the week, not just by stop. One item wasting at every stop is a prep or menu problem. Waste concentrated at one stop is a spot problem. Run the variance check when the week food cost looks off:

    python3 scripts/food_truck_ops.py variance --actual-pct 35.4 --theoretical-pct 30.8 --waste-cost 78 --sales 1950
    # variance: +4.6 percentage points
    # reading: above 3 points, a specific cause is likely: waste, over-portioning, or unrecorded use

- Update every par line the week touched, using section 3, and update the register for anything expiring inside the next 30 days.
- End the review by booking next week from the decisions, not from habit or from whoever asked loudest. An empty slot is cheaper than a stop the numbers already cut.

Worked week, one truck, average ticket $14 all week. The two regular stops earn. The festival has the best takings of the week and loses money, which is the exact trap this review exists to catch.

Tuesday, office park lunch, third visit. Expected 90 covers, breakeven 69 (section 2 example). Actual: 90 covers, sales $1,260, full day cost $1,101 including $45 of waste, net $159, waste 3.6 percent of sales. Decision: keep, with a fix. The fix is a tighter prep target on the top wasting item, since waste at 3.6 percent sits in the band where real money is available.

Thursday, brewery evening, regular slot. Actual: 65 covers, sales $910, full day cost $767 including $22 of waste, net $143, net per cover $2.20, waste 2.4 percent of sales. Decision: keep. Lower sales than Tuesday and a better return per cover, because there is no pitch fee and the shift is shorter.

Saturday, festival, first booking at this event. The scorecard said no before the truck rolled: flat fee $1,200 plus a 10 percent share of gross, fixed day cost $2,145, breakeven 279 covers against an expected 270 that came from the organizer footfall claim.

    python3 scripts/food_truck_ops.py breakeven --ticket 14 --food-cost-pct 32 --card-pct 3 --fee-pct 10 --fixed 2145 --expected-covers 270
    # breakeven_covers: 279
    # expected_profit: $-66.00 after the $2145.00 fixed day cost
    # verdict: FAILS on the numbers, renegotiate the fee, change the hours, or pass

The booking was taken anyway as a test. Actual: 270 covers, the best takings of the week at $3,780, full day cost $4,056 including $210 of waste at 5.6 percent of sales, net a loss of $276. Week total across all three stops: sales $5,950, net $26. One festival day ate nearly all of what two good regular stops earned. Decision: cut. Do not rebook at a $1,200 flat fee plus 10 percent. The door stays open at a lower flat fee or a share with a sales floor, and the organizer hears that in those words, with the breakeven number attached.

## Output Contract

- A permit and commissary register returns one row per jurisdiction with every permit, agreement, inspection, and expiry from section 1, plus a list of anything expiring inside 30 days.
- A booking decision returns the filled scorecard, the breakeven covers, the expected profit, and a verdict of book, book with conditions, renegotiate, or pass, with the reason stated in numbers.
- A prep plan returns, per menu item, the last service figures it scaled from, the scale factor, the prep target that becomes the par for that spot and day type, and any named adjustment with its reason.
- A service log returns every field in section 4, completed the same night, closing with net profit, net margin, and waste percent from the calculator.
- A weekly review returns the by-stop totals, one written decision per stop (keep, keep with a fix, test once more, or cut) with its reason, the par updates, the register expiries, and next week bookings that follow the decisions.

## Operating Rules

- Never present a model code, a blog post, or another city rule as the law in the jurisdiction you are parked in. The register row for that jurisdiction is the authority, and it names the local source.
- Never book on takings, footfall claims, or a good feeling about a spot. Expected covers against breakeven covers, with the basis for the estimate written down, or the booking does not happen.
- Never set prep from last prep. Set it from last sold at the same spot and day type, and write the named reason for any adjustment.
- Never split the log. Sales without waste hides overprep, waste without weather blames the kitchen for a rain day, and a log written days later is not a log.
- Never let a high sales day outrank a profitable day in the review. Rank on net profit and net per cover, and let the festival with the big takings and the loss get cut when the numbers say cut.
- Never double count waste. Food cost in the calculator is food that went into items sold, waste cost is the logged waste line, and together they make the true food cost for the day.
- Never serve from a failed temperature check while deciding what to do. Hold the food out of service first, then fix, move, or discard, and log the action taken.
- Keep every number in a booking, prep, or review decision traceable to the truck own logs or to a named source in the references. An estimate is allowed. An estimate dressed up as a fact is not.
