list_anti_patterns
List curated cross-domain anti-patterns from `UPG_ANTI_PATTERNS`. Each row pairs a memorable name with a machine-evaluable `IntelligenceCondition`, applicable stages, severity, and remediation. Graph-health patterns evaluated whole-graph (distinct from per-domain anti-patterns via `get_domain_guide`). Paginated (default 50, max 200). Filters AND together: `severity` (`high` / `medium` / `low`), `stage` (keeps patterns whose `stages[]` includes the given `UPGProductStage`).
Spec Introspectionatomic (read-only)
Arguments
severitystringoptionalExact-match UPGAntiPatternSeverity.
highmediumlow
stagestringoptionalKeeps anti-patterns whose stages[] includes the given UPGProductStage.
conceptvalidationbuildbetalaunchgrowthmaturemaintenancesunset
limitnumberoptionalPage size (default 50, max 200).
cursorstringoptionalOpaque pagination cursor. Pass next_cursor from a previous response.
Returns
Shape
{ total, count, next_cursor?, anti_patterns: UPGCuratedAntiPattern[] }Examples
Live call against the Notion example graph.
Output
{
"total": 12,
"count": 12,
"anti_patterns": [
{
"id": "personas-without-jobs",
"name": "Personas without jobs",
"description": "The graph has persona entities, but none link into the user chain via any of the v0.2 chain edges (job, need, desired_outcome, or switching_cost). A persona without chain links is a demographic profile: who someone is, not what they are trying to get done.",
"structured_condition": {
"operator": "and",
"checks": [
{
"check": {
"type": "entity_count",
"entity_type": "persona",
"comparison": "nonzero"
}
},
{
"check": {
"type": "relationship",
"source_type": "persona",
"edge_type": "persona_pursues_job",
"target_type": "job",
"comparison": "not_exists"
}
},
{
"check": {
"type": "relationship",
"source_type": "persona",
"edge_type": "persona_experiences_need",
"target_type": "need",
"comparison": "not_exists"
}
},
{
"check": {
"type": "relationship",
"source_type": "persona",
"edge_type": "persona_aspires_to_desired_outcome",
… (truncated)