Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ jobs:
python:
strategy:
fail-fast: false
# ponytail: sem leg arm ; build_lite.sh empacota so .py + shows + profiles, o tarball do
# arm sai byte a byte igual ao do x64 (e colidia no merge do release)
matrix:
os: [windows-latest, ubuntu-latest, ubuntu-24.04-arm]
os: [windows-latest, ubuntu-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -66,41 +68,64 @@ jobs:
- os: ubuntu-24.04-arm
bin: spellcore
name: spellcore-linux-aarch64
# Pi aarch64 estatico (PRD 6). O runner ja e' aarch64: musl e' so mais um target do
# rustup, sem cross nem zigbuild. Nenhuma dep do workspace tem codigo C (Helios e' stub
# sem rusb), entao o musl-libc que vem com o std basta.
- os: ubuntu-24.04-arm
bin: spellcore
name: spellcore-linux-aarch64-static
target: aarch64-unknown-linux-musl
runs-on: ${{ matrix.os }}
env:
CARGO_TERM_COLOR: always
T: ${{ matrix.target && format('--target {0}', matrix.target) || '' }}
REL: target/${{ matrix.target && format('{0}/', matrix.target) || '' }}release
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- name: target musl
if: matrix.target
run: rustup target add ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
with:
workspaces: spellcore
key: ${{ matrix.name }}

- name: clippy
working-directory: spellcore
run: cargo clippy --workspace --all-targets -- -D warnings
run: cargo clippy --workspace --all-targets ${{ env.T }} -- -D warnings

- name: testes (inclui conformidade byte a byte com os fixtures)
working-directory: spellcore
run: cargo test --workspace
run: cargo test --workspace ${{ env.T }}

- name: release
working-directory: spellcore
run: cargo build --release --workspace
run: cargo build --release --workspace ${{ env.T }}

- name: confirma que o binario e' estatico
if: matrix.target
shell: bash
working-directory: spellcore
run: |
B="${{ env.REL }}/${{ matrix.bin }}"
file "$B"
ls -l "$B"
if readelf -d "$B" | grep -q NEEDED; then echo "tem dependencia dinamica"; exit 1; fi

- name: bench como gate (jitter e throughput)
# ponytail: runner compartilhado tem ruido, aqui so reporta ; tirar continue-on-error em runner self-hosted
continue-on-error: true
working-directory: spellcore
run: |
./target/release/jitter --secs 5
./target/release/throughput
./${{ env.REL }}/jitter --secs 5
./${{ env.REL }}/throughput

- name: renomeia o binario
shell: bash
run: cp "spellcore/target/release/${{ matrix.bin }}" "${{ runner.temp }}/${{ matrix.name }}"
run: cp "spellcore/${{ env.REL }}/${{ matrix.bin }}" "${{ runner.temp }}/${{ matrix.name }}"

- uses: actions/upload-artifact@v4
with:
Expand Down
15 changes: 13 additions & 2 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,19 @@ O serviço `spellcaster` sobe `spell serve`; a GUI fica em `http://<hostname>.lo
para quem tiver navegador na rede. `install.sh <destino>` muda a pasta. Tarball `--no-gui` é o
mesmo pacote sem os assets da GUI.

Binário Rust para o Pi: `spellcore-linux-aarch64` do release (glibc; o build estático musl é
pendência do R8).
Binário Rust para o Pi, dois no release:

- `spellcore-linux-aarch64-static` — musl, sem `NEEDED` no ELF: roda em qualquer Raspberry Pi OS
aarch64 (ou Alpine, ou container `scratch`) sem depender da versão do glibc. Use este por padrão.
- `spellcore-linux-aarch64` — glibc, para o caso de precisar de algo do sistema em runtime.

```bash
chmod +x spellcore-linux-aarch64-static
./spellcore-linux-aarch64-static play shows/medgrupo.spell --osc-port 9000
```

Fora do binário estático: o Helios (USB) já é stub no `laser` em qualquer build — não é limitação
do musl.

## 3. A partir do código-fonte (desenvolvimento)

Expand Down
6 changes: 3 additions & 3 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ O plano acima (F0–F7) foi o do protótipo Python e está concluído até F6. O
| R5 GUI Tauri | show de 3 min do zero; Face em modo performance | pendente | voto das rodadas 5 e 6 do design |
| R6 previz Godot | 60 fps, 64 fixtures, 2 LED walls | pendente | Godot não instalado |
| R7 MCP com rmcp | sessão de IA monta e toca um show sem GUI | pendente | nenhum: registry pronto |
| R8 empacotamento | onedir, Linux, Pi estático; CI com bench como gate | parcial | Pi estático (musl) pendente; só CI |
| R8 empacotamento | onedir, Linux, Pi estático; CI com bench como gate | concluída | — |
| R9 editores de Face/Graph + painel Agent | operador monta uma Face em 10 min | pendente | depende de R5 |

## 8. Design — rodadas e branches (09/09/2026)
Expand Down Expand Up @@ -185,11 +185,11 @@ CI, sem tocar no que já está conforme):
|---|---|---|---|
| R3 pixel mapping | crate `pixelmap` com rayon (wgpu depois), bench Criterion | 100 000 px a 60 Hz < 2 ms | nada |
| R7 MCP | crate `mcp` com rmcp (stdio + HTTP), tools do registry, `spellcore mcp install` | sessão de IA escaneia, patcheia, cria timeline e dá play | nada |
| R8 Pi estático | job de CI `aarch64-unknown-linux-musl`, artefato `spellcore-linux-aarch64-static` | binário roda num Pi limpo sem glibc da versão | nada |
| ~~R8 Pi estático~~ | ~~job de CI `aarch64-unknown-linux-musl`, artefato `spellcore-linux-aarch64-static`~~ | feito: leg musl na matriz do `spellcore`, ELF sem `NEEDED` verificado no CI | — |
| R5 base | `canvaskit.js` (pan, zoom, seleção, hit-test por bisect, dirty-flag, DPR) + timeline canvas portada do Python | testes headless no Chrome; timeline abre `medgrupo.spell` | nada (design só define o cromo) |
| Design | merge das branches de design; rodada 7 | voto do dono | voto das rodadas 5 e 6 |

Bloqueadas até instalar SDK (decisão do dono, não de agente): R2 (GStreamer + NDI SDK),
R6 (Godot 4). R9 espera R5.

Já feito: F0–F6, R0, R1, R4, CI com release por tag, docs (README, INSTALL, LICENSE, ARCHITECTURE, PRD).
Já feito: F0–F6, R0, R1, R4, R8, CI com release por tag, docs (README, INSTALL, LICENSE, ARCHITECTURE, PRD).
Loading