07: English screenshots, School news version 2 with Checker and Gatekeeper
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 56 KiB |
@@ -2,7 +2,7 @@
|
||||
FOR THE EDITOR
|
||||
|
||||
Guide 7: self-critique and a gatekeeper, a sequel to guide 3. Screenshots in screenshots/,
|
||||
captured on 20 September 2026 (Dify cloud, Dutch build of the same workflow).
|
||||
captured on 21 September 2026 (Dify cloud, English interface).
|
||||
|
||||
Convert to HTML, PDF and Word: python3 build.py
|
||||
(python-markdown, google-chrome and libreoffice; layout and logo in _tools/build_guide.py)
|
||||
@@ -15,7 +15,7 @@ Formatting conventions (see also README.md):
|
||||
- Blockquote starting with **Your choice** = a choice for the participant (green box)
|
||||
|
||||
The Python code for the Gatekeeper is in the text; participants paste it with Ctrl+V into the Code node.
|
||||
Published example app (Dutch, version 2 of School news): https://udify.app/workflow/jJclFyX9BlteuHYi
|
||||
Published example app (version 2 of School news): https://udify.app/workflow/E2CHtVPKe3PLg7GF
|
||||
-->
|
||||
|
||||
# School news with checks: self-critique and a gatekeeper
|
||||
@@ -32,7 +32,7 @@ In guide 3 you built School news: one core message becomes a piece for the websi
|
||||
|
||||
The difference between those two is the heart of this guide. The Checker is a model reviewing a model: good for form and tone, but it can talk itself into things. The Gatekeeper is six lines of Python that cannot be talked into anything: 81 words is too many, full stop. Together they deliver what a communications officer wants: less checking work, and certainty that the rules that really matter really apply.
|
||||
|
||||
This guide follows the cloud version of Dify of 20 September 2026. If your screen differs, follow what you see. The screenshots show the Dutch build of this workflow (Dutch block names such as Controleur and Poortwachter, Dutch texts); the screens and clicks are the same.
|
||||
This guide follows the cloud version of Dify of 20 September 2026. If your screen differs, follow what you see.
|
||||
|
||||
**How to read this guide**
|
||||
|
||||
@@ -77,11 +77,11 @@ Before we started clicking, this card was filled in (the blank card is in the De
|
||||
|
||||
This is what School news looks like before you start:
|
||||
|
||||

|
||||

|
||||
|
||||
And this is what the tail looks like when you are done:
|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
@@ -100,15 +100,15 @@ The new blocks go between Social and Output. So you first disconnect Output.
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
### Step 2. Add the Checker
|
||||
|
||||
1. Under **NEXT STEP** click **Select next step** and choose **LLM**.
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
2. **MODEL**: gpt-5-mini. **CONTEXT**: Knowledge Retrieval / result (the style guide).
|
||||
3. Paste the prompt below into **SYSTEM**. For `{Context}` type a forward slash and choose **Context**; for `{Parent app/text}` choose the item **text** under **PARENT APP**.
|
||||
@@ -125,11 +125,11 @@ Style guide: {Context}
|
||||
Draft message: {Parent app/text}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
4. Rename the block to `Checker`.
|
||||
|
||||

|
||||

|
||||
|
||||
> "Work in two steps, but give only step 2." That is not a contradiction but a trick: the model assesses first (which improves the result) and you still get clean text back that you can pass on directly. If you leave step 1 in the answer, that explanation ends up in the parent app too.
|
||||
|
||||
@@ -145,7 +145,7 @@ Draft message: {Parent app/text}
|
||||
|
||||
1. At Checker: **NEXT STEP** → **Select next step** → under Transform: **Code**.
|
||||
|
||||

|
||||

|
||||
|
||||
2. Click in the editor, select everything (Ctrl+A) and paste the code below.
|
||||
|
||||
@@ -171,7 +171,7 @@ def main(website: str, parent_app: str, social: str) -> dict:
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
What the code does, line by line in plain words:
|
||||
|
||||
@@ -191,7 +191,7 @@ What the code does, line by line in plain words:
|
||||
|
||||
1. Under **INPUT VARIABLES** rename `arg1` to `website` and `arg2` to `parent_app`. Click **+** for a third variable and call it `social`. The names must be exactly the same as the names in the first line of the code.
|
||||
|
||||

|
||||

|
||||
|
||||
2. For each variable click **Set variable** and choose:
|
||||
|
||||
@@ -201,17 +201,17 @@ What the code does, line by line in plain words:
|
||||
| parent_app | **CHECKER / text** (the improved version, not the raw one) |
|
||||
| social | **SOCIAL / text** |
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
3. Under **OUTPUT VARIABLES**: rename `result` to `ok` and set the type to **Number**. Click **+** and add `reasons`, type **String**.
|
||||
|
||||

|
||||

|
||||
|
||||
4. Rename the block to `Gatekeeper`.
|
||||
|
||||

|
||||

|
||||
|
||||
> The output names (`ok`, `reasons`) must literally match the names in the `return` line of the code. One letter different and the workflow stops with an error about a missing output.
|
||||
|
||||
@@ -225,21 +225,21 @@ What the code does, line by line in plain words:
|
||||
|
||||
1. At Gatekeeper: **Select next step** → under Logic: **IF/ELSE**.
|
||||
|
||||

|
||||

|
||||
|
||||
2. Under **IF** click **+ Add Condition** and choose **GATEKEEPER / ok**.
|
||||
|
||||

|
||||

|
||||
|
||||
3. Leave the comparison on **=** and type `1` as the value.
|
||||
|
||||

|
||||

|
||||
|
||||
### Step 6. Exit 1: Approved
|
||||
|
||||
1. Under **NEXT STEP** under **IF**: **Select next step** → **Output**.
|
||||
|
||||

|
||||

|
||||
|
||||
2. Add three output variables:
|
||||
|
||||
@@ -251,7 +251,7 @@ What the code does, line by line in plain words:
|
||||
|
||||
3. Rename the block to `Approved`.
|
||||
|
||||

|
||||

|
||||
|
||||
### Step 7. Exit 2: to the communications officer
|
||||
|
||||
@@ -270,7 +270,7 @@ What the code does, line by line in plain words:
|
||||
|
||||
3. Rename the block to `To the communications officer`.
|
||||
|
||||

|
||||

|
||||
|
||||
> Two Output blocks may not have variables with the same name. If you call them `website` in both, Dify puts an orange "Duplicate variable" in the checklist and you cannot publish. Hence `draft_` in the second exit.
|
||||
|
||||
@@ -280,16 +280,14 @@ What the code does, line by line in plain words:
|
||||
|
||||

|
||||
|
||||
2. Click **Output** in the checklist. The old block is selected; it is hidden behind Checker.
|
||||
2. Click the first line under **Output** in the checklist. The old block is selected and the panel opens.
|
||||
|
||||

|
||||

|
||||
|
||||
3. In the panel click the three dots and then **Delete**.
|
||||
4. Check that the checklist is empty (no number on the icon any more).
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
@@ -309,7 +307,7 @@ You always test a gatekeeper both ways. Testing only the good side proves nothin
|
||||
|
||||
2. **Start Run**. After about a minute the path via **IF** to **Approved** turns green.
|
||||
|
||||

|
||||

|
||||
|
||||
3. Click **DETAIL**: status SUCCESS, run time and tokens.
|
||||
|
||||
@@ -319,12 +317,10 @@ You always test a gatekeeper both ways. Testing only the good side proves nothin
|
||||
|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
> Tracing is your friend. For every question "why did this come out?" you open the block here and see exactly what went in and what came out. This is also the screen on which you saw that the Checker had removed the sign-up deadline (see the orange box in step 2).
|
||||
|
||||

|
||||
|
||||
### Step 10. Test 2: a message with gaps
|
||||
|
||||
1. **Test Run** again, now with a message without a date, without a time and with an abbreviation:
|
||||
@@ -335,25 +331,25 @@ You always test a gatekeeper both ways. Testing only the good side proves nothin
|
||||
| For which class or year group? | `Year 7` |
|
||||
| Which tone fits this message? | **informative** |
|
||||
|
||||

|
||||

|
||||
|
||||
2. **Start Run**. Now the path runs via **ELSE** to **To the communications officer**, and the reasons are at the top of the result.
|
||||
|
||||

|
||||

|
||||
|
||||
Read the reasons: all three texts contain [FILL IN] (the models did not know the date and neatly did not invent one), and the social post contains "asap". That last one is instructive: the Social prompt asked to follow the style guide, and still the abbreviation from the core message slipped through. A prompt asks; the gatekeeper enforces.
|
||||
Read the reasons: all three texts contain [FILL IN] (the models did not know the date and neatly did not invent one). In our Dutch run the social post also contained the abbreviation from the core message; in this run the model left it out. That difference is instructive: the Social prompt asked to follow the style guide, and whether the abbreviation slips through depends on the run. A prompt asks; the gatekeeper enforces, every time.
|
||||
|
||||
### Step 11. Publish
|
||||
|
||||
1. **Publish** → **Publish Update**. Dify creates version 2 of the app; with **Name** you can give a version a name, and via the clock icon at the top right you can always go back to version 1.
|
||||
|
||||

|
||||

|
||||
|
||||
2. Open the webapp and repeat test 2. The colleague sees the reasons at the top and below them the drafts to complete.
|
||||
|
||||

|
||||

|
||||
|
||||
The link has stayed the same (Dutch version): https://udify.app/workflow/jJclFyX9BlteuHYi
|
||||
The link has stayed the same: <https://udify.app/workflow/E2CHtVPKe3PLg7GF>.
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 71 KiB |
@@ -5,7 +5,7 @@ This is what changed per release.
|
||||
|
||||
## 2026-09-20, English screenshots
|
||||
|
||||
- Guides 01, 02 and 03 rebuilt with the English Dify interface and English apps (Text at level, School guide assistant, Parent letter assistant, School news; links in the README). The other guides follow.
|
||||
- Guides 01, 02, 03 and 07 rebuilt with the English Dify interface and English apps (Text at level, School guide assistant, Parent letter assistant, School news with checks; links in the README). The other guides follow.
|
||||
- New appendix 00-self-hosting: running Dify Community Edition yourself with Docker (Windows, Mac, Linux).
|
||||
|
||||
## 2026-09-20, first release
|
||||
|
||||
@@ -57,7 +57,7 @@ The apps are live to try out:
|
||||
- Text at level (01): https://udify.app/workflow/VHWboGL9462eA1KI
|
||||
- School guide assistant (02, with the Reception mode from 03): https://udify.app/chat/6Y6WnP0m5Z3jSHRs
|
||||
- Parent letter assistant (03): https://udify.app/chat/oB2H2mLaoKR6d4IC
|
||||
- School news (03): https://udify.app/workflow/E2CHtVPKe3PLg7GF
|
||||
- School news (03 and 07): https://udify.app/workflow/E2CHtVPKe3PLg7GF
|
||||
- Test week planner (04; Dutch build): https://udify.app/agent/rKoqw8rbmp0IF86Q
|
||||
- Transcription tool (05; Dutch build): https://udify.app/workflow/7N5dNg8fD9qXHA80
|
||||
- Materials check (06; Dutch build): https://udify.app/agent/lkWKedkSW2d3nqBV
|
||||
|
||||