# OpenWC Documentation Standard

## Цель

Документация является частью реализации. Код без актуального объяснения публичного API, данных, ownership и поведения считается незавершённым, даже если компилируется и проходит тесты.

Документация должна позволить человеку ответить:

- зачем существует модуль;
- какие данные он получает и откуда;
- что он создаёт или изменяет;
- кто владеет состоянием и ресурсами;
- какие зависимости допустимы;
- что происходит по шагам;
- как модуль завершается, отменяется и восстанавливается после ошибки;
- как проверить fidelity, correctness и performance;
- какие части реализованы, запланированы или известны как gap.

Правила именования, KISS и локализации неизбежной сложности определены в [`CODING_STANDARD.md`](CODING_STANDARD.md). Документация и ясные имена дополняют друг друга: комментарий не должен компенсировать неудачное имя.

## Уровни документации

### 1. Inline API documentation

Находится рядом с кодом и является источником истины для точной сигнатуры:

- публичные classes/interfaces;
- public methods/functions;
- signals/events;
- exported properties/configuration;
- commands, events и read models;
- ownership/lifetime/threading requirements;
- error/return semantics;
- non-obvious invariants.

### 2. Module specification

Находится в `docs/modules/<module>.md` и объясняет назначение, архитектуру, data flow, state/lifecycle, extension points и verification. Шаблон: [`modules/TEMPLATE.md`](modules/TEMPLATE.md).

### 3. Data/schema documentation

Описывает persisted/wire/content formats: fields, types, units, optionality, version, migration, provenance и compatibility. Нельзя объяснять schema только примером JSON или SQL.

### 4. ADR

Фиксирует значимое решение, варианты и последствия. ADR не заменяет актуальное описание модуля: после решения module spec обновляется до текущего состояния.

### 5. Operational documentation

Команды build/test/import/bake/deploy/recovery, expected outputs и diagnostics. Команда без условий запуска и интерпретации результата недостаточна.

## Обязательная module specification

Новый самостоятельный модуль или существенно выделенная подсистема обязаны иметь документ со следующими разделами:

1. Metadata/status.
2. Purpose и non-goals.
3. Context и architecture boundaries.
4. Public API.
5. Inputs и outputs.
6. Data flow diagram.
7. State/lifecycle или sequence diagram, если применимо.
8. Ownership, threading и resource lifetime.
9. Errors, cancellation и recovery.
10. Configuration/capabilities/profiles.
11. Persistence/cache/migrations.
12. Diagnostics и observability.
13. Tests, fidelity evidence и performance budgets.
14. Extension points.
15. Known gaps.
16. Source map.

`Status` принимает только:

- `Planned`;
- `Prototype`;
- `Partial`;
- `Implemented`;
- `Verified`;
- `Deprecated`.

`Implemented` не означает fidelity; `Verified` требует evidence и ссылок на тесты.

## Обязательные схемы

### Data flow diagram

Обязательна для каждого module spec. Показывает реальные имена contracts и направление данных:

```mermaid
flowchart LR
    Source[ADT bytes] --> Parser[ADTLoader]
    Parser --> Data[AdtTileData]
    Data --> Planner[StreamingTargetPlanner]
    Planner --> Queue[RenderFinalizeCommand]
    Queue --> Renderer[TerrainRenderer]
```

Диаграмма должна показывать:

- внешние источники;
- входные contracts;
- преобразования;
- выходные contracts/side effects;
- persistence/cache, если участвует;
- запрещённое направление, если оно является важной границей.

### Sequence diagram

Обязательна, если операция пересекает два и более из следующих boundary:

- thread/job queue;
- network;
- gameplay;
- renderer/UI/audio;
- Editor;
- server/database;
- filesystem/build pipeline.

```mermaid
sequenceDiagram
    participant Net as WorldSession
    participant Game as WorldState
    participant View as EntityPresenter
    participant Render as WorldRenderFacade
    Net->>Game: EntityCreated
    Game-->>View: EntityReadModel change
    View->>Render: spawn_entity(descriptor)
```

### State diagram

Обязательна для lifecycle/state machine с тремя и более состояниями, reconnect/retry или rollback:

```mermaid
stateDiagram-v2
    [*] --> Disconnected
    Disconnected --> Connecting
    Connecting --> Authenticated
    Connecting --> Failed
    Authenticated --> Disconnected
    Failed --> Connecting: retry
```

### Dependency diagram

Обязательна при изменении архитектурной границы или модуле с тремя и более downstream consumers. Она показывает compile/runtime dependencies, а не случайное расположение Node в сцене.

## Public API documentation

Для каждого public symbol указываются:

- краткое назначение;
- параметры с единицами и coordinate space;
- return value или emitted event;
- preconditions/postconditions;
- ownership и mutability;
- допустимый thread;
- failure behavior;
- profile/capability restrictions;
- пример только если контракт остаётся неочевидным.

### GDScript

- Использовать `##` documentation comments для class, public methods, signals и exported properties.
- Всегда указывать типы аргументов/return, где Godot API позволяет.
- `@export` property объясняет units/range/profile и runtime mutability.
- Signal документирует момент emission, arguments и ordering guarantees.
- Internal helper получает комментарий, если содержит сложный invariant, coordinate conversion, ownership или performance assumption.

### C++/GDExtension

- Public headers используют Doxygen-compatible `///`/`/** */`.
- Документировать ownership указателей/references/buffers, thread safety и error transport.
- Binary structs указывают source format/build, packing/endianness и validation.
- Native/Godot boundary описывает allocation и lifetime Variant/PackedArray/Resource.
- Implementation comments объясняют `why` и invariant, а не пересказывают строку кода.

### Shaders/materials

- Uniform/global parameter: coordinate/color space, range, units и producer.
- Material profile: supported WoW shader/blend modes и approximations.
- Expensive branch/texture dependency имеет cost/fallback note.
- Blizzlike и Enhanced behavior документируются отдельно.

### Network codecs

- Opcode/direction/session phase.
- Exact build/profile.
- Field order/type/endianness/conditional presence.
- Domain events на выходе.
- Malformed/unknown handling.
- Fixture/reference source без sensitive payload.

### Content/server schemas

- Canonical field и mapping на каждый core adapter.
- Unit, default, null/optional semantics и flags.
- Numeric ID allocation и references.
- Migration/rollback и unsupported degradation.

## Документация потока данных

Inputs/outputs оформляются таблицей:

| Direction | Contract/data | Producer | Consumer | Ownership | Thread/lifetime |
|---|---|---|---|---|---|
| Input | `EntityMoved` | `WorldSession` | `WorldState` | Immutable event | Game-thread apply |
| Output | `EntityReadModel` | `WorldState` | Presenter/UI | Snapshot | Until next revision |

Side effects перечисляются отдельно:

- scene tree mutation;
- RenderingServer RID creation/free;
- filesystem/cache write;
- network send;
- DB query/apply;
- settings/SavedVariables mutation.

Скрытый side effect является дефектом документации и API.

## Статус реализации

Документ не должен выдавать roadmap за существующий код. Каждый важный capability помечается:

| Capability | Status | Evidence | Gap/next step |
|---|---|---|---|

После изменения кода статус и `Last verified` обновляются в том же work package. Если документацию нельзя подтвердить, ставится `Unknown`/`Planned`, а не предположение.

## Documentation change rules

Документация обновляется в том же work package, если изменились:

- public API/signal/event;
- data flow или ownership;
- state/lifecycle;
- thread boundary;
- format/schema/cache version;
- configuration/capability;
- diagnostics/error/recovery;
- fidelity или performance behavior;
- extension point.

Переименование symbol/path требует обновить source map, diagrams и ссылки. Stale documentation считается regression.

## Code comments

Хороший комментарий объясняет:

- почему решение отличается от очевидного;
- форматное или protocol ограничение;
- ownership/thread invariant;
- причину batching/budget;
- источник fidelity behavior;
- временный compatibility path и условие удаления.

Плохой комментарий:

- пересказывает код;
- обещает будущую работу без target/work package ID;
- содержит устаревшую сигнатуру;
- маскирует magic number без source/unit;
- утверждает `Blizzlike` без evidence.

TODO/FIXME должен содержать target/work package или diagnostic code.

## Review gate

Reviewer/integrator проверяет:

- public symbols имеют inline docs;
- module spec существует или обновлён;
- input/output и side effects перечислены;
- diagrams соответствуют реальным contracts;
- state/error/recovery paths показаны;
- tests/evidence и known gaps честны;
- документы не дублируют противоречивые источники истины.

Если хотя бы один обязательный пункт отсутствует, handoff остаётся `PARTIAL`, а target не может получить `DONE`.
