Drupal Capability Ownership Map¶
Capability → owner. The answer to "who owns this, so I do not build it?" Owners are ordered by the implementation precedence that governs every Drupal decision at Bluefly:
Drupal Core → Drupal Contrib → Contrib Configuration → Recipes / Config Actions
→ Canvas / SDC → Views → ECA / FlowDrop → Drupal AI → Tool API / MCP
→ Existing Bluefly Reusable Package → New Custom Code Last
The precedence is normative in drupal-standard.md section 12 (Drupal ownership ladder) and how-we-build-in-drupal.md section 2 (decision tree); the site-building order is in drupal-site-building-standard.md section 2. This map applies them. Module-level detail is in module-ownership-matrix.md; package-level detail in bluefly-package-map.md. Owner names below are the owning layer; a module in parentheses is the current contrib owner as of the linked matrix.
Content and data¶
| Capability | Owner | Governing standard |
|---|---|---|
| Business objects (Service, Work, Product, Person, Insight, Evidence, Organization, ...) | Core content entities and bundles | drupal-component-dry-standard.md section 12; site-building section 1 |
| Facts about a business object | Fields on the entity (not prose, not Canvas props) | DRY section 12; DRY section 51 |
| Classification | Taxonomy (core) | DRY section 48 |
| Relationships between business objects | Entity reference fields (core) | DRY sections 15, 16, 52 |
| Reusable assets (image, document, remote video, logo) | Media (core) with Media Library; crop and focal point (contrib crop); SVG (svg_image) |
DRY section 50; matrix rows E |
| Alt text assistance | Drupal AI (ai_image_alt_text), editorial review retained |
matrix row E; site-building section 4a |
| Reference usage and orphan detection | Contrib (entity_usage) |
matrix row G |
| Automatic entity labels | Contrib (auto_entitylabel), only when a bundle needs it |
matrix row G |
| Text-format restriction per field | Core (formerly allowed_formats) |
matrix row G |
| Editorial form architecture (Core / Story / Relationships / Media / Discovery / Promotion / Governance sections) | Configuration: form displays, field groups, Drupal CMS form-display capabilities | specification section 9; site-building section 4a |
Display modes (full, teaser, card, featured, compact, related, search_result, ...) |
Configuration: entity view modes and displays, mapped to SDCs by Canvas content templates | DRY section 23; specification section 10 |
| Configuration itself | Git-tracked config export; Recipes and Config Actions for reusable composition | how-we-build section 6; DRUPAL-RECIPE-FACTORY-PLAYBOOK.md |
| Site assembly and package sets | Recipes (capability = module, composition = recipe) | drupal-standard section 12; DRUPAL-FACTORY-CONVERGENCE-PLAYBOOK.md |
Collections, composition, presentation¶
| Capability | Owner | Governing standard |
|---|---|---|
| Collections, listings, related content, directories, search results | Views (core); exposed filters via better_exposed_filters when needed |
DRY sections 19, 46, 47; matrix row H |
| Bulk actions on collections | Contrib (views_bulk_operations), only with a consuming View |
matrix row H |
| Page composition, section order, CTA placement, Views blocks, content templates, global regions | Canvas | site-building section 3; how-we-build section 16 |
| Reusable visual patterns (hero, card, card grid, metric panel, CTA cluster, person card, ...) | SDC in the theme or the shared component library; Canvas Code Components where Canvas-native composition is required | site-building sections 7, 15, 16; DRY |
| Design tokens and primitives | Shared library (Studio UI) consumed by the theme | site-building ownership boundary table |
Drupal chrome: html.html.twig, page.html.twig, regions, messages, forms |
Theme | site-building section 16 |
| Navigation blocks | Core menus and blocks; menu_block only once the theme renders regions |
matrix row H |
| Local code-component workflow | Canvas CLI | DRUPAL-CANVAS-CLI-PLAYBOOK.md |
SEO, URLs, discovery¶
| Capability | Owner | Governing standard |
|---|---|---|
| Metadata | Contrib (metatag, with token) |
matrix row C |
| URL aliases | Contrib (pathauto, with token) |
matrix row C |
| Redirects and redirect maps | Contrib (redirect) |
matrix row C; migration-factory-drupal.md REDIRECTS |
| AI meta generation | Drupal AI extension (metatag_ai) when content exists |
matrix row C |
| AI SEO analysis | Drupal AI extension (ai_seo); one such module only |
matrix row C |
| Analytics tracker | One contrib owner (Drupal CMS ships google_tag); decision open |
matrix, found rows |
| Agent-readable content (Markdown, llms.txt) | Contrib (markdownify + llms_txt) |
matrix row A; bluefly-package-map.md |
Agent and service discovery (/.well-known/duadp.json) |
Bluefly package duadp (protocol Bluefly authors), enabled by configuration |
bluefly-package-map.md |
Workflow, tools, AI¶
| Capability | Owner | Governing standard |
|---|---|---|
| Event-driven internal workflow | ECA | how-we-build section 12; DRUPAL-ECA-AUTOMATION-PLAYBOOK.md |
| Workflow and model abstraction | Modeler API (modeler_api); Bluefly integrates via ModelOwner plugins |
matrix row F |
| Visual and data pipelines | FlowDrop — only with an actual pipeline consumer | matrix, found rows; drupal-standard section 10 |
| External orchestration bridge | orchestration — only when a bridge to Activepieces / n8n / Zapier exists |
drupal-standard section 10; matrix, found rows |
| Typed executable capabilities | Tool API (tool); Bluefly registers #[Tool] plugins, never a second registry |
drupal-standard section 7; how-we-build section 8 |
| Atomic Drupal operations as tools | tool_belt |
how-we-build section 9 |
| Protocol exposure of tools (MCP, JSON-RPC, REST) | Adapters over Tool API: mcp_server + tool bridge; never a capability owner |
drupal-standard section 7.3 |
| Model and provider abstraction | Drupal AI (ai); providers are ai_provider_* plugins; LiteLLM as proxy where adopted |
drupal-ai-architecture.md; drupal-standard section 10 |
| Bounded reasoning agents | AI Agents (ai_agents); OSSA manifests derive them via ai_agents_ossa core |
drupal-ai-architecture.md; bluefly-package-map.md |
| Editorial AI suggestions and CKEditor AI | Drupal AI extensions (ai_content_suggestions, ai_ckeditor); one CKEditor AI plugin only |
matrix row D |
| AI administration, metering, logging | Drupal AI (ai_dashboard, ai_metering, ai_logging / ai_observability) |
matrix row B |
| AI usage quotas | ai_metering |
matrix row K |
| Context plumbing: providers, scoring, caching, scopes, items, budgets | ai_context (Context Control Center) |
DRUPAL-AI-CONTEXT-PLAYBOOK.md; how-we-build section 10 |
| Context governance: Cedar-gated writes, DUADP attestation, GAID provenance | Bluefly package kb_cache (governance extension only) |
bluefly-package-map.md |
| Policy decision | Thin PDP client (Tool plugin + ECA condition) to the compliance engine; never inline evaluation in Drupal | bluefly-package-map.md, cedar_policy |
| Compliance baselines | drupal.org secure_drupal recipe |
bluefly-package-map.md |
| OpenAPI → managed data source → Tool API | Bluefly package api_normalization core |
bluefly-package-map.md |
| External REST integration (generic) | api_orchestrator / http_client_manager before custom HTTP clients |
how-we-build section 13 |
| Gas City bridge | Bluefly Tool API plugins in one package | bluefly-package-map.md; drupal-standard section 7.4 |
| Conventional and semantic search | Search API; AI Search + vector store as a pilot | drupal-ai-architecture.md |
Migration, identity, operations¶
| Capability | Owner | Governing standard |
|---|---|---|
| Content migration (sources, processes, destinations, groups, rollbacks) | Core Migrate + migrate_plus (+ migrate_tools) as configuration |
migration-factory-drupal.md; matrix row I |
| Feed-style ingestion | feeds — only with a consuming feed; otherwise not installed |
matrix, found rows |
| External authentication and SSO | externalauth + openid_connect, configuration only |
matrix row J |
| Secrets | Key + 1Password Connect | 1password-drupal-secrets.md |
| Cache backend | One stack: redis via environment configuration |
matrix row K |
One path via mailsystem (decision open) |
matrix row K | |
| Cron and monitoring | Core automated cron and status report unless a consumer needs more | matrix, found rows |
| Local runtime | DDEV | ddev-standard.md |
| Project tracking | Beads, never a Drupal node type | bluefly-package-map.md, kb_cache |
What no layer above owns¶
New custom code is the last rung. It requires a PROVEN_GAP classification (site-building section 25), the upstream discovery proof in how-we-build section 2, and — for a new Bluefly module — a Bluefly-specific reason listed in how-we-build section 30. A capability that appears in this map already has an owner; extend the owner.