AI-assisted production lines · human approval gates · EU AI Act
Compliance as a property of the production line, not a report written before the audit. An n8n module you drop in front of any publishing step: it classifies the asset under Article 50, labels it, writes provenance, waits for a person, logs the decision, and keeps a registry of every AI system on the instance with a verdict on each path to the public.
Why now, and where the habit comes from. The EU AI Act’s transparency duties for deployers apply from 2 August 2026. This kit is the preparation, built ahead of the date: the obligations turned into a property of the production line before anyone asks for a report. The habit comes from work as AI Expert on Horizon Europe projects with GDSI, where an AI component ships only under the programme’s mandatory ethics and data-governance requirements — governance there is a condition of funding, not a policy document. The same discipline, applied to a marketing line.
Nine pieces, one repository. Your line calls the module; everything else fills itself. The only model in the box is a local text-to-speech voice in the demo line; the kit itself generates nothing, it labels and records what your generators produce.
Yours
A workflow that ends in a publish node. It adds one Execute Sub-workflow call before publishing and gets back approved, disclosure_status and the labelled file.
Module · workflows/transparency-kit.json
Classifies under Art. 50 and Art. 3(60), fixed disclosure sentence per language, provenance manifest, the gate, the record, the registry snapshot. No model inside.
Service · tools/media-label
A small container with a static ffmpeg: burns the label into images and video, writes it into audio metadata. Unreachable? Images fall back to n8n's Edit Image node, the rest is disclosed at publication.
Gate · Slack thread or form
Post to #ai-act-gate, poll the thread, take the reviewer's identity from Slack. No Slack? A Wait-node form, no credentials at all.
Storage · db/schema.sql
Assets, decisions, registry snapshots. Decisions are append-only and hash-chained by database triggers; verify_chain() runs on every audit render.
Page · workflows/audit-view.json
GET /webhook/audit: what an auditor reads instead of the pipeline. Registry with path analysis, synthetic media, generated text, approval log.
Demo · workflows/host-line.json
A real line with the module inside: text → three local Kokoro voices → gate → publish. The only model in the repository, and only here.
Samples · three inactive lines
A social drafter with no gate (uncovered), a support inbox scoring emotion with nobody told (inform), a chatbot that never says it is one (chatbot).
Picture · pipeline-map importer
Generated from the exported workflow JSON and the registry, not drawn. Every block on this page is a node on the map.
Keys 1–5 fly between views: everything, the production line, the kit, the flagged sample, the Auditor block with its page. Press A for flow, H to hide the chrome.
Five blocks, filled from files the line writes. Nothing typed by hand except the reviewer's decision.


Art. 3(60): generated or manipulated content resembling a real person, object, place or event that would appear authentic. No person needed. The intake asks what is shown, whether the footage was altered, and whether it is an artistic or satirical work; the label follows.



Why the satire label is smaller
Art. 50(4) §1, last sentence: when a deep fake is part of an evidently artistic, creative, satirical, fictional or analogous work, the duty is limited to disclosing "in an appropriate manner that does not hamper the display or enjoyment of the work". The law keeps the label and lets it shrink. In the demo the same altered photo of Varna goes through the gate twice with one intake answer changed, Artistic, creative or satirical work?: no gives the full "AI-manipulated" label and the disclosure sentence under the photo, yes gives a small corner label. The claim is the operator's, not the kit's: the person at the gate sees it and approves or returns.
Systems, not assets: emotion recognition and biometric categorisation must inform the people exposed (Art. 50(3)), chatbots must say they are AI (Art. 50(1)). The registry flags both from the workflow graph, publishing or not.
The Act does not regulate links between nodes; it regulates what reaches people. From every node that calls a model, every path forward to a publishing node is walked, and what stood in between decides the verdict.
| Verdict | Rule | For the auditor |
|---|---|---|
| internal | no path reaches a publishing node | no Art. 50 duty, recorded anyway |
| disclosed | every path passes a disclosure step | disclosure is built into the line |
| editorial | no disclosure step, but every path passes a human gate | text only, Art. 50(4) §2, with a named responsible person |
| verify | a destination that may or may not reach people | a person decides; tag the node |
| uncovered | a path reaches people with neither | AI content goes out with no disclosure and no responsible person |
| likeness | a face or voice generator reaches people without a disclosure step | deep fakes need disclosure regardless of a gate, Art. 50(4) §1 |
| inform | emotion recognition or biometric categorisation runs on people who are not told | Art. 50(3), publishing or not; tag the node that informs them |
| chatbot | a system talks to people without saying it is an AI | Art. 50(1); tag the node that discloses it |
Docker and Python 3. No model, no GPU, no API key: the kit labels and records what your generators produce, it does not generate. Works with any model your line already calls, because the line only passes the model's name and the prompt.
git clone https://github.com/karusrus/transparency-kit && cd transparency-kit, then either docker compose up -d (an init job imports and publishes the six workflows before n8n starts) or ./reload.sh (the same three containers with plain docker run, needs Python 3).localhost:5678, once./form/ai-act-intake; decide at the form gate; read /webhook/audit.GATE_MODE=slack in .env, rebuild and re-import.After that, embedding in your own line is three nodes, below.
Nothing else changes. The registry reads the instance through the n8n API; the auditor's page reads the files the kit writes. Tag your own publishing nodes [exit] and your own disclosure nodes [AI disclosure] so lines the kit did not build are judged too.
Not legal advice, and not a high-risk (Annex III) system: scope is the deployer side of Article 50 and a voluntary record. Reviewer identity is self-declared unless the gate sits behind an authenticated channel. Files on one host are not a tamper-proof ledger. Those are the next three things to build, in that order.