Skip to content

Commit 9aa85e2

Browse files
hyperpolymathclaude
andcommitted
fix: remove residual dead V-lang wiring (Justfile/CI/scripts/docs)
PR #66 removed only the V-lang CI jobs. This finishes the dead-leaf cleanup: no V source exists (adapter/v/ was deleted in the prior 2026-04-12 sweep) and the real REST/gRPC/GraphQL surface is the Elixir backend (elixir/, Plug/Cowboy) — no V port was ever needed. Justfile: - delete build-adapter recipe - run/serve/install now use only the existing Elixir path (dead V else branches dropped; install no longer copies a V binary) - heal: removed the git-clone vlang/v + make + symlink block - doctor: dropped check_optional "V (vlang)" and the adapter/v binary artefact check (now checks elixir/) - matrix/tour/help-me: cosmetic V status echoes repointed to Elixir CI: - .github/workflows/lsp-dap-bsp.yml: delete the V-lang adapter-check job (ran `v check`; missed by PR #66) and drop it from completeness needs: - .github/workflows/e2e.yml: delete the dead "Build V adapter" step scripts/tests/docs: - tests/e2e_full.sh, federation_multinode.sh: launch the Elixir backend instead of the non-existent adapter/v/boj-server binary - tests/aspect_tests.sh: removed the dead V-lang ABI-contract aspect and the V SPDX loop; cartridge-completeness now ABI+FFI; aspects renumbered - scripts/boj-selinux-contexts.sh: dropped the dead V binary fcontext - docs (RSR_OUTLINE, QUICKSTART, GETTING-STARTED, blog-post-draft, wiki Developer/User guides), .github/DISCUSSION_TEMPLATE/ cartridge-proposal.yml, .gitignore, 0-AI-MANIFEST.a2ml: dead adapter/v/ path references / stack wording corrected to the Elixir+Zig reality Left untouched (intentional): CHANGELOG/ADR/.machine_readable history records (document the retirement), Intentfile/Mustfile Unbreakable-Stack ban-enforcement assets, and per-cartridge *_adapter.zig provenance comments / cartridge README adapter tables (out of scope for this dead-leaf PR; partly protected estate-rule surface). Validation: 3 changed YAML files yaml.safe_load OK; `just --list` OK (107 lines, build-adapter absent, all recipes intact); bash -n clean on all 4 edited shell scripts; 0-AI-MANIFEST.a2ml parens balanced. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent e256fcf commit 9aa85e2

16 files changed

Lines changed: 98 additions & 248 deletions

.github/DISCUSSION_TEMPLATE/cartridge-proposal.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ body:
55
attributes:
66
value: |
77
Proposing a new cartridge for the Ayo (community) menu? Tell us about it!
8-
Cartridges follow the three-layer stack: Idris2 ABI + Zig FFI + V-lang Adapter.
8+
Cartridges follow the stack: Idris2 ABI + Zig FFI, served by the Elixir adapter.
99
See docs/DEVELOPERS.md for the full guide.
1010
- type: input
1111
attributes:

.github/workflows/e2e.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ jobs:
6666
[ -f "$cart/build.zig" ] && (cd "$cart" && zig build) || true
6767
done
6868
69-
- name: Build V adapter
70-
run: |
71-
cd adapter/v && v -o boj-server . || echo "V adapter build attempted"
72-
7369
- name: Run E2E full test suite
7470
run: bash tests/e2e_full.sh
7571

.github/workflows/lsp-dap-bsp.yml

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -91,34 +91,6 @@ jobs:
9191
cd "$GITHUB_WORKSPACE"
9292
done
9393
94-
adapter-check:
95-
name: V-lang Adapter Check
96-
runs-on: ubuntu-latest
97-
steps:
98-
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
99-
- name: Install V-lang
100-
run: |
101-
sudo apt-get update && sudo apt-get install -y libgc-dev
102-
git clone --depth=1 https://github.com/vlang/v
103-
cd v && make && sudo ./v symlink
104-
- name: Check LSP/DAP/BSP adapters
105-
run: |
106-
for cart in lsp-mcp dap-mcp bsp-mcp; do
107-
echo "=== Checking $cart adapter ==="
108-
adapter_dir="cartridges/$cart/adapter"
109-
if [ ! -d "$adapter_dir" ]; then
110-
echo "ERROR: $adapter_dir missing"
111-
exit 1
112-
fi
113-
v_files=$(find "$adapter_dir" -name '*.v' | wc -l)
114-
if [ "$v_files" -eq 0 ]; then
115-
echo "ERROR: No .v files in $adapter_dir"
116-
exit 1
117-
fi
118-
v check "$adapter_dir"/*.v 2>&1 || { echo "ERROR: V check failed for $cart"; exit 1; }
119-
echo " V-lang check passed ($v_files files)"
120-
done
121-
12294
panel-validation:
12395
name: Panel Manifest Validation
12496
runs-on: ubuntu-latest
@@ -153,7 +125,7 @@ jobs:
153125
completeness:
154126
name: Cartridge Completeness Check
155127
runs-on: ubuntu-latest
156-
needs: [abi-check, ffi-build, adapter-check, panel-validation]
128+
needs: [abi-check, ffi-build, panel-validation]
157129
steps:
158130
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
159131
- name: Verify triadic structure

.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,6 @@ src/abi/build/
112112
# Cartridge Idris2 build artifacts
113113
cartridges/*/abi/build/
114114

115-
# V-lang build artifacts
116-
adapter/v/boj-server
117-
v.mod.lock
118-
119115
# Hypatia scanner logs
120116
.hypatia/
121117

0-AI-MANIFEST.a2ml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
Class 1 (Simple) — self-contained cartridges via GitHub Actions.
2121
Class 2 (Orchestrator) — unified gateways (WS/MQTT/Webhook).
2222
Class 3 (Multiplier) — Elixir/BEAM for mass concurrency.
23-
Every cartridge has Idris2 ABI + Zig FFI + V-lang Adapter triple.")
23+
Every cartridge has Idris2 ABI + Zig FFI; the Elixir backend serves the network adapter.")
2424

2525
;; ===================================================================
2626
;; CONTEXT TIERS
@@ -65,7 +65,7 @@
6565
├── src/abi/ # Idris2 ABI (Catalogue, Protocol, Domain, Menu, Federation)
6666
├── ffi/zig/ # Zig FFI (catalogue mount/unmount, loader)
6767
├── generated/abi/ # Auto-generated C headers
68-
├── adapter/v/ # V-lang triple adapter (REST+gRPC+GraphQL, port 9000)
68+
├── elixir/ # Elixir triple adapter (REST+gRPC+GraphQL, Plug/Cowboy)
6969
├── cartridges/ # One dir per matrix cell (database-mcp, nesy-mcp, fleet-mcp, ...)
7070
├── container/ # Stapeln container ecosystem
7171
├── panll/src/ # PanLL panel (ReScript/TEA)
@@ -77,7 +77,7 @@
7777
;; ===================================================================
7878

7979
(critical-invariants
80-
(rule "Three-Layer Stack: every cartridge = Idris2 ABI + Zig FFI + V-lang Adapter")
80+
(rule "Stack: every cartridge = Idris2 ABI + Zig FFI; Elixir backend serves the network adapter")
8181
(rule "Zero believe_me anywhere in src/abi/ or cartridges/*/abi/")
8282
(rule "%default total on all Idris2 files")
8383
(rule "IsUnbreakable proof required for Ready cartridges")

Justfile

Lines changed: 19 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -430,14 +430,14 @@ matrix:
430430
ABI=""; FFI=""; ADAPTER=""; TESTS=""
431431
[ -f "cartridges/$cart/abi"/*/*.idr ] 2>/dev/null && ABI=""
432432
[ -f "cartridges/$cart/ffi"/*_ffi.zig ] 2>/dev/null && FFI=""
433-
[ -f "cartridges/$cart/adapter"/*_adapter.v ] 2>/dev/null && ADAPTER=""
433+
[ -d "elixir" ] 2>/dev/null && ADAPTER=""
434434
[ -f "cartridges/$cart/ffi/build.zig" ] 2>/dev/null && TESTS=""
435435
printf " %-20s %s %s %s %s\n" "$cart" "$ABI" "$FFI" "$ADAPTER" "$TESTS"
436436
done
437437
echo ""
438438
echo " Core catalogue: ffi/zig/src/catalogue.zig"
439439
echo " Dynamic loader: ffi/zig/src/loader.zig"
440-
echo " V-lang adapter: adapter/v/src/ (directory)"
440+
echo " REST server: elixir/ (Plug/Cowboy)"
441441
echo " Menu: .machine_readable/servers/menu.a2ml"
442442
echo ""
443443
@@ -449,49 +449,24 @@ matrix:
449449
run *args: build
450450
#!/usr/bin/env bash
451451
set -euo pipefail
452-
# Preference: Elixir (Class 3) > V-lang (deprecated/banned)
452+
# The REST surface is the Elixir backend (Class 3 Multiplier).
453453
if [ -d "elixir" ] && command -v mix >/dev/null 2>&1; then
454454
echo "Starting BoJ Server (Elixir Class 3 Multiplier)..."
455455
cd elixir && exec mix run --no-halt {{args}}
456456
else
457-
ADAPTER="adapter/v/boj-server"
458-
if [ ! -f "$ADAPTER" ]; then
459-
if command -v v >/dev/null 2>&1; then
460-
just build-adapter
461-
else
462-
echo "ERROR: V-lang adapter not built and 'v' not found."
463-
echo "V-lang was banned 2026-04-10. Please use the Elixir backend (cd elixir && mix run)."
464-
exit 1
465-
fi
466-
fi
467-
echo "Starting BoJ Server (Legacy V-lang Adapter)..."
468-
LLP="$(pwd)/ffi/zig/zig-out/lib"
469-
for d in cartridges/*/ffi/zig-out/lib; do [ -d "$d" ] && LLP="${LLP}:$(pwd)/${d}"; done
470-
LD_LIBRARY_PATH="${LLP}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" exec "$ADAPTER" {{args}}
457+
echo "ERROR: Elixir backend not available (need 'elixir/' dir and 'mix')."
458+
echo "Install Elixir/Mix, then: cd elixir && mix run --no-halt"
459+
exit 1
471460
fi
472461
473462
# Run with verbose output
474463
run-verbose *args: build
475464
BOJ_VERBOSE=1 just run {{args}}
476465

477-
# Build V-lang adapter binary (compiles full directory: REST+gRPC+GraphQL+SSE)
478-
build-adapter: build
479-
#!/usr/bin/env bash
480-
set -euo pipefail
481-
echo "Building V-lang adapter (REST+gRPC+GraphQL+SSE)..."
482-
LFLAGS="-L$(pwd)/ffi/zig/zig-out/lib"
483-
for d in cartridges/*/ffi/zig-out/lib; do
484-
[ -d "$d" ] && LFLAGS="${LFLAGS} -L$(pwd)/${d}"
485-
done
486-
v -cc gcc -cflags "${LFLAGS} -Wl,--allow-multiple-definition -no-pie" \
487-
-o adapter/v/boj-server adapter/v/src/
488-
echo "Built: adapter/v/boj-server ($(du -h adapter/v/boj-server | cut -f1))"
489-
490-
# Install to user path
491-
install: build-adapter
492-
@echo "Installing boj-server..."
493-
cp adapter/v/boj-server ~/.local/bin/boj-server
494-
@echo "Installed to ~/.local/bin/boj-server"
466+
# Install: the REST surface is served by the Elixir backend (cd elixir && mix run)
467+
install: build
468+
@echo "The BoJ REST surface is the Elixir backend; no binary is installed."
469+
@echo "Run it with: cd elixir && mix run --no-halt (or: just run)"
495470

496471
# Start Cloudflare quick tunnel (exposes BoJ at *.trycloudflare.com)
497472
tunnel:
@@ -503,14 +478,14 @@ tunnel:
503478
serve: build
504479
#!/usr/bin/env bash
505480
set -euo pipefail
506-
ADAPTER="adapter/v/boj-server"
507-
if [ ! -f "$ADAPTER" ]; then
508-
just build-adapter
481+
if [ ! -d "elixir" ] || ! command -v mix >/dev/null 2>&1; then
482+
echo "ERROR: Elixir backend not available (need 'elixir/' dir and 'mix')."
483+
exit 1
509484
fi
510485
echo "Starting BoJ Server..."
511486
echo " Local: http://localhost:7700/status"
512487
echo " SSE: http://localhost:7703/sse"
513-
LD_LIBRARY_PATH="$(pwd)/ffi/zig/zig-out/lib" "$ADAPTER" &
488+
(cd elixir && mix run --no-halt) &
514489
BOJ_PID=$!
515490
trap "kill $BOJ_PID 2>/dev/null; kill $TUNNEL_PID 2>/dev/null; exit" INT TERM
516491
sleep 2
@@ -1218,7 +1193,6 @@ doctor:
12181193
check "git" git "2.0+"
12191194
echo ""
12201195
echo "Optional tools:"
1221-
check_optional "V (vlang)" v "deprecated/banned 2026-04-10"
12221196
check_optional "Cargo" cargo "needed by launch-scaffolder (mint/provision/config)"
12231197
check_optional "cloudflared" cloudflared "needed for tunnel"
12241198
check_optional "panic-attack" panic-attack "pre-commit scanner"
@@ -1254,10 +1228,10 @@ doctor:
12541228
else
12551229
echo " [INFO] ffi/zig/zig-out/ not found — run 'just build'"
12561230
fi
1257-
if [ -f "adapter/v/boj-server" ]; then
1258-
echo " [OK] adapter/v/boj-server binary exists"
1231+
if [ -d "elixir" ]; then
1232+
echo " [OK] elixir/ exists (REST server backend)"
12591233
else
1260-
echo " [INFO] V-lang adapter not built — run 'just build-adapter'"
1234+
echo " [INFO] elixir/ backend not found"
12611235
fi
12621236
if [ -d "src/abi/build" ]; then
12631237
echo " [OK] src/abi/build/ exists (Idris2 ABI compiled)"
@@ -1317,25 +1291,6 @@ heal:
13171291
ZIG_VER=$(asdf list zig 2>/dev/null | tail -1 | tr -d ' ')
13181292
[ -n "$ZIG_VER" ] && asdf global zig "$ZIG_VER" && echo " Zig global version set: $ZIG_VER"
13191293
fi
1320-
# --- Install V (vlang) ---
1321-
if ! command -v v >/dev/null 2>&1; then
1322-
echo "Installing V (API adapter)..."
1323-
if [ ! -d "$HOME/vlang" ]; then
1324-
git clone https://github.com/vlang/v "$HOME/vlang"
1325-
fi
1326-
(cd "$HOME/vlang" && make)
1327-
# Symlink without sudo — use ~/.local/bin if writable
1328-
mkdir -p "$HOME/.local/bin"
1329-
ln -sf "$HOME/vlang/v" "$HOME/.local/bin/v"
1330-
export PATH="$HOME/.local/bin:$PATH"
1331-
if ! grep -q '\.local/bin' "$HOME/.bashrc" 2>/dev/null; then
1332-
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc"
1333-
fi
1334-
echo " V installed at ~/.local/bin/v"
1335-
echo " (If 'v' is still not found in a new shell, run: sudo ~/vlang/v symlink)"
1336-
HEALED=$((HEALED + 1))
1337-
echo ""
1338-
fi
13391294
# --- System library dependencies ---
13401295
if command -v apt-get >/dev/null 2>&1; then
13411296
MISSING_PKGS=""
@@ -1390,7 +1345,7 @@ tour:
13901345
echo ""
13911346
echo " 1. Idris2 ABI — Dependent types prove correctness"
13921347
echo " 2. Zig FFI — C-compatible native execution"
1393-
echo " 3. V-lang API — REST + gRPC + GraphQL adapter"
1348+
echo " 3. Elixir API — REST + gRPC + GraphQL surface"
13941349
echo ""
13951350
echo "Three-Class Architecture:"
13961351
echo " Class 1: Simple Track — CLI/curl, self-contained"
@@ -1406,7 +1361,7 @@ tour:
14061361
echo "Key directories:"
14071362
echo " cartridges/ 70+ cartridge directories"
14081363
echo " ffi/zig/ Core catalogue FFI"
1409-
echo " adapter/v/ V-lang triple adapter"
1364+
echo " elixir/ REST server (Plug/Cowboy)"
14101365
echo " container/ Stapeln container ecosystem"
14111366
echo ""
14121367
CART_COUNT=$(ls -d cartridges/*-mcp 2>/dev/null | wc -l)
@@ -1442,7 +1397,6 @@ help-me:
14421397
echo "BUILD & RUN:"
14431398
echo " just build Build all Zig FFI layers (catalogue + cartridges)"
14441399
echo " just build-release Build with optimizations"
1445-
echo " just build-adapter Build V-lang API triple adapter"
14461400
echo " just run Build + start server (REST 7700, gRPC 7701, GraphQL 7702)"
14471401
echo " just run-verbose Start with verbose output"
14481402
echo " just serve Server + Cloudflare tunnel"

docs/GETTING-STARTED.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| Tool | Version | Purpose |
77
|------|---------|---------|
88
| [Zig](https://ziglang.org/download/) | 0.15+ | FFI compilation |
9-
| [V-lang](https://vlang.io/) | 0.5.0+ | Adapter compilation |
9+
| [Elixir](https://elixir-lang.org/) | 1.15+ | REST/gRPC/GraphQL adapter |
1010
| GCC | any recent | Linking |
1111

1212
Optional:
@@ -29,18 +29,18 @@ for cart in cartridges/*/ffi; do
2929
(cd "$cart" && zig build 2>/dev/null)
3030
done
3131

32-
# Build the V adapter
33-
cd adapter/v
34-
v -cc gcc src/main.v -o boj-server
35-
cd ../..
32+
# Fetch + compile the Elixir backend (REST/gRPC/GraphQL adapter)
33+
cd elixir
34+
mix deps.get && mix compile
35+
cd ..
3636
```
3737

3838
### 2. Run
3939

4040
```bash
41-
cd adapter/v
42-
export LD_LIBRARY_PATH=../../ffi/zig/zig-out/lib:../../cartridges/container-mcp/ffi/zig-out/lib:../../cartridges/feedback-mcp/ffi/zig-out/lib
43-
./boj-server
41+
cd elixir
42+
export LD_LIBRARY_PATH=../ffi/zig/zig-out/lib:../cartridges/container-mcp/ffi/zig-out/lib:../cartridges/feedback-mcp/ffi/zig-out/lib
43+
mix run --no-halt
4444
```
4545

4646
The server starts on three ports:
@@ -107,12 +107,12 @@ All ports are configurable via environment variables:
107107
## Architecture
108108

109109
```
110-
Idris2 ABI (proofs) → Zig FFI (execution) → V-lang Adapter (network)
110+
Idris2 ABI (proofs) → Zig FFI (execution) → Elixir Adapter (network)
111111
```
112112

113113
- **Idris2** defines types with dependent-type proofs (IsUnbreakable safety gate)
114114
- **Zig** implements C-ABI exports (mount/unmount, federation, feedback, etc.)
115-
- **V-lang** exposes everything as REST + gRPC + GraphQL
115+
- **Elixir** exposes everything as REST + gRPC + GraphQL (Plug/Cowboy on the BEAM)
116116

117117
The capability matrix is 2D (protocol × domain) with an optional third axis
118118
(backend/provider) for community extensions. See `docs/EXTENSIBILITY.md`.

docs/QUICKSTART.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ cartridges/ # Matrix cells — one dir per (Protocol x Domain) pair
4545
fleet-mcp/ # MCP x Fleet (abi/ + ffi/)
4646
nesy-mcp/ # MCP x NeSy (abi/ + ffi/)
4747
agent-mcp/ # MCP x Agent (abi/ + ffi/)
48-
adapter/v/ # V-lang triple adapter (REST+gRPC+GraphQL) — Phase 3
48+
elixir/ # REST server backend (REST+gRPC+GraphQL, Plug/Cowboy)
4949
container/ # Stapeln container ecosystem
5050
docs/ # Architecture, federation, developer guides
5151
.machine_readable/ # State files, menu, policies, contractiles

docs/RSR_OUTLINE.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ boj-server/
100100
│ └── agent-mcp/ # MCP × Agent
101101
│ ├── abi/ # SafeOODA.idr
102102
│ └── ffi/ # agent_ffi.zig + build.zig
103-
├── adapter/v/ # V-lang triple adapter (Phase 3)
103+
├── elixir/ # REST server backend (Plug/Cowboy)
104104
├── container/ # Stapeln container ecosystem
105105
│ ├── Containerfile # Multi-stage OCI build (Chainguard)
106106
│ ├── compose.toml # selur-compose orchestration

docs/outreach/blog-post-draft.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ The typical developer server is Python or TypeScript. BoJ uses none of those. In
6262
|-------|----------|-----|
6363
| ABI | Idris2 | Prove the interface is correct |
6464
| FFI | Zig | Execute it natively |
65-
| Adapter | V-lang | Serve it over the network |
65+
| Adapter | Elixir | Serve it over the network |
6666

6767
**Why Idris2?** Because it has dependent types. Not "type-safe" in the TypeScript sense. Actually provably correct at compile time. The core safety gate is a type called `IsUnbreakable` -- it's a mathematical proof that only cartridges in the `Ready` state can be activated. The type checker enforces this, not a runtime check, not a unit test. If the proof doesn't hold, the code doesn't compile.
6868

@@ -78,7 +78,7 @@ You literally cannot call `mount` on a cartridge that isn't `Ready`. The type sy
7878

7979
**Why Zig?** Because it produces C-ABI-compatible shared libraries with zero runtime dependencies. Each cartridge compiles to a `.so` file. The Zig layer bridges Idris2's proofs with actual system calls -- file I/O, networking, database connections. Cross-compilation is built in, which matters when community members run nodes on ARM, x86, or whatever they have.
8080

81-
**Why V-lang?** Because one V codebase exposes all three API styles (REST + gRPC + GraphQL) on dedicated ports. One language, three protocols, no code generation step.
81+
**Why Elixir?** Because one Elixir codebase on the BEAM (Plug/Cowboy) exposes all three API styles (REST + gRPC + GraphQL) on dedicated ports, with the fault-tolerance and concurrency the BEAM is known for. One runtime, three protocols, no code generation step.
8282

8383
The result: a compact binary. 219 Zig tests + 8 integration tests + 32 seam checks. Thread-safe (every FFI entry point serialises on a per-module mutex). No virtualenvs, no node_modules, no pip install.
8484

@@ -90,8 +90,7 @@ Start the server:
9090
git clone https://github.com/hyperpolymath/boj-server.git
9191
cd boj-server
9292
cd ffi/zig && zig build && cd ../..
93-
cd adapter/v && v -cc gcc src/main.v -o boj-server
94-
./boj-server
93+
cd elixir && mix deps.get && mix run --no-halt
9594
```
9695

9796
Three ports open:

0 commit comments

Comments
 (0)