docs: align departments and add departmental squads #10

Merged
jarvis-at-skic merged 1 commits from docs/align-departments-add-squads into main 2026-10-04 01:51:06 -07:00
3 changed files with 146 additions and 33 deletions

No files matched your search

+112 -28
View File
@@ -23,7 +23,7 @@
"label": "Management",
"sublabel": "CEO / COO",
"pos": [
490,
820,
40
],
"size": [
@@ -41,7 +41,7 @@
280
],
"size": [
240,
280,
80
]
},
@@ -51,11 +51,11 @@
"label": "Technology",
"sublabel": "Engineering and platform",
"pos": [
720,
360,
280
],
"size": [
240,
280,
80
]
},
@@ -65,11 +65,11 @@
"label": "Operations",
"sublabel": "Service, resolution and trust",
"pos": [
40,
1450
680,
280
],
"size": [
240,
280,
80
]
},
@@ -79,11 +79,11 @@
"label": "Marketing",
"sublabel": "Brand and customer growth",
"pos": [
370,
1450
1000,
280
],
"size": [
240,
280,
80
]
},
@@ -93,11 +93,11 @@
"label": "Finance & Accounting",
"sublabel": "Financial performance and controls",
"pos": [
700,
1450
1320,
280
],
"size": [
240,
280,
80
]
},
@@ -107,11 +107,11 @@
"label": "HR & Administration",
"sublabel": "People and workplace",
"pos": [
1030,
1450
1640,
280
],
"size": [
240,
280,
80
]
},
@@ -122,7 +122,7 @@
"sublabel": "Strategy, priorities and outcomes",
"pos": [
40,
520
480
],
"size": [
280,
@@ -136,7 +136,7 @@
"sublabel": "Research and experience design",
"pos": [
40,
680
620
],
"size": [
280,
@@ -149,8 +149,8 @@
"label": "Product Engineering",
"sublabel": "Marketplace software delivery",
"pos": [
720,
520
360,
480
],
"size": [
280,
@@ -163,8 +163,8 @@
"label": "Platform & IT",
"sublabel": "Reliability and internal systems",
"pos": [
720,
680
360,
620
],
"size": [
280,
@@ -177,8 +177,8 @@
"label": "Architecture & Security",
"sublabel": "Technical standards and protection",
"pos": [
720,
840
360,
760
],
"size": [
280,
@@ -191,8 +191,8 @@
"label": "Quality Engineering",
"sublabel": "Testing and release quality",
"pos": [
720,
1000
360,
900
],
"size": [
280,
@@ -205,8 +205,64 @@
"label": "Data & AI",
"sublabel": "Analytics, ML and AI enablement",
"pos": [
720,
1160
360,
1040
],
"size": [
280,
80
]
},
{
"id": "operations-team-1",
"type": "frontend",
"label": "Operations Squad",
"sublabel": "Service, resolution, risk and quality",
"pos": [
680,
480
],
"size": [
280,
80
]
},
{
"id": "marketing-team-1",
"type": "frontend",
"label": "Marketing Squad",
"sublabel": "Brand, acquisition and retention",
"pos": [
1000,
480
],
"size": [
280,
80
]
},
{
"id": "finance-team-1",
"type": "frontend",
"label": "Finance & Accounting Squad",
"sublabel": "Planning, controls and payments",
"pos": [
1320,
480
],
"size": [
280,
80
]
},
{
"id": "people-team-1",
"type": "frontend",
"label": "People & Administration Squad",
"sublabel": "Talent, people and workplace",
"pos": [
1640,
480
],
"size": [
280,
@@ -292,6 +348,30 @@
"from": "technology",
"to": "technology-team-5",
"variant": "default"
},
{
"id": "operations-1",
"from": "operations",
"to": "operations-team-1",
"variant": "default"
},
{
"id": "marketing-1",
"from": "marketing",
"to": "marketing-team-1",
"variant": "default"
},
{
"id": "finance-1",
"from": "finance",
"to": "finance-team-1",
"variant": "default"
},
{
"id": "people-1",
"from": "people",
"to": "people-team-1",
"variant": "default"
}
],
"cards": [
@@ -318,6 +398,7 @@
"dot": "cyan",
"title": "Operations",
"items": [
"Operations Squad",
"Customer Support; Trust & Resolution",
"Risk & Fraud",
"Operational Quality"
@@ -327,6 +408,7 @@
"dot": "amber",
"title": "Marketing",
"items": [
"Marketing Squad",
"Brand & Community; Creative; SEO",
"PPC & Affiliate; Influencer",
"CRM"
@@ -336,6 +418,7 @@
"dot": "cyan",
"title": "Finance & Accounting",
"items": [
"Finance & Accounting Squad",
"Financial Planning & Analysis",
"Accounting, Tax & Controls",
"Treasury & Payment Operations"
@@ -345,6 +428,7 @@
"dot": "amber",
"title": "HR & Administration",
"items": [
"People & Administration Squad",
"Talent Acquisition",
"People Operations",
"Office & Administration"
+13 -5
View File
@@ -24,7 +24,7 @@ Functional leaders translate company priorities into departmental plans. Team le
## Departments and teams
Product has **two teams** and Technology has **five teams**. Each team belongs to one department, with its own leadership and responsibilities. The departments collaborate on delivery without sharing team ownership.
Product has **two teams** and Technology has **five teams**. Operations, Marketing, Finance & Accounting, and HR & Administration each have **one squad** covering their departmental workstreams. Each team belongs to one department, with its own leadership and responsibilities. The departments collaborate on delivery without sharing team ownership.
### Product
@@ -55,7 +55,9 @@ The CTO owns technology direction. The Head of Engineering leads engineering del
**Purpose:** keep marketplace trading dependable and resolve customer issues fairly and efficiently.
| Team | Responsibilities |
**Operations Squad** delivers the department’s responsibilities across the following workstreams.
| Workstream | Responsibilities |
| --- | --- |
| Customer Support | Buyer and seller assistance, knowledge management, self-service and support workflow automation. |
| Trust & Resolution | Disputes, appeals, refunds, warranties, chargebacks and complex customer cases. |
@@ -68,7 +70,9 @@ The COO coordinates Operations. Team leads manage specialists and daily service
**Purpose:** attract and retain customers, build the Eldorado brand and grow marketplace demand.
| Team / workstream | Responsibilities |
**Marketing Squad** delivers the department’s responsibilities across the following workstreams.
| Workstream | Responsibilities |
| --- | --- |
| Brand & Community | Brand positioning, campaigns, organic social, community and brand partnerships. |
| Creative | Campaign concepts, visual assets and performance creative. |
@@ -83,7 +87,9 @@ The CMO coordinates Marketing. The Brand Team Lead owns Brand & Community, with
**Purpose:** maintain financial control, support business decisions and keep marketplace money flows dependable.
| Team / function | Responsibilities |
**Finance & Accounting Squad** delivers the department’s responsibilities across the following workstreams.
| Workstream | Responsibilities |
| --- | --- |
| Financial Planning & Analysis | Budgets, forecasts, profitability, management reporting and investment analysis. |
| Accounting, Tax & Controls | Accounting, financial reporting, tax, audit coordination and internal controls. |
@@ -95,7 +101,9 @@ The CFO coordinates Finance & Accounting and works with executive leadership on
**Purpose:** help teams attract, develop and retain people and provide an effective working environment.
| Team | Responsibilities |
**People & Administration Squad** delivers the department’s responsibilities across the following workstreams.
| Workstream | Responsibilities |
| --- | --- |
| Talent Acquisition | Recruitment, candidate experience, hiring coordination and workforce demand support. |
| People Operations | Employee onboarding, development, performance processes, policies and employee experience. |
+21
View File
@@ -77,6 +77,27 @@ test('Product owns two teams and Technology owns five separate teams', () => {
}
}
});
test('departments share one row and each has delivery teams below it', () => {
const spec = JSON.parse(read('diagrams/organization-structure.architecture.json'));
const page = read('docs/organization/structure.mdx');
const departments = ['product', 'technology', 'operations', 'marketing', 'finance', 'people'];
const nodes = new Map(spec.components.map(n => [n.id, n]));
assert.equal(new Set(departments.map(id => nodes.get(id).pos[1])).size, 1);
for (const [i, id] of departments.entries()) {
const department = nodes.get(id);
const teams = spec.connections.filter(e => e.from === id).map(e => nodes.get(e.to));
assert.equal(teams.length, i === 0 ? 2 : i === 1 ? 5 : 1);
for (const team of teams) {
assert(team.pos[1] > department.pos[1] + department.size[1]);
assert.equal(team.pos[0], department.pos[0]);
assert.deepEqual(spec.connections.filter(e => e.to === team.id).map(e => e.from), [id]);
assert(page.includes(team.label));
}
}
for (const [i, a] of spec.components.entries()) for (const b of spec.components.slice(i + 1)) {
assert(!(a.pos[0] < b.pos[0] + b.size[0] && a.pos[0] + a.size[0] > b.pos[0] && a.pos[1] < b.pos[1] + b.size[1] && a.pos[1] + a.size[1] > b.pos[1]), `${a.id} overlaps ${b.id}`);
}
});
test('organization page presents an operating model, not research notes', () => {
const page = read('docs/organization/structure.mdx');
assert(page.includes('operating model') && page.includes('## Departments and teams'));