content_brief — SEO Content Brief
| Field | Value |
|---|---|
| Type key | content_brief |
| Label | SEO Content Brief |
| Agent queue | content-brief-writer |
| Plan tier | Free+ (starter, growth, professional) |
| Credits/unit | 1 |
| Monthly range | 1 per blog_post |
What it produces
A structured SEO content brief for a single blog post: target keyword, secondary keywords, proposed title, recommended word count, outline (H2/H3 structure), angle/hook, competitor references, and internal linking suggestions. Output is stored in Activity.outputPayload as structured JSON.
Pipeline sequence
keyword_cluster (optional context) ──→ content-brief-writer ──→ Activity: done
│
[auto-approved — no review]
│
blog-writer picks up outputPayloadNo HITL gates. The brief auto-approves on agent completion.
Status machine
The content brief does not have a dedicated content model. Status is tracked on the parent Activity record.
| Activity status | Meaning |
|---|---|
pending | Scheduled, waiting for dependencies |
queued | Submitted to BullMQ |
in_progress | Worker running |
done | Brief written, outputPayload saved |
failed | Worker error |
The Deliverable linked to this activity moves from generating → approved automatically when the activity reaches done.
HITL gates
None. Content briefs are never shown to the DM reviewer or the client for approval. The output feeds directly into the blog-writer’s input payload.
Dependencies
- Optional input:
keyword_cluster— if a keyword cluster was produced this month, its primary keyword and cluster data are injected as context into the brief writer’s prompt. - Depended on by:
blog_post— the blog-writer’s input payload always includes the linked content brief’soutputPayload.
DB records created
| Record | Created by | Notes |
|---|---|---|
DeliverableTemplate | deliverable-planner | 1 brief per blog post quota |
Activity | activity-planner | type = content_brief; dependsOn links to blog_post activity |
Deliverable | content-brief-writer worker | Auto-approved on completion |
No dedicated content model. The brief JSON lives in Activity.outputPayload.
Key rules
- The planner must always pair 1
content_briefwith eachblog_post. Creating a blog post without a brief is invalid. - The
content_briefactivity should be scheduled to run before theblog_postactivity (enforced viaActivity.dependsOn). - There is no client-facing deliverable card for content briefs — they are an internal pipeline input, not a client deliverable.