Skip to content

ADR 0015 — Separate Architecture Decision, Implementation And Verification

  • Status: ACCEPTED
  • Date: 2026-08-25
  • Supersedes: any practice that lets one implementation slice redefine the architecture rule used to approve itself
  • Decision owner: Product architecture review

Context

Recent Logistics Workspace work repeatedly created customer/cohort-named backend files, speculative runtime or package scaffolding and implementation-specific architecture tests. The repository already stated many correct principles, but the active Task could amend Product/phase/Task/manifest/code/test and validation together. A wrong premise could therefore become internally consistent and pass.

The immediate example is treating the first Trade/Inventory validation tenant as a backend owner. CTC and MK are tenants and operating-profile cohorts; Commercial, Fulfillment, Scale, Inventory, Transportation and Settlement are the shared semantic owners.

Decision

Adopt ../architecture/ARCHITECTURE_CHANGE_METHOD.md as the binding process for architecturally significant changes.

  1. Evidence mapping, shaping, architecture review, implementation and verification are separate passes.
  2. A production implementation slice may not modify architecture authority or architecture/admission validators.
  3. A governance slice may not modify Product runtime source.
  4. New packages/public exports/customer-specific backend boundaries default to a zero budget.
  5. Architecture changes require a previously accepted ADR with at least three serious options.
  6. Stable fitness functions enforce Product/module principles; Task-specific tests may not redefine those principles.
  7. First validation tenants are recorded as cohorts, never module/package/writer owners.
  8. Structural cleanup reports net complexity, not only added-line and changed-path counts.

Alternatives

Alternative A — Add more startup context and a longer plan

Rejected. More detail reduces omissions but does not validate the starting premise. It can make the wrong design more coherent and harder to challenge.

Alternative B — Add more fields to the active Task manifest

Rejected as the sole control. A self-authored manifest can still justify its own abstraction and test. Machine fields are useful only after an independently accepted architectural decision.

Alternative C — Separate roles and use stable architecture fitness functions

Accepted. This creates an independent decision point, prevents implementation from changing its own rules and measures whether complexity actually decreases.

Alternative D — Central architecture team approval for every code change

Rejected for the current operating scale. It would add excessive queueing. Review is required only for difficult-to-reverse structural decisions; ordinary vertical implementation remains Task-owned.

Consequences

Positive:

  • customer/cohort names are less likely to become backend architecture;
  • architecture tests protect stable rules instead of implementation artifacts;
  • cleanup is measured by reduced structural complexity;
  • Cloud/macro review can remain read-only until an implementation decision is approved;
  • implementation Tasks become smaller and easier to verify.

Negative:

  • architecture changes require an extra decision pass;
  • some existing tenant-specific debt remains temporarily as a frozen exception;
  • urgent structural changes may take longer than a direct patch;
  • reviewers must maintain current system/module maps and debt exceptions.

Revisit triggers

Revisit when one of the following is proven:

  • the process blocks ordinary non-architectural changes;
  • accepted decisions routinely lack enough information for implementation;
  • stable fitness functions produce persistent false positives;
  • team scale requires explicit human ownership beyond role-separated passes;
  • configuration-only onboarding is accepted and changes the tenant/profile boundary.

---

Source: new-system/docs/decisions/0015-architecture-change-control.md — ctc repository · This page is an English translation of the source document. Identifiers, file paths and code symbols are unchanged.