ADR 0040 and the constitution sync — absorb, then publish

The sync came due for three accepted rules. Reading the target before
overwriting it found the source and the enforced copy had diverged unrecorded,
and that a literal republish would have DELETED rules the mesh enforces: the
live page's §4 carried SOLID, layering, TypeScript strictness and DRY/YAGNI,
which appear in no decision record anywhere and have been checked against for
six weeks.

Removal was not the safe alternative either. The orchestrator reads "when
absent, no constitution is injected (backward-compatible)" — so deleting the
page would not fail, it would silently inject nothing, and every design meeting
would run unchecked. Three unenforced rules would have become all of them.

So: absorb first. The code-quality rules land as §8 rather than §4, because
appending renumbers nothing and every existing citation stays valid. They are
marked as inherited — every other rule states the incident behind it, these
state nothing because nothing was written down, and importing them silently
would have claimed a provenance the document does not have.

The review bar is resolved to a person who is not the proposer. The live page
required two node operators; there is one, so the rule was never met and could
not be — a rule that cannot be satisfied is not a high standard, it is one
everything silently violates.

Then published, and the read-back earned its place in the playbook: the FIRST
publish reported success and changed nothing. New revision, new title, body
unapplied — a malformed argument dropped silently. §5 demonstrating itself
during its own publication.
This commit is contained in:
2026-08-26 00:05:50 +02:00
parent 34e7a4780a
commit 6e4fc5d69b
2 changed files with 153 additions and 0 deletions
+49
View File
@@ -220,6 +220,12 @@ This document is governed. It does not change by commit message or unilateral de
No drive-by edits. Every change traces to a recorded decision.
**Review means a person who is not the proposer.** The enforced page carried a stricter bar —
a design meeting with at least two node operators — which has never been met and cannot be, as
there is one operator. A rule that cannot be satisfied is not a high standard; it is a rule
everything silently violates. Recorded here as resolved in favour of what is achievable, and
what has in fact been practised ([ADR 0040](../02-DECISIONS/0040-the-constitution-absorbs-what-is-enforced.md)).
---
## 7. Overrides
@@ -229,3 +235,46 @@ They may never relax them.
An override says which rule it tightens, or which gap it fills, and follows the same amendment
process. Absence of an override means these rules apply unmodified.
---
## 8. Code quality
*Absorbed 2026-08-26 from the enforced page, which carried these rules while this document did
not — [ADR 0040](../02-DECISIONS/0040-the-constitution-absorbs-what-is-enforced.md).*
**These rules are recorded because they are enforced, not because this repository earned them.**
Every other rule here states the incident or measurement behind it. These state nothing,
because nothing is written down. That is a gap, not a style choice, and it is marked rather
than dressed up: a rule whose reasoning nobody recorded is one nobody can argue with correctly,
which is the condition §2 exists to avoid.
### Structure
- **One reason to change** per module, class or function.
- **Extend by composition**, not by editing what already works.
- **Depend on abstractions**, and inject the concrete thing rather than reaching for it.
- **Small, focused interfaces** over one large one.
- A substitute for a type must not break the behaviour its users rely on.
### Layering
Data access, business logic and the interface layer are separate.
- No queries in route handlers, tool definitions or daemon loops — those belong in repositories.
- No orchestration or validation in repositories — that belongs in services.
- Shared logic belongs in the SDK. Duplicating it into a surface is how two answers to one
question start to exist.
### Types
- TypeScript throughout; no new untyped JavaScript.
- Strict, with no implicit `any` and no unchecked index access.
- Public functions state their return type. Prefer `unknown` with a guard over `any`. Errors
are typed, never thrown as strings.
### Restraint
- **Do not over-abstract.** Three similar lines beat a premature abstraction.
- **Build what is needed now.** A hypothetical future is not a requirement.
- Names reveal intent, functions fit on a screen, and boundaries fail fast.