Guarding Architecture

作者 riekelte67b7af9ac74无许可证5 个星标收录于 2026年10月8日更新于 2026年10月8日仓库3周前更新

Use when a change crosses module boundaries, adds a dependency direction between modules, touches a critical path, or conflicts with a stated principle - and when writing or updating architecture principles themselves. Encodes structural invariants as named, enforced contracts: statement, rationale, guard. Use whenever "we'll just import it from there for now" appears, which is how boundaries die.

AI 生成的概览

将结构性不变量编码为具名且受强制执行的契约,包含陈述、理由与机械式守卫。

功能
定义一套模式,把架构不变量转化为具名、可引用的契约,每项包含陈述、具体的失败理由与影响。它把稳定的原则文档与随代码变动的实现文档分开,要求可强制的不变量由会使构建失败的架构测试支撑,并把违规视为需要重新设计而非辩解。它还说明如何以修正案或有期限的豁免来提出例外,以及如何处理守卫排除项。
适用场景
适用于变更跨越模块边界、在模块之间新增依赖方向、触及关键路径,或与既定原则冲突时。也适用于撰写或更新架构原则本身,或当有人打算先临时加一个导入时。它面向希望由构建而非仅靠评审来守住边界的团队。
运行要求
无需脚本或工具,仅为说明性内容。它要求以 principal-engineering 技能作为必备背景,并提及 keeping-one-source-of-truth、handling-failures、recording-decisions 等相关技能。

Guarding architecture

REQUIRED BACKGROUND: the principal-engineering skill.

Overview

Structural invariants are load-bearing contracts: violating one surfaces as a class of bugs, not a single defect. An invariant that matters gets a name, a written rationale, and a mechanical guard; an invariant without a guard is a wish.

The pattern

  1. Name the invariants. Numbered and citable ("Law 3"), each with a Statement (technology-neutral, meant to outlast any framework), a Rationale, and Implications. The Rationale is a concrete failure narrative: the class of bugs that appears when the invariant is violated, told from an incident, not an abstraction.
  2. Split the stable from the volatile. The principles document changes rarely and names no classes; its current realization (the canonical owners, the guards, the reference designs) lives in a companion that changes with the code. When the two disagree, the invariant governs and the realization document gets corrected.
  3. Enforce mechanically. Every enforceable invariant gets an architecture test that fails the build: dependency directions, package boundaries, layering rules, forbidden imports. What cannot be build-enforced becomes a named review check with the invariant cited.
  4. Violations mean redesign, never justification. A design that violates a named invariant is wrong by construction: redesign it, do not argue the exception into the spec. Watering the contract down to match nonconforming code is the banned move; the violation gets recorded and the code gets fixed (the same rule the technical-writer plugin applies to normative documents).
  5. Specs show conformance. A design that touches guarded ground names the invariants it touches and shows, per invariant, how it upholds each; the reviewer checks claims against named invariants instead of debating taste.
  6. Exceptions are amendments. A genuine exception proposes an amendment, naming the invariant it bends and the boundary of the bend; silent exceptions are how an invariant becomes a suggestion. This is the only legal form of exception, and point 4 bans every other; an unreachable owner does not create one, so the change waits or lands conforming. A genuinely temporary exception is a dated waiver with an expiry condition and the owner's sign-off, recorded in the volatile realization document, not by amending the stable invariant for a passing condition.
  7. An unexplained guard exclusion is a violation hidden from the build. Whoever finds one surfaces it to the invariant's owner. An exclusion is never precedent for the next one; extending an exclusion list "like the others did" ratifies erosion instead of following a pattern.

Common invariant classes

Worth guarding in most systems, as examples rather than mandates:

  • One canonical owner per concern (see keeping-one-source-of-truth).
  • Dependency direction: the domain never imports the delivery mechanism.
  • Critical-path isolation: no I/O and no slow or optional dependency on the hot path.
  • Fail-closed boundaries: a gate that cannot evaluate must deny (see handling-failures).
  • Migration immutability (see the hard rules in principal-engineering).

Common mistakes

  • A principles document full of class names: the realization document wearing the wrong title; split them.
  • Adding the import "for now". Boundaries die by single convenient imports; the guard exists because each violation is locally reasonable.
  • An invariant asserted in review but absent from the build: enforced exactly as often as the right reviewer is present.
  • Justifying a violation by the cost of conforming. The cost argument may be right, but its correct form is an amendment to the invariant, decided by the owner, recorded (via recording-decisions where installed), never a quiet exception in one spec.
  • Principles written as taste ("prefer small modules") instead of contracts ("module X never imports module Y"). A contract can fail a build; taste can only fail a mood.

来源与署名

来源:riekelt/principal-engineer位于plugins/principal-engineer/skills/guarding-architecture提交e67b7af

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架