The human-review gate stopped being a screen for one customer's blog posts
Same run, same parked step, same real app in Chrome — one build apart. The gate is where the product's one irreversible decision is made, and it used to be hardcoded to an SEO article. Now it presents whatever the step produced.
The gate
article_html, judge and
validate by name — and judge/validate
have not existed since the monolithic ai block was deleted, so they
rendered as nothing at all. No way into the sub-workflow either: this was the one
drawer that never drew the drill-in button.
The artefact itself
Two subtractions keep the article legible
- An empty value is not evidence. A gate on a text-mode
use: aistep hands back the whole unused JSON-mode output as empty strings; five blank rows above Approve is noise. - A field that repeats the artefact is dropped. An article's
bodyis itstext— printing it twice would put a wall of raw markdown in the drawer.
Behind it: the engine forgot what an article is
Look at the graph in either shot — write_article → article_meta →
save_article. Storing the approved article is a database_insert
step in the workflow now. It used to be an Article ORM model inside the
engine, a table created on every install of a general-purpose automation platform, and
a heuristic that scanned a finished run for "the first output with a slug".
That also fixes a long-standing asymmetry: persistence hung off the approve path only, so a run that finished without a gate stored nothing — after its publishing dispatch had already fired. A step runs wherever the workflow puts it.