Brigade · ING-001 visual contract
Task visual · Duplicate safety

Do not create or replace a recipe by accident.

Brigade checks for an existing recipe before the Add action writes. The immediate release supports exact no-op, save separately, or cancel. Updating existing follows the content-versioning checkpoint.

Write rule: no automatic merge, no silent overwrite, and no duplicate Recipe Book entry when the source is already present.
Outcome map

Three states cover the immediate write decision.

New recipeNo existing match. Add the reviewed recipe and show the normal receipt.Create recipe
Exact duplicateThe same source or confirmed equivalent content is already stored. Create nothing.No write
Possible matchShow the likely existing recipe and the incoming source. Save separately or cancel; do not update yet.Review first
Schema boundary: update-existing is added only after stable recipe identity, RecipeContentVersion, concurrency, and reversal contracts are approved.
Possible-match flow

Compare before writing.

Proposed acceptance contract · flag likely match · not live
Recipe review · possible match

Seafood Paella may already exist

Review the existing Recipe Book entry before saving this upload.

Seafood PaellaPossible match
  • Same recipe name
  • Similar ingredient names
  • Existing Recipe Book entry
Incoming source13 ingredients · 1 instruction · serves 6
Review existing recipe Save as a separate recipe Cancel
A possible match is not presented as certainty. The chef can preserve a legitimately separate recipe without searching the Recipe Book first.
Proposed interim decision · separate or cancel · not live
Compare recipes

Seafood Paella

The existing recipe stays unchanged until you confirm.

IngredientsStored: 12 lines · Incoming: 13 lines
InstructionsStored: none · Incoming: 1 source step
YieldStored: serves 8 · Incoming: serves 6
SourceStored: previous upload · Incoming: today's file
Save as separate recipe
Keeps both recipes in the Recipe Book.
Cancel · back to recipe review
The comparison uses chef-facing recipe content. Match scores, database IDs, and raw catalog evidence stay out of the primary decision.
Future after schema approval · update receipt · not in immediate release
Recipe Book

Seafood Paella

The existing entry now points to the accepted recipe version.

Recipe updated
New recipe version createdThe prior version and incoming source remain available. Costing refreshes from the accepted content.
What changedIngredient content, instructions, and yield follow the choices confirmed in comparison.
Menu scopeNo Menu item was created or replaced.
Open updated recipe
Undo restores the exact prior recipe version and related decision state. Updating the Recipe Book does not silently modify a sellable Menu item.
Exact-duplicate flow

Stop without creating cleanup work.

Recipe already added

Seafood Paella is already in your Recipe Book

This same source was added before. No new recipe or version was created.

No changes madeRecipe Book unchanged
Open existing recipe Upload another recipe
Deterministic exactnessUse a source fingerprint or canonical content equality. A model similarity score alone cannot declare an exact duplicate.
No false success receiptSay that no changes were made. Do not present an Add or Update receipt when nothing was written.
No Menu side effectDuplicate handling operates on Recipe Book entries. It does not create, replace, or relink a sellable Menu item.
Source remains traceableRecord the duplicate detection event and source fingerprint without creating a second recipe-content version.
Implementation boundary

The immediate release prevents duplicates without pretending update is ready.

Before the writeReturn duplicate state, the candidate Recipe Book reference, chef-facing match reasons, and the incoming source summary. A possible match never auto-selects Update.
Immediate actionsExact duplicate creates nothing. A possible match can be saved separately or cancelled. Every create uses upload idempotency.
Future confirmed updateAfter schema approval, send the stable existing recipe, current content-version reference, accepted incoming fields, and an idempotency key.
Future concurrencyIf the existing recipe changed after comparison, stop the write and ask the chef to review the current version. Never overwrite a newer edit.