docs/mix_tasks.md
<!--
SPDX-FileCopyrightText: 2026 diffo-dev contributors
SPDX-License-Identifier: Apache-2.0
-->
# Mix Tasks
The ieee1164 knowledge compiler pipeline is driven by two Mix tasks.
Run them in order whenever the yarn changes.
```sh
mix ieee1164.gen_uuids
mix ieee1164.compile
```
Both tasks require the application to be started (`app.start` is called internally).
---
## `mix ieee1164.gen_uuids`
Walks the ieee1164 yarn, collects every `name` property, and assigns each a
stable UUIDv7. Existing entries are preserved — only names not yet in the file
receive a new UUID.
**Output:** `priv/diffo/ieee1164/uuids.exs`
```sh
mix ieee1164.gen_uuids
# priv/diffo/ieee1164/uuids.exs: 42 total (3 new)
```
Run this task once after adding new nodes to the yarn, then commit
`priv/diffo/ieee1164/uuids.exs`. The file is the stable identity of every node
across the diffo universe — the same name always carries the same UUID.
When a registry or Artefactory service is available, this step becomes a push
to that service rather than a file write.
---
## `mix ieee1164.compile`
Parses each section of the ieee1164 yarn into an `%Artefact{}` and serialises
it to `priv/diffo/ieee1164/<section>.bin` using `:erlang.term_to_binary/1`.
Also writes the fully integrated `ieee1164.bin`.
**Requires:** `priv/diffo/ieee1164/uuids.exs` (run `gen_uuids` first)
**Output:** `priv/diffo/ieee1164/*.bin`
```sh
mix ieee1164.compile
# wrote priv/diffo/ieee1164/standard.bin
# wrote priv/diffo/ieee1164/signals.bin
# wrote priv/diffo/ieee1164/values.bin
# wrote priv/diffo/ieee1164/resolutions.bin
# wrote priv/diffo/ieee1164/operations.bin
# wrote priv/diffo/ieee1164/projections.bin
# wrote priv/diffo/ieee1164/transitions.bin
# wrote priv/diffo/ieee1164/synchronicity.bin
# wrote priv/diffo/ieee1164/ieee1164.bin
# priv/diffo/ieee1164: 9 artefacts compiled
```
Commit the `.bin` files so livebooks and other consumers can load artefacts
directly without re-parsing.
---
## Loading artefacts at runtime
Section artefacts and the integrated artefact can be loaded from the compiled
binaries without re-parsing the yarn:
```elixir
# A single section
Diffo.Ieee1164.load(:values)
# The fully integrated ieee1164 artefact
Diffo.Ieee1164.load_ieee1164()
```
Both raise with a clear message if `mix ieee1164.compile` has not been run.
---
## Testing
The standard test suite runs without any prior build steps:
```sh
mix test
```
The compile task test is tagged `:integration` and excluded by default — it
requires the `.bin` files to exist. Run the full suite with:
```sh
mix ieee1164.gen_uuids
mix ieee1164.compile
mix test --include integration
```
---
## `priv/diffo/ieee1164/` layout
```
priv/diffo/ieee1164/
├── uuids.exs ← stable UUIDv7s keyed by node name (gen_uuids)
├── standard.bin ─╮
├── signals.bin │
├── values.bin │
├── resolutions.bin ├─ compiled section artefacts (compile)
├── operations.bin │
├── projections.bin │
├── transitions.bin │
├── synchronicity.bin ─╯
└── ieee1164.bin ← fully integrated artefact (compile)
```