Two Fields, and Only One of Them Is Doing Work Today
What crosses the seam is almost nothing: a pipeline name, and a pointer shaped as a kind plus an identifier. That is the entire payload. The pointer says what sort of thing this is and which one, and it deliberately does not carry the thing itself.
Only one pipeline exists, and it only ever consumes one kind of material. So the kind field does nothing right now — an identifier alone would work perfectly. It is there anyway, and the reasoning behind that is the actual content of this lesson, because "we added a field we do not need yet" is usually a mistake and here it isn't.
Generalize the Contract, Not the Implementation
There are two things you could pre-build for a future you cannot see. You could generalize the implementation — build a pipeline framework, a plugin registry, an abstract stage interface, so that adding a second pipeline is easy. That is the expensive kind of guessing, and the workshop's own doctrine forbids it: build concretely for the one case that exists, because a framework designed against a hypothetical second case is fitted to a guess.
Or you could generalize the contract — the shape of what crosses the boundary. That costs one field. And unlike the implementation, the contract is the expensive thing to change later, because changing it means coordinating both sides at once. Pre-generalizing the cheap-to-build, expensive-to-change half while staying concrete in the expensive-to-build, cheap-to-change half is close to a general rule.
What the Type Field Buys
With a kind on the pointer, a future pipeline can point at a completely different sort of source material — a journal entry, an essay, a live application — and the seam does not change at all. The calling side keeps emitting a pointer. The receiving side dispatches on kind. Nobody renegotiates anything.
There is a second, quieter benefit: the type makes the payload self-describing in the record. Six months later, reading an old request, you can tell what it referred to without knowing which pipeline was current at the time. An untyped identifier in a log is a mystery whose meaning lived in code that has since changed.