Content modeling for Sage/Bedrock — classify as CPT ACF fields Blade component Livewire component or Options Page, Poet CPT configuration, ACF Composer fields vs GUI, relational content, static vs dynamic, content architecture decisions, config/poet.php, modeling before building, content classification matrix
Scanned 9/11/2026
Install to Claude Code
npx -y skills add hekivo/superpowers-sage --skill modeling --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Modeling?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/hekivo-modeling)More formats (shields.io, HTML) on the badges page.
---
name: superpowers-sage:modeling
description: >
Content modeling for Sage/Bedrock — classify as CPT ACF fields Blade component
Livewire component or Options Page, Poet CPT configuration, ACF Composer fields
vs GUI, relational content, static vs dynamic, content architecture decisions,
config/poet.php, modeling before building, content classification matrix
user-invocable: true
---
# Modeling — Content Architecture Analysis
Classify content within blocks and components to determine the right data modeling approach: static ACF fields, dynamic CPTs, Options Pages, or relationship fields.
## When to use
- Planning a new block or component that displays content
- Deciding whether content should be hardcoded, editable per-page, or managed as a collection
- Before implementing blocks to prevent "static content that should be dynamic" mistakes
- Automatically invoked by `/building` when content classification is needed
## Content Classification Matrix
| Classification | When to Use | Implementation |
|---|---|---|
| **Static** | Fixed text that rarely changes, part of page identity | ACF field in block `fields()` |
| **Dynamic Collection** | Growing list of items (portfolio, team, testimonials) | CPT via Poet + taxonomy |
| **Dynamic Global** | Shared across pages (site info, social links, CTA) | ACF Options Page |
| **Dynamic Relation** | References other content (featured posts, related projects) | ACF Relationship field |
| **Fixed Repeater** | 3-5 items, rarely change, no detail pages | ACF Repeater field in block |
## Decision Checklist
For each piece of content in a block, ask:
1. **Does this content appear in more than one place?**
- YES → Dynamic Global (Options Page) or Dynamic Relation
- NO → Continue...
2. **Will the client add/remove items over time?**
- YES → Dynamic Collection (CPT)
- NO → Continue...
3. **Does the list have categories or filters?**
- YES → Dynamic Collection (CPT + taxonomy)
- NO → Continue...
4. **Is it a fixed set of 3-6 items that rarely changes?**
- YES → Fixed Repeater (ACF Repeater in block)
- NO → Continue...
5. **Does this content have its own detail page?**
- YES → Dynamic Collection (CPT) — even if the list is short
- NO → Continue...
6. **Should this content be searchable or filterable on the frontend?**
- YES → Dynamic Collection (CPT)
- NO → Static (ACF field)
## Output Format
For each analyzed component, output:
```markdown
### Content Model: {Component Name}
| Content Element | Classification | Implementation |
|---|---|---|
| {element} | {static/dynamic-collection/etc.} | {ACF field type / CPT name} |
**Poet Config** (if CPTs needed):
```php
// config/poet.php
'post' => [
'project' => [
'route' => 'projects',
'supports' => ['title', 'editor', 'thumbnail'],
],
],
'taxonomy' => [
'project_type' => [
'links' => ['project'],
'meta_box' => 'radio',
],
],
```
**ACF Fields** (key fields):
```php
$this->addText('headline', ['label' => 'Headline']);
$this->addRepeater('items', ['label' => 'Items'])
->addText('title')
->addTextarea('description')
->endRepeater();
```
**Query Example** (if dynamic):
```php
$projects = get_posts([
'post_type' => 'project',
'posts_per_page' => 6,
'orderby' => 'menu_order',
'order' => 'ASC',
]);
```
```
## Key Principles
- **Ask the checklist** — don't guess, systematically evaluate each content element
- **Default to static** — only use CPTs when the checklist clearly indicates dynamic content
- **YAGNI** — a repeater is simpler than a CPT; use the simpler option when both work
- **Poet for CPTs** — never `register_post_type()` directly
- **Future-proof wisely** — if content will "probably" grow, use a CPT; if "maybe someday", use a repeater
## Query First — MCP Integration
Before proposing CPTs or ACF field groups, query what already exists:
```
execute-ability posts/list-types
execute-ability acf/field-groups
```
See [`sageing/references/mcp-query-patterns.md`](../sageing/references/mcp-query-patterns.md).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!