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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user