Commit f2f60db
symphony: move the elixir runtime into packages/symphony (#782)
## Summary
Move the Symphony Elixir runtime into `packages/symphony`, absorbed from
[indexable-inc/symphony](https://github.com/indexable-inc/symphony) at
`c9e709208c3ae161e24f625b9f3808a288c859ed`. After symphony#268 moved the
room stack (room-server, the Tauri/Svelte UI) into the ix monorepo, the
dedicated repo was the Elixir runtime alone; this PR gives it its
long-term home in index so the standalone repo can retire. Follows up on
the reverted whole-repo subtree attempt (#767 → #779/#780): this time
only the Elixir part moves, per the plan agreed in Slack (room → ix,
elixir → index).
## What this adds
- `packages/symphony/`: the runtime (`elixir/`), the engine wire
fixtures (`contracts/fixtures`, kept beside `elixir/` because the
contract tests resolve `../../contracts`), the bundled example pack
(`workflows/example`), `bin/run-nix`, and docs. The 30 MB of `.github`
demo media, the standalone CI workflows, and the PR template did not
move; the `pr_body.check` mix task that validated that template is
deleted as vestigial.
- `packages.<sys>.symphony`: the launcher, parity with the standalone
flake's `packages.default` (Nushell wrapper exec'ing `bin/run-nix` with
Elixir 1.19/OTP 28, gh, git, openssh, cacert on PATH). Production
deploys keep working the same way: stage source, `mix deps.get`, `mix
run --no-halt`.
- `nixosModules.symphony` via `modules/services/symphony/`: the service
module, unchanged, auto-discovered under the same attr name ix imports
from the symphony flake today.
- `checks.x86_64-linux.symphony-elixir`: the standalone repo's required
lane (`mix compile --warnings-as-errors`, `mix format
--check-formatted`, `mix credo`, `mix test`; 384 tests) as a sandboxed
derivation. Deps come from a `fetchMixDeps` fixed-output derivation;
rebar is pinned; the lazy_html C++ NIF (test-only, LiveView HTML
assertions) is satisfied by seeding elixir_make's artifact cache with
the upstream release tarball, which elixir_make still verifies against
the `checksum.exs` pinned in the dep. The advisory lane (dialyzer,
sobelow, deps.audit, coveralls) stays a local `make quality` run; see
`packages/symphony/docs/quality.md`.
- `devShells.<sys>.symphony`: parity with the standalone devshell
(elixir, erlang, codex, gh, git, openssh).
- Eval assertions (`tests/default.nix`, `symphony` group) pinning the
module's unit env contract (`SYMPHONY_WORKFLOW_PACK` default,
primary-repo export, ExecStart shape, EnvironmentFile pass-through,
hostRuntime gating) that ix's hil deployment and worker module read.
## The room-server seam (deliberately untouched)
The `symphony` flake input stays exactly as #780 restored it: pinned to
the last rev that still builds `room-server`, feeding
`pkgs.symphony-room-server` into `images/dev/symphony-codex` and its
eval tests. room-server's source now lives in the private ix monorepo,
so the public image cannot build it once the symphony repo goes away.
Resolving that seam (move the image to ix, or have ix layer room-server
onto a public base image) is the remaining blocker for retiring the
repo; the input comment in `flake.nix` now says so. Do not `nix flake
update symphony` until then: symphony@main no longer exports
`room-server`, so a bump breaks the image eval.
## ix follow-up (after this merges)
- `inputs.symphony.packages.<sys>.default` →
`inputs.index.packages.<sys>.symphony` in
`nix/modules/services/host/symphony/module.nix` and
`symphony-runtime/module.nix`
- `inputs.symphony.nixosModules.symphony` →
`inputs.index.nixosModules.symphony`
- `inputs.symphony.packages.<sys>.codex` → `pkgs.codex` (the symphony
flake's `codex` output was a plain re-export for pin visibility)
- drop ix's `symphony` input and the `inputs.symphony.follows` line on
its `index` input
- then resolve the image seam, drop index's `symphony` input, and
archive indexable-inc/symphony
## Validation
- `nix build .#checks.x86_64-linux.symphony-elixir` (384 tests, 0
failures, sandboxed)
- `nix build .#ciChecks.x86_64-linux.eval` (aggregate includes the new
`ix-test-symphony` and the untouched `ix-test-symphony-codex`)
- `nix build .#packages.x86_64-linux.symphony` and
`.#devShells.x86_64-linux.symphony`
- `nix eval .#nixosModules --apply builtins.attrNames` lists `symphony`
- `nix run .#lint` (nixfmt, statix, deadnix, ast-grep, ast-grep-test all
green)
- `git diff --check` clean
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- Macroscope's pull request summary starts here -->
<!-- Macroscope will only edit the content between these invisible
markers, and the markers themselves will not be visible in the GitHub
rendered markdown. -->
<!-- If you delete either of the start / end markers from your PR's
description, Macroscope will append its summary at the bottom of the
description. -->
> [!NOTE]
> ### Move the Symphony Elixir runtime into packages/symphony
> - Relocates the Symphony Elixir runtime into
[packages/symphony/elixir](https://github.com/indexable-inc/index/pull/782/files#diff-c3bd38f0e22ac85e5dd9316c2d736a934c9f00aa9e8b68e2e956b30fbf2ddaeb),
establishing it as a self-contained Mix project (`symphony_elixir`
v0.2.0) with its own toolchain, Nix derivation, and CI quality gate.
> - Adds a full OTP application with role-based supervision:
control-plane nodes boot the web endpoint, workflow/skill catalogs,
cron/Slack triggers, GitHub App token management, and the IR runtime;
worker nodes boot a minimal Slipstream client.
> - Introduces the IR execution layer: `RunGraph`, `Node`, `Attempt`,
`Store` (JSON-backed persistence), `Materializer`, `Graph` (ready-node
scheduling and failure propagation), `Recovery`, and a
`DynamicSupervisor` that resumes pending runs after restart.
> - Adds a DSL pipeline — `Lexer`, `Parser`, `Interpreter`, and `Schema`
— that compiles `.sym` workflow files into IR nodes, with
`WorkflowCatalog` hot-reloading them from disk.
> - Exposes a Phoenix web layer with LiveView dashboards for runs,
workflows, skills, and statistics, plus a JSON API at `/api/v1` with run
controls and webhook receivers for GitHub, Linear, and Slack.
> - Adds a NixOS module at
[modules/services/symphony/default.nix](https://github.com/indexable-inc/index/pull/782/files#diff-de2dbd88d424fd159a6aa9ddcfef4d9505fb4d90f66eed66936038c967e6e7bf)
and a `bin/run-nix` entrypoint for production deployment, with a new
`symphony` developer shell in
[lib/per-system.nix](https://github.com/indexable-inc/index/pull/782/files#diff-9879a1f03396eb758ff538e44a00fb409b99bc0bbfac4656755b05716d036683).
>
> <!-- Macroscope's review summary starts here -->
>
> <sup><a href="https://app.macroscope.com">Macroscope</a> summarized
8b5445b.</sup>
> <!-- Macroscope's review summary ends here -->
>
<!-- Macroscope's pull request summary ends here -->
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent 104bf2e commit f2f60db
157 files changed
Lines changed: 24454 additions & 0 deletions
File tree
- lib
- modules/services/symphony
- packages/symphony
- assets
- bin
- contracts/fixtures
- docs
- elixir
- config
- docs
- lib
- symphony_elixir_web
- channels
- components
- controllers
- live
- symphony_elixir
- claude
- codex
- dsl
- parser
- engine
- ir
- linear
- runtime
- slack
- triggers
- workspace
- priv/static
- test
- claude
- codex
- symphony_elixir_web
- components
- symphony_elixir
- dsl
- fixtures
- engine
- ir
- runtime
- workflows/example
- skills
- workflows
- tests
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
60 | 65 | | |
61 | 66 | | |
62 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
633 | 633 | | |
634 | 634 | | |
635 | 635 | | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
636 | 641 | | |
637 | 642 | | |
638 | 643 | | |
| |||
809 | 814 | | |
810 | 815 | | |
811 | 816 | | |
| 817 | + | |
| 818 | + | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + | |
| 829 | + | |
| 830 | + | |
812 | 831 | | |
813 | 832 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
0 commit comments