Help & Documentation

Artifact catalog

19 artifact types the Conductor can render inline today — from research briefs and charts to A/B variant pairs, live publish status cards, variant performance comparisons, and master-context-diff cards.

Artifacts are the visible output of the system. Every chart, card, and diagram you see in a conversation is an artifact — a typed, structured object rendered by a dedicated React component. The Conductor emits them via the generate_artifact tool; some (like project_status) are also seeded directly by database triggers or background events.

Available today

project_statusProject statusSlice 2 · shipped

Pinned card at the top of the primary conversation: master_context version + channel connections (Connect / Reconnect buttons, status pills) + autopilot state + last_audit_at. Always seeded on project creation; hydrated live from DB on every render + subscribed to channel_connections Realtime updates.

Trigger: Seeded automatically by DB trigger. Not emittable by the LLM.
Data shape: { autopilot_enabled, connected_channels[], master_context_version, last_audit_at }
master_context_viewMaster context viewSlice 2 · shipped

Structured render of the current master_context — tagline, positioning, voice guidelines, audience segments.

Trigger: /context or "show me the master context" → show_master_context tool
Data shape: { payload, version_n, section }
research_briefResearch briefSlice 2 · shipped

Signals list grouped by PESTEL domain. Also serves the "research kicked off" and analyze_domain output views.

Trigger: /signals, /analyze or "show me recent signals" → list_recent_signals / analyze_domain / kickoff_research
Data shape: { signals[], domain? } OR { kind: "research_running", runId, ... } OR { domain, question, signals, gaps }
project_audit_summaryProject audit summarySlice 2 · shipped

The onboarding artifact — first thing shown on a project after the initial audit. Signals-by-domain grid + positioning highlight.

Trigger: Emitted by the research pipeline when the initial audit completes.
Data shape: { signalsByDomain, masterContextPayload }
scorecardScorecardSlice 2 · shipped

Metric tiles with values, trends (up/down/neutral), optional progress bars.

Trigger: /scorecard or "scorecard of our positioning" → generate_artifact(type=scorecard)
Data shape: { metrics: [{ label, value, trend?, change?, maxValue? }] }
comparison_tableComparison tableSlice 2 · shipped

Side-by-side columns comparing options, competitors, approaches. Highlighted cells for winners.

Trigger: /compare or "compare X vs Y" → generate_artifact(type=comparison_table)
Data shape: { rows, columns, cells } (shape per pre-hack comparison-table.tsx)
bar_chartBar chartSlice 2 · shipped

Categorical bar chart via recharts. Good for rankings, distributions, A/B comparisons.

Trigger: /chart or "bar chart of X" → generate_artifact(type=bar_chart)
Data shape: { data: [{ name, value, ... }], keys?, indexBy? }
pie_chartPie chartSlice 2 · shipped

Share-of-whole breakdown. Best for 3–6 slices.

Trigger: /chart or "pie chart of X" → generate_artifact(type=pie_chart)
Data shape: { data: [{ name, value }] }
radar_chartRadar chartSlice 2 · shipped

Multi-dimensional capability map. Good for feature-set comparisons across ~5–8 axes.

Trigger: /chart or "radar chart of X" → generate_artifact(type=radar_chart)
Data shape: { data, dimensions, series? }
mind_mapMind mapSlice 2 · shipped

Hierarchical decomposition tree via @xyflow/react. Good for topic maps, problem breakdowns.

Trigger: /mindmap or "mind map of X" → generate_artifact(type=mind_map)
Data shape: { nodes | root | items } (multiple input shapes supported)
mermaid_diagramMermaid diagramSlice 2 · shipped

Any mermaid-syntax diagram — flowchart, sequence, state, ERD, gantt, etc.

Trigger: /diagram or "mermaid diagram of X" → generate_artifact(type=mermaid_diagram)
Data shape: { definition: "graph TD\nA --> B" }
key_findingsKey findingsSlice 2 · shipped

Ranked insight list. 3–7 top takeaways with short descriptions.

Trigger: /findings or "top findings on X" → generate_artifact(type=key_findings)
Data shape: { findings: [{ title, description, source? }] }
swot_analysisSWOT analysisSlice 2 · shipped

Four-quadrant strengths / weaknesses / opportunities / threats breakdown.

Trigger: /swot or "SWOT analysis of X" → generate_artifact(type=swot_analysis)
Data shape: { strengths[], weaknesses[], opportunities[], threats[] }
timelineTimelineSlice 2 · shipped

Chronological events / milestones / roadmap with type-coloured dots.

Trigger: /timeline or "timeline of X" → generate_artifact(type=timeline)
Data shape: { events: [{ date, title, description?, type? }] }
document_export_cardDocument export cardSlice 2 · shipped

Download card for a generated PPTX / DOCX / XLSX / CSV. Includes section preview + download button.

Trigger: /export or "export as PPTX" → generate_document
Data shape: { format: "pptx"|"docx"|"xlsx"|"csv", sections: [{ heading, content }], projectId }
variant_pairVariant pairSlice 3 · shipped

Side-by-side A/B drafts for one channel. Chips: Publish A, Publish B, Publish both, Regenerate. The first artifact in the generate → publish arc.

Trigger: /variants or "Draft two LinkedIn posts about X" → generate_variants (invokes Content Generator agent with a per-channel Zod schema via Output.object)
Data shape: { channel, variantPairId, topic, variants: [{ label: "A"|"B", body, meta? }] }
publish_statusPublish statusSlice 3 · shipped

6-state card showing where a publish is in its lifecycle. States: awaiting_confirmation → publishing → live / sandboxed / failed (plus scheduled for future). Border + icon colour keyed to state. For real LinkedIn publishes, externalUrl is the live share_url returned by Unipile getPost.

Trigger: Emitted by publish_variant (initial state) and updated via publish_* background events. User confirms from awaiting_confirmation via a Confirm chip which re-invokes the tool with confirmed=true.
Data shape: { state, channel, variantLabel, publishId?, sandboxedPublishId?, externalUrl?, error? }
variant_performanceVariant performanceSlice 4 · shipped

A/B winner card produced by the Variant Comparator. Shows per-variant metric rollup (impressions / reactions / comments for LinkedIn, views / reading time for Sanity), the winner, and the Comparator's reasoning. Emitted once both A and B have engagement_batch learnings.

Trigger: /compare-pair or "Compare variants A and B of the most recent pair" → Comparator (manual chip or autopilot reactive)
Data shape: { variantPairId, channel, topic, winner: "A"|"B"|"tie", variantA: {...}, variantB: {...}, reasoning, learningId }
master_context_diffMaster context diffSlice 4 · shipped

Version-bump card emitted by the Curator. Shows the old and new master_context side by side with a concise summary of what changed, plus how many unapplied learnings got consumed.

Trigger: /curate or "Update the master context now" → Curator (manual chip or daily autopilot cron at 02:00 UTC)
Data shape: { projectId, previousVersion, newVersion, appliedLearningIds[], summary, previousPayload, newPayload }

How an artifact lands

  1. You ask (or pick a slash command).
  2. The Conductor calls a tool whose execute() returns { artifact: { type, title, description?, data } }.
  3. AI SDK v6 emits that as a tool-toolName UI message part.
  4. components/chat/message.tsx dispatches the part to ArtifactRenderer.
  5. ArtifactRenderer lazy-imports the component in components/artifacts/{type}.tsx and mounts it.
  6. After the stream ends, onFinish archives the artifact row into the artifacts table (idempotently, keyed on conversation_id, turn_id, type).

Data validation

Every renderer validates props.data through a Zod schema at the top of the file. If the LLM emits malformed payload, the renderer shows a <details> fallback with the raw JSON instead of crashing the page.