Este ecossistema é construído sobre primitivos universais que seguem um padrão consistente:
┌─────────────────────────────────────────────────────┐
│ Serve Sozinho (Standalone Value) │
│ ↓ │
│ Converge Emergentemente (Ecosystem Synergy) │
└─────────────────────────────────────────────────────┘
Cada primitivo é uma biblioteca standalone com valor independente:
- API clara e bem documentada
- Zero dependências no ecossistema
- Casos de uso externos são válidos e encorajados
Quando primitivos se encontram no contexto de aplicações maiores, surgem sinergias naturais sem acoplamento forçado:
- lifecycle quer observabilidade → adota introspection
- trellis quer persistência → adota loam
- lifecycle quer process hygiene → adota procio
Nenhum primitivo "conhece" os outros. A convergência acontece nas camadas de aplicação.
- Standalone: Generic Mermaid diagram builders para qualquer Go project
- Convergência: lifecycle, trellis, arbour querem visualizar topologias → adotam introspection naturalmente
- Exemplo:
lifecycle.SystemDiagram()usaintrospection.ComponentDiagram()sem forçar coupling
- Standalone: Embedded reactive & transactional engine com Git audit trail
- Convergência: trellis/arbour/Life-DSL querem "Everything as Code" → loam como data layer natural
- Exemplo: Trellis usa Loam para persistir estados de agentes (ADR 014), mas Loam continua útil fora do ecossistema
- Standalone: Process hygiene (PDeathSig, Job Objects) + interactive I/O (CONIN$ on Windows)
- Convergência: lifecycle consuming tasks querem subprocess cleanup → procio como foundation
- Exemplo: lifecycle workers executando processos filhos usam procio, mas CLIs simples podem usar procio diretamente
- Diferença: lifecycle é o integration point, não um primitivo
- Consome primitivos (procio, introspection) e orquestra o control plane
- Outros apps (trellis, arbour) usam lifecycle como foundation, não como library
- Reuso Real: Primitivos úteis fora do ecossistema = validação de design
- Baixo Acoplamento: Mudanças em um primitivo não quebram outros
- Composição Natural: Apps escolhem quais primitivos adotar
- Testabilidade: Cada primitivo testável em isolamento
- Coordenação Manual: Converging patterns não são automatizados (deliberado)
- Documentação Distribuída: Cada primitivo documenta seu próprio uso
- Descoberta: Devs precisam conhecer os primitivos disponíveis
✅ Use quando:
- Você quer criar algo reutilizável além do projeto atual
- O conceito tem valor standalone claro
- Acoplamento forçado traria mais custo que benefício
❌ Evite quando:
- O código é específico demais para um único app
- A abstração seria "premature optimization"
- A API standalone não faria sentido para outsiders
// introspection: generic diagram builder (standalone)
func ComponentDiagram(primary, secondary any, cfg *DiagramConfig) string
// lifecycle: domain adapter (convergence)
func SystemDiagram(sig SignalState, work WorkerState) string {
return introspection.ComponentDiagram(sig, work, LifecycleDiagramConfig())
}Resultado: introspection permanece generic, lifecycle ganha observability, sem coupling direto.
// loam: transactional file storage (standalone)
type Engine interface { Read, Write, Watch, Transact }
// trellis: agent persistence (convergence)
type AgentStore struct { loam *Engine }
func (s *AgentStore) SaveState(agent Agent) { s.loam.Transact(...) }Resultado: loam continua útil para CLIs, CMSs, config tools. Trellis ganha audit trail grátis.
❌ Evite:
// introspection depende de lifecycle
import "github.com/aretw0/lifecycle"
func Diagram() string { /* assume lifecycle running */ }✅ Prefira:
// introspection recebe apenas interfaces genéricas
func Diagram(primary any, cfg DiagramConfig) string