Migrate all docs scattered across hidden folders into docs/: - .compozy/tasks/ → docs/planning/ (PRDs, tech specs, tasks, memory) and docs/adr/ (ADRs by phase) - .specs/ → docs/specs/ (codebase, features, project specs) - .docs/ → docs/legacy/ (legacy reference implementation docs) - .discussions/ → docs/discussions/ (design discussions and open questions) Delete .compozy/, .specs/, .docs/, and .discussions/. Update AGENTS.md: add explicit docs/ location table, hard rule against hidden doc folders, and new AI-assisted development section (context lazy loading, scope control, verification). Update CLAUDE.md: fix .docs/ references to docs/legacy/. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
84 lines
3.2 KiB
Markdown
84 lines
3.2 KiB
Markdown
# Ymir — Arquitetura Atual
|
|
|
|
## Modelo de Bounded Contexts
|
|
|
|
O projeto usa 6 bounded contexts com dependências enforçadas pelo CMake (link time):
|
|
|
|
```
|
|
ymir_common ←────────────────────────────────────────────────────
|
|
↑ │
|
|
ymir_physics ←──────────────────────────────── │
|
|
↑ ↑ ↑ │
|
|
ymir_simulation ymir_world ymir_vessel │
|
|
↑ ↑ ↑ │
|
|
ymir_persistence ←─────────────────────────────────────────────────
|
|
```
|
|
|
|
## Contextos e Responsabilidades
|
|
|
|
| Contexto | Target CMake | Tipo | Responsabilidade |
|
|
|----------|-------------|------|-----------------|
|
|
| `common` | `ymir_common` | INTERFACE | Math types, Vector6, Matrix6x6, constantes |
|
|
| `physics` | `ymir_physics` | STATIC | RigidBody6DOF, 9 módulos de força, integrador ODE |
|
|
| `simulation` | `ymir_simulation` | STATIC | Orquestração, NavalDomain, CouplingForceModel |
|
|
| `world` | `ymir_world` | STATIC | Wave engine, Environment, CouplingRegistry |
|
|
| `vessel` | `ymir_vessel` | STATIC | Thrusters, rudders, controllers, DynamicVessel |
|
|
| `persistence` | `ymir_persistence` | STATIC | JSON scenario reader, BodyDefinition |
|
|
|
|
## Módulos de Força (ymir_physics)
|
|
|
|
9 módulos independentes, todos implementam `ForceModel`:
|
|
- `ThrustForces`, `RudderForces`, `WindForces`, `CurrentForces`
|
|
- `WaveForces` (JONSWAP), `DampingForces`, `InertialForces`
|
|
- `RestoringForces`, `SquatForces`, `TugForces`
|
|
|
|
## Integrador ODE
|
|
|
|
- Implementação atual: **CVODE BDF** (SUNDIALS) — stiff solver
|
|
- Interface abstrata: `IIntegrator` em `CvodeIntegrator.h`
|
|
- Target pós-migração: **Dormand-Prince RK45** — mesma interface, zero dependências externas
|
|
|
|
## Regras Arquiteturais (AGENTS.md)
|
|
|
|
1. **Nenhum contexto viola o grafo de dependência** — enforçado no link time
|
|
2. **Physics tem zero conhecimento de I/O** — sem filesystem, sem network
|
|
3. **C API boundary é a única superfície pública** — sem STL/exceções cruzando DLL
|
|
4. **Zero heap allocation no integration loop** — buffers pré-alocados
|
|
5. **Sem raw owning pointers** — smart pointers ou stack allocation
|
|
|
|
## Apps (stubs)
|
|
|
|
- `apps/server/` — target CMake INTERFACE, sem implementação (Phase 3 original)
|
|
- `apps/fast-time/` — target CMake INTERFACE, sem implementação
|
|
|
|
## C API Planejada
|
|
|
|
`include/` está vazio — C API surface prevista mas não implementada. Será o ponto de entrada dos Embind para WASM.
|
|
|
|
## Fluxo de Dados (runtime)
|
|
|
|
```
|
|
JSON Scenario
|
|
│
|
|
▼
|
|
ScenarioReader (persistence)
|
|
│
|
|
▼
|
|
NavalDomain (simulation)
|
|
│ monta
|
|
▼
|
|
[DynamicVessel, ...] + NavalEnvironment (world)
|
|
│
|
|
▼
|
|
NavalSimulation.step()
|
|
│ chama
|
|
▼
|
|
RigidBody6DOF.integrate() → Integrador ODE
|
|
│ acumula
|
|
▼
|
|
ForceModels[0..n].compute() → Vector6 forces
|
|
│
|
|
▼
|
|
BodyState (posição, velocidade, aceleração)
|
|
```
|