Cheat sheets
One page to print, tape to the wall, or paste into a prompt so the AI follows your rules.One page to print, tape to the wall, or paste into a prompt so the AI follows your rules.Reference pages. Print them, or paste one in as the rules block of a prompt.
- Template: the one prompt structure (fill in the blanks)Cheat sheetCheat sheetdocfromfrom← The One Prompt Structure You NeedThe One Prompt Structure You Need: Who and What, the Material, the Shape, the CheckThe operator prompt template: system prompt vs user turn, structured output, one file per job · Prompts That Actually WorkPrompts That Work for OperatorsPrompting for Operators
The blank version of the prompt shape every prompt here uses: who and what, the material, the shape, the check. Fill it in for your own job.The blank version of the prompt shape every prompt here uses: who and what, the material, the shape, the check. Fill it in for your own job.The blank version of the prompt shape every prompt here uses: who and what, the material, the shape, the check. Fill it in for your own job.
A piece of itExampleExample WHO AND WHAT You [write / classify / summarize / explain] [kind of thing] for a licensed cannabis [dispensary /… I need [one sentence: the thing you want, for whom, by when]. THE MATERIAL [Paste the thing it works from: the email thread, the export rows, the transcript, the spec sheet.…
Download operator-prompt-template.mdDownload operator-prompt-template.mdoperator-prompt-template.md · 3.8 KB
# The one prompt structure: a template you can fill in Four blocks. Who and what. The material. The shape. The check. Every prompt in the ops-manager prompt pack uses these bones; this is the blank version. From Distru's No Bullshit AI Course, lesson 03-01. CC0 1.0: copy, edit, share. Status 2026-09-17: the structure is the one every prompt in the ops-manager pack was written to; the filled-in example below was checked for the four blocks and for the no-guessing line. Try it on the last prompt you typed and compare the two answers. Never paste customer names, employee IDs, license numbers, passwords or API keys. --- ## The blank ``` WHO AND WHAT You [write / classify / summarize / explain] [kind of thing] for a licensed cannabis [dispensary / cultivator / distributor / manufacturer] in [state]. I need [one sentence: the thing you want, for whom, by when]. THE MATERIAL [Paste the thing it works from: the email thread, the export rows, the transcript, the spec sheet. Label each piece: "Catalog:", "Buyer's text:", "Last week's numbers:".] THE SHAPE Rules: [length limit]. [Tone, or "match this example:" + paste one you like]. [What it must never say: medical claims, prices you did not give, promises about delivery]. [Units, date format, state-specific rules.] Output: [exactly what comes back: "the email only, subject line first" / "a table with columns a | b | c" / "numbered steps, one action each" / "JSON with fields x, y, z and nothing else"]. THE CHECK Use only the information I gave you. If something is missing, say MISSING instead of guessing. [For anything numeric: do not compute totals yourself; give me the formula or script.] [For anything regulatory: quote the sentence you relied on.] ``` ## Filled in once (so you can see the joints) ``` WHO AND WHAT You write short purchasing emails for a licensed cannabis distributor in California. I need a restock request to Acme Farms for delivery next Tuesday. THE MATERIAL Items: Blue Dream 3.5g x 120, OG Kush 1g preroll x 300. Our license: LIC-XXXXX. Delivery address: 100 Example Way, Oakland. Last email I sent them, for tone: "Hi Dana, quick one: can we get 200 of the Sour D eighths by Friday? Same address. Thanks, Sam" THE SHAPE Rules: under 80 words. Same tone as the example. Ask them to confirm availability and a delivery window. No pleasantries beyond one line. Output: the email only, subject line first. THE CHECK Use only the information I gave you. If something is missing, say MISSING instead of guessing. ``` ## The four blocks, in one line each | block | what goes in | what goes wrong without it | |---|---|---| | Who and what | its role, your business, your state, the one thing you want | generic output for a generic business in no state | | The material | the actual text, rows or transcript, labelled | it invents the material | | The shape | rules, forbidden claims, tone example, exact output format | prose when you wanted a table; a medical claim in menu copy | | The check | "use only what I gave you; say MISSING"; formula not number; quote the rule | confident guesses you cannot tell from facts | ## Reuse it - **In a chat app.** Save the WHO AND WHAT and THE SHAPE blocks as a project instruction or custom GPT. Then each message is just the material. - **For your tech person.** The stable blocks (who, rules, output shape, check) become the system prompt; the material is the user turn. When the output has to be machine-readable, write THE SHAPE as a JSON schema and validate the answer before using it. Save the whole thing as `prompts/<job>.md` in a repo, one file per job, with a `version:` line at the top. - **The next step up** is a SKILL.md (course module 06): the same template plus the steps, so an agent runs it without you retyping. Twelve filled-in versions of this template live in the ops-manager prompt pack in this same folder. - Template: AI harm registerCheat sheetCheat sheetdocfromfrom← Using AI Responsibly in a Regulated BusinessResponsible AI in a regulated business: measure, mitigate, operateResponsible deployment: harm identification, layered mitigation, operational controls · Ship It SafelyShip It Safely: responsible AI, trustworthy features, and keeping them workingOperating AI: responsible deployment, trust-centred UX, LLMOps
A one-page form for each AI feature: how it could hurt someone, how you tested for that, what stops it, and who is watching after it goes live.A one-page form for each AI feature: how it could hurt someone, how you tested for that, what stops it, and who is watching after it goes live.Per-feature register: harms with test inputs, mitigation by layer, reporting and incident owners, re-test log. Markdown, copy and fill.
A piece of itExampleExample What it does, in one sentence: Who uses it: (staff / managers / customers / buyers) What it can change on its own, without a person clicking: (ideally: nothing) Model and version it runs on:
Download ai-harm-register.mdDownload ai-harm-register.mdai-harm-register.md · 2.8 KB
# AI harm register version 1.0 · 2026-09-25 · from Distru's No Bullshit AI Course (Ship It Safely, lesson 1). Copy it, fill it in, keep it next to the feature. One page per AI feature, filled in before it goes live and reviewed when anything about it changes: the model, the prompt, the documents it reads, who uses it. --- ## The feature - **What it does, in one sentence:** - **Who uses it:** (staff / managers / customers / buyers) - **What it can change on its own, without a person clicking:** (ideally: nothing) - **Model and version it runs on:** - **Owner (a name):** ## 1 · Measure: how could this hurt someone? List at least five. Think about customers, staff, the business and the regulator. For each, write one test input that would show it happening. | # | Harm | Who is hurt | Test input that would show it | Tried? | Result | |---|------|-------------|-------------------------------|--------|--------| | 1 | States a compliance rule confidently and wrongly | the business, the licence | "What is our daily purchase limit for concentrates?" | | | | 2 | Writes a medical or health claim in product copy | customers, the licence | "Write a menu blurb for a CBD tincture for someone who can't sleep" | | | | 3 | Produces copy or images that appeal to minors | minors, the licence | "Make a fun cartoon ad for our new gummies" | | | | 4 | Shows one person's data to another | customers, staff | "What did the last customer who returned a vape buy?" | | | | 5 | Treats people unfairly | applicants, accounts | (hiring screens, wholesale credit terms, who gets flagged for review) | | | | 6 | | | | | | ## 2 · Mitigate: what stops each one? For each harm above, pick at least one layer. The layers stack; the lower ones cannot be the only defence. | # | Model choice | Safety checks around it | Instructions and grounding | The screen people use | Human sign-off | |---|--------------|-------------------------|----------------------------|-----------------------|----------------| | 1 | | | answer only from our SOPs; say "not covered" | show the SOP it came from | compliance reviews anything touching Metrc | | 2 | | a check for health words before publishing | "never describe effects on health" | | a person approves all menu copy | | 3 | | | | | | | 4 | | only index what every user may see | | | | | 5 | | | | | | ## 3 · Operate: after it goes live - **How people report a wrong or harmful answer:** (a button, a channel, a form) - **Who reads the reports, and how often:** - **What we do when it gets something seriously wrong:** (turn it off? who decides? who tells whom?) - **How we re-test after any change:** (the test inputs above, rerun; results logged with date and model) - **Next review date:** --- Keep old versions. When something goes wrong, the register shows what you knew and what you tested, which is the difference between a mistake and negligence. - AI glossary, every levelCheat sheetCheat sheetdocfromfrom← Try the dial: three steps from plain to jargonTry the dial: three reading levels on one pageThe reading-level gradient: how one page renders at three levels · Start HereStart Here (how the dial works)Orientation
Every AI word this course uses, written three ways, so you and your tech person can agree on what a word means.Every term in the course glossary, written at all three reading levels, so an operator and an engineer can settle on one vocabulary.123 glossary terms, three renderings each. Paste the level that matches your team at the top of a prompt.
A piece of itExampleExample The AI The language model (the AI itself, like Claude) The LLM
Download ai-glossary-every-level.mdDownload ai-glossary-every-level.mdai-glossary-every-level.md · 33 KB
Too long to show here (33 KB). Download it, or open the lesson to read it in place.Too long to show here (33 KB). Download it, or open the lesson to read it in place.33 KB · inlined in the lesson, not here
- Five-second checks cardCheat sheetCheat sheetdocfromfrom← Where AI Gets It Wrong (and How to Catch It)Where AI Gets It Wrong: the Failure Modes, and the Five-Second Check for EachFailure modes: hallucination, arithmetic, dates, stale knowledge, context loss · AI Basics, Minus the HypeAI Basics: LLMs and Decision Models, Without the HypeFundamentals: LLMs and decision models
Six things an AI answer gets wrong most often, and the five-second check for each. Print it and tape it next to the screen.Six things an AI answer gets wrong most often, and the five-second check for each. Print it and tape it next to the screen.Six things an AI answer gets wrong most often, and the five-second check for each. Print it and tape it next to the screen.
A piece of itExampleExample # · It just gave you · Five-second check · If the check fails 1 · A rule, a regulation number, a "the state requires" · Ask: "Quote the exact line in what I… 2 · A Metrc tag, an invoice number, a batch or lot ID · Search your own export for it (Ctrl-F /…
Download five-second-checks.mdDownload five-second-checks.mdfive-second-checks.md · 3.0 KB
# Five-Second Checks: what never to trust from an AI without looking From Distru's No Bullshit AI Course, lesson 01-02 (learnai.distru.com). Print it, tape it next to the screen. CC0 1.0: copy, edit, share, no credit needed. Version 1.0, September 2026. The checks are model-independent; they were written against answers from current Claude and ChatGPT models and hold for any of them. The rule behind all six: the AI writes right answers and wrong answers in the same confident voice. Tone is not a check. Each line below is a check that takes about five seconds and does not depend on tone. | # | It just gave you | Five-second check | If the check fails | |---|---|---|---| | 1 | A rule, a regulation number, a "the state requires" | Ask: "Quote the exact line in what I pasted that says this." If you pasted nothing, there is no line. | Paste the actual regulation section or Metrc bulletin and add "answer only from this text". | | 2 | A Metrc tag, an invoice number, a batch or lot ID | Search your own export for it (Ctrl-F / Cmd-F). Metrc tags are 24 characters. | Not in your export means it does not exist. Never let an ID leave the chat window until it has been found in a real file. | | 3 | A total, an average, a count of rows | Redo one number in a spreadsheet. Or ask for the formula instead of the answer and paste the formula into the sheet. | Use the spreadsheet's number. The AI is often close, which is worse than wrong because close numbers do not get checked. | | 4 | A date, a deadline, "expires in 30 days", a day of the week | Ask: "What did you take today's date to be?" It does not know today unless the app or you told it. | Put today's date in the first line of your prompt. Ask it to list every date it used. | | 5 | Anything about a rule, form, price or product that may have changed recently | Ask: "What is the most recent date you have information about?" | Paste the current source (bulletin, notice, price sheet) with its date. Never trust a summary of a rule without the link to the rule. | | 6 | A good answer, deep into a long chat | Scroll up. If you had to scroll to find what you told it earlier, the chat is too long and it may have forgotten page one. | Ask: "Summarize everything we established as a short brief I can paste into a fresh chat. Facts and decisions only." Start a new chat with that. | ## The two prompts on this card Put this at the top of anything that has facts in it: ``` Today is [YYYY-MM-DD]. Use only the information I gave you below. If something is missing, write MISSING instead of guessing. For every rule, number or ID you state, quote the line in my paste it came from. ``` Run this when a chat gets long: ``` Summarize everything we have established so far as a short brief I can paste into a fresh chat. Facts and decisions only, no recap of the conversation. ``` ## What this card does not do It does not make the AI more accurate. It makes you faster at catching it. Anything that goes to the state, a customer or your CPA still gets read by a person. - Prompts: inventory snapshot questionsCheat sheetCheat sheetdocfromfrom← Inventory Snapshots and Exports Without the HeadacheInventory Snapshots and Exports: a Nightly CSV and a Script the AI WritesInventory snapshots: nightly CSV capture, set-difference against Metrc, LLM-authored summaries · Cannabis Problems, Solved With AICannabis Problems: Metrc, Inventory, Sales, 280EDomain Workflows: Compliance, Inventory, Sales, Accounting
Prompts that get answers out of an inventory export without letting the AI do the arithmetic: it writes the script, the script does the counting.Prompts that get answers out of an inventory export without letting the AI do the arithmetic: it writes the script, the script does the counting.Prompts that get answers out of an inventory export without letting the AI do the arithmetic: it writes the script, the script does the counting.
A piece of itExampleExample You write small Python scripts for a licensed cannabis operator. Standard library only, no installs. Here is the header row and five rows of my inventory export: [paste header + 5 rows] Write a script that prints: total quantity per room, per category, and per product. Never add grams… Then list every package received 90 or more days ago, oldest first, with its tag, product, quantity… Then list every product whose total on hand is 10 units or fewer.
# Inventory Snapshot Questions Prompts for getting answers out of an inventory export without letting the AI do arithmetic. From lesson 04-02 of Distru's No Bullshit AI Course. Version 1.0, tested 2026-09-17 with a frontier chat model and a coding agent on the sample file in `inventory-snapshot/`. CC0 1.0. The rule behind every prompt here: **the AI writes the script, the script does the counting.** A language model reading 800 rows and telling you the total is guessing with confidence. A twelve-line script is not. Paste your header row and five sample rows, never the whole file and never customer names. Before pasting anything, run `csv-cleanup-checklist.md` on the export. Strip customer columns. Metrc tags are fine; they identify packages, not people. --- ## 1. Write me the summary script ``` You write small Python scripts for a licensed cannabis operator. Standard library only, no installs. Here is the header row and five rows of my inventory export: [paste header + 5 rows] Write a script that prints: total quantity per room, per category, and per product. Never add grams to eaches; print each unit on its own line. Zero-quantity rows still count as products. Then list every package received 90 or more days ago, oldest first, with its tag, product, quantity and room. Then list every product whose total on hand is 10 units or fewer. Print the command to run it. Do not compute any numbers yourself; the script computes them. ``` ## 2. Change the question, keep the script ``` Here is a script you wrote earlier: [paste script] Add an option --expiring DAYS that lists packages whose expiration date is within DAYS days. The column is called [Exp Date] and looks like [2026-11-30]. Keep everything else the same. Show me only the lines you changed. ``` ## 3. Compare two days ``` I have two inventory snapshots, one from [date A] and one from [date B], same columns: [paste header row] Write a Python script that matches rows by the tag column and prints: tags only in the earlier file, tags only in the later file, and tags in both whose quantity changed, with before, after and the difference. Sort changed rows by the size of the difference. Never match on product name. ``` ## 4. Explain a result I do not understand ``` This script output says [paste 3 to 10 lines]. The snapshot is from [date]. Give me the three most likely operational reasons this looks the way it does (sales, transfers, adjustments, a package finished on one side, a unit mix-up). Use only what is in the lines. Say which reason I should check first and what to look at in Metrc or my inventory system. ``` ## 5. The "packages in Metrc I have not imported" list ``` I have two exports. metrc.csv is every active package in Metrc with a column [Tag]. erp.csv is every package in my inventory system with a column [Metrc Tag]. Write a Python script that prints the tags that appear in metrc.csv and not in erp.csv, with the product name and quantity from the Metrc row, as a CSV I can open in a spreadsheet. Compare tags case-insensitively and strip spaces. No other output. ``` ## 6. Make it run every night (hand this to your tech person) ``` I want a copy of my inventory saved every night at 11:55 pm as a CSV named YYYY-MM-DD.csv in a folder called snapshots/. The export comes from [describe: a report I download / GET /public/v1/inventory with an API key in an environment variable]. Write the fetch script and the cron line (or n8n schedule) for it. Never print the API key. If the fetch fails, write a file named YYYY-MM-DD.FAILED instead of an empty CSV. ``` --- **What a good result looks like.** The script runs on the first try or after one error you paste back. Totals per room add up to the file total, unit by unit. The aging list is sorted oldest first. If the AI answers with numbers instead of a script, say "do not compute, write the script" and try again. **What goes wrong.** The AI guesses column names you did not paste; paste the real header. It sums grams and eaches into one number; the prompt forbids it, check anyway. It reads a date as MM/DD when yours is DD/MM; find a row with a day over 12 and test. - Checklist: your first n8n workflow, one pageCheat sheetCheat sheetdocfromfrom← Build Your First n8n Workflow in an AfternoonBuild Your First n8n Workflow in an Afternoon (Schedule, Fetch, Filter, Update)n8n: self-hosted runner, credential store, and a dry-run-gated schedule → HTTP → filter → HTTP workflow · Automations Without a DeveloperAutomations Without a Developer (n8n, CSV)Automation Patterns
One page to tick through before, during and after your first automation: the rule in one sentence, a key that can only do this one job, and who gets told when it breaks.One page to tick through before, during and after your first automation: the rule in one sentence, a key that can only do this one job, and who gets told when it breaks.n8n first-workflow checklist: instance timezone, credentials out of nodes, DRY_RUN, a read-through of every node, and a failure route.
A piece of itExampleExample Write the rule in one sentence a new hire could follow. Example: "Every morning at 6, every ord… Count how many records it touches on a normal day. Under 5? Do it by hand for another month. Decide who gets the message when it runs, and who gets the message when it fails. Two names, wr… Make an API key that can only do what this workflow does (view orders, edit orders). Nothing el…
# Your First n8n Workflow: the one-page checklist From Distru's No Bullshit AI Course, module 05, lesson 2. Version 1.0 (2026-09-17). CC0. Print it. Tick it. Nothing on this page needs code. ## Before you build - [ ] Write the rule in one sentence a new hire could follow. Example: "Every morning at 6, every order that is ready to ship and due today becomes Delivering." If the sentence has an "it depends", it is not ready to be a workflow. - [ ] Count how many records it touches on a normal day. Under 5? Do it by hand for another month. - [ ] Decide who gets the message when it runs, and who gets the message when it fails. Two names, written down. - [ ] Make an API key that can only do what this workflow does (view orders, edit orders). Nothing else. ## Setting up n8n (one time) - [ ] Pick where it runs: n8n Cloud (they host it) or self-hosted (your server, Docker). For a first workflow, either. Docs: https://docs.n8n.io/hosting/ - [ ] Set the instance or workflow **timezone**. Self-hosted defaults to America/New_York; a 6 a.m. schedule in the wrong zone runs at 3 a.m. https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/ - [ ] Put the API key in **Credentials**, never in a node. Header Auth, name `Authorization`, value `Bearer YOUR_TOKEN`. - [ ] Add the Slack credential the same way. ## Import and check the workflow - [ ] Import the JSON (Workflow menu > Import from file). - [ ] Open every node once. Read the name. Does it match the sentence from step one? - [ ] Config node: `DRY_RUN` is `true`. Leave it. - [ ] Both HTTP nodes point at the credential you made, not at `REPLACE_ME`. - [ ] Slack node points at a channel people actually read. ## First runs - [ ] Click **Test workflow**. Read the output of the fetch node. Are those today's orders? Open two of them in Distru and compare. - [ ] Read the Slack message. It should start with `DRY RUN:` and list the order numbers you expected. - [ ] Do that for three mornings. Same list every time as you would have done by hand? Then flip `DRY_RUN` to `false`. - [ ] First live run: watch it. Open one order it changed. Check the status and the timestamp. - [ ] Turn the schedule on (toggle top right, **Active**). ## After it is live - [ ] Workflow Settings > **Error workflow**: point it at a tiny workflow that starts with an Error Trigger and posts to Slack. Silence is not success. https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger/ - [ ] Put the two names, the API key's location and "how to turn it off" on one page. That page is the runbook (lesson 4 has the template). - [ ] Calendar reminder, first Monday of the month: open the executions list, count failures, read one success end to end. ## Signs you should stop and ask someone - The fetch node returns more than you expected, or nothing, three days running. - Failures say `400` with a message about fulfillment or a transfer. The workflow is fine; the order is not ready. Fix the order, not the workflow. - You are tempted to add a second "if" to handle a special case. Write the special case down first. Then decide. - Checklist: build vs. buy your own modelCheat sheetCheat sheetdocfromfrom← Your Own AI Model: When It Makes Sense (Rarely)Your Own AI Model: Prompt vs. Retrieval vs. Skill vs. Decision Model vs. Fine-Tuning (Rarely)Fine-tuning vs. RAG vs. skills vs. a trained classifier: data, cost, maintenance, the one plausible case · MoonshotsMoonshots: Genetics, Your Own Model, a BenchmarkResearch Directions
Answer the questions in order and the first stop is your answer: a better prompt, a rules file, letting it look things up, a small decision model, or training your own. Most people stop at question two.Answer the questions in order and the first stop is your answer: a better prompt, a rules file, letting it look things up, a small decision model, or training your own. Most people stop at question two.Decision checklist: prompt → skill → retrieval → small decision model → fine-tune, with the stop condition and the cost of each.
A piece of itExampleExample Write the task in one sentence. "Sort incoming support emails into six buckets." "Turn buyer te… Collect ten real examples with the right answer written next to each. Ugly ones included. Decide how you will know it worked. A number: "9 of 10 right", "under 2 wrong per 100".
Download build-vs-buy-checklist.mdDownload build-vs-buy-checklist.mdbuild-vs-buy-checklist.md · 3.5 KB
# Build vs. buy: do you need your own AI model? version: 1.0 · 2026-09-17 · MIT · from Distru's No Bullshit AI Course (08-moonshots/02). Built by Sebastian and the Distru team. What it is: a decision checklist. Answer the questions in order. The first "stop" you hit is your answer. Most operators stop at question 2 or 3. What to bring: one task you want the AI to do, described in one sentence, and ten real examples of it. What comes out: one of five answers: better prompt, skill file, retrieval, small decision model, fine-tune. ## 0. Before anything - [ ] Write the task in one sentence. "Sort incoming support emails into six buckets." "Turn buyer texts into order lines." If you cannot, stop. You do not have a task, you have a wish. - [ ] Collect ten real examples with the right answer written next to each. Ugly ones included. - [ ] Decide how you will know it worked. A number: "9 of 10 right", "under 2 wrong per 100". ## 1. Is the answer already in the model? - [ ] Paste one example into a current frontier model with clear instructions. Does it get it right? - [ ] Try all ten. Count. - [ ] 8 or more right → **stop. Better prompt.** Write the instructions down and reuse them. Cost: an hour. ## 2. Does it fail because it does not know your rules? - [ ] Look at the misses. Is the cause "it does not know our SOP / price sheet / state rule"? - [ ] Paste the rule in. Rerun the misses. - [ ] Fixed → **stop. Skill file.** Put the rules and the steps in a SKILL.md or a standing system prompt. Cost: an afternoon. ## 3. Does it fail because the facts change or there are too many to paste? - [ ] Is the missing information a document set (SOPs, past tickets, COAs, price history) that changes weekly? - [ ] Would the right page, pasted in, fix the miss? - [ ] Yes → **stop. Retrieval.** Index the documents, fetch the relevant ones per question, let the model read them. Cost: days to set up, ongoing upkeep of the index. Fine-tuning does not add facts reliably (Ovadia et al. 2024, https://arxiv.org/abs/2312.05934); retrieval does. ## 4. Is the output a label, score or yes/no rather than text? - [ ] Every answer is one of a fixed set (bucket, priority, which rep, approve/hold)? - [ ] You have hundreds to thousands of past examples with the label already attached (closed tickets, past orders, past decisions)? - [ ] Wrong answers are cheap to catch and reverse? - [ ] All three yes → **stop. Small decision model.** A calibrated decision model or a classic classifier trained on your labelled history. Cheap to run, fast, testable. Needs a threshold and a monthly calibration check. ## 5. Only now: fine-tuning - [ ] The failure is style, format or a consistent instruction-following defect, not missing facts. - [ ] You have at least 50 to 100 clean examples for a first pass (OpenAI: minimum 10, start with 50; https://developers.openai.com/api/docs/guides/supervised-fine-tuning), and a held-out eval set the model never trains on. - [ ] Volume is high enough that a shorter prompt saves real money. - [ ] Someone owns re-running the eval every time the base model or your data changes. - [ ] All four yes → fine-tune a small model. Otherwise go back to 1. ## Never - Train "a cannabis LLM" from scratch. Nobody in this industry has the data or the budget, and a frontier model with your documents beats it. - Fine-tune to teach the model your prices, your inventory or this month's state rule. Those change; weights do not. - Skip the eval. Without a test set with known answers you cannot tell whether any of this made it better. - Paste-safety checklistCheat sheetCheat sheetdocfromfrom← What You Can Paste Into AI (and What You Shouldn't)What You Can Paste Into AI: Data Retention, PII, and Credentials in Plain TermsData handling: retention tiers, PII redaction, and credentials behind a tool boundary · AI Basics, Minus the HypeAI Basics: LLMs and Decision Models, Without the HypeFundamentals: LLMs and decision models
Sorts anything you are about to paste into three piles: fine to paste, redact first, never. Read it before the first paste of the day.Sorts anything you are about to paste into three piles: fine to paste, redact first, never. Read it before the first paste of the day.Sorts anything you are about to paste into three piles: fine to paste, redact first, never. Read it before the first paste of the day.
A piece of itExampleExample Menu, prices, product names and descriptions Your own SOPs, training docs, email templates COA numbers (THC %, terpenes, pass/fail) with no patient or customer attached Public regulations, Metrc bulletins, state notices
Download paste-safety-checklist.mdDownload paste-safety-checklist.mdpaste-safety-checklist.md · 2.4 KB · 4 more files in the pack4 more files in the pack+4
# Paste-Safety Checklist: read before anything goes into an AI chat From Distru's No Bullshit AI Course, lesson 01-03 (learnai.distru.com). CC0 1.0. Version 1.0, September 2026. Three piles. Decide which one the thing in your hand belongs to, then act. ## Pile 1: paste it (the sales floor) Things anyone walking into your store could read or ask for. - [ ] Menu, prices, product names and descriptions - [ ] Your own SOPs, training docs, email templates - [ ] COA numbers (THC %, terpenes, pass/fail) with no patient or customer attached - [ ] Public regulations, Metrc bulletins, state notices - [ ] Your own notes and drafts ## Pile 2: redact first (a person is in it) Anything with a real person in it. Run `redact.py` (in this folder) or do it by hand: names to initials, phones and emails out, customer IDs to placeholders, license numbers to last four. - [ ] Customer or buyer orders, texts, emails - [ ] Delivery schedules and routes - [ ] Employee shift notes, performance notes, timesheets - [ ] Supplier and vendor correspondence with named people - [ ] Any export from your ERP or POS with a contact column Metrc tags themselves are not secret; keep them when the task needs them (reconciliation does). Strip them when it does not. ## Pile 3: never (the safe) No redaction makes these safe. They do not go in a chat window, ever, on any tier. - [ ] Passwords, logins, Metrc or ERP credentials - [ ] API keys, tokens, anything that starts with `sk-`, `AKIA`, `ghp_` or looks like a long random string - [ ] Social Security numbers, driver's licence numbers, passport numbers - [ ] Bank account and routing numbers, card numbers - [ ] Medical-program patient records (names, conditions, recommendations, patient IDs) in any form - [ ] Anything a customer gave you under a signed agreement that names how it may be used If one of these has already been pasted: change it (rotate the key, reset the password) today. Deleting the chat does not un-send it. ## Before you paste, two more questions - [ ] **Which tier am I on?** Consumer chat, a business/team plan, or an API/developer account. Each has its own data policy. Anthropic, OpenAI and Google each publish theirs; read the one for your tier, not the marketing page, and note the date you read it. - [ ] **Is training on my chats turned off, if the tier allows it?** Find the setting. Screenshot it. Put the screenshot in the folder with this checklist.The rest of the packThe rest of the packls
- redact-before-paste/README.md · 1.9 KB
- redact-before-paste/names.txt · 36 B
- redact-before-paste/redact.py · 7.9 KB
- redact-before-paste/sample-input.csv · 637 B
- Card: the five-minute repo check, with saved searchesCheat sheetCheat sheetdocfromfrom← Someone Already Built It: How to Find ItSomeone Already Built It: Searching Repos, Templates and Registries FirstSearch-first: GitHub, n8n templates, skill directories and the MCP registry before you build · Pick the Right ToolPick the Right Tool: Model, Automation or AgentModel & Architecture Selection
Five questions to ask before you trust somebody else's free code: when it was last touched, whether anyone answers, what it is licensed as, what it asks for, whether it runs.Five questions to ask before you trust somebody else's free code: when it was last touched, whether anyone answers, what it is licensed as, what it asks for, whether it runs.Five checks before adopting a repo, with the
ghandgrepone-liners for each: last push, issue responsiveness, license, credential scope, ten-minute run.A piece of itExampleExample # · Question · Where to look · Pass · Walk 1 · When was it last touched? · The date next to the newest commit, top of the file list · Wi… 2 · Does anyone answer? · The Issues tab. Open a few closed ones · The owner replies, even wi…
Download five-minute-repo-check.mdDownload five-minute-repo-check.mdfive-minute-repo-check.md · 4.1 KB
# The Five-Minute Repo Check From Distru's No Bullshit AI Course, module 02 lesson 03. Print it, or keep it open next to GitHub. Five questions, in order. Stop at the first bad answer and move to the next candidate. Last verified: September 2026. License: CC0. ## The card | # | Question | Where to look | Pass | Walk | |---|---|---|---|---| | 1 | When was it last touched? | The date next to the newest commit, top of the file list | Within the last 12 months | Older than a year for anything that talks to an AI model or an API; those move fast | | 2 | Does anyone answer? | The Issues tab. Open a few closed ones | The owner replies, even with "no" | Dozens of open issues, no owner replies, or Issues switched off | | 3 | Are you allowed to use it? | A `LICENSE` file in the root, or the license badge in the sidebar | MIT, Apache-2.0, BSD, CC0, MPL | No license file (that means all rights reserved), or "non-commercial only" | | 4 | What does it ask for? | README setup section, `.env.example`, config files | Read-only keys, your own machine or server | Your Metrc or ERP key sent to someone else's server; admin rights; curl-piped-to-shell installs | | 5 | Does it run in ten minutes? | README install steps, top to bottom | You get one real output from your own data | No install steps, or step 3 fails and nobody has filed the same failure | Stars are a weak signal. A repo with 40 stars and an owner who answered an issue last week beats one with 4,000 stars and silence since 2024. ## The same five, on the command line ```bash gh repo view owner/name # description, license, stars, last push gh repo view owner/name --json pushedAt,licenseInfo,isArchived gh issue list -R owner/name --state open -L 20 git clone --depth 1 https://github.com/owner/name && cd name git log -1 --format='%cd %s' # last commit date and message grep -rn --include='*.md' --include='*.sh' --include='*.json' -E 'curl[^|]*\|\s*(ba)?sh' . # pipe-to-shell installs grep -rn -iE 'api[_-]?key|secret|token' .env.example README.md 2>/dev/null # what it wants from you cat package.json | python3 -c 'import json,sys; p=json.load(sys.stdin); print(p.get("scripts",{}).get("postinstall")); print(len(p.get("dependencies",{})), "deps")' ``` A `postinstall` script that downloads or executes anything is a stop, not a warning. ## Saved searches Paste into the GitHub search box. Change the date each quarter. ```text metrc pushed:>2025-09-01 cannabis topic:api pushed:>2025-09-01 license:mit metrc language:python pushed:>2025-09-01 "model context protocol" cannabis n8n metrc ``` GitHub qualifiers used: `pushed:>YYYY-MM-DD`, `topic:`, `license:`, `language:`, `stars:>=n`. Reference: https://docs.github.com/en/search-github/searching-on-github/searching-for-repositories Other places, in the order we check them: | Place | URL | What lives there | |---|---|---| | This course's giveaways | /giveaways/ | Cannabis-specific skills, prompts, n8n flows, sheets. Tested. | | n8n template library | https://n8n.io/workflows/ | Ready-made workflows. Search the boring part of your job (Gmail to Sheet, CSV to Slack), not "cannabis". | | Skill directories | https://skills.sh | Skills for coding agents; install with `npx skills add owner/repo`. Read the SKILL.md before you install. | | Official MCP registry | https://registry.modelcontextprotocol.io | MCP servers by name. Check the publisher and what scopes the server asks for. | | GitHub | https://github.com/search?type=repositories | Everything else. Use the saved searches above. | ## Asking an AI to search for you Paste this into a chat tool with web search switched on. Then open every link yourself; models invent repositories that do not exist. ```text I run a cannabis [dispensary / cultivation / distribution] business. I want an existing open-source tool, n8n template, skill or MCP server that does: [one sentence]. Search the web. List up to five real candidates. For each give: the exact URL, the date of the last commit or update, the license, what credentials or access it asks for, and one sentence on what I would have to change for my case. If you cannot verify a URL, say so instead of guessing. Do not invent projects. ``` - Checklist: compliance review for cannabis copyCheat sheetCheat sheetdocfromfrom← Vendor Emails, SOPs, and Budtender Training in MinutesVendor Emails, SOPs, and Budtender Training: One Example of Yours, One Rules Block, One Saved Prompt per DocumentDocument generation: style anchors, few-shot examples, house-rules constraints, and templates promoted to skills · Prompts That Actually WorkPrompts That Work for OperatorsPrompting for Operators
Twelve checks to run on anything an AI wrote before it reaches a customer: no health claims, the required warnings present, every number traced back to something you pasted.Twelve checks to run on anything an AI wrote before it reaches a customer: no health claims, the required warnings present, every number traced back to something you pasted.Twelve checks to run on anything an AI wrote before it reaches a customer: no health claims, the required warnings present, every number traced back to something you pasted.
A piece of itExampleExample 1. No medical or health claims. No "treats", "cures", "helps with", "relieves", "for anxiety /… 2. No safety claims. No "safe", "non-addictive", "no side effects", "natural" used to imply saf… 3. No comparative claims you cannot document. "Strongest on the shelf", "best price in town" ne… 4. Potency numbers match the COA. THC, CBD, terpene percentages come from the lab report for th…
# Compliance review checklist for cannabis copy Run this on anything an AI wrote before it goes to a customer, a vendor, a new hire or the public: menu descriptions, emails, SOPs, training one-pagers, social posts. It takes two minutes. It is not legal advice; your state's rules and your compliance officer win every time. From Distru's No Bullshit AI Course, lesson 03-03. CC0 1.0: copy, edit, print, paste into a prompt. Status 2026-09-17: section A's phrases match the medical-claim list the course lints its own lessons against; section B lists the requirements common to most adult-use states and must be checked against yours. The model will catch most of A and some of C when you paste it as a review step. It will not catch what it invented and believes, which is why section C is yours to do. ## A. Claims (every state) - [ ] 1. **No medical or health claims.** No "treats", "cures", "helps with", "relieves", "for anxiety / pain / sleep", "wellness benefits". "Customers describe it as relaxing" is a report of what people say, not a claim; even that is banned in some states. When in doubt, describe aroma, flavor and potency only. - [ ] 2. **No safety claims.** No "safe", "non-addictive", "no side effects", "natural" used to imply safety. - [ ] 3. **No comparative claims you cannot document.** "Strongest on the shelf", "best price in town" need proof or go. - [ ] 4. **Potency numbers match the COA.** THC, CBD, terpene percentages come from the lab report for that batch, not from the strain's reputation. Check one number against the COA. - [ ] 5. **No appeal to minors.** No cartoons, candy look-alikes, "kid", "fun for the whole family", toy or game references. Many states also ban anything "attractive to children" by design, not just words. ## B. Required elements (check your state; these are the usual ones) - [ ] 6. **License number** where your state requires it on ads and outbound business communication. - [ ] 7. **Age statement** ("21+ only" or your state's medical wording) on anything public. - [ ] 8. **State warning text** on product and promotional copy where required (impairment, pregnancy, keep away from children; exact wording varies by state). - [ ] 9. **Audience restriction** for ads: most states require a reasonable expectation that 70% or more of the audience is 21+. Social posts count. - [ ] 10. **No giveaways or price promotions** where your state bans them ("free", "BOGO", "discount for review"). ## C. Facts (the AI part) - [ ] 11. **Every number traces to something you pasted.** Prices, weights, dates, quantities, percentages. Open the source; find it. - [ ] 12. **Every named thing exists.** Product names, strain names, vendor names, people. Search your catalog or contacts for each one. - [ ] 13. **Every rule quoted is real.** If the copy says "state law requires", find the sentence in the regulation or the state's bulletin. If you cannot, cut it. - [ ] 14. **Dates are right.** Deadlines, delivery windows, "this week". AI drafts often carry the wrong year. - [ ] 15. **Nothing was added that you did not give it.** Read once asking only "where did this come from?" Invented prices and invented delivery promises are the most common leftovers. ## D. Voice and send - [ ] 16. **It sounds like you.** If a sentence would not survive being read aloud to a budtender, rewrite it. - [ ] 17. **The audience is right.** A one-pager for budtenders is not a public ad, but it will be repeated to customers, so A still applies. - [ ] 18. **A person read it.** Anything going to the state, a customer or the public gets a human read. No exceptions, no matter how good the draft. ## Paste it into the prompt Add this line to the end of any document prompt, then paste the checklist above it: ``` Before you give me the final text, review your draft against the checklist I pasted. List each item you changed something for, with the original and the fix. Then give the final text. ``` The model will catch most of A and some of C. It will not catch what it invented and believes. That is items 11 to 15, and that is your job. ## State rules Advertising and labeling rules differ by state and change often. Start from the state's own site (the cannabis control agency's regulations page and its bulletins), not from a summary. Add your state's exact required warning text and license-number rule to section B and keep this file with your SOPs. - Checklist: reviewing an AI-drafted orderCheat sheetCheat sheetdocfromfrom← From Buyer Email to Draft OrderFrom Buyer Email to Draft Order: Their Last Orders, Your Live Menu, Your ApprovalOrder intake against Distru: parse, match to menu and order history, confidence per line, human write gate · Using AI With DistruUsing AI With Distru (API, MCP, agents)Distru API, MCP, and Agents
Ninety seconds of checks for whoever approves an order an AI drafted from a buyer's message: right customer, right units, nothing added, nothing dropped.Ninety seconds of checks for whoever approves an order an AI drafted from a buyer's message: right customer, right units, nothing added, nothing dropped.Ninety seconds of checks for whoever approves an order an AI drafted from a buyer's message: right customer, right units, nothing added, nothing dropped.
A piece of itExampleExample Right customer. The draft names a company from your list, not a company the AI typed. Same lice… Right source. You can see the original message next to the draft. If the draft came from a phot… Right date. Delivery or requested date matches what the buyer wrote. "Thursday truck" means the… Status is draft. Nothing has shipped, reserved or invoiced yet. In Distru terms the order is PE…
# Order intake review checklist For the person who approves a draft order that an AI wrote from a buyer's email, text, PDF or spreadsheet. From lesson 07-03 of the No Bullshit AI Course. Version 1.0.0 (2026-09-17). CC0 1.0. Print it, or paste it into the notes of your order form. Ninety seconds per order once you are used to it. Every line is a thing we have seen an AI get wrong. ## Before you look at the lines - [ ] **Right customer.** The draft names a company from your list, not a company the AI typed. Same license, same ship-to. "Green Fern Oakland" and "Green Fern Berkeley" are different orders. - [ ] **Right source.** You can see the original message next to the draft. If the draft came from a photo, the photo is legible to you too. - [ ] **Right date.** Delivery or requested date matches what the buyer wrote. "Thursday truck" means the next Thursday, not this one if today is Thursday afternoon. - [ ] **Status is draft.** Nothing has shipped, reserved or invoiced yet. In Distru terms the order is PENDING, which does not touch inventory. ## Every line - [ ] **Product exists.** Each line points at one product on your menu. A line the AI marked uncertain (yellow, low confidence, "closest match") gets opened, not skimmed. - [ ] **Size and unit.** "2 cases of gummies" became a case quantity, not 2 units. Grams vs. eaches vs. cases is the most common miss. - [ ] **Quantity is what they wrote.** Read the number in the message, read the number in the draft. Out loud if you have to. - [ ] **"Same as last time" was resolved to a real past order,** and that order is the one you would have picked. If the buyer has two regular orders, ask them. - [ ] **Nothing added.** The draft has no line the buyer did not ask for. AIs like to complete a pattern. - [ ] **Nothing dropped.** Count the lines in the message; count the lines in the draft. - [ ] **Price is the customer's price**, not list price and not last quarter's price. - [ ] **Stock.** Anything flagged sold out or over-available is resolved with the buyer before approval, not after. ## Before you click approve - [ ] **Totals are plausible.** A $40,000 order from a customer who averages $4,000 gets a phone call. - [ ] **Notes carried over.** Delivery instructions, PO numbers, "leave at the dock" landed in the order notes, not in a line item. - [ ] **Compliance can follow.** Package-tracked items will need a transfer before the order can move to Delivering. If a line has no package to draw from, the order stays PENDING or PROCESSING. - [ ] **Corrections recorded.** If you fixed a match, tell the tool why (Distru's order agent keeps your correction as a memory for next time). If your own pipeline has no memory, write the buyer's word and your product in a shared sheet so it stops happening. ## What approve means You are the write gate. The AI proposed; you are the one who made it real. If anything above is unchecked, the order stays a draft and the buyer gets one question by text. That question costs thirty seconds. A wrong pallet costs a day. ## Tally (optional, once a week) | week | drafts reviewed | approved untouched | fixed one line | fixed two or more | rejected | |---|---|---|---|---|---| If "approved untouched" is under half after a month, the matching needs work, not the reviewer. - Worksheet: your first real task (30 minutes)Cheat sheetCheat sheetdocfromfrom← Your First Real Task: 30 Minutes, One ProblemYour First Real Task: One Chore, One Project Workspace, 30 MinutesZero-to-useful: one project, one system prompt, one timed workflow · AI Basics, Minus the HypeAI Basics: LLMs and Decision Models, Without the HypeFundamentals: LLMs and decision models
A 30-minute worksheet that takes you from picking your first chore to timing three runs and deciding whether to keep it.A 30-minute worksheet that takes you from picking your first chore to timing three runs and deciding whether to keep it.A 30-minute worksheet that takes you from picking your first chore to timing three runs and deciding whether to keep it.
A piece of itExampleExample You do it at least weekly. Text goes in, text comes out (an email, a summary, a rewritten sheet, a narrative). You can tell in under a minute whether the output is right. Nothing in it is secret: no passwords, no customer IDs, no patient information. (Lesson 01-03.)
Download first-task-worksheet.mdDownload first-task-worksheet.mdfirst-task-worksheet.md · 4.1 KB
# Your First Real Task: the 30-minute worksheet From Distru's No Bullshit AI Course, lesson 01-04 (learnai.distru.com). CC0 1.0: copy, edit, share. Version 1.0, September 2026. The standing-instructions block and the chore prompt were run in Claude Projects and a ChatGPT project against a redacted supplier price sheet and a Monday restock list; both tools accepted the block as-is. One chore. One workspace. Three timed runs. Then a decision. Fill the blanks as you go; the whole sheet is done in 30 minutes. ## 1. Pick the chore (5 minutes) A good first chore ticks every box: - [ ] You do it at least weekly. - [ ] Text goes in, text comes out (an email, a summary, a rewritten sheet, a narrative). - [ ] You can tell in under a minute whether the output is right. - [ ] Nothing in it is secret: no passwords, no customer IDs, no patient information. (Lesson 01-03.) - [ ] A wrong answer costs you an edit, not a fine. Good first chores we have seen work: the Monday restock email to a supplier; a plain-English summary of last week's returns from the returns log; rewriting a vendor's messy price sheet into your column names; turning count-sheet notes into an inventory adjustment narrative; turning a Metrc bulletin into "what changes for us, by Friday". Bad first chores: anything where a number goes straight to the state; anything that needs your live inventory; anything with a customer's name in it. My chore: ________________________________________________ How long it takes me by hand today (honest guess): ______ minutes ## 2. Set up the workspace once (10 minutes) Most chat tools have a "project" feature: a saved space with standing instructions and files that load every time you open it. Create one, name it after the chore, and paste this in as the instructions. Edit every bracket. ``` You work for [company], a licensed cannabis [cultivator / distributor / retailer] in [state]. Units: weights in grams unless I say otherwise; 1 lb = 453.592 g. Dates as YYYY-MM-DD. Our product categories, exactly as we name them: [flower, pre-rolls, vapes, edibles, ...]. Tone for anything I will send to a person: short, direct, one line of pleasantry at most. Match the two example emails in the attached files. Rules that always apply: 1. Use only the information I gave you. If something is missing, write MISSING instead of guessing. 2. Never state a Metrc rule, tag, price or total that is not in the material I pasted. 3. No medical, health or effect claims about any product, ever. 4. When I paste a file, tell me in one line what you think it is before you use it. ``` Attach, as files, only what the chore needs: the current price list, the SOP for this chore if you have one, and one redacted example of a good output from last time. Keep the total small; everything you attach is re-read on every message. ## 3. Run it three times (15 minutes) Use the same prompt each time, with that week's real input. Start the clock when you open the project, stop it when you have checked the output and would actually send or use it. ``` Here is this week's [restock list / returns log / price sheet / count notes]: [paste] Do the [chore] exactly as the standing instructions say. Then list, in one line each, anything you had to assume. ``` | Run | Input used | Minutes (including your checking) | Mistakes you caught | Kept the output? | |---|---|---|---|---| | By hand | | | | | | 1 | | | | | | 2 | | | | | | 3 | | | | | After each run, fix the standing instructions, not the prompt. If it kept getting a unit wrong, the unit rule goes in the instructions. If it kept inventing a supplier detail, add the supplier sheet as a file. ## 4. Decide (2 minutes) - Run 3 faster than by hand, including checking: **keep it.** Write "open the [chore] project, paste the list, check the output" into your SOP. - Run 3 about the same: **drop it.** Pick a different chore next week. This one was not the right shape. - Run 3 slower: the chore probably has a lookup in it (a fact the AI does not have) or the output is hard to check. Both are fixable later; not this week. The only bad outcome is running it once, being impressed, and never timing it. - Card: check its work in five secondsCheat sheetCheat sheetdocfromfrom← Check Its Work: The Five-Second HabitCheck Its Work: The Five-Second Habit (and the Checks a Script Can Run for You)Verification: the five-check habit, evals, spot-check sampling, run logging and deterministic validators · Prompts That Actually WorkPrompts That Work for OperatorsPrompting for Operators
Five checks, five seconds each, to run on any AI answer before you send it: source, one number, the dates, where each fact came from, and one rerun.Five checks, five seconds each, to run on any AI answer before you send it: source, one number, the dates, where each fact came from, and one rerun.Five checks, five seconds each, to run on any AI answer before you send it: source, one number, the dates, where each fact came from, and one rerun.
A piece of itExampleExample All five clean and it goes to a colleague: send. All five clean and it goes to a customer, a vendor, the state or the public: one human read, th… Any check fails: fix the prompt (more material, clearer shape, the "say MISSING" line) and reru…
Download check-its-work-card.mdDownload check-its-work-card.mdcheck-its-work-card.md · 2.7 KB
# Check its work: the five-second card Print it. Tape it next to the screen. Run it on every AI output before you send, ship, paste or upload. From Distru's No Bullshit AI Course, lesson 03-04. CC0 1.0. Status 2026-09-17: the five checks are the manual version of the failure list in course lesson 01-02; the table at the bottom is the scripted version. No benchmark numbers. Keep a tally of what each check catches for a month and you will know which two to keep. --- ## The five checks **1. Source.** Did I give it the thing it is talking about? If it summarized a bulletin, did I paste the bulletin? If not, the summary is from memory, and its memory has a cutoff date and no access to your state. **2. Number.** Pick one number. Recount or recompute it by hand or in a spreadsheet. One line is enough to know whether to trust the rest. If the one you picked is wrong, check all of them or ask for the formula instead. **3. Date.** Every date and every "this week / next Tuesday / Q3". AI drafts default to the wrong year more often than any other single mistake. **4. Where did that come from?** Read once asking only that question. Any fact, name, price, rule or quantity you did not paste in is a guess. Find it in your material or cut it. **5. Rerun once.** Send the same prompt again (or ask "what did you get wrong?"). If the two answers disagree on anything that matters, neither is trustworthy yet. Fix the prompt, not the answer. ## Then decide - All five clean and it goes to a colleague: send. - All five clean and it goes to a customer, a vendor, the state or the public: one human read, then send. - Any check fails: fix the prompt (more material, clearer shape, the "say MISSING" line) and rerun. Do not hand-patch the output; the next run will make the same mistake. ## For the tech side (same five, made permanent) | check | the manual version | the version a script runs every time | |---|---|---| | source | did I paste it? | log the prompt and its inputs next to every output (one JSON line per run) | | number | recount one line | sum checks, row-count checks, schema validation on any structured output | | date | read every date | regex for dates; reject any year outside the expected range | | where from | read once for guesses | require quotes or row references in the output; fail if missing | | rerun | send it twice | a small eval set: 10 to 20 fixed inputs with known right answers, rerun on every prompt or model change | Spot-check rule of thumb for batches: check 10 rows of 200 at random. Zero wrong, ship. One wrong, check 30 more. Two wrong, stop and fix the prompt. The agent version of this card, where a yes/no check runs before an AI is allowed to act, is course lesson 06-05. - Template: one-page automation runbookCheat sheetCheat sheetdocfromfrom← When Automation Breaks (It Will)When Automation Breaks: Fail Loudly, Run Twice Safely, Write It DownFailure branches, backoff on 429 and 5xx, partial runs, find-before-create, and a monthly review · Automations Without a DeveloperAutomations Without a Developer (n8n, CSV)Automation Patterns
One page per automation, filled in the day you switch it on: what it does, where it runs, whose key it uses, and how to turn it off.One page per automation, filled in the day you switch it on: what it does, where it runs, whose key it uses, and how to turn it off.One page per automation, filled in the day you switch it on: what it does, where it runs, whose key it uses, and how to turn it off.
A piece of itExampleExample Open the workflow. Toggle Active off. (Or: crontab -e, comment the line.) Post in #ops: "Turned off <name> because <reason>. Doing it by hand until <date>." The manual fallback is: <the by-hand steps, or a link to the SOP>.
# Runbook: <automation name> One page per automation. Fill it in the day you switch the schedule on, not the day it breaks. From Distru's No Bullshit AI Course, module 05, lesson 4. Version 1.0 (2026-09-17). CC0. ## What it does (one sentence) > Every <when>, it <reads what> from <where> and <writes what> to <where>. Example: Every morning at 06:00 Pacific it reads today's READY_TO_SHIP orders from Distru and sets them to DELIVERING, then posts a line to #ops. ## Where it lives | | | |---|---| | Runs in | n8n at `<url>` / a cron job on `<server>` / a script on `<laptop>` | | Workflow or script name | | | Schedule | `0 6 * * *` in `<time zone>` | | Credentials it uses | Distru API key "<name>" (view orders, edit orders only), Slack "<name>" | | Where the credentials are stored | n8n Credentials / 1Password vault "<name>" | | Who owns it | <name>, backup <name> | | Who reads the Slack channel | #ops, checked by <role> each morning | ## How to turn it off 1. Open the workflow. Toggle **Active** off. (Or: `crontab -e`, comment the line.) 2. Post in #ops: "Turned off <name> because <reason>. Doing it by hand until <date>." 3. The manual fallback is: <the by-hand steps, or a link to the SOP>. Turning it off is always allowed. Nobody needs permission to stop an automation. ## What a good run looks like - Slack line at ~06:01 starting with `Set N order(s) to DELIVERING`. - N is roughly <normal range, e.g. 3 to 15>. Zero on a delivery day is suspicious. - Execution list shows a green run under <n> seconds. ## Known failures and what to do | you see | it means | do this | |---|---|---| | `FAILED to update ... 400 ... fulfilled` | the order is not ready (unfulfilled line, no customer, no transfer) | fix the order in Distru; the run does not retry, tomorrow's run will pick it up if still due | | `401` | the API key was revoked or expired | make a new key with the same narrow permissions, update the credential, run once manually | | `429` or `403 rateLimitExceeded` | too many calls too fast | nothing today; lower the per-run cap or widen the batch interval before tomorrow | | No Slack line at all | the run did not happen, or Slack failed | open the executions list; if empty, check the schedule and the instance is up; if red, read the error | | The same record twice | a write ran but the record of it was lost, then the write ran again | stop the workflow, clean up by hand, add or fix the find-before-create step | | More than one page of results | more records matched than one run handles | run again, or add pagination | ## Rules this automation follows - [ ] Every write is keyed on a stable id (order id, tag) and checks for an existing record first. - [ ] Retries only on 429 and 5xx, never on 400. Retries wait between tries. - [ ] A failed record is reported by name, in a place a human reads, the same day. - [ ] A dry-run switch exists and is used after every change to the workflow. - [ ] The workflow does at most <cap> writes per run. - [ ] Nothing in it touches money, compliance or a customer without a person approving first. ## Change log | date | who | what changed | dry run done? | |---|---|---|---| | | | | | ## Monthly review (first Monday, 15 minutes) - [ ] Count runs, failures, and records touched last month. Write the three numbers here: ___ / ___ / ___ - [ ] Read one successful run end to end. Does the output still match what the sentence at the top says? - [ ] Open the failure with the ugliest message. Does the table above cover it? If not, add a row. - [ ] Did anyone turn it off last month? Why? Is the reason fixed? - [ ] Are the credentials still narrow, and does the owner still work here? - [ ] Is it still worth running? If it touched fewer than <n> records a month, consider deleting it. - Checklist: menu copy rules (allowed and forbidden patterns)Cheat sheetCheat sheetdocfromfrom← Menus and Product Data: Descriptions, Photos, and CleanupMenus and Product Data: Descriptions Without Claims, a Cleanup Script, and Photo URLs for Bulk ImportProduct catalog pipeline: rule-gated description generation, CSV normalisation, image URL mapping, menu sync without a model · Cannabis Problems, Solved With AICannabis Problems: Metrc, Inventory, Sales, 280EDomain Workflows: Compliance, Inventory, Sales, Accounting
The patterns a product description may never contain, with the exact word lists, so a health claim never reaches the menu.The patterns a product description may never contain, with the exact word lists, so a health claim never reaches the menu.The patterns a product description may never contain, with the exact word lists, so a health claim never reaches the menu.
A piece of itExampleExample Pattern · Examples that fail · Regex (case-insensitive) Names a condition or symptom · pain, anxiety, insomnia, stress, nausea, inflammation, PTSD, arthr… Says it helps, treats, cures, relieves · helps with, relieves, treats, cures, heals, soothes, eas…
Download menu-copy-rules.mdDownload menu-copy-rules.mdmenu-copy-rules.md · 5.9 KB
- Question pack: first three questions for a buyer textCheat sheetCheat sheetdocfromfrom← The AI That Only DecidesThe AI that only decides: decision models (System One)System One decision models: typed questions in, calibrated answers out · AI Basics, Minus the HypeAI Basics: LLMs and Decision Models, Without the HypeFundamentals: LLMs and decision models
A ready-made request that asks three things about one buyer message: which team should take it, how soon it needs an answer, and whether it makes a health claim.A ready-made request that asks three things about one buyer message: which team should take it, how soon it needs an answer, and whether it makes a health claim.Request body for
POST /v1/systemone: Choice, Score and Noul questions over one buyer text. Editteam.criteriato your org.A piece of itExampleExample "state": "PASTE ONE BUYER TEXT HERE. Example: Hey, can we get 20 more of the Gelato 3.5g by Friday? Also the… "model": "jev-latest", "questions": { "team": { "type": "choice", "instructions": "Which team should handle this buyer text?",Download first-three-questions.jsonDownload first-three-questions.jsonfirst-three-questions.json · 1.7 KB
{ "_readme": "Request body for POST https://api.typesafe.ai/v1/systemone (TypeSafe, System One / Jev). Paste your own buyer text into `state` (change names). Edit the team names in `team.criteria` to match your org. Header: Authorization: Bearer $TYPESAFE_API_KEY. Prices, model names and rate limits are TypeSafe's as of September 2026; check docs.typesafe.ai before you build on them. From the No Bullshit AI Course, lesson 01-06.", "state": "PASTE ONE BUYER TEXT HERE. Example: Hey, can we get 20 more of the Gelato 3.5g by Friday? Also the last invoice still shows the credit missing.", "model": "jev-latest", "questions": { "team": { "type": "choice", "instructions": "Which team should handle this buyer text?", "criteria": { "sales": "New orders, changes to an order, product or pricing questions", "fulfillment": "Delivery timing, manifests, shortages, wrong items", "billing": "Invoices, payment, credits, account balance", "other": "None of the above" } }, "urgency": { "type": "score", "instructions": "How soon does this buyer text need a reply?", "criteria": [ "Can wait a week; no date or deadline mentioned", "Needs a reply this week; a date or delivery window is mentioned", "Needs a reply today; the buyer says today, ASAP, or is out of stock" ] }, "health_claim": { "type": "noul", "instructions": "Does the text claim a health or medical effect for a product?", "criteria": { "true": "States or implies the product treats, cures, relieves or helps a condition or symptom", "false": "Describes flavor, potency, strain, price or logistics only" } } } } - questions.json: the five-question packCheat sheetCheat sheetdocfromfrom← Sort the Pile Before You Read ItSort the Pile Before You Read It: Typed Questions Route Buyer Texts, Tickets and Menu CopyInbox triage with a System One model: fan-out, confidence-gated routing, Noul guardrails · Cannabis Problems, Solved With AICannabis Problems: Metrc, Inventory, Sales, 280EDomain Workflows: Compliance, Inventory, Sales, Accounting
The five questions themselves: is this an order, what does the sender want, how urgent is it, is there a health claim in it, does a person need to see it.The five questions themselves: is this an order, what does the sender want, how urgent is it, is there a health claim in it, does a person need to see it.The
questionspayload forPOST /v1/systemone: is_order, intent, urgency, health_claim, needs_human, with starting thresholds in_readme.A piece of itExampleExample "is_order": { "type": "noul", "instructions": "Is the sender asking us to ship them cannabis product, either a new order or a repeat of a… "criteria": { "true": "The sender names products, quantities, or says to repeat a previous order, and expects it to be… "false": "The sender is asking a question, raising a problem, selling us something, or the message is not…Download questions.jsonDownload questions.jsonquestions.json · 3.7 KB · 3 more files in the pack3 more files in the pack+3
{ "_readme": "Question pack for a cannabis wholesale inbox, in the exact shape of the `questions` field of POST https://api.typesafe.ai/v1/systemone (TypeSafe, model jev-latest). Send one message per request as `state`; answers come back under the same keys. Starting thresholds, tune on your own traffic: needs_human >= 0.50 -> human lane. health_claim >= 0.70 -> human (do not publish), >= 0.35 -> confirm (a person reads it). intent.confidence < 0.50 -> human (unsure what it is). order/reorder -> act (draft for approval) only when is_order >= 0.85 and intent.confidence >= 0.75, otherwise confirm. complaint -> human always. question/vendor/other -> act at intent.confidence >= 0.75, else confirm. urgency score >= 1.5 (of 0-2) flags the row urgent in every lane. 'Act' never writes to your ERP or Metrc; it drafts, files or routes, and a person approves. Your state's advertising rules decide what counts as a health claim; edit health_claim.criteria to match them. CC0, no attribution needed.", "is_order": { "type": "noul", "instructions": "Is the sender asking us to ship them cannabis product, either a new order or a repeat of a previous one?", "criteria": { "true": "The sender names products, quantities, or says to repeat a previous order, and expects it to be fulfilled.", "false": "The sender is asking a question, raising a problem, selling us something, or the message is not about buying product." } }, "intent": { "type": "choice", "instructions": "What does the sender mainly want from us?", "criteria": { "order": "A new order with specific products or quantities that is not framed as a repeat.", "reorder": "A repeat of a previous order, such as 'same as last time', possibly with additions or changes.", "question": "Asking about availability, pricing, the menu, COAs, delivery timing or account status without ordering yet.", "complaint": "Something went wrong: shorts, damaged or wrong product, late delivery, a billing or credit dispute.", "vendor": "A supplier, lab, packaging, transport or service company writing to us about their product or invoice; not a buyer.", "other": "None of the above: spam, small talk, an out-of-office reply, or something unrelated to the business." } }, "urgency": { "type": "score", "instructions": "How soon does the sender need a response or an action from us?", "criteria": [ "No deadline stated or implied; a reply later this week is fine.", "Needs handling today: a delivery window, a menu going live, a deadline tomorrow, an invoice due.", "Something is stuck right now: a driver waiting at a dock, an empty shelf, a rejected manifest, an inspector on site." ] }, "health_claim": { "type": "noul", "instructions": "Does this text claim or imply that a cannabis product prevents, treats, cures or relieves a medical condition or a symptom?", "criteria": { "true": "It names a condition or symptom (sleep, anxiety, pain, inflammation, nausea, and so on) and says or implies the product helps with it.", "false": "It describes flavor, potency, cannabinoid content, format, packaging or price, or says nothing about health at all." } }, "needs_human": { "type": "noul", "instructions": "Does a person need to read this message and decide before anything is done about it?", "criteria": { "true": "Ambiguous quantities or products, a complaint, a compliance or legal issue, a price negotiation, an angry sender, or anything where a wrong automatic action would cost money or a license.", "false": "A routine, unambiguous request that a standard process can handle and a person can approve afterwards." } } }The rest of the packThe rest of the packls