The Software GardenConway's Law still holds ← Contents
The Software Garden · Organisation

Conway's Law still holds

Plan with the owner, not around them.

Real enterprise features cross repositories, teams and vendors. Agents don't dissolve the org chart. At agent speed, they just hit its boundaries faster. So the plan has to know where the boundaries are, and who is on the other side.

Scroll ↓
The law

Systems mirror the organisations that build them.

Melvin Conway observed it in 1968: an organisation designs systems that copy its own communication structure. Every team boundary becomes an interface, and every interface has an owner.

That's not a technical problem to engineer away. It's how large software gets built at all. A feature someone asks for in one product usually needs a change in a service another team owns, a library a third team publishes, and something from a vendor nobody here controls.

So planning a real feature isn't purely technical. It's working out who owns each part, and coordinating with them.

🏠 Your repositoryWhat your team owns and can change today.
🏢 Another team's repositorySame company, different owners, roadmap and review.
📦 A shared libraryPublished by one team, used by many. A change ripples.
🌐 A third partyAn outside project or vendor. You use what it offers.
The failure mode

An agent optimises for the repository it's standing in.

Ask an agent for a feature and it will find a way to deliver it from where it is. If the data it needs belongs to another team, it reads their database. If the API doesn't offer a field, it scrapes one. If a capability is missing, it rebuilds it locally.

Each shortcut works. Each one is the local optimisation that grows a jungle, except now the jungle spans repositories, and the team that owns the real thing doesn't know your copy exists.

❌ Read their databaseCouples you to internals they'll change without telling you.
❌ Copy their logicTwo sources of truth, drifting apart.
❌ Use an endpoint they never offeredWorks until their next release.
✅ Ask the ownerSlower this week. Correct for every week after.
Metadata by convention

Every repository declares what it owns, and what it doesn't.

At Camunda, each repository carries an ARCHITECTURE.md with a small, machine-readable front matter. It says what the component owns, what people commonly think it owns but doesn't (with the real owner), what it depends on, and how other teams should ask it for changes.

Each dependency also says how far you may go to work around it. For most, the answer is never.

It's written for humans first and structured enough for any agent to read. It's the same idea as derivation: declare the facts once, where they live, and derive plans from them.

# ARCHITECTURE.md front matter (illustrative) component: acme/web-app intake: { how: issue, labels: [cross-repo-request] } owns: - Process list and its UI does_not_own: - { concept: Deployment history, owner: acme/orchestration } depends_on: - id: orchestration component: acme/orchestration kind: runtime-api architecture: ARCHITECTURE.md workaround_policy: never - id: identity component: OIDC provider kind: external workaround_policy: adapter-boundary
The planning skill

Find the owner of each capability, transitively.

Our planning skill starts by rewriting the feature as capabilities: “The system must…”, without naming any repository. Naming one too early decides the owner before anyone has looked.

Then it follows depends_on to each dependency's own ARCHITECTURE.md, and onward, to find whoever is the source of truth. Owned here: plan it here. Owned by another team: write that team a requirement brief. Owned outside: use the extension points it offers, behind an adapter.

Feature: show users when each process was last deployed, and by whom.
 

Illustrative repositories and feature.

The rules

Speed never outranks ownership.

Before options are compared, five hard gates rule some out. An option that fails any one is gone, however fast it would be.

The survivors are ranked in order: architectural integrity first, then constraints, then delivery. The tiers aren't added up, so a workaround here can never outscore asking the owner. A deadline is a reason to cut scope, or to agree a temporary contract with the owner, with its replacement already planned. It's never a reason to build their part in your repository.

G1

OwnershipDon't build what another component owns.

G2

ContractUse only what the owner offers, for what it was offered for.

G3

Binding decisionsDon't contradict an accepted decision record without proposing a new one.

G4

Hard constraints“Must work air-gapped” means must.

G5

Consumer promisesDon't break a compatibility promise without a deprecation path.

1 · Integrity
2 · Constraints
3 · Delivery
Working across teams

The coordination is part of the plan, not an afterthought.

The plan is a structured Markdown file, iterated in a pull request that's reviewed but never merged. Every part has an ID, so other plans can refer to it across repositories.

A brief goes to the owner the way the owner asked: through the intake in their ARCHITECTURE.md. Increments that need it are marked blocked by it. The owner answers each need in their plan, so they decide how to build it, not you.

Design and breakdown are separate phases. No issues are filed until the team and every owner it relies on have agreed the design.

📝

Draft the planCapabilities, owners, design, open questions.

📨

Send briefsAn issue in each owner's repository, need by need.

🤝

Owners answerAccepted, counter-proposal or declined, in their own plan.

✅

Design agreedOnly now does breakdown start.

🧱

Breakdown and fileIssues, with cross-repository “blocked by” links.

📚

ArchiveThe final plan goes on the epic; lasting decisions become decision records.

The same loops

A planning skill is code. Test it like code.

A validator checks every plan mechanically: IDs resolve, a permanent workaround is never chosen, “build it here” is only used for capabilities this repository owns, increments have no cycles, the diagram matches the tables, and each brief matches the plan.

And the skill itself was developed against evals: scripted scenarios run by agents and scored by separate grader agents against fixed rubrics. Each round's findings were fixed in the skill and checked in the next round.

ScenarioLatest round
Main planning flow30/31 and 27/29 criteria passed, none failed
Under delivery pressure11/12 and 13/14 passed, none failed
Owner answering a brief12–13 passed, 3 partial, none failed

From 51 graded runs on one real feature. Some scenarios haven't been run yet.

So

Declare the borders. Plan with the owners.

Enterprise features cross teams, and agents will happily cut straight across them. Have every repository declare what it owns and depends on, and let a planning skill read that across the organisation, place each capability with its owner, and make the coordination part of the plan. Then validate the plans and test the skill like any other code.