Problem
Portfolio updates were fragmented across messages, files and manual WordPress work. The design task was to give the team one controlled path for project data, images, approval, publishing, updates, archiving and visible failures.
2 intake paths, 4 lifecycle states, 7 controlled handoffs and 3 orchestration workflows connect onboarding, approval, activity and recovery to one agent core.
Problem and solution
Portfolio updates were fragmented across messages, files and manual WordPress work. The design task was to give the team one controlled path for project data, images, approval, publishing, updates, archiving and visible failures.
A product interface and bounded-agent system that move a project from team intake through validation, approval, WordPress tools, browser QA, recovery and an auditable trace.
Designed product surfaces for intake, validation status, approval queues, run health, audit activity and reversible failure states.
Process audit
I decomposed the manual process into states, roles and handoffs: intake, validation, approval, publishing, update, archive and error handling.
Automation starts with a clear model of states and ownership, not with connecting tools.
The core Compose stack defines PostgreSQL, NocoDB, n8n, Publishing Orchestrator, Data, Publishing, QA and Site Manager agents; MinIO lives in the Telegram-bot stack.
Telegram passes project data to Data Agent, while NocoDB gives the team direct table control over the same PostgreSQL source of truth.
Publishing Orchestrator reloads fresh database state, selects an allowlisted route and stores each agent objective, tool, decision, input and output in agent_runs.
A failed QA check triggers a compensating WordPress rollback to draft; the offline demo proves both completed and blocked paths without claiming live external calls.
Architecture
Two intake channels converge into a shared data model and pass the same controls before WordPress.
Designed product surfaces for intake, validation status, approval queues, run health, audit activity and reversible failure states.
Mapped the manual process into an end-to-end lifecycle with explicit agent objectives, handoffs and four project states.
Implemented a bounded orchestrator with an allowlisted planner, hard data gate, optional Claude review, specialist tools and complete JSON trace.
Added browser QA as a blocking step and a compensating action that returns a rejected WordPress page to draft.
Agent run
Each agent receives one objective, a restricted tool and the previous step's context. A successful WordPress response is not a successful run until QA passes.
Telegram or NocoDB stores the record in PostgreSQL before emitting project.ready.
A fresh snapshot blocks the run when description, category, image or state requirements fail.
Current wp_post_id selects create, update or archive; an allowlist prevents arbitrary tools.
Claude can recommend pass or block, but cannot control WordPress or bypass hard rules.
The agent creates, updates or recovers the page and returns its ID and URL.
Playwright checks the page; failure triggers a compensating rollback to draft.
Site-wide state is refreshed, the trace is stored and Telegram receives the structured result.
stored without starting publication
→approved; n8n delegates to the publishing orchestrator
→WordPress ID and URL are stored
→the post moves to recoverable trash
Orchestration
n8n owns transport, schedules and notifications. Planning, tools, QA and compensation stay inside the agent run and are stored in PostgreSQL.
The model never selects API tools: create, update and archive are controlled by deterministic policy.
An AI failure switches review to policy fallback while the source record and local slug remain available.
Failed browser QA returns the WordPress post to draft and marks the run as blocked.
A repeated event_id returns the stored trace instead of starting another sequential run.
Onboarding, approval and recovery screens connect directly to the architecture, data model and auditable agent run.
Validation and outcome
2 intake paths, 4 lifecycle states, 7 controlled handoffs and 3 orchestration workflows connect onboarding, approval, activity and recovery to one agent core.
The product screens translate the existing lifecycle, policy and trace contracts into interface states.
Local source: modern-house/agents/docker-compose.yml defines the service topology.
Local source: modern-house/agents/agents/publishing_orchestrator contains the executable pipeline, tests and offline demo.
Local source: modern-house/agents/db/schema.sql defines projects, images, action logs and complete agent_runs traces.
Local source: modern-house/agents/n8n/workflows/agent-publishing-workflow.json is an importable event-to-agent workflow.
Local source: modern-house/telegram-bot contains the guided intake and Data Agent client.
Generated success and QA-blocked runs demonstrate the orchestration logic and recovery path.
Agency work is credited to Lex Wizhevsky Architects.
The control-room screens are based on the lifecycle, policy and trace contracts implemented in the agent core.
The case scope covers product design, orchestration logic and QA behaviour.
Measured system scope: 2 input channels, 4 states, 7 handoffs, 3 workflows and 1 reversible failure path.
Discuss a related project
Send the current surface, goal and constraints. I will propose a route from diagnosis to a verifiable release.
Discuss a related project↗