B2BEA.org Current Site Reverse Engineering v1
internal prototype · canonical JSON + Dreamborn Forge HTML
internal generated
research · supabase_json

B2BEA.org Current Site Reverse Engineering v1

research artifact · for B2BEA.org Rebuild · status approved

Planning Surface

Use this to decide what happens next.

Status

approved

Agent Handoff
Start Here

research artifact · for B2BEA.org Rebuild · status approved

Completion Evidence

No explicit evidence field yet. Require tests, screenshots, linked PRs, or reviewed outputs before marking complete.

Artifact Shape
  • scope: Current-state audit only. Capability catalog is intentionally deferred until after this reverse-engineering pass is reviewed.
  • title: B2BEA.org Current Site Reverse Engineering v1
  • layouts: 9 items
  • version: 1
  • partials: 19 items
  • surfaces: auth: object, b2bea_admin: object, public_site: object, member_dashboard_profile: object, vendor_management_portal: object, practitioner_company_workspace: object
  • project id: a820dd0c-6cef-4133-bfbd-d802fd806e44
  • updated at: 2026-05-06T19:13:19.768Z
  • source repo: /Users/justinking/Vaults/Projects/B2BEA-org-new
  • css findings: 4 items
  • data modules: 35 items
  • artifact type: research
Structured Payload

Machine-readable source fields

scope

Current-state audit only. Capability catalog is intentionally deferred until after this reverse-engineering pass is reviewed.

title

B2BEA.org Current Site Reverse Engineering v1

layouts
  • src/_includes/layouts/admin.njk
  • src/_includes/layouts/article.njk
  • src/_includes/layouts/auth.njk
  • src/_includes/layouts/base.njk
  • src/_includes/layouts/editorial.njk
  • src/_includes/layouts/page.njk
  • src/_includes/layouts/portal.njk
  • src/_includes/layouts/studio.njk
  • src/_includes/layouts/vendor-landing.njk
version

1

partials
  • src/_includes/partials/admin-nav.njk
  • src/_includes/partials/admin-rebuild.njk
  • src/_includes/partials/case-study-card.njk
  • src/_includes/partials/content-card.njk
  • src/_includes/partials/course-card.njk
  • src/_includes/partials/exchange-card.njk
  • src/_includes/partials/footer.njk
  • src/_includes/partials/nav.njk
  • src/_includes/partials/person-card.njk
  • src/_includes/partials/portal-nav.njk
  • src/_includes/partials/search-modal.njk
  • src/_includes/partials/studio-nav.njk
  • src/_includes/partials/topic-concepts.njk
  • src/_includes/partials/topic-cta.njk
  • src/_includes/partials/topic-featured.njk
  • src/_includes/partials/topic-hero.njk
  • src/_includes/partials/topic-section.njk
  • src/_includes/partials/vendor-card.njk
  • src/_includes/partials/vendor-people.njk
surfaces
auth
current role

Login, signup, confirm email, OAuth, password/magic-link flows.

current files
  • src/confirm-email/index.njk
  • src/login/index.njk
  • src/signup/index.njk
rebuild implication

Auth should be treated as a shared cross-surface capability with clear return URLs and role-aware routing.

b2bea admin
current role

Internal platform operations for users, vendors, companies, categories, academy, jobs, Studio/media, and dashboard metrics.

current files
  • src/admin/academy/course.njk
  • src/admin/academy/index.njk
  • src/admin/academy/lesson.njk
  • src/admin/categories/index.njk
  • src/admin/companies/index.njk
  • src/admin/index.njk
  • src/admin/jobs/index.njk
  • src/admin/users/index.njk
  • src/admin/vendors/index.njk
  • src/studio/index.njk
  • src/studio/media/index.njk
rebuild implication

Should become an app surface with consistent tables, filters, forms, drawers/modals, detail panels, permissions, audit states, and bulk actions.

public site
current role

Marketing, editorial, search/discovery, public directories, resources, learning previews, conversion, public profiles, and public vendor pages.

current files
  • src/agencies/index.njk
  • src/assessments/index.njk
  • src/assessments/maturity/index.njk
  • src/assessments/maturity/results/index.njk
  • src/assessments/maturity/take/index.njk
  • src/authors/author.njk
  • src/blog/index.njk
  • src/blog/post.njk
  • src/careers/index.njk
  • src/careers/job.njk
  • src/case-studies/case-study.njk
  • src/case-studies/index.njk
  • src/concepts/ai-product-recommendations-b2b.njk
  • src/concepts/concept.njk
  • src/concepts/index.njk
  • src/consultants/index.njk
  • src/courses/course.njk
  • src/courses/index.njk
  • src/courses/lessons/lesson.njk
  • src/courses/modules/challenge-feedback.njk
  • src/courses/modules/challenge.njk
  • src/courses/modules/test.njk
  • src/distributors/index.njk
  • src/events/event.njk
  • src/events/index.njk
  • src/exchange/exchange.njk
  • src/exchange/index.njk
  • src/for/agencies/index.njk
  • src/for/consultants/index.njk
  • src/for/distributors/index.njk
  • src/for/manufacturers/index.njk
  • src/for/software-providers/index.njk
  • src/for/vendors/index.njk
  • src/guides/guide.njk
  • src/guides/index.njk
  • src/how-we-use-ai/index.njk
  • src/index.njk
  • src/insights/index.njk
  • src/leaders/index.njk
  • src/manufacturers/index.njk
  • src/pages/about.njk
  • src/pages/checkout-success.njk
  • src/pages/checkout.njk
  • src/pages/contact.njk
  • src/pages/join.njk
  • src/pages/membership-terms.njk
  • src/pages/services.njk
  • src/pages/terms.njk
  • src/pages/upgrade.njk
  • src/pages/vendor-application.njk
  • src/pages/vendor-membership.njk
  • src/people/index.njk
  • src/people/person.njk
  • src/podcast/episode.njk
  • src/podcast/index.njk
  • src/reports/index.njk
  • src/reports/report.njk
  • src/resources/2026-b2b-ecommerce-trends/download.njk
  • src/resources/2026-b2b-ecommerce-trends/index.njk
  • src/resources/career-acceleration-kit/download.njk
rebuild implication

Should become mostly template-driven with explicit page families and component contracts.

member dashboard profile
current role

Personal dashboard, account settings, profile editing, knowledge profile, onboarding, welcome/pro state.

current files
  • src/account/index.njk
  • src/dashboard/index.njk
  • src/dashboard/onboarding/index.njk
  • src/dashboard/profile/edit.njk
  • src/dashboard/profile/knowledge.njk
  • src/dashboard/profile.njk
  • src/dashboard/welcome/index.njk
rebuild implication

Should define individual identity, public profile projection, learning activity, membership entitlements, saved items, account/security, and career activity.

vendor management portal
current role

Vendor claim and vendor profile/content/analytics portal. Current portal has profile, case studies, blog, analytics, and coming-soon areas for events/team/resources/courses.

current files
  • src/exchange/vendor-claim.njk
  • src/vendor-portal/index.njk
rebuild implication

Should be its own company workspace for vendors selling into the ecosystem, distinct from practitioner company workspaces.

practitioner company workspace
current role

Not present as a first-class surface in the current repo.

current files

No items captured.

rebuild implication

Needs net-new spec for company admins managing employee seats, academy access, career benefits, membership ownership, and company-level participation.

project id

a820dd0c-6cef-4133-bfbd-d802fd806e44

updated at

2026-05-06T19:13:19.768Z

source repo

/Users/justinking/Vaults/Projects/B2BEA-org-new

css findings
  • src/assets/css/style.css is the dominant legacy stylesheet at roughly 14.9k lines and 2.4k selector blocks; this is the major design-system risk.
  • src/assets/css/lovable-system.css currently acts as an overlay/normalization layer rather than the sole source of truth.
  • admin.css, portal.css, studio.css, survey.css, search.css, and how-we-use-ai.css are separate surface/page stylesheets that need consolidation decisions.
  • Many templates contain inline <style> blocks. These should be classified as discard, migrate-to-component, or true one-off editorial exceptions.
data modules
filerest tablessource types
src/_data/allContent.js- sanity - fetch
src/_data/allResources.js- sanity
src/_data/assessment.json- static_json
src/_data/authors.js- people- supabase
src/_data/blogPosts.js- sanity - fetch
src/_data/caseStudies.js- sanity - fetch
src/_data/conceptPages.js
src/_data/concepts.js- sanity - fetch
src/_data/contentQuality.js
src/_data/courses.js- supabase
src/_data/events.js- supabase
src/_data/flatLessons.js
src/_data/guides.js- sanity - fetch
src/_data/homepageFeaturedPeople.js- people- supabase
src/_data/hubCategories.js- supabase
src/_data/jobs.js- supabase
src/_data/leaders.js- people- supabase
src/_data/membershipTiers.js- supabase
src/_data/people.js- people- supabase
src/_data/podcastEpisodes.js- podcast_episodes- supabase
src/_data/podcastVideoEnrichment.js
src/_data/podcasts.js- fetch
src/_data/reports.js- sanity - fetch
src/_data/sanityClient.js- sanity
src/_data/sanityEvents.js- supabase - sanity - fetch
src/_data/sanityLessons.js- supabase - sanity - fetch
src/_data/site.js
src/_data/subcategories.js- supabase
src/_data/supabaseClient.js- supabase
src/_data/vendorCategories.js- supabase
src/_data/vendorEvents.js- supabase
src/_data/vendorPeople.js- people - vendors- supabase
src/_data/vendors.js- supabase
src/_data/vendorsForPagination.js
src/_data/womenInB2b.js- people- supabase
artifact type

research

css inventory
filelinesimportant countselectors approx
src/assets/css/admin.css9861161
src/assets/css/how-we-use-ai.css451077
src/assets/css/lovable-system.css181516212
src/assets/css/portal.css7000118
src/assets/css/search.css414082
src/assets/css/studio.css245042
src/assets/css/style.css14865102427
src/assets/css/survey.css8960126
data findings
  • Data comes from mixed sources: Supabase REST, Supabase client-side JS, Sanity fetches, static JSON, and local generated data helpers.
  • Content/data boundaries are implicit in data loader files and page templates; rebuild needs explicit model contracts.
  • Build currently tolerates missing/failed Supabase/Sanity data with warnings in several loaders; rebuild should define fallback behavior intentionally.
surface counts
auth

3

b2bea admin

11

public site

73

member dashboard profile

7

vendor management portal

2

inventory counts
layouts

9

partials

19

css files

8

data modules

35

pages or page templates

96

executive summary
  • The current site is an Eleventy/Nunjucks application with static generation and a substantial amount of client-side Supabase workflow code embedded directly in templates.
  • The public site is broad: directories, resources, reports, guides, blog/editorial, concepts/topics, academy, careers, events, people, vendor profiles, persona pages, assessments, and legal/simple pages.
  • Authenticated areas already exist but are uneven: B2BEA Admin is the most functional app surface; member dashboard/profile and vendor portal exist but are thinner; practitioner company workspace is not currently represented as its own surface.
  • Design drift is structural: one large legacy stylesheet, multiple surface stylesheets, page inline styles, client-side scripts in templates, and a newer Lovable normalization layer layered over older CSS.
  • The rebuild should not start from page visuals. It should start from surfaces, capabilities, content/data contracts, design-system primitives, and reusable template families.
page family counts
auth

3

events

2

guides

2

academy

6

reports

2

topic hubs

7

assessments

4

public core

12

careers jobs

2

admin academy

3

editorial blog

2

concept library

3

page inventory sample
  • Item
    - file: src/account/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/admin/academy/course.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/academy/index.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/academy/lesson.njk - family: admin_academy - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/categories/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: true - inline script: true
  • Item
    - file: src/admin/companies/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/jobs/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: true - inline script: true
  • Item
    - file: src/admin/users/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/admin/vendors/index.njk - family: admin_operations - layout: admin.njk - surface: b2bea_admin - inline style: false - inline script: true
  • Item
    - file: src/agencies/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/assessments/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/assessments/maturity/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: true - inline script: true
  • Item
    - file: src/assessments/maturity/results/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: true - inline script: true
  • Item
    - file: src/assessments/maturity/take/index.njk - family: assessments - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/authors/author.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/blog/index.njk - family: editorial_blog - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/blog/post.njk - family: editorial_blog - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/careers/index.njk - family: careers_jobs - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/careers/job.njk - family: careers_jobs - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/case-studies/case-study.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/case-studies/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/concepts/ai-product-recommendations-b2b.njk - family: concept_library - layout: editorial.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/concepts/concept.njk - family: concept_library - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/concepts/index.njk - family: concept_library - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/confirm-email/index.njk - family: auth - layout: auth.njk - surface: auth - inline style: false - inline script: true
  • Item
    - file: src/consultants/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/courses/course.njk - family: academy - layout - surface: public_site - inline style: true - inline script: true
  • Item
    - file: src/courses/index.njk - family: academy - layout - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/courses/lessons/lesson.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/courses/modules/challenge-feedback.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/courses/modules/challenge.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/courses/modules/test.njk - family: academy - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/dashboard/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/dashboard/onboarding/index.njk - family: member_account_profile - layout: base.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/dashboard/profile/edit.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/dashboard/profile/knowledge.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/dashboard/profile.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/dashboard/welcome/index.njk - family: member_account_profile - layout: portal.njk - surface: member_dashboard_profile - inline style: false - inline script: true
  • Item
    - file: src/distributors/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/events/event.njk - family: events - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/events/index.njk - family: events - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/exchange/exchange.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/exchange/index.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/exchange/vendor-claim.njk - family: vendor_portal_claims - layout: base.njk - surface: vendor_management_portal - inline style: false - inline script: true
  • Item
    - file: src/for/agencies/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/for/consultants/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/for/distributors/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/for/manufacturers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/for/software-providers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/for/vendors/index.njk - family: vendor_directory - layout: base.njk - surface: public_site - inline style: true - inline script: true
  • Item
    - file: src/guides/guide.njk - family: guides - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/guides/index.njk - family: guides - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/how-we-use-ai/index.njk - family: public_core - layout: false - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/insights/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: true
  • Item
    - file: src/leaders/index.njk - family: public_core - layout: base.njk - surface: public_site - inline style: false - inline script: false
  • Item
    - file: src/login/index.njk - family: auth - layout: auth.njk - surface: auth - inline style: false - inline script: true
  • Item
    - file: src/manufacturers/index.njk - family: persona_landing - layout: base.njk - surface: public_site - inline style: true - inline script: false
  • Item
    - file: src/pages/about.njk - family: simple_marketing_legal - layout: base.njk - surface: public_site - inline style: false - inline script: false
required next artifacts
reasonartifact type
Organize current and target capabilities by surface/area after reverse engineering.capability-map
Define hardened shared foundation before any new page coding.design-system-spec
Define public, admin, member, vendor, and practitioner company workspaces separately.surface-spec
Turn implicit data loaders/tables into explicit model contracts.content-model-spec
Map all routes/page families to reusable templates and components.page-template-spec
Capture data warnings, legacy CSS risk, auth/permission gaps, and migration hazards.risk-register
current workflow signals
areasignalsevidence
auth- SignInWithPassword - SignInWithOAuth - SignInWithOtp - ResetPasswordForEmail - SignUp - UpdateEmail - ChangePassword - LinkIdentity - UnlinkIdentity - SignOut- src/login/index.njk - src/signup/index.njk - src/account/index.njk
member_profile- UpdateProfileName - UpdateHeadshot - UpdateProfileFields - CompleteProfile - ManageKnowledgeProfile- src/dashboard/index.njk - src/dashboard/profile/edit.njk - src/account/index.njk
academy_admin- CreateCourse - UpdateCourse - DeleteCourse - SetCourseInstructor - UpdateCoursePricing - UpdateCourseThumbnail - CreateModule - UpdateModule - DeleteModule - CreateLesson - UpdateLesson - DeleteLesson - EnrollLearner - UnenrollLearner- src/admin/academy/index.njk - src/admin/academy/course.njk - src/admin/academy/lesson.njk
academy_learner- CheckEnrollment - StartLesson - SaveLessonProgress - CompleteLesson - UpdateModuleProgress - TakeKnowledgeCheck - SubmitApplicationChallenge- src/courses/lessons/lesson.njk - src/courses/modules/challenge.njk - src/courses/modules/test.njk
vendor_admin- CreateVendor - UpdateVendor - AssignVendorCategories - ApproveVendorClaim - AssignVendorAdmin - ReviewVendorContentSubmission- src/admin/vendors/index.njk
vendor_portal- SubmitVendorProfileUpdate - VendorCreateCaseStudyDraft - VendorSubmitExistingCaseStudy - VendorCreateBlogPostDraft - VendorSubmitExistingBlogPost - ViewVendorAnalytics - ClaimVendorListing- src/vendor-portal/index.njk - src/exchange/vendor-claim.njk
jobs_admin- CreateScrapeSource - UpdateScrapeSource - RunScrapeSource - DeleteScrapeSource - ReviewScrapedJob - ApproveScrapedJob - RejectScrapedJob - CreateJob - UpdateJob - PublishOrArchiveJob- src/admin/jobs/index.njk
taxonomy_admin- UpdateSubcategory - CreateCategoryFaq - UpdateCategoryFaq - DeleteCategoryFaq - AssignCategoryExpert - RemoveCategoryExpert- src/admin/categories/index.njk
users_admin- CreateUserPerson - UpdateUserPerson - AssignRoles - RemoveRoles - GrantPlatformAdmin - RevokePlatformAdmin - AssignOrganization- src/admin/users/index.njk
resources_gating- GateResourceByAccount - GateResourceByProMembership - RecordResourceDownload- src/guides/guide.njk - src/reports/report.njk - src/resources/*/index.njk
analytics- RecordPageView - AggregateVendorProfileViews - AggregateVendorContentViews- src/blog/post.njk - src/case-studies/case-study.njk - src/exchange/exchange.njk - src/vendors/orocommerce.njk - src/vendor-portal/index.njk
assessments- CreateAssessmentSession - LoadAssessmentResults- src/assessments/maturity/take/index.njk - src/assessments/maturity/results/index.njk
supabase operation signals
opcount
resource_downloads.upsert5
people.update4
page_views.insert4
organizations.select3
lessons.delete2
persons.select2
courses.update2
subcategories.select2
people.select2
vendors.select2
person_roles.insert2
modules.update1
modules.delete1
modules.insert1
lessons.insert1
course_enrollments.delete1
course_enrollments.insert1
courses.insert1
courses.delete1
lessons.update1
subcategories.update1
category_faqs.delete1
category_faqs.update1
category_faqs.insert1
category_experts.delete1
category_experts.insert1
vendor_updates.select1
scrape_sources.select1
scrape_sources.update1
scrape_runs.insert1
scrape_sources.delete1
scrape_sources.insert1
scraped_jobs.select1
jobs.insert1
scraped_jobs.update1
jobs.update1
persons.update1
person_roles.delete1
platform_admins.delete1
persons.insert1
vendors.update1
organizations.insert1
vendors.insert1
vendor_category_assignments.delete1
vendor_category_assignments.insert1
vendor_updates.update1
vendor_content_submissions.update1
vendor_content_submissions.select1
assessment_sessions.select1
assessment_sessions.insert1
vendor_content_submissions.insert1
vendor_updates.insert1
route and template findings
  • The current repo uses file-based Eleventy/Nunjucks templates, with dynamic route generation via permalink strings for blogs, vendors, people, guides, reports, events, careers, concepts, and courses.
  • Several pages are full templates with inline scripts and styles rather than thin views composed from shared components.
  • The same broad design pattern appears in multiple persona pages; rebuild should collapse these into one persona landing template with content data.
  • Admin pages are large single-file app screens; rebuild should split them into capability/workflow specs before choosing component boundaries.