Dev Queue

Consolidated backlog, top = highest priority  · 

Deploy status: Stage ✓ on stage Prod ✓ on prod Stage not yet Prod not yet
Internal Visibility

Read-only page under the Admin menu (owner access only). Live metrics for Technical KPIs 3, 4, and 5 are computed daily by the kpiMetrics Lambda and displayed with status chips. KPI 6 (Active Subscribers) renders as a bar chart. KPIs 1 and 2 were removed as unmeasurable without structured incident logging.

See docs/kpis.md for full KPI definitions, targets, measurement approach, and Lambda setup details.

Remaining work

  • Commercial and Customer Service KPI sections are placeholders. Define targets with Tim and Chetan before implementing.
Active / In Progress

Short, clean videos to eliminate question time and reduce churn. Users should be able to self-serve answers without support intervention. Critical for scaling.

High Impact for Current Rollout

Ingredients in Recipe Builder need to be grouped into named sections (e.g. "Sauce", "Garnish", "Batch Prep") so a recipe is easy to follow during service. Proposed solution: add a section feature to the ingredients table so rows can be assigned a section and displayed under a section header.

Batch Prep items specifically need to be separated now that the Batch Prep feature is live. This also supersedes the "Group Recipe Ingredients into Sections" hold item.

Implement a hierarchical menu to prevent scroll fatigue across 300+ items. Primary categories (confirm final list with Tim before implementing):

  • Food: Cabinet, Plated, Hot, Cold, etc.
  • Beverages: Signatures, Coffee, etc.
  • Resale: Cabinet/Fridge, etc.

Users must be able to narrow by these categories. Tagging (dietary, prep-style) sits on top as cross-category filtering. A flat scrolling list is not acceptable. This supersedes the "Group Recipes into Sections" hold item.

Move Prep and Ingredients into a distinct sub-module to separate Production (what the kitchen makes) from Service (what the customer buys), keeping the live menu clean and customer-focused.

Proposed solution: add a horizontal divider above the Batch Prep and Ingredients sections.

Equipment entries currently look like free-text labels. Add structured fields for shape (rectangular / round) and size (200 ml / 500 ml / 1 L / 2 L) so recipes can specify what they actually need. Quantity stays in the recipe's prep notes, not the multiselect.

Each kitchen has a standard kit (mixing bowls, whisks, spatulas, tongs, plates, knives, sandwich paper, container labels). Recipes should not need to list these — only recipe-specific items. Add a kitchen-level toggle so the recipe-card view hides standard kit by default. Makes equipment lists ~60% shorter and faster to scan during prep.

Ingredients in the platform use storage taxonomy (e.g. "Salt, Cooking", "Flour, Plain") for stock and search. The recipe method should render in chef language ("salt", "plain flour"). Add a display-name field that strips the category suffix when ingredients appear in method text.

Core Platform Gaps

Flash red when a role is modelled below minimum wage or exceeds legal hours.

Add super payment calculations to the Roles / Payroll section.

Users sometimes create two ingredient records with different names for the same physical ingredient (e.g. "Salt" and "Salt, Cooking"). A merge action should let the user select two ingredients, designate one as the canonical record, and automatically re-point all RecipeIngredient references from the discarded ingredient to the canonical one before deleting it.

Acceptance criteria

  • User can select a source ingredient (to be deleted) and a target ingredient (to be kept)
  • All RecipeIngredient records referencing the source are updated to reference the target
  • The source ingredient record is deleted after all references are migrated
  • If the source has no recipe references it is simply deleted (merge still succeeds)
  • The target ingredient's name, cost, and supplier are preserved unchanged
  • A success notification confirms how many recipe references were migrated
  • The operation is atomic — no partial state if migration fails mid-way
  • Tests cover: all references migrated, source with no references, migration failure rollback

The recipe description field and the whatIsIt ("What is it?") field carry the same meaning. Having both causes confusion and data duplication. Migrate all existing description values into whatIsIt and remove the description field from the schema, UI, and all associated code.

Acceptance criteria

  • One-off migration copies each recipe's description into whatIsIt where whatIsIt is currently blank; existing whatIsIt values are preserved unchanged
  • description field removed from GraphQL schema and Amplify codegen re-run
  • All UI components, forms, and table configs updated to use whatIsIt
  • No remaining references to recipe.description in application code
  • Tests cover: migration logic, form renders whatIsIt field, schema no longer exposes description

Allow users to recover accidentally deleted records via a trash / undo action.

  • Add Tags field to Recipe schema and form
  • Update search / filter to match on tags
  • Reduce visible fields in responsive / mobile view (especially for recipe image upload flow)
  • Add a season field to Ingredients
  • Flash red / trigger when an out-of-season ingredient is used in a recipe
  • Ability to create menus filtered by season
Revenue and Engagement

Replace Tim's current workflow (Claude + Excel + Chet manual data entry) with a native "Audit Recipe" feature on the Recipe Analysis page. Tim opens a recipe, triggers the audit, reviews a structured diff of proposed changes, approves sections, and writes directly to the DB. No Excel. No handoff.

Background: Tim uses a 19-section master prompt (v7.3) in an external Claude session to audit Test Kitchen recipes, producing an Excel sheet. Chet then manually pastes every green cell into HospoSure. As of June 2026, 33 recipes have been audited this way. Master prompt at /Users/michaelroberts/Downloads/1. HospoSure Recipe Audit - Master Prompt (10).md.

User flow

  1. Tim opens any Food/Beverage/Batch recipe on the Recipe Analysis page.
  2. An "Audit Recipe" button appears in the header (admin-only).
  3. Tim optionally types an intent (e.g. "make this gluten free"). Leaving it blank triggers a full standards audit.
  4. Lambda runs the audit against the live recipe data and returns a typed diff.
  5. Tim sees a diff review panel: Method, Service Tip, Customer Notes (4 fields), Tags, Allergens, Equipment, Ingredient grid, Description.
  6. Each section shows current vs proposed side by side with AI reasoning.
  7. Tim approves or rejects each section independently.
  8. "Apply approved changes" writes via the existing recipe mutation layer.

Architecture

New Lambda operation recipe_audit added to the existing aiProxy Lambda. No new Lambda, no new IAM grants needed.

Lambda request payload

{
  "operation": "recipe_audit",
  "recipe": { "...full recipe fields..." },
  "ingredients": [ "...recipeIngredients with names, costs, units..." ],
  "availableIngredients": [ "...venue ingredient library..." ],
  "availableTags": ["..."],
  "availableAllergens": ["..."],
  "availableEquipment": ["..."],
  "intent": "optional free-text from Tim"
}

Lambda response (typed diff)

{
  "method": "...",
  "chefTip": "...",
  "description": "...",
  "tags": ["..."],
  "allergens": ["..."],
  "equipment": ["..."],
  "customerNotes": {
    "whatIsIt": "...",
    "howDoesItTaste": "...",
    "suitableFor": "...",
    "whatsOnPlate": "..."
  },
  "ingredientChanges": [
    { "action": "update", "ingredientId": "...", "quantity": 150, "unitNote": "g" },
    { "action": "add", "ingredientName": "...", "quantity": 30, "unitNote": "g" },
    { "action": "remove", "ingredientId": "..." }
  ],
  "auditNotes": ["PORTION block quantity for butter corrected from 1g to 15g"]
}

System prompt scope (in Lambda)

Encodes Tim's master prompt logic: customer notes voice rules (§4-5), 8 method block structure, FSANZ allergen smart defaults (§6), locked tag library v7.3 with single-select rules (§7), ingredient grid math rules (§12), and all 28 data-integrity patterns (§13). Lives server-side so audit rules cannot be tampered with from the browser.

Ingredient change constraints

  • AI can only suggest existing venue ingredients by ID.
  • If a recipe needs an ingredient not in the venue library, the diff flags it as "add to Ingredients page first".
  • Quantity corrections follow PORTION x portionCount math with bidirectional unit conversion (sub-1 kg/L down to g/ml; over-999 g/ml up to kg/L).

Files to create or modify

FileChange
amplify/backend/function/aiProxy/src/index.jsAdd recipe_audit operation handler with audit system prompt
src/utils/aiProxy.tsAdd invokeRecipeAudit() function and RecipeAuditDiff type
src/layouts/recipe-analysis/components/RecipeAuditPanel/index.tsxNew component: button, intent input, diff review, approve/reject toggles, apply action
src/layouts/recipe-analysis/index.tsxMount RecipeAuditPanel (admin-only render)
src/utils/aiProxy.test.tsUnit tests for new function and type
src/layouts/recipe-analysis/components/RecipeAuditPanel/RecipeAuditPanel.test.tsxComponent tests

Acceptance criteria

  • Audit panel renders only for admin users on Food, Beverage, and Batch recipe analysis pages
  • Full audit with no intent runs the complete standards check (all 28 data-integrity patterns)
  • Diff shows current vs proposed for every changed field; unchanged fields are hidden
  • Each section can be approved or rejected independently
  • Apply writes only approved sections via existing useRecipeMutations
  • Ingredient "add" suggestions that reference unknown ingredients show a warning rather than creating a broken record
  • Unit display rule enforced in diff output (bidirectional)
  • Tags respect single-select rules for Seasonal, Category, Cuisine
  • Allergen output covers all 14 FSANZ allergens with present/absent for each
  • TypeScript compiles clean; unit tests pass; build passes

Out of scope for MVP

  • New ingredient creation from within the audit panel (flag and link to Ingredients page instead)
  • Batch multi-recipe audit queue
  • Audit history / version tracking
  • Recipe creation from a photo of the dish (image recognition)
  • Recipe creation from a photo of a printed or handwritten recipe
  • Recipe creation from a URL link to an external recipe

Generate a downloadable business plan or pitch deck from the user's modelling, suitable for presenting to a bank or investor.

Apply a blanket price increase (e.g. +$0.20 per item) across the menu and recalculate net profit based on sales volume.

Freeze projections at a specific date for future comparison against actuals.

  • Seasonal Ingredient Cross-Utilisation chart: increase data point size and add popups showing recipe count

Add PSM / ROI metric to the dashboard Operations section.

Operational Tools

New page for startup and fit-out costs, split into phases:

Phase A: Professional Services

Legal fees, trademark registration, accounting / ASIC / ABN, bank / loan fees, design and permit fees, branding, business insurance, licenses and permits, consultant fees.

Phase B: The Space

Venue fit-out costs (content TBD).

Import payroll data from an external source.

Export standard operating procedures for recipes as a formatted document.

Export an ingredient list in a format suitable for supplier price matching.

Allow users to download or share their full modelling data (format TBD).

Model weekend and public holiday surcharges as part of payroll / revenue modelling.

Split indirect payroll costs (e.g. management overhead) into the overhead pool and factor into per-recipe profit.

Annual process: export template ingredients, review against current market prices, upload updated prices.

  • Retrieve menu item sales from Square (send path is already done)
Backburner

Upgrade Amplify from Gen 1 to Gen 2.

  • Members module
  • Profile module
  • RecipeAnalysis module
  • Timeline module
  • Hooks
  • Utils

Dashboard, Entries, Exchange already done.

Onboarding tips for accessing Demo and Templates, and updating the venue name on first login.

Pull live ingredient pricing from PFD, BidFood, Sydney Freezers, Fish, and other suppliers.

Capture referral source before a user enters the demo to ensure we don't miss sign-ups who bypass the contact form.

  • Review docs/future-enhancements.md and move any actionable items into this file or git issues

Add contextual food imagery or abstract graphics to pages. Style reference: Clever Cafe (simple, abstract). Match imagery to page context.

Tags at Account Setup level and Item Card level to define an "Operational Space." New items matching saved tags auto-flagged as "New." Best actioned once a regular Test Kitchen recipe intake process is established.

Needs Clarification

Request to separate beverage tagging logic from food (no seasonal auto-rotate; exception-based only for signatures / short-shelf-life items). We do not currently have expiring tags at all. Needs clarification from Tim on what exact behaviour is expected before this can be spec'd.

Referenced a linked spreadsheet. Appears to be an operational process rather than a platform feature. Needs clarification on what is actually being requested for HospoSure.

Discussion open on whether having both supplier costs and menu spending creates data duplication. Decision pending.