# Buildplan EventCatalog Documentation > Architecture, domains, services, events, and APIs ## Events - [AgentQL Extraction Completed - AgentQLExtractionCompleted - 1.0.0 ](https://eventcatalog.dev/docs/events/AgentQLExtractionCompleted/1.0.0.mdx) - AgentQL returned extracted JSON.- [BrightData Page Fetched - BrightDataPageFetched - 1.0.0 ](https://eventcatalog.dev/docs/events/BrightDataPageFetched/1.0.0.mdx) - BrightData returned fetched page content.- [Class Parameter Allowed Values Replaced - ClassParameterAllowedValuesReplaced - 1.0.0 ](https://eventcatalog.dev/docs/events/ClassParameterAllowedValuesReplaced/1.0.0.mdx) - The allowed-value set on a ClassParameter binding was replaced wholesale.- [Class Parameter Assigned - ClassParameterAssigned - 1.0.0 ](https://eventcatalog.dev/docs/events/ClassParameterAssigned/1.0.0.mdx) - A ParameterKey was directly assigned to an ObjectClass.- [Class Parameter Assignment Updated - ClassParameterAssignmentUpdated - 1.0.0 ](https://eventcatalog.dev/docs/events/ClassParameterAssignmentUpdated/1.0.0.mdx) - An existing ClassParameter binding changed — requiredness, inheritance mode, child behavior, or promotion from rendered to direct.- [Class Parameter Unassigned - ClassParameterUnassigned - 1.0.0 ](https://eventcatalog.dev/docs/events/ClassParameterUnassigned/1.0.0.mdx) - A ClassParameter binding between an ObjectClass and a ParameterKey was removed.- [Medusa Stripe Webhook Received - MedusaStripeWebhookReceived - 1.0.0 ](https://eventcatalog.dev/docs/events/MedusaStripeWebhookReceived/1.0.0.mdx) - Medusa forwarded a Stripe commerce webhook to api-v1.- [Object Class Demoted - ObjectClassDemoted - 1.0.0 ](https://eventcatalog.dev/docs/events/ObjectClassDemoted/1.0.0.mdx) - An approved ObjectClass returned to draft after it lost a required classification. Covering approved Revit projections are demoted to draft for re-review.- [Object Class Parent Graph Changed - ObjectClassParentGraphChanged - 1.0.0 ](https://eventcatalog.dev/docs/events/ObjectClassParentGraphChanged/1.0.0.mdx) - Parent edges in the ObjectClass tree changed. Four handlers reconcile derived state for the affected subtrees.- [Organization Created - OrganizationCreated - 1.0.0 ](https://eventcatalog.dev/docs/events/OrganizationCreated/1.0.0.mdx) - A canonical party-directory organization was created.- [Organization Updated - OrganizationUpdated - 1.0.0 ](https://eventcatalog.dev/docs/events/OrganizationUpdated/1.0.0.mdx) - A canonical party-directory organization was updated.- [Parameter Group Changed - ParameterGroupChanged - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterGroupChanged/1.0.0.mdx) - A ParameterGroup was created or renamed. Renaming a group resyncs derived Revit projection metadata.- [Parameter Key Activated - ParameterKeyActivated - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyActivated/1.0.0.mdx) - A ParameterKey moved `draft → active` — displayable but not yet vetted. Nothing subscribes to it.- [Parameter Key Approved - ParameterKeyApproved - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyApproved/1.0.0.mdx) - A ParameterKey passed its approve gate and became canonical. This is the event that triggers the automatic Revit projection.- [Parameter Key Archived - ParameterKeyArchived - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyArchived/1.0.0.mdx) - A ParameterKey was archived; the linked Revit projection is archived with it, never deleted.- [Parameter Key Created - ParameterKeyCreated - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyCreated/1.0.0.mdx) - A new canonical ParameterKey was authored in `draft`.- [Parameter Key Deleted - ParameterKeyDeleted - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyDeleted/1.0.0.mdx) - A ParameterKey was hard-deleted. The event is an audit record, not a lifecycle transition.- [Parameter Key Updated - ParameterKeyUpdated - 1.0.0 ](https://eventcatalog.dev/docs/events/ParameterKeyUpdated/1.0.0.mdx) - Canonical metadata, usages, or the system flag on a ParameterKey changed. The busiest event in the module — three handlers listen to it.- [Product From URL Requested - ProductFromUrlRequested - 1.0.0 ](https://eventcatalog.dev/docs/events/ProductFromUrlRequested/1.0.0.mdx) - A product creation workflow accepted a source URL.- [Product Model Created - ProductModelCreated - 1.0.0 ](https://eventcatalog.dev/docs/events/ProductModelCreated/1.0.0.mdx) - A ProductModel aggregate was materialized in the catalog.- [Product Model Images Published - ProductModelImagesPublished - 1.0.0 ](https://eventcatalog.dev/docs/events/ProductModelImagesPublished/1.0.0.mdx) - Product image records were published to persistent media URLs.- [Product Scrape Completed - ProductScrapeCompleted - 1.0.0 ](https://eventcatalog.dev/docs/events/ProductScrapeCompleted/1.0.0.mdx) - A product scrape completed with catalog-ready scraped data.- [Product Scrape Failed - ProductScrapeFailed - 1.0.0 ](https://eventcatalog.dev/docs/events/ProductScrapeFailed/1.0.0.mdx) - A product scrape ended in a recoverable or terminal failure.- [Revit Parameter Projection Approved - RevitParameterProjectionApproved - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionApproved/1.0.0.mdx) - A steward promoted a Revit projection from `draft` to `approved`.- [Revit Parameter Projection Archived - RevitParameterProjectionArchived - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionArchived/1.0.0.mdx) - A Revit projection was archived and is retained for history — never deleted.- [Revit Parameter Projection Created - RevitParameterProjectionCreated - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionCreated/1.0.0.mdx) - A Revit-facing projection of an approved ParameterKey was created, normally in `draft`.- [Revit Parameter Projection Demoted - RevitParameterProjectionDemoted - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionDemoted/1.0.0.mdx) - An approved projection returned to `draft` because its shared-parameter-file output changed.- [Revit Parameter Projection Resynced - RevitParameterProjectionResynced - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionResynced/1.0.0.mdx) - A projection's derived Revit name was refreshed after the canonical key or group changed.- [Revit Parameter Projection Reused - RevitParameterProjectionReused - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionReused/1.0.0.mdx) - An archived projection was restored to `draft`, keeping its identity and shared parameter GUID.- [Revit Parameter Projection Updated - RevitParameterProjectionUpdated - 1.0.0 ](https://eventcatalog.dev/docs/events/RevitParameterProjectionUpdated/1.0.0.mdx) - Steward-authored Revit facts on a projection changed.- [Scrape Run Completed - ScrapeRunCompleted - 1.0.0 ](https://eventcatalog.dev/docs/events/ScrapeRunCompleted/1.0.0.mdx) - A shared scraping run completed successfully.- [Scrape Run Failed - ScrapeRunFailed - 1.0.0 ](https://eventcatalog.dev/docs/events/ScrapeRunFailed/1.0.0.mdx) - A shared scraping run failed. ## Commands - [AgentQL Extraction Requested - AgentQLExtractionRequested - 1.0.0 ](https://eventcatalog.dev/docs/commands/AgentQLExtractionRequested/1.0.0.mdx) - Request LLM-assisted extraction from a hydrated page.- [BrightData Page Fetch Requested - BrightDataPageFetchRequested - 1.0.0 ](https://eventcatalog.dev/docs/commands/BrightDataPageFetchRequested/1.0.0.mdx) - Request a BrightData-backed page fetch.- [Execute Scraping Plan - ExecuteScrapingPlan - 1.0.0 ](https://eventcatalog.dev/docs/commands/ExecuteScrapingPlan/1.0.0.mdx) - Run the selected scraping plan for a product source URL.- [Fetch Page - FetchPage - 1.0.0 ](https://eventcatalog.dev/docs/commands/FetchPage/1.0.0.mdx) - Fetch and hydrate a source page for scraping.- [Persist Party To Airtable - PersistPartyToAirtable - 1.0.0 ](https://eventcatalog.dev/docs/commands/PersistPartyToAirtable/1.0.0.mdx) - Write party-directory records to Airtable.- [Publish Catalog To Medusa - PublishCatalogToMedusa - 1.0.0 ](https://eventcatalog.dev/docs/commands/PublishCatalogToMedusa/1.0.0.mdx) - Publish selected product catalog data to the commerce engine.- [Resolve Manufacturer Organization - ResolveManufacturerOrganization - 1.0.0 ](https://eventcatalog.dev/docs/commands/ResolveManufacturerOrganization/1.0.0.mdx) - Resolve or select the party-directory organization for a product manufacturer.- [Send Transactional Email - SendTransactionalEmail - 1.0.0 ](https://eventcatalog.dev/docs/commands/SendTransactionalEmail/1.0.0.mdx) - Send a transactional email from api-v1.- [Sync Catalog To Airtable - SyncCatalogToAirtable - 1.0.0 ](https://eventcatalog.dev/docs/commands/SyncCatalogToAirtable/1.0.0.mdx) - Write product-marketplace catalog records to Airtable.- [Upsert Organization From Scrape - UpsertOrganizationFromScrape - 1.0.0 ](https://eventcatalog.dev/docs/commands/UpsertOrganizationFromScrape/1.0.0.mdx) - Create or update an organization discovered during a product scrape. ## Queries - [Lookup Organization By Domain - LookupOrganizationByDomain - 1.0.0 ](https://eventcatalog.dev/docs/queries/LookupOrganizationByDomain/1.0.0.mdx) - Find an existing organization by website domain.- [Pull Airtable Schema - PullAirtableSchema - 1.0.0 ](https://eventcatalog.dev/docs/queries/PullAirtableSchema/1.0.0.mdx) - Read Airtable schema metadata.- [Route By Vendor - RouteByVendor - 1.0.0 ](https://eventcatalog.dev/docs/queries/RouteByVendor/1.0.0.mdx) - Select a scraping strategy based on vendor or source URL. ## Agents ## Services - [AgentQL - AgentQL - 1.0.0 ](https://eventcatalog.dev/docs/services/AgentQL/1.0.0.mdx) - External LLM-assisted extraction provider used by shared-scraping.- [Airtable - Airtable - 1.0.0 ](https://eventcatalog.dev/docs/services/Airtable/1.0.0.mdx) - External Airtable bases backing api-v1 product-marketplace and party-directory persistence.- [airtable-front-end - airtable-front-end - 1.0.0 ](https://eventcatalog.dev/docs/services/airtable-front-end/1.0.0.mdx) - In-Airtable steward UI scripts (`apps/airtable-front-end`). Not a hosted process. - [api-v1 (current) - api-v1 - 1.0.0 ](https://eventcatalog.dev/docs/services/api-v1/1.0.0.mdx) - Active Airtable-backed backend for MVP and product workflows. Primary HTTP surface for current development; OpenAPI contracts, domain discovery, and longer-term migration context. - [api-v2 (target) - api-v2 - 1.0.0 ](https://eventcatalog.dev/docs/services/api-v2/1.0.0.mdx) - Target backend application. Source of the formal HTTP API contract via generated OpenAPI. EventCatalog renders the spec on this page. - [BrightData - BrightData - 1.0.0 ](https://eventcatalog.dev/docs/services/BrightData/1.0.0.mdx) - External browser, proxy, and Web Unlocker provider used by shared-scraping.- [front-end - front-end - 1.0.0 ](https://eventcatalog.dev/docs/services/front-end/1.0.0.mdx) - Next.js 14 application UI. Deployable on Vercel (`apps/front-end`). - [Medusa - Medusa - 1.0.0 ](https://eventcatalog.dev/docs/services/Medusa/1.0.0.mdx) - External commerce engine receiving selected product catalog data and forwarding commerce webhooks.- [Party Directory - party-directory - 1.0.0 ](https://eventcatalog.dev/docs/services/party-directory/1.0.0.mdx) - Canonical party, person, organization, and contact identity service shared by business modules.- [Sendgrid - Sendgrid - 1.0.0 ](https://eventcatalog.dev/docs/services/Sendgrid/1.0.0.mdx) - External email delivery provider for transactional api-v1 notifications.- [Shared Scraping Core - shared-scraping - 1.0.0 ](https://eventcatalog.dev/docs/services/shared-scraping/1.0.0.mdx) - Cross-domain scraping orchestration that owns ScrapingPlan, ScraperCapability, ScrapeRunScope, and provider-facing scraping ports.- [workers - workers - 1.0.0 ](https://eventcatalog.dev/docs/services/workers/1.0.0.mdx) - Background migration, sync, and reconciliation jobs (`@buildplan/workers`). ## Data Products ## Domains - [BIM Ontology - bim-ontology - 1.0.0 ](https://eventcatalog.dev/docs/domains/bim-ontology/1.0.0.mdx) - The canonical classification of building objects and the canonical parameter dictionary. Owns ObjectClass, ParameterKey, ClassParameter, ParameterGroup, ParameterValue, and the Revit parameter projection. Consumed by product-marketplace, which assigns classes to products and uses the associated parameters. - [Platform - platform - 1.0.0 ](https://eventcatalog.dev/docs/domains/platform/1.0.0.mdx) - Shared kernel — cross-cutting vocabulary and the catalog entry point. Not a runtime bounded context and not an api-v2 module folder. - [Product Marketplace - product-marketplace - 1.0.0 ](https://eventcatalog.dev/docs/domains/product-marketplace/1.0.0.mdx) - Product catalog, vendor product data, object-category graph, product scraping, image publishing, and BIM-oriented product metadata. ## Flows - [Create Product From URL - create-product-from-url - 1.0.0 ](https://eventcatalog.dev/docs/flows/create-product-from-url/1.0.0.mdx) - Queue and execute product creation from a vendor source URL in api-v1. - [Object Class Demotion Cascade - object-class-demotion-cascade - 1.1.0 ](https://eventcatalog.dev/docs/flows/object-class-demotion-cascade/1.1.0.mdx) - An ObjectClass that loses a required classification is demoted approved → draft. That records ObjectClassDemoted, and covering approved Revit projections are demoted to draft for re-review. - [Object Class Graph Mutations - object-class-graph-mutations - 1.0.0 ](https://eventcatalog.dev/docs/flows/object-class-graph-mutations/1.0.0.mdx) - Restructure the single-parent ObjectClass tree in api-v1 and fan out to the four handlers that recompute everything derived from tree position. - [Parameter Graph Persistence - parameter-graph-persistence - 1.0.0 ](https://eventcatalog.dev/docs/flows/parameter-graph-persistence/1.0.0.mdx) - Persist scraped parameter assignments through the canonical dictionary, taxonomy upsert, and variant_parameters junction writer. - [Parameter Key to Revit Projection - parameter-key-to-revit-projection - 1.0.0 ](https://eventcatalog.dev/docs/flows/parameter-key-to-revit-projection/1.0.0.mdx) - Author a canonical ParameterKey, approve it, and let ParameterKeyApproved mint the draft Revit projection a steward then completes and approves. - [Refresh and Reload Product Scrape - refresh-reload-product-scrape - 1.0.0 ](https://eventcatalog.dev/docs/flows/refresh-reload-product-scrape/1.0.0.mdx) - Queue and run refresh/reload scrape jobs for selected Product Marketplace catalog records. - [Revit Projection Archive and Reuse - revit-projection-archive-and-reuse - 1.0.0 ](https://eventcatalog.dev/docs/flows/revit-projection-archive-and-reuse/1.0.0.mdx) - Retiring a ParameterKey archives its Revit projection instead of deleting it, so the shared-parameter GUID survives and re-adding the parameter reuses the same identity. One path breaks the rule, and it is documented here. ## Channels ## Ubiquitous Language - BIM Ontology Domain - [Object Class: - A kind of building object BuildPlan can classify, specify, and eventually build. Aggregate root; Airtable object_classes. Answers "what kind of thing is this?" — not a product, a model, or a Revit category.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Product parent graph: - The single-parent ancestry between object classes (ADR-0046). At most one parent per class, acyclic. This is the edge set only; parameter inheritance is a separate concept that reads it.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [root_object_class: - The parentless ancestor at the top of a class's lineage. Derived and persisted on each row. Explicitly NOT an input to Revit category resolution — that was a DAG-era rule retired with ADR-0046.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [External classification mapping: - Uniformat, Masterformat, OmniClass, and ObjectClass codes cross-referenced from a class. The first three plus Revit category use inherit-by-default fill with make-unique (ADR-0050); OmniClass is a flat non-propagating link.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Make unique: - ADR-0050 fill rule. Stewards author *_direct only; make-unique is inferred on edit. The value fills down from the nearest make-unique ancestor until the next one. Effective mirrors materialized *_direct, so no read-time walk happens.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit category classification link: - The single Revit category an object class classifies as (0..1), with health status current | stale | needs_review | unresolved and provenance authored | inherited. Distinct from Revit category scope — this classifies a class, that describes a parameter binding's coverage.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Key: - The canonical identity and meaning of one parameter, independent of where it is used or how it is rendered. Aggregate root; Airtable parameter_keys; REST /parameter-keys. Owned by bim-ontology, consumed by product-marketplace (ADR-0006).](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter lifecycle: - draft → active → approved → archived, invariant-checked. ParameterKey is the only aggregate with active. See the "Why active exists" section below — it is the scraping contract, not an extra step.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Usage: - Which product contexts a key participates in — variant_option, product_spec, bim_parameter, mfg_takeoff, qto_takeoff. Non-empty set. bim_parameter membership is load-bearing - it gates automatic Revit projection. Not the same as Revit document altitude.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Spec: - The value semantics of a key — what kind of value, whether measurable, which unit system. BuildPlan's own semantics, mapped onto an Autodesk RevitSpecType. Airtable parameter_specs.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Control: - How a parameter is presented for authoring or selection. Constrains the interaction where ParameterSpec constrains the value. Airtable parameter_controls.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Group: - The authoring grouping that organizes related keys for humans. The source both Revit group projections derive from; not itself a Revit artifact.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Value: - One canonical value a key can take, optionally carrying measured quantities. Quantity roles distinguish primary, alternate, min, max, and modifier readings.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Parameter Value Group: - A reusable ordered set of parameter values applied as a template.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Unit: - A canonical unit of measure, referenced from quantity values and constrained by ParameterSpec. Belongs to neither.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Class Parameter: - The assignment of one parameter key to one object class, with the local rules governing it. Aggregate root. Called assignment, never binding — binding is reserved for Revit placement.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Assignment Origin: - How an assignment came to exist — direct, rendered, or legacy_unknown. Only direct rows accept deletion and allowed-value edits. Server-owned; hidden from stewards.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Inheritance Mode: - On direct rows only — unique (this node only) or apply_to_descendants. The retired wire vocabulary self_only / self_plus_descendants / descendants_only is gone from the HTTP contract.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Child Behavior: - On rendered rows only — inherit (default), suppress (this class only), or override (this class only, local values).](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Effective parameter set: - The resolved answer to "what parameters does this class actually have", computed on request with an explanation. Resolution kinds are direct, inherited, override, suppressed. Rendered rows are a cache for Airtable's benefit; the resolution is authoritative.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit Parameter Projection: - The Revit-facing expression of exactly one parameter key — one definition identity plus optional placements. Aggregate root; lifecycle draft → approved → archived. System-created, steward-completed.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit definition form: - shared, family_local, project_local, built_in, legacy_unknown. Definition means an identity BuildPlan authors and owns; Reference means an external identity it reads but never authors.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit shared parameter GUID: - Minted once for a shared definition and never regenerated. That immutability is what makes shared definitions portable, and why retirement archives a projection rather than deleting it.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit category scope: - The set of Revit categories a project binding covers, resolved from effective class assignments. Derived only — the steward override was removed. Scope in this module means this and nothing else.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Revit binding kind: - instance or type — Revit's own vocabulary and the one sanctioned bare use of the word "type". RevitBindingKindPreference holds the aggregate-level default.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Document altitude (revit_usages): - Which Revit document kinds a projection is enabled for — family and/or project — derived at write time from the two placements, plus an authored primary preference. Same word as ParameterUsage, different altitude.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Effective Revit name: - Normally derived from the canonical name, optionally pinned by override. Because it is derived, editing the canonical name drifts the projection — which is what the derivation-drift report and resync exist to reconcile.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [Common parameters: - A stewarded allowlist of platform-wide parameters in the bp.common.* handle space that project with a fixed shape. Sheet, view, and annotation categories are denylisted from common project binding.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - [AT-A1 / AT-A2 / AT-B1 / AT-C1: - The Airtable steward-UI mutation patterns. AT-A1 is a flag-based action table, AT-A2 a record-detail action button, AT-B1 a create-request table, AT-C1 a watched-field recompute (ADR-0047). Every one calls the API; none writes domain state directly.](https://eventcatalog.dev/docs/domains/bim/language.mdx) - Platform Domain - [Project Object Model (POM): - Like a DOM for the project — the current rendered state of the project graph. Not a bounded context or api-v2 module. Persisted in Postgres (api-v2); may be serialized to JSON for APIs and visualization. The app materializes POM views from committed state plus in-flight workflow.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [POM graph: - JSON or API projection of project nodes and relationships used for rendering and integration; not a separate module folder.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Committed state: - Official project data owned by bounded contexts (e.g. design-management design/spec graph, construction-management cost/execution). Mutations after approval go through module ports, often invoked by project-coordination after commit gates.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Proposed state: - In-flight change proposals, approvals, and workflow status owned by project-coordination until commit.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Change Proposal: - Aggregate in project-coordination representing a proposed change awaiting review/approval/commit.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Configuration DSL (JSX): - Domain-specific JSX language that encapsulates complex project configuration logic; evaluated in app/runtime context, not a backend module name.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [project-coordination: - api-v2 module — cross-role workflow orchestration (approvals, proposals, tasks). Process manager / saga; does not own product catalog or committed POM slices.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [BFF (app-level API): - Role-specific API composition under apps/api-v2/src/apps/** (e.g. client-portal-api). Not a bounded context; composes module inbound ports and api-v1 HTTP during cutover.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [apps/** experience layer: - apps/api-v2/src/apps/{bff-name}/ — routes, controllers, presenters, composition; no core/domain folder.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Object Class: - The canonical classification node other contexts attach to — "what kind of thing is this?". A single-parent tree (ADR-0046). Owned by bim-ontology; product-marketplace assigns classes to products rather than defining them. Full definition on the bim-ontology language page.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Parameter Key: - The canonical identity and meaning of one parameter — one key per concept, defined once, independent of where it is used. Owned by bim-ontology, consumed by product-marketplace (ADR-0006). Full definition on the bim-ontology language page.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Class Parameter: - The assignment of a parameter key to an object class, with the local rules governing it. Always called an assignment, never a binding — "binding" is reserved for Revit placement.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [Revit Parameter Projection: - The Revit-facing expression of an approved parameter key — one definition identity plus optional placements. A projection of a key, not a second definition of it.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [root_object_class: - The parentless ancestor at the top of a class's lineage, derived and persisted on each row. Explicitly not an input to Revit category resolution — that was a DAG-era rule retired with ADR-0046.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [active (ParameterKey state): - Displayable-but-unvetted. ParameterKey is the only aggregate with this state (ADR-0052). A scraper maps onto an approved key or creates a new key in active so scraped data is live while flagged for steward mapping.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [AT-A1: - Airtable steward-UI mutation pattern (ADR-0047) — flag-based action table. Calls the API; never writes domain state directly.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [AT-A2: - Airtable steward-UI mutation pattern (ADR-0047) — record-detail action button. Calls the API; never writes domain state directly.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [AT-B1: - Airtable steward-UI mutation pattern (ADR-0047) — create-request table. Calls the API; never writes domain state directly.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - [AT-C1: - Airtable steward-UI mutation pattern (ADR-0047) — watched-field recompute. Calls the API; never writes domain state directly. AT-A* / AT-B1 written fields and AT-C1 watch lists must stay disjoint.](https://eventcatalog.dev/docs/domains/platform/language.mdx) - Product Marketplace Domain - [Object Category: - Product taxonomy node backed by the api-v1 object_categories table.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Object Category Code: - Code reference linked from an object category record.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Category Graph Service: - Pure domain policy for object-category tree changes.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Parameter Key: - Canonical parameter concept (one record per handle). Owned by bim-ontology and consumed here — see the ParameterKey entity page under that domain. Product-marketplace assigns a class to a product and uses the associated parameters.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Parameter Scope: - Retired name for ParameterUsage (variant_option, product_spec, bim_parameter, mfg_takeoff, qto_takeoff). In bim-ontology "scope" means Revit category scope and nothing else; use usage for this concept.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Category Parameter: - Retired name for bim-ontology's ClassParameter — the assignment of one parameter key to one object class, with allowed-value children. Product-marketplace does not own this junction.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Model Parameter: - L2 junction on ProductModel; MTO allowable values and ranges are stored here (ADR-0007).](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Variant Parameter: - L3 junction on ProductVariant (renamed from parameter_assignments / variant_parameters table).](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Configuration Mode: - Product model strategy — simple, predefined_variants, made_to_order, or hybrid (ADR-0008).](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Canonical Parameter Dictionary Index: - In-memory index of synced taxonomy keys/values used during scrape persistence to reuse canonical records by name, handle, or domain_id.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Scraped Parameter Graph: - Outbound persistence pipeline that upserts taxonomy keys/values and writes variant_parameters from scrape assignments.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Pending Parameter Link: - Deferred variant_parameters link queued when PM mirror records are not yet synced; reconciled by ReconcilePendingParameterLinksUseCase.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Parameter Template Inheritance Service: - Policy that computes inherited effective parameter templates across category ancestors.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Vendor: - Product-marketplace organization projection backed by vendor records.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Seller: - Product-marketplace person projection backed by seller records.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Product Collection: - Deprecated product-marketplace name that now means VendorProductCollection; user-curated collections belong to design-management.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Refresh Field Catalog: - Product-specific catalog of stable fields a refresh scrape is allowed to update.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Product Scrape Run Behavior: - Policy that combines scrape run scope with catalog persistence behavior.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Create from URL: - User-driven workflow that validates a source URL and starts scrape/persist processing for a product.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Refresh Scrape: - Update allowed fields for an existing product model while preserving records outside the refresh field set.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Reload Scrape: - Re-scrape and replace a broader set of scrape-owned records for an existing model or family.](https://eventcatalog.dev/docs/domains/product/language.mdx) - [Image Publishing: - Workflow that publishes Airtable-linked product images to persistent media URLs and writes attachment state back.](https://eventcatalog.dev/docs/domains/product/language.mdx) ## Containers (Databases, External Systems) ## Entities - BIM Ontology Domain - [Object Class](https://eventcatalog.dev/docs/entities/ObjectClass/1.0.0.mdx) - The canonical kind of building object BuildPlan can classify, specify, and eventually build. Aggregate root of a single-parent tree, cross-referenced to Uniformat, Masterformat, ObjectClass codes, and one Revit category. - [Parameter Key](https://eventcatalog.dev/docs/entities/ParameterKey/1.0.0.mdx) - The canonical identity and meaning of one parameter, independent of where it is used or how it is rendered. Owned by bim-ontology, consumed by product-marketplace. One record per handle, never one per product model. - [Class Parameter](https://eventcatalog.dev/docs/entities/ClassParameter/1.0.0.mdx) - The assignment of one ParameterKey to one ObjectClass, with the local rules governing it. Always called an assignment — binding is reserved for Revit placement. - [Parameter Group](https://eventcatalog.dev/docs/entities/ParameterGroup/1.0.0.mdx) - The authoring grouping that organizes related ParameterKeys for humans. No lifecycle. The source a Revit UI group projection derives from — not itself a Revit artifact. - [Parameter Value](https://eventcatalog.dev/docs/entities/ParameterValue/1.0.0.mdx) - One canonical value a ParameterKey can take, optionally carrying measured quantities. Owned by bim-ontology; product-marketplace reads it. No lifecycle. - [Parameter Value Group](https://eventcatalog.dev/docs/entities/ParameterValueGroup/1.0.0.mdx) - A reusable ordered set of ParameterValues applied as a template. Owned by bim-ontology; product-marketplace reads it. No lifecycle, no events, no authoring endpoint yet. - [Revit Parameter Projection](https://eventcatalog.dev/docs/entities/RevitParameterProjection/1.0.0.mdx) - The Revit-facing expression of exactly one ParameterKey — one definition identity plus optional placements. Lifecycle draft → approved → archived. System-created in draft, steward-completed, steward-approved. Archived, never deleted. - Product Marketplace Domain - [Product Model](https://eventcatalog.dev/docs/entities/ProductModel/1.0.0.mdx) - Master catalog aggregate for product model identity, configuration mode, parameter bindings, variant strategy, and refresh capability. - [Product Variant](https://eventcatalog.dev/docs/entities/ProductVariant/1.0.0.mdx) - Catalog aggregate for a concrete product variant, including SKU data, pricing snapshots, stock, and variant parameters. - [Model Parameter](https://eventcatalog.dev/docs/entities/ModelParameter/1.0.0.mdx) - L2 junction binding a canonical ParameterKey to a ProductModel; MTO allowable values and ranges live here. - [Model Parameter Allowed Value](https://eventcatalog.dev/docs/entities/ModelParameterAllowedValue/1.0.0.mdx) - Child row defining an allowable ParameterValue (or range via quantity_values) for a ModelParameter junction. - [Variant Parameter](https://eventcatalog.dev/docs/entities/VariantParameter/1.0.0.mdx) - L3 junction linking a ProductVariant to selected ParameterValue records for one ParameterKey (renamed from parameter_assignments). - [Price Group](https://eventcatalog.dev/docs/entities/PriceGroup/1.0.0.mdx) - Pricing aggregate that gates price and cost by parameter values, value groups, and tiered quantities. - [Vendor Product Collection](https://eventcatalog.dev/docs/entities/VendorProductCollection/1.0.0.mdx) - Catalog aggregate for manufacturer or vendor product lines, distinct from design-management user collections. - [CAD Asset](https://eventcatalog.dev/docs/entities/CadAsset/1.0.0.mdx) - BIM/CAD file attached to a product model or generic object category. - [Inventory](https://eventcatalog.dev/docs/entities/Inventory/1.0.0.mdx) - Catalog stock snapshot for a product variant. - [Material](https://eventcatalog.dev/docs/entities/Material/1.0.0.mdx) - Renderable material data and texture assets associated with catalog products. - [Product Description](https://eventcatalog.dev/docs/entities/ProductDescription/1.0.0.mdx) - Marketing, technical, and SEO copy associated with catalog products. - [Product Document](https://eventcatalog.dev/docs/entities/ProductDoc/1.0.0.mdx) - Product document linked to a product model or variant. - [Product Image](https://eventcatalog.dev/docs/entities/ProductImage/1.0.0.mdx) - Catalog image metadata and publishing state for a product model or variant. ## Teams - [buildplan](https://eventcatalog.dev/docs/teams/buildplan.mdx) - Buildplan Engineering ## Users