Design Principles
Plumego is not defined by its feature set.
It is defined by what it refuses to become.
This document lists the non-negotiable design principles
that constrain Plumego’s evolution and guide every future decision.
If a change violates these principles,
it does not belong in Plumego — regardless of demand or popularity.
Principle 1: Explicitness Over Convenience
If behavior is not visible in code, it is not acceptable.
Plumego rejects:
- Implicit configuration
- Magic defaults
- Convention-based behavior
- Runtime inference
- Hidden lifecycle hooks
Every meaningful behavior must be:
- Constructed explicitly
- Wired explicitly
- Invoked explicitly
Convenience that hides behavior is considered technical debt.
Principle 2: Control Flow Must Be Obvious
Plumego treats control flow as sacred.
This means:
- Middleware execution order is explicit
- Handler termination is explicit
- Errors do not “bubble magically”
- Nothing retries or recovers unless you wire it
If you cannot explain exactly what happens next,
the design is wrong.
Principle 3: No Global State, No Ambient Context
Plumego avoids:
- Global registries
- Hidden singletons
- Ambient configuration
- Implicit dependency injection
All dependencies must be passed explicitly.
This enables:
- Testability
- Replaceability
- Reasoning under pressure
- Safe refactoring
Global convenience is short-term gain, long-term cost.
Principle 4: Small Core, Strong Boundaries
Plumego’s core is intentionally minimal.
The framework:
- Defines boundaries
- Enforces contracts
- Refuses to grow horizontally
New capabilities should live:
- In user code
- In optional middleware
- In external packages
If something can be done outside the core, it should be.
Principle 5: Application Owns the Lifecycle
Plumego never assumes ownership of:
- Process startup
- HTTP server lifecycle
- Shutdown orchestration
- Background workers
- Scheduling
The application decides when things start and stop.
This makes Plumego embeddable, composable, and long-lived.
Principle 6: Framework Neutrality
Plumego is deliberately opinionated about structure,
but neutral about infrastructure.
It does not mandate:
- Logging libraries
- Auth providers
- Databases
- Message queues
- Serialization formats
- Deployment models
Plumego integrates with ecosystems —
it does not replace them.
Principle 7: Boring Is a Feature
Plumego values:
- Predictability over novelty
- Stability over speed of change
- Familiarity over cleverness
If something feels “exciting” because it is clever,
it probably does not belong in the core.
Boring code survives longer.
Principle 8: Replaceability Is a First-Class Goal
Every major abstraction must be replaceable:
- Routers
- Middleware
- Persistence
- External integrations
Replaceability is achieved by:
- Explicit interfaces
- Clear boundaries
- No hidden coupling
If something cannot be replaced safely,
it will eventually force a rewrite.
Principle 9: Errors Are Part of the Contract
Errors are not incidental.
Plumego enforces that:
- Errors are explicit
- Error handling is visible
- Error translation happens at boundaries
- Nothing is silently swallowed
This applies equally to:
- HTTP errors
- Domain errors
- Infrastructure failures
Silence is never acceptable.
Principle 10: Documentation Is a Contract
Documentation is not optional.
If behavior exists:
- It must be documented
- It must be intentional
- It must be defensible
Undocumented behavior is considered unstable by default.
The Reference section defines reality.
Principle 11: Evolution Must Be Slow and Deliberate
Plumego optimizes for longevity.
This means:
- Breaking changes are rare
- Major versions are infrequent
- Compatibility is valued
- Migration paths are explicit
Framework churn is treated as a design failure.
Principle 12: The User Is a Responsible Engineer
Plumego assumes its users:
- Understand Go
- Understand HTTP
- Understand concurrency
- Understand trade-offs
The framework does not protect users from complexity
by hiding it.
Instead, it exposes complexity honestly.
Principle 13: No Features Without a Clear Removal Story
Every new capability must answer:
“How do we remove this if it turns out to be wrong?”
If removal would break the ecosystem,
the feature should not be added.
Principle 14: Pressure Is the Real Test
Design decisions must hold under:
- Scale
- Failures
- Team growth
- Operational stress
- Time
If a design only works in small demos,
it does not belong in Plumego.
How These Principles Are Applied
Every proposed change is evaluated against this checklist:
- Does it introduce hidden behavior?
- Does it weaken boundaries?
- Does it grow the core unnecessarily?
- Does it reduce replaceability?
- Does it complicate reasoning?
If yes, the change is rejected.
Summary
Plumego is constrained by design.
These principles exist to ensure that:
- The framework remains understandable
- Systems remain evolvable
- Users retain control
- Time does not turn features into liabilities
The roadmap is shaped not by ambition,
but by restraint.
Related Roadmap Pages
- Roadmap Overview — long-term direction
- Migration Policy — how change is handled
- Changelog — what actually changed
If Plumego ever violates these principles,
it has lost its reason to exist.