From 428e64048440d6fb7933d06f86811c47974e414b Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:40:29 +0700 Subject: [PATCH 01/10] ci: ask the build what it installs, and ask zig for the whole vibeec error list --- .github/workflows/release-probe.yml | 45 +++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/release-probe.yml diff --git a/.github/workflows/release-probe.yml b/.github/workflows/release-probe.yml new file mode 100644 index 0000000000..80894fbd7d --- /dev/null +++ b/.github/workflows/release-probe.yml @@ -0,0 +1,45 @@ +# Temporary instrument, deleted before this branch merges. +# +# Two questions the release workflows cannot answer by reading: +# 1. Does the default build step actually install `firebird`, or only +# tri + vibee? trinity-binary-release.yml copies it with a `[ -f ] || +# echo "not found"` guard, which is how that workflow shipped archives +# nobody checked. +# 2. What is the FULL error list for src/vibeec? Zig analyses lazily, so +# the four errors reported on the v10.1.1 tag are only the first wave. +name: release probe + +on: + push: + branches: [fix/release-workflows] + workflow_dispatch: + +env: + ZIG_VERSION: 0.15.2 + +jobs: + bins: + name: what the default step installs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: mlugg/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + - run: | + zig build -Dtarget=x86_64-linux-gnu.2.35 -Doptimize=ReleaseSafe -Dci=true + echo "=== zig-out/bin" + ls -la zig-out/bin/ + + vibeec: + name: every error in src/vibeec + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v4 + - uses: mlugg/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + - run: | + cd src/vibeec + zig build -Doptimize=Debug 2>&1 | tail -120 From 979a17f35ea3776cae4278fa5445fbd80eb10281 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:41:10 +0700 Subject: [PATCH 02/10] ci: stop building a Tauri app this repository does not contain Build & Release fires on every v* tag and runs three jobs -- macOS, Windows, Linux -- each of which does `cargo install tauri-cli --locked` and then `cargo tauri build` in `vibee-browser/`. That directory was removed on 2026-01-31 by 182df46ea, "refactor: clean up project root". Twenty-one files, deliberately. The only vibee-browser left in the tree is archive/vibee-browser-chromium/, which is a set of Chromium patches, not a Tauri project -- `cargo tauri build` has nothing to point at. So the workflow cannot be repaired into working; there is no source. What it did instead was worse than failing quietly: its release job calls action-gh-release with make_latest: true and a body that begins "## VIBEE Browser", against the same tag Binary Release publishes. Whichever of the two finished last decided what the Trinity release said it was. The product is gone. The workflow goes with it; the file stays in history for whoever revives the browser. --- .github/workflows/build-release.yml | 167 ---------------------------- 1 file changed, 167 deletions(-) delete mode 100644 .github/workflows/build-release.yml diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml deleted file mode 100644 index c3b7745f00..0000000000 --- a/.github/workflows/build-release.yml +++ /dev/null @@ -1,167 +0,0 @@ -# VIBEE Browser - Build & Release -# Creates .dmg (macOS), .exe (Windows), .AppImage (Linux) -# φ² + 1/φ² = 3 | PHOENIX = 999 - -name: Build & Release - -on: - push: - tags: - - 'v*' - - '!ext-v*' - - '!compiler-v*' - workflow_dispatch: - -env: - CARGO_TERM_COLOR: always - -jobs: - build-macos: - runs-on: macos-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - - name: Install Tauri CLI - run: cargo install tauri-cli --locked - - - name: Install dependencies - working-directory: vibee-browser - run: npm install - - - name: Build VIBEE Browser (macOS) - working-directory: vibee-browser - run: cargo tauri build - - - name: Upload macOS DMG - uses: actions/upload-artifact@v4 - with: - name: vibee-browser-macos - path: vibee-browser/src-tauri/target/release/bundle/dmg/*.dmg - if-no-files-found: warn - - build-windows: - runs-on: windows-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - - name: Install Tauri CLI - run: cargo install tauri-cli --locked - - - name: Install dependencies - working-directory: vibee-browser - run: npm install - - - name: Build VIBEE Browser (Windows) - working-directory: vibee-browser - run: cargo tauri build - - - name: Upload Windows artifacts - uses: actions/upload-artifact@v4 - with: - name: vibee-browser-windows - path: | - vibee-browser/src-tauri/target/release/bundle/msi/*.msi - vibee-browser/src-tauri/target/release/bundle/nsis/*.exe - if-no-files-found: warn - - build-linux: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - - - name: Install Linux dependencies - run: | - sudo apt-get update - sudo apt-get install -y \ - libwebkit2gtk-4.1-dev \ - libappindicator3-dev \ - librsvg2-dev \ - patchelf - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - - name: Install Tauri CLI - run: cargo install tauri-cli --locked - - - name: Install dependencies - working-directory: vibee-browser - run: npm install - - - name: Build VIBEE Browser (Linux) - working-directory: vibee-browser - run: cargo tauri build - - - name: Upload Linux artifacts - uses: actions/upload-artifact@v4 - with: - name: vibee-browser-linux - path: | - vibee-browser/src-tauri/target/release/bundle/appimage/*.AppImage - vibee-browser/src-tauri/target/release/bundle/deb/*.deb - if-no-files-found: warn - - release: - needs: [build-macos, build-windows, build-linux] - runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/') - permissions: - contents: write - steps: - - name: Download all artifacts - uses: actions/download-artifact@v4 - - - name: List artifacts - run: find . -type f -name "*.dmg" -o -name "*.msi" -o -name "*.exe" -o -name "*.AppImage" -o -name "*.deb" - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - make_latest: true - files: | - vibee-browser-macos/*.dmg - vibee-browser-windows/*.msi - vibee-browser-windows/*.exe - vibee-browser-linux/*.AppImage - vibee-browser-linux/*.deb - body: | - ## VIBEE Browser ${{ github.ref_name }} - - **φ² + 1/φ² = 3 | PHOENIX = 999** - - ### Downloads - - **macOS**: `.dmg` file - - **Windows**: `.msi` or `.exe` file - - **Linux**: `.AppImage` or `.deb` file - - ### Features - - Chrome DevTools Protocol (CDP) integration - - AI Agent automation - - Golden ratio UI (φ = 1.618...) - fail_on_unmatched_files: false From a1cf3ef8ae75b1a56158dd848931d4d1c184b031 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:41:28 +0700 Subject: [PATCH 03/10] ci: one binary release, not two racing for the same tag Trinity Binary Release and Binary Release build the same product from the same tree for the same five targets, and both end by calling action-gh-release with make_latest: true against the tag that triggered them. That is not two workflows with bugs; it is two authors of one release body. Whichever finished last decided whether users were told about four downloads or five. Repairing this one would not have removed the race, and it needed repairing everywhere anyway: -Draylib=false is not a declared option. `zig build -h` on a working runner lists -Dtarget -Dcpu -Dofmt -Ddynamic-linker -Doptimize -Dci -Dtreesitter, and passing an unknown -D kills the job in ten seconds. macos-13 for the amd64 job. On 2026-09-20 that image sat queued for the whole of a fifty-minute run and never started; the target is a cross-compile anyway. macos-latest for the arm64 job -- macOS 26.6 with the Xcode 26.6 SDK, where zig 0.15.2 cannot link `pub fn main() void {}` against libc. Measured on all three images. The macOS jobs `cd release/macos-amd64 && zip -r ../../trinity-*.zip *`, which writes the zip to the repository root, then upload from `release/`. Even on a green build those two artifacts were empty. Every binary is copied with `[ -f x ] && cp x || echo "not found"`, so a build that produced nothing still tarred, uploaded and published. The Windows job has no continue-on-error, and 17 source files cannot compile for that target. Binary Release is the survivor: it shipped v10.1.1 on four platforms. The one thing this file had that it did not is `firebird`, which moves across in the next commit. --- .github/workflows/trinity-binary-release.yml | 295 ------------------- 1 file changed, 295 deletions(-) delete mode 100644 .github/workflows/trinity-binary-release.yml diff --git a/.github/workflows/trinity-binary-release.yml b/.github/workflows/trinity-binary-release.yml deleted file mode 100644 index ba80b12a67..0000000000 --- a/.github/workflows/trinity-binary-release.yml +++ /dev/null @@ -1,295 +0,0 @@ -# Trinity Core Binary Release Workflow -# Builds cross-platform binaries for v1.0.1 "PURITY" -# Targets: linux/amd64, linux/arm64, macos/amd64, macos/arm64, windows/amd64 -# φ² + 1/φ² = 3 | TRINITY v1.0.1 - -name: Trinity Binary Release - -on: - push: - tags: - - 'v*' - workflow_dispatch: - inputs: - version: - description: 'Version tag (e.g., v1.0.1)' - required: true - default: 'v1.0.1' - -env: - ZIG_VERSION: '0.15.2' - -jobs: - build-linux-amd64: - name: Build Linux AMD64 - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Zig - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - - name: Build TRI CLI - run: | - # Build with optional dependencies disabled for CI - # raylib=false: GUI tools (node-gui, photon-demo, photon-immersive) - # treesitter=false: AST tools (needle-mcp, trinity-mcp) - zig build -Dtarget=x86_64-linux-gnu.2.35 -Doptimize=ReleaseFast -Draylib=false -Dtreesitter=false - mkdir -p release/linux-amd64 - # Copy binaries - [ -f zig-out/bin/tri ] && cp zig-out/bin/tri release/linux-amd64/ || echo "tri binary not found" - [ -f zig-out/bin/vibee ] && cp zig-out/bin/vibee release/linux-amd64/ || echo "vibee binary not found" - [ -f zig-out/bin/firebird ] && cp zig-out/bin/firebird release/linux-amd64/ || echo "firebird binary not found" - chmod +x release/linux-amd64/* 2>/dev/null || true - - - name: Create tarball - run: | - cd release/linux-amd64 - tar czvf ../trinity-${{ github.ref_name }}-linux-amd64.tar.gz * - cd ../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: trinity-linux-amd64 - path: release/trinity-*-linux-amd64.tar.gz - - build-linux-arm64: - name: Build Linux ARM64 - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Zig - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - - name: Build TRI CLI - run: | - zig build -Dtarget=aarch64-linux-gnu.2.35 -Doptimize=ReleaseFast -Draylib=false -Dtreesitter=false - mkdir -p release/linux-arm64 - [ -f zig-out/bin/tri ] && cp zig-out/bin/tri release/linux-arm64/ || echo "tri binary not found" - [ -f zig-out/bin/vibee ] && cp zig-out/bin/vibee release/linux-arm64/ || echo "vibee binary not found" - [ -f zig-out/bin/firebird ] && cp zig-out/bin/firebird release/linux-arm64/ || echo "firebird binary not found" - chmod +x release/linux-arm64/* 2>/dev/null || true - - - name: Create tarball - run: | - cd release/linux-arm64 - tar czvf ../trinity-${{ github.ref_name }}-linux-arm64.tar.gz * - cd ../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: trinity-linux-arm64 - path: release/trinity-*-linux-arm64.tar.gz - - build-macos-amd64: - name: Build macOS AMD64 - runs-on: macos-13 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Zig - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - - name: Build TRI CLI - run: | - zig build -Dtarget=x86_64-macos-gnu -Doptimize=ReleaseFast -Draylib=false -Dtreesitter=false - mkdir -p release/macos-amd64 - [ -f zig-out/bin/tri ] && cp zig-out/bin/tri release/macos-amd64/ || echo "tri binary not found" - [ -f zig-out/bin/vibee ] && cp zig-out/bin/vibee release/macos-amd64/ || echo "vibee binary not found" - [ -f zig-out/bin/firebird ] && cp zig-out/bin/firebird release/macos-amd64/ || echo "firebird binary not found" - chmod +x release/macos-amd64/* 2>/dev/null || true - - - name: Create zip - run: | - cd release/macos-amd64 - zip -r ../../trinity-${{ github.ref_name }}-macos-amd64.zip * - cd ../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: trinity-macos-amd64 - path: release/trinity-*-macos-amd64.zip - - build-macos-arm64: - name: Build macOS ARM64 - runs-on: macos-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Zig - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - - name: Build TRI CLI - run: | - zig build -Dtarget=aarch64-macos-gnu -Doptimize=ReleaseSafe -Draylib=false -Dtreesitter=false - mkdir -p release/macos-arm64 - [ -f zig-out/bin/tri ] && cp zig-out/bin/tri release/macos-arm64/ || echo "tri binary not found" - [ -f zig-out/bin/vibee ] && cp zig-out/bin/vibee release/macos-arm64/ || echo "vibee binary not found" - [ -f zig-out/bin/firebird ] && cp zig-out/bin/firebird release/macos-arm64/ || echo "firebird binary not found" - chmod +x release/macos-arm64/* 2>/dev/null || true - - - name: Create zip - run: | - cd release/macos-arm64 - zip -r ../../trinity-${{ github.ref_name }}-macos-arm64.zip * - cd ../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: trinity-macos-arm64 - path: release/trinity-*-macos-arm64.zip - - build-windows: - name: Build Windows AMD64 - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Zig - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - - name: Build TRI CLI - run: | - zig build -Dtarget=x86_64-windows-gnu -Doptimize=ReleaseFast -Draylib=false -Dtreesitter=false - mkdir -p release/windows-amd64 - [ -f zig-out/bin/tri.exe ] && cp zig-out/bin/tri.exe release/windows-amd64/ || echo "tri binary not found" - [ -f zig-out/bin/vibee.exe ] && cp zig-out/bin/vibee.exe release/windows-amd64/ || echo "vibee binary not found" - [ -f zig-out/bin/firebird.exe ] && cp zig-out/bin/firebird.exe release/windows-amd64/ || echo "firebird binary not found" - - - name: Create zip - run: | - cd release/windows-amd64 - zip -r ../../trinity-${{ github.ref_name }}-windows-amd64.zip * - cd ../.. - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: trinity-windows-amd64 - path: release/trinity-*-windows-amd64.zip - - generate-checksums: - name: Generate Checksums - runs-on: ubuntu-latest - needs: [build-linux-amd64, build-linux-arm64, build-macos-amd64, build-macos-arm64, build-windows] - steps: - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: release - - - name: Generate SHA256 checksums - run: | - cd release - find . -type f \( -name "*.tar.gz" -o -name "*.zip" \) -exec sha256sum {} \; > SHA256SUMS.txt - cat SHA256SUMS.txt - - - name: Upload checksums - uses: actions/upload-artifact@v4 - with: - name: checksums - path: release/SHA256SUMS.txt - - release: - name: Create GitHub Release - runs-on: ubuntu-latest - needs: [generate-checksums] - if: startsWith(github.ref, 'refs/tags/') - permissions: - contents: write - steps: - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: release - - - name: Create Release - uses: softprops/action-gh-release@v2 - with: - make_latest: true - files: | - release/trinity-*/*.tar.gz - release/trinity-*/*.zip - release/checksums/SHA256SUMS.txt - body: | - # Trinity ${{ github.ref_name }} "PURITY" - - **φ² + 1/φ² = 3 | TRINITY v1.0.1** - - ## Downloads - - | Platform | Architecture | Download | - |----------|-------------|----------| - | Linux | AMD64 | `trinity-${{ github.ref_name }}-linux-amd64.tar.gz` | - | Linux | ARM64 | `trinity-${{ github.ref_name }}-linux-arm64.tar.gz` | - | macOS | Intel | `trinity-${{ github.ref_name }}-macos-amd64.zip` | - | macOS | Apple Silicon | `trinity-${{ github.ref_name }}-macos-arm64.zip` | - | Windows | AMD64 | `trinity-${{ github.ref_name }}-windows-amd64.zip` | - - ## Verification - - ```bash - # Verify SHA256 checksum - sha256sum -c SHA256SUMS.txt - ``` - - ## Quick Start - - ```bash - # Extract and run - tar xzf trinity-${{ github.ref_name }}-linux-amd64.tar.gz - ./tri --help - - # Or with Docker - docker pull ghcr.io/ghashtag/trinity:${{ github.ref_name }} - docker run ghcr.io/ghashtag/trinity:${{ github.ref_name }} tri --help - ``` - - ## What's Included - - - **tri**: Unified Trinity CLI (195+ commands) - - **vibee**: VIBEE specification compiler - - **firebird**: BitNet-to-Ternary inference engine - - ## Documentation - - - Full API Reference: https://gHashTag.github.io/trinity/docs/api - - Quick Start: https://gHashTag.github.io/trinity/docs/quick-start - - GitHub Repository: https://github.com/gHashTag/trinity - - ## Performance - - - ARM64 NEON SIMD: 2.96x - 41.65x speedup - - Memory Efficiency: 20x vs float32 - - VSA Operations: 1000+ ops/ms - fail_on_unmatched_files: false From bc1855e3bb01d1c1df04a27d9bd9a5752a7d3f78 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:43:44 +0700 Subject: [PATCH 04/10] port(vibeec): the first four errors zig reported, and nothing it did not Build Compiler Release has never built anything since zig moved to 0.15: src/vibeec/compiler.zig is the root of the vibeec binary and does not compile. The sibling copy under src/phi-engine/vibeec_original was ported and this one was not, so the idiom used here is the one that copy already uses and that src/tri/pathology.zig and src/sacred/caps_report.zig compile with today. type_checker.zig:287 -- TypeChecker.init was declared to return Self while calling TypeRegistry.init, which returns an error union. Both its own tests at 531 and 542 and compiler.zig:152 already write 'try TypeChecker.init', so the declaration was the thing out of step, not the four callers. compiler.zig:474 and 513 -- std.io.getStdOut() no longer exists. File.stdout() needs a buffer for .writer(), and these two functions print a help screen once; deprecatedWriter() is the same GenericWriter they were written against. Zig analyses lazily, so this is the first wave and probably not the last. Each round is measured on the runner rather than guessed -- the local toolchain is 0.16.0 and cannot stand in for 0.15.2. --- src/vibeec/compiler.zig | 4 ++-- src/vibeec/type_checker.zig | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vibeec/compiler.zig b/src/vibeec/compiler.zig index ad90c63fa5..de3f19395a 100644 --- a/src/vibeec/compiler.zig +++ b/src/vibeec/compiler.zig @@ -471,7 +471,7 @@ pub fn main() !u8 { } fn printSimpleHelp() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\ \\ ╔═══════════════════════════════════════════════════════════╗ @@ -510,7 +510,7 @@ fn printSimpleHelp() void { } fn printVersion() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\VIBEEC v22.0.0 \\φ = 1.618033988749895 diff --git a/src/vibeec/type_checker.zig b/src/vibeec/type_checker.zig index 9da3806d55..e027fd5ae5 100644 --- a/src/vibeec/type_checker.zig +++ b/src/vibeec/type_checker.zig @@ -284,10 +284,10 @@ pub const TypeChecker = struct { is_dirty: bool, }; - pub fn init(allocator: Allocator) Self { + pub fn init(allocator: Allocator) !Self { return Self{ .allocator = allocator, - .registry = TypeRegistry.init(allocator), + .registry = try TypeRegistry.init(allocator), .cache = StringHashMap(CacheEntry).init(allocator), .current_version = 0, .cache_hits = 0, From 422b13170d024e9433b23b32a097f02a11fe9967 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:52:10 +0700 Subject: [PATCH 05/10] ci: the extension release built zips with no manifest in them Extension Release has been pointed at `extension/` since the tree was moved to deploy/trinity-nexus/extensions. Every step after checkout ran against a directory that does not exist, so the workflow could not have produced a loadable extension on any tag since the move. The move also lost twelve files -- both manifests and all six icons -- and the reason it lost exactly those is in .gitignore. Two unanchored rules, `extensions/` and `trinity-nexus/`, each match at any depth, so both matched deploy/trinity-nexus/extensions. The 53 sibling source files were already tracked and kept working; only files added AFTER the move were swallowed, which is why nothing looked broken. That is the identical defect the comment three lines below already records for `website/` on 2026-08-10. Anchoring both rules exposes exactly twelve files repo-wide and nothing else -- measured, not assumed; no top-level trinity-nexus/ exists, so that rule was protecting nothing. The manifests and icons are restored from tag ext-v2.0.0. chrome/icons/README.md stays ignored by the repo-wide `*.md` rule. The packaging step excludes `*.md` from the zip, so it changes no artifact. Six other rules in that block hide files below top level too (bin, demos, mcp, models, runtime -- 27 files between them). They are not in the path of a release workflow and are left alone rather than swept in here. Build Compiler Release, separately: - It fired on `v*`, publishing its own release body with its own asset table against the same tag as Binary Release. Whichever finished last won. Narrowed to `compiler-v*`, which was already in its trigger list. - macos-latest is the SDK-26 wall that zig 0.15.2 cannot link its build runner against. Pinned to macos-14, same measurement as release.yml. - goto-bus-stop/setup-zig is deprecated; mlugg/setup-zig@v2 everywhere. - The notes claimed "Zig 0.13.0 used for compilation" while the env pins 0.15.2, linked downloads to gHashTag/vibee-lang (not this repository), and advertised ghcr.io/ghashtag/vibee -- an image nothing builds, under a tag that does not trigger docker-build.yml at all. The real image is ghcr.io/ghashtag/trinity. - Artifacts named `vibee-*` were the `vibeec` binary, which is a different program from the `vibee` that Binary Release ships. Renamed to `vibeec-*`. - Both "Test binary" steps ended in `|| echo "continuing"`, so they could not fail, and the macOS one ran against an x86_64 binary that cannot execute on an arm64 runner. Gated to the native target and allowed to fail. - make_latest pinned false on both non-headline workflows: the action defaults it to true, which would put a compiler or extension tag above Trinity. The probe gains a third job that builds the WASM module, packages both zips and asserts manifest_version 3 and 2 by reading them back out of the archives. Co-Authored-By: Claude Opus 5 --- .github/workflows/build-compiler-release.yml | 82 ++++++++++++------ .github/workflows/extension-release.yml | 41 +++++---- .github/workflows/release-probe.yml | 53 ++++++++++- .gitignore | 12 ++- .../extensions/chrome/icons/icon128.png | Bin 0 -> 149 bytes .../extensions/chrome/icons/icon128.svg | 4 + .../extensions/chrome/icons/icon16.png | Bin 0 -> 107 bytes .../extensions/chrome/icons/icon16.svg | 4 + .../extensions/chrome/icons/icon48.png | Bin 0 -> 129 bytes .../extensions/chrome/icons/icon48.svg | 4 + .../extensions/chrome/manifest.json | 58 +++++++++++++ .../extensions/firefox/icons/icon128.png | Bin 0 -> 149 bytes .../extensions/firefox/icons/icon16.png | Bin 0 -> 107 bytes .../extensions/firefox/icons/icon48.png | Bin 0 -> 129 bytes .../extensions/firefox/manifest.json | 59 +++++++++++++ 15 files changed, 268 insertions(+), 49 deletions(-) create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon128.png create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon128.svg create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon16.png create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon16.svg create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon48.png create mode 100644 deploy/trinity-nexus/extensions/chrome/icons/icon48.svg create mode 100644 deploy/trinity-nexus/extensions/chrome/manifest.json create mode 100644 deploy/trinity-nexus/extensions/firefox/icons/icon128.png create mode 100644 deploy/trinity-nexus/extensions/firefox/icons/icon16.png create mode 100644 deploy/trinity-nexus/extensions/firefox/icons/icon48.png create mode 100644 deploy/trinity-nexus/extensions/firefox/manifest.json diff --git a/.github/workflows/build-compiler-release.yml b/.github/workflows/build-compiler-release.yml index 1718083447..4f16f5b9f7 100644 --- a/.github/workflows/build-compiler-release.yml +++ b/.github/workflows/build-compiler-release.yml @@ -4,12 +4,16 @@ name: Build Compiler Release +# NOT 'v*'. This workflow publishes its own release body with its own asset +# table, and so does Binary Release (release.yml). On a v* tag both fired +# against the same tag and whichever finished last overwrote the other's notes +# -- on v10.1.0 the surviving body advertised files the run had not produced. +# `compiler-v*` was already in this list, so a separate namespace was always the +# intent; this just stops the two from racing. on: push: tags: - - 'v*' - 'compiler-v*' - - '!ext-v*' workflow_dispatch: env: @@ -25,9 +29,9 @@ jobs: target: [x86_64-linux-gnu, aarch64-linux-gnu] include: - target: x86_64-linux-gnu - binary_name: vibee-linux-x86_64 + binary_name: vibeec-linux-x86_64 - target: aarch64-linux-gnu - binary_name: vibee-linux-aarch64 + binary_name: vibeec-linux-aarch64 steps: - name: Checkout @@ -36,7 +40,7 @@ jobs: fetch-depth: 0 - name: Setup Zig - uses: goto-bus-stop/setup-zig@v2 + uses: mlugg/setup-zig@v2 with: version: ${{ env.ZIG_VERSION }} @@ -47,10 +51,13 @@ jobs: cp zig-out/bin/vibeec ../../${{ matrix.binary_name }} chmod +x ../../${{ matrix.binary_name }} + # Only x86_64 is native on this runner; the aarch64 build cannot be + # executed here. Where it CAN run, it has to run: `|| echo "continuing"` + # made this step incapable of failing, which is not a smoke test. - name: Test binary (if native) run: | if [[ "${{ matrix.target }}" == "x86_64-linux-gnu" ]]; then - ./${{ matrix.binary_name }} --version 2>/dev/null || echo "Version check failed but continuing" + ./${{ matrix.binary_name }} --version fi - name: Upload artifact @@ -62,23 +69,28 @@ jobs: build-macos: name: Build macOS (${{ matrix.target }}) - runs-on: macos-latest + # NOT macos-latest. That image is macOS 26.6 with the Xcode 26.6 SDK, and + # zig 0.15.2 cannot link its own build runner against libc there -- every + # libSystem symbol comes back undefined from build_zcu.o, before any of this + # repository's code is looked at. Measured 2026-09-20: macos-14 (Xcode 15.4) + # links it, macos-latest does not. Same pin, same reason, as release.yml. + runs-on: macos-14 strategy: fail-fast: false matrix: target: [x86_64-macos, aarch64-macos] include: - target: x86_64-macos - binary_name: vibee-macos-x86_64 + binary_name: vibeec-macos-x86_64 - target: aarch64-macos - binary_name: vibee-macos-arm64 + binary_name: vibeec-macos-arm64 steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Zig - uses: goto-bus-stop/setup-zig@v2 + uses: mlugg/setup-zig@v2 with: version: ${{ env.ZIG_VERSION }} @@ -89,9 +101,15 @@ jobs: cp zig-out/bin/vibeec ../../${{ matrix.binary_name }} chmod +x ../../${{ matrix.binary_name }} - - name: Test binary + # macos-14 is an arm64 runner, so only the aarch64 build is native here. + # The old version of this step ran unconditionally and swallowed the + # failure, which is how an x86_64 binary that cannot execute on this + # machine passed a "test binary" step on every release. + - name: Test binary (if native) run: | - ./${{ matrix.binary_name }} --version 2>/dev/null || echo "Version check failed but continuing" + if [[ "${{ matrix.target }}" == "aarch64-macos" ]]; then + ./${{ matrix.binary_name }} --version + fi - name: Upload artifact uses: actions/upload-artifact@v4 @@ -115,20 +133,24 @@ jobs: - name: List artifacts run: | - find . -type f -name "vibee-*" | xargs ls -la + find . -type f -name "vibeec-*" | xargs ls -la - name: Create checksums run: | - for f in vibee-*; do + for f in vibeec-*; do sha256sum "$f" > "$f.sha256" done - name: Create Release uses: softprops/action-gh-release@v2 with: + # The compiler is not the repository's headline artifact -- Binary + # Release is. Leaving this at the action's default (true) would make a + # compiler-v* tag the release users are offered on the front page. + make_latest: false files: | - vibee-* - vibee-*.sha256 + vibeec-* + vibeec-*.sha256 body: | ## VIBEE Compiler ${{ github.ref_name }} @@ -138,39 +160,43 @@ jobs: | Platform | Architecture | Binary | |----------|--------------|--------| - | Linux | x86_64 | `vibee-linux-x86_64` | - | Linux | ARM64 (aarch64) | `vibee-linux-aarch64` | - | macOS | x86_64 (Intel) | `vibee-macos-x86_64` | - | macOS | ARM64 (Apple Silicon) | `vibee-macos-arm64` | + | Linux | x86_64 | `vibeec-linux-x86_64` | + | Linux | ARM64 (aarch64) | `vibeec-linux-aarch64` | + | macOS | x86_64 (Intel) | `vibeec-macos-x86_64` | + | macOS | ARM64 (Apple Silicon) | `vibeec-macos-arm64` | + + This is `vibeec`, the compiler built from `src/vibeec`. It is not the + `vibee` binary shipped by Binary Release — that one comes from the + top-level build. The files used to be named `vibee-*` here, which + made two different programs look like one. ### Installation ```bash # Download appropriate binary - curl -LO https://github.com/gHashTag/vibee-lang/releases/download/${{ github.ref_name }}/vibee-linux-x86_64 + curl -LO https://github.com/gHashTag/trinity/releases/download/${{ github.ref_name }}/vibeec-linux-x86_64 # Make executable - chmod +x vibee-linux-x86_64 + chmod +x vibeec-linux-x86_64 # Move to PATH - sudo mv vibee-linux-x86_64 /usr/local/bin/vibee + sudo mv vibeec-linux-x86_64 /usr/local/bin/vibeec ``` ### Verification ```bash # Check SHA256 - sha256sum -c vibee-linux-x86_64.sha256 + sha256sum -c vibeec-linux-x86_64.sha256 # Test - vibee --version - vibee --help + vibeec --version + vibeec --help ``` ### Notes - All binaries built with `-Doptimize=ReleaseSafe` (safe for all CPUs) - - Zig 0.13.0 used for compilation - - Docker image also available: `ghcr.io/ghashtag/vibee` + - Compiled with Zig ${{ env.ZIG_VERSION }} **Golden Chain is closed. KOSCHEI is immortal.** draft: false diff --git a/.github/workflows/extension-release.yml b/.github/workflows/extension-release.yml index aadb8d920a..e1486c789a 100644 --- a/.github/workflows/extension-release.yml +++ b/.github/workflows/extension-release.yml @@ -1,5 +1,12 @@ # NeoDetect Extension Release Workflow # Triggers on extension-specific tags (ext-v*) to avoid conflicts with other releases +# +# Every path here used to point at a top-level directory that no longer exists. +# The tree moved under deploy/trinity-nexus/ and the workflow did not move with +# it, so each step after checkout was operating on a missing directory. The +# move also dropped both manifests and all six icons -- restored from ext-v2.0.0 +# in the same commit as this repoint, because a build that cannot find +# manifest.json produces a zip Chrome will not load. name: Extension Release @@ -38,7 +45,7 @@ jobs: echo "Building extension version: $VERSION" - name: Setup Zig - uses: goto-bus-stop/setup-zig@v2 + uses: mlugg/setup-zig@v2 with: version: 0.15.2 @@ -49,7 +56,7 @@ jobs: - name: Update version in package.json run: | - cd extension + cd deploy/trinity-nexus/extensions VERSION="${{ steps.version.outputs.version }}" jq ".version = \"$VERSION\"" package.json > tmp.json && mv tmp.json package.json cat package.json | grep version @@ -61,28 +68,28 @@ jobs: -O ReleaseFast \ -fno-entry \ -rdynamic \ - -femit-bin=extension/chrome/wasm/neodetect.wasm + -femit-bin=deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm - cp extension/chrome/wasm/neodetect.wasm extension/firefox/wasm/ + cp deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm deploy/trinity-nexus/extensions/firefox/wasm/ echo "WASM built:" - ls -la extension/chrome/wasm/neodetect.wasm + ls -la deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm - name: Update Chrome manifest version run: | - cd extension/chrome + cd deploy/trinity-nexus/extensions/chrome VERSION="${{ steps.version.outputs.version }}" jq ".version = \"$VERSION\"" manifest.json > tmp.json && mv tmp.json manifest.json - name: Update Firefox manifest version run: | - cd extension/firefox + cd deploy/trinity-nexus/extensions/firefox VERSION="${{ steps.version.outputs.version }}" jq ".version = \"$VERSION\"" manifest.json > tmp.json && mv tmp.json manifest.json - name: Sync Firefox files run: | - cd extension + cd deploy/trinity-nexus/extensions # Copy shared files cp chrome/icons/*.png firefox/icons/ cp chrome/wasm/neodetect-loader.js firefox/wasm/ @@ -96,7 +103,7 @@ jobs: - name: Package Chrome extension run: | - cd extension/chrome + cd deploy/trinity-nexus/extensions/chrome VERSION="${{ steps.version.outputs.version }}" zip -r ../neodetect-chrome-v${VERSION}.zip . \ -x "*.DS_Store" \ @@ -110,7 +117,7 @@ jobs: - name: Package Firefox extension run: | - cd extension/firefox + cd deploy/trinity-nexus/extensions/firefox VERSION="${{ steps.version.outputs.version }}" zip -r ../neodetect-firefox-v${VERSION}.zip . \ -x "*.DS_Store" \ @@ -126,13 +133,13 @@ jobs: uses: actions/upload-artifact@v4 with: name: neodetect-chrome - path: extension/neodetect-chrome-*.zip + path: deploy/trinity-nexus/extensions/neodetect-chrome-*.zip - name: Upload Firefox artifact uses: actions/upload-artifact@v4 with: name: neodetect-firefox - path: extension/neodetect-firefox-*.zip + path: deploy/trinity-nexus/extensions/neodetect-firefox-*.zip release: name: Create Release @@ -200,8 +207,8 @@ jobs: ### Links - - [Documentation](https://github.com/gHashTag/trinity/tree/main/extension) - - [Privacy Policy](https://github.com/gHashTag/trinity/blob/main/extension/chrome/PRIVACY_POLICY.md) + - [Documentation](https://github.com/gHashTag/trinity/tree/main/deploy/trinity-nexus/extensions) + - [Privacy Policy](https://github.com/gHashTag/trinity/blob/main/deploy/trinity-nexus/extensions/chrome/PRIVACY_POLICY.md) - [Source Code](https://github.com/gHashTag/trinity) --- @@ -211,12 +218,16 @@ jobs: cat release_notes.md - name: Create GitHub Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: name: NeoDetect v${{ needs.build.outputs.version }} body_path: release_notes.md draft: false prerelease: false + # The browser extension is a side artifact, not the repository's + # headline download. v2 defaults make_latest to true, which would put + # an ext-v* tag at the top of the releases page ahead of Trinity. + make_latest: false files: | ./artifacts/neodetect-chrome-*.zip ./artifacts/neodetect-firefox-*.zip diff --git a/.github/workflows/release-probe.yml b/.github/workflows/release-probe.yml index 80894fbd7d..fc263bf6fa 100644 --- a/.github/workflows/release-probe.yml +++ b/.github/workflows/release-probe.yml @@ -1,12 +1,16 @@ # Temporary instrument, deleted before this branch merges. # -# Two questions the release workflows cannot answer by reading: +# Three questions the release workflows cannot answer by reading: # 1. Does the default build step actually install `firebird`, or only -# tri + vibee? trinity-binary-release.yml copies it with a `[ -f ] || +# tri + vibee? trinity-binary-release.yml copied it with a `[ -f ] || # echo "not found"` guard, which is how that workflow shipped archives # nobody checked. # 2. What is the FULL error list for src/vibeec? Zig analyses lazily, so -# the four errors reported on the v10.1.1 tag are only the first wave. +# each fix exposes the next wave; the local toolchain is 0.16.0 and +# cannot stand in for 0.15.2. +# 3. Does Extension Release produce loadable zips now that its paths point +# at deploy/trinity-nexus/extensions and the manifests are back? A zip +# without manifest.json is a zip Chrome refuses to load. name: release probe on: @@ -40,6 +44,47 @@ jobs: - uses: mlugg/setup-zig@v2 with: version: ${{ env.ZIG_VERSION }} + # `| tail` would make the pipeline's status tail's, so the step could + # never report a failure. Capture, then decide on the captured text. - run: | cd src/vibeec - zig build -Doptimize=Debug 2>&1 | tail -120 + set +e + zig build -Doptimize=Debug > /tmp/vibeec.log 2>&1 + rc=$? + set -e + tail -150 /tmp/vibeec.log + echo "=== exit $rc, $(grep -c 'error:' /tmp/vibeec.log) error lines" + + extension: + name: extension packages end to end + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: mlugg/setup-zig@v2 + with: + version: ${{ env.ZIG_VERSION }} + - name: Build WASM module + run: | + zig build-exe src/firebird/neodetect_wasm.zig \ + -target wasm32-freestanding \ + -O ReleaseFast \ + -fno-entry \ + -rdynamic \ + -femit-bin=deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm + ls -la deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm + - name: Sync, package, and look inside the zips + run: | + cd deploy/trinity-nexus/extensions + cp chrome/wasm/neodetect.wasm firefox/wasm/ + cp chrome/icons/*.png firefox/icons/ + cp chrome/wasm/neodetect-loader.js firefox/wasm/ + cp chrome/popup/popup.html firefox/popup/ + sed 's/chrome\./browser./g' chrome/popup/popup.js > firefox/popup/popup.js + sed 's/chrome\./browser./g' chrome/content/content.js > firefox/content/content.js + (cd chrome && zip -qr ../probe-chrome.zip . -x "*.DS_Store" -x "*.md") + (cd firefox && zip -qr ../probe-firefox.zip . -x "*.DS_Store" -x "*.md") + echo "=== chrome zip"; unzip -l probe-chrome.zip + echo "=== firefox zip"; unzip -l probe-firefox.zip + # The one thing that decides whether these are installable. + unzip -p probe-chrome.zip manifest.json | jq -e '.manifest_version == 3' + unzip -p probe-firefox.zip manifest.json | jq -e '.manifest_version == 2' diff --git a/.gitignore b/.gitignore index bad690c296..6108be3f77 100644 --- a/.gitignore +++ b/.gitignore @@ -375,7 +375,12 @@ bindings/ contracts/ demo/ demos/ -extensions/ +# Anchored 2026-09-20, same defect as website/ below. Unanchored, `extensions/` +# matched deploy/trinity-nexus/extensions at depth 3 and silently swallowed both +# browser manifests and all six icons when that tree was moved there -- the 53 +# already-tracked files kept working, so nothing looked wrong, and Extension +# Release built zips with no manifest.json in them for months. +/extensions/ homebrew-tap/ install.sh k8s/ @@ -387,7 +392,10 @@ packages/ runtime/ translator-app/ tree-sitter-vibee/ -trinity-nexus/ +# Anchored for the same reason: it matched deploy/trinity-nexus, where 2988 +# files are tracked. No top-level trinity-nexus/ exists, so the rule was +# protecting nothing and hiding real source. +/trinity-nexus/ # website/ removed 2026-08-10: it matched apps/website at any depth and silently # excluded every NEW file in the site source, while already-tracked files kept working. # Build output is handled by apps/website/.gitignore (node_modules, dist). diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon128.png b/deploy/trinity-nexus/extensions/chrome/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..d39d91956bc021a9e2641c5b847ad0cc8b91a4e5 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSQJyZ2Ar-gY9%SSN@(wNd?w`xg fE&^my3_hf@X)rMUXFRAH4l>Kr)z4*}Q$iB}mVy+Q literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon128.svg b/deploy/trinity-nexus/extensions/chrome/icons/icon128.svg new file mode 100644 index 0000000000..19090853d7 --- /dev/null +++ b/deploy/trinity-nexus/extensions/chrome/icons/icon128.svg @@ -0,0 +1,4 @@ + + + 🔥 + diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon16.png b/deploy/trinity-nexus/extensions/chrome/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2bce4877e637acc426a2592eb1176ec58586cd GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar_~Tf1E$?VSXbJOl)j? zXwS^de7K&ijg5`1?LQ9>FAopTe@O``2?>dR#s&-wVeBmbB~MQU>SpkC^>bP0l+XkK DxKtf_ literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon16.svg b/deploy/trinity-nexus/extensions/chrome/icons/icon16.svg new file mode 100644 index 0000000000..ab781e69e4 --- /dev/null +++ b/deploy/trinity-nexus/extensions/chrome/icons/icon16.svg @@ -0,0 +1,4 @@ + + + 🔥 + diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon48.png b/deploy/trinity-nexus/extensions/chrome/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..4a52498c91c2ee353af250b3f4b4e994aa3cf3e7 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCH%}MGkc@k8&ogo|FmNz0Sik?p l%Y*E4o(`quBmj1P25|$1|BMG!!+~Zpc)I$ztaD0e0sv5cDQ5rx literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/chrome/icons/icon48.svg b/deploy/trinity-nexus/extensions/chrome/icons/icon48.svg new file mode 100644 index 0000000000..465a934546 --- /dev/null +++ b/deploy/trinity-nexus/extensions/chrome/icons/icon48.svg @@ -0,0 +1,4 @@ + + + 🔥 + diff --git a/deploy/trinity-nexus/extensions/chrome/manifest.json b/deploy/trinity-nexus/extensions/chrome/manifest.json new file mode 100644 index 0000000000..f2b5a3849e --- /dev/null +++ b/deploy/trinity-nexus/extensions/chrome/manifest.json @@ -0,0 +1,58 @@ +{ + "manifest_version": 3, + "name": "NeoDetect Anti-Detect", + "version": "2.0.0", + "description": "Advanced antidetect browser with WASM-powered fingerprint protection. Canvas, WebGL, Audio, Navigator spoofing. Cross-OS emulation.", + "homepage_url": "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/gHashTag/trinity", + + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + }, + + "action": { + "default_popup": "popup/popup.html", + "default_icon": { + "16": "icons/icon16.png", + "48": "icons/icon48.png" + }, + "default_title": "NeoDetect" + }, + + "background": { + "service_worker": "background/service-worker.js", + "type": "module" + }, + + "content_scripts": [ + { + "matches": [""], + "js": ["content/content.js"], + "run_at": "document_start", + "all_frames": true + } + ], + + "permissions": [ + "storage", + "activeTab", + "scripting", + "alarms" + ], + + "host_permissions": [ + "" + ], + + "web_accessible_resources": [ + { + "resources": ["wasm/*", "wasm/neodetect.wasm", "wasm/neodetect-loader.js", "content/inject.js"], + "matches": [""] + } + ], + + "content_security_policy": { + "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" + } +} diff --git a/deploy/trinity-nexus/extensions/firefox/icons/icon128.png b/deploy/trinity-nexus/extensions/firefox/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..d39d91956bc021a9e2641c5b847ad0cc8b91a4e5 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSQJyZ2Ar-gY9%SSN@(wNd?w`xg fE&^my3_hf@X)rMUXFRAH4l>Kr)z4*}Q$iB}mVy+Q literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/firefox/icons/icon16.png b/deploy/trinity-nexus/extensions/firefox/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2bce4877e637acc426a2592eb1176ec58586cd GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MxHK?Ar_~Tf1E$?VSXbJOl)j? zXwS^de7K&ijg5`1?LQ9>FAopTe@O``2?>dR#s&-wVeBmbB~MQU>SpkC^>bP0l+XkK DxKtf_ literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/firefox/icons/icon48.png b/deploy/trinity-nexus/extensions/firefox/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..4a52498c91c2ee353af250b3f4b4e994aa3cf3e7 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCH%}MGkc@k8&ogo|FmNz0Sik?p l%Y*E4o(`quBmj1P25|$1|BMG!!+~Zpc)I$ztaD0e0sv5cDQ5rx literal 0 HcmV?d00001 diff --git a/deploy/trinity-nexus/extensions/firefox/manifest.json b/deploy/trinity-nexus/extensions/firefox/manifest.json new file mode 100644 index 0000000000..82ec800202 --- /dev/null +++ b/deploy/trinity-nexus/extensions/firefox/manifest.json @@ -0,0 +1,59 @@ +{ + "manifest_version": 2, + "name": "NeoDetect Anti-Detect", + "version": "2.0.0", + "description": "Advanced antidetect browser with WASM-powered fingerprint protection. Canvas, WebGL, Audio, Navigator spoofing. Cross-OS emulation.", + "homepage_url": "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/gHashTag/trinity", + + "browser_specific_settings": { + "gecko": { + "id": "neodetect@trinity.dev", + "strict_min_version": "109.0" + } + }, + + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + }, + + "browser_action": { + "default_popup": "popup/popup.html", + "default_icon": { + "16": "icons/icon16.png", + "48": "icons/icon48.png" + }, + "default_title": "NeoDetect" + }, + + "background": { + "scripts": ["background/background.js"], + "persistent": false + }, + + "content_scripts": [ + { + "matches": [""], + "js": ["content/content.js"], + "run_at": "document_start", + "all_frames": true + } + ], + + "permissions": [ + "storage", + "activeTab", + "", + "alarms" + ], + + "web_accessible_resources": [ + "wasm/*", + "wasm/neodetect.wasm", + "wasm/neodetect-loader.js", + "content/inject.js" + ], + + "content_security_policy": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'" +} From 5ff98021bf9934d865217501c38ce3a841ec4bb5 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:54:33 +0700 Subject: [PATCH 06/10] port(vibeec): every Writergate site at once, not one per CI round Round two reported exactly one error -- compiler.zig:186 -- because zig analyses lazily and each fix only exposes the next unreferenced body. Fixing them one at a time costs a full CI cycle per line, and the tree has forty of them. They are all the same mechanical substitution, so they all move together: std.io.getStdOut().writer() -> std.fs.File.stdout().deprecatedWriter() std.io.getStdErr().writer() -> std.fs.File.stderr().deprecatedWriter() std.io.getStdIn().reader() -> std.fs.File.stdin().deprecatedReader() std.io.getStdOut() -> std.fs.File.stdout() deprecatedWriter returns the old GenericWriter, so `.any()` and `.print()` keep working and nothing downstream has to change -- compiler.zig:186 hands its result straight to ColorWriter.init as an AnyWriter. igla_local_coder.zig:84 is left alone on purpose. That line is inside a `\\` string literal: it is Zig source this file EMITS, not Zig source it compiles. Rewriting it would change the generator's output, which is a separate question from making this build. Also, keeping the promise from the trinity-binary-release deletion: the probe shows `zig build -Dci=true` installs firebird unconditionally alongside tri and vibee -- 3.1 MB, present in zig-out/bin on a clean Linux run. It is now in all five archive steps and named in the release notes, so the one thing the deleted workflow shipped that release.yml did not is no longer lost. Co-Authored-By: Claude Opus 5 --- .github/workflows/release.yml | 24 ++++++++++------ src/vibeec/benchmark.zig | 2 +- src/vibeec/benchmark_ternary_vs_binary.zig | 2 +- src/vibeec/benchmark_trinity.zig | 2 +- src/vibeec/chrome_headless_demo.zig | 4 +-- src/vibeec/chrome_integration_test.zig | 4 +-- src/vibeec/cli.zig | 2 +- src/vibeec/competitive_repl.zig | 4 +-- src/vibeec/compiler.zig | 32 +++++++++++----------- src/vibeec/e2e_test.zig | 2 +- src/vibeec/error_reporter.zig | 2 +- src/vibeec/full_matrix_benchmark.zig | 2 +- src/vibeec/repl.zig | 4 +-- src/vibeec/repl_agent.zig | 4 +-- src/vibeec/repl_main.zig | 4 +-- src/vibeec/simd_vectorizer.zig | 2 +- src/vibeec/universal_varlog_gen.zig | 2 +- src/vibeec/validator_engine.zig | 2 +- src/vibeec/varlog_batch_gen.zig | 2 +- src/vibeec/vibee_benchmark.zig | 2 +- 20 files changed, 55 insertions(+), 49 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f58a633116..8287877ca6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,8 +42,9 @@ jobs: mkdir -p release cp zig-out/bin/tri release/tri-linux-amd64 cp zig-out/bin/vibee release/vibee-linux-amd64 - chmod +x release/tri-linux-amd64 release/vibee-linux-amd64 - tar czf trinity-linux-amd64.tar.gz -C release tri-linux-amd64 vibee-linux-amd64 + cp zig-out/bin/firebird release/firebird-linux-amd64 + chmod +x release/tri-linux-amd64 release/vibee-linux-amd64 release/firebird-linux-amd64 + tar czf trinity-linux-amd64.tar.gz -C release tri-linux-amd64 vibee-linux-amd64 firebird-linux-amd64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -74,8 +75,9 @@ jobs: mkdir -p release cp zig-out/bin/tri release/tri-linux-arm64 cp zig-out/bin/vibee release/vibee-linux-arm64 - chmod +x release/tri-linux-arm64 release/vibee-linux-arm64 - tar czf trinity-linux-arm64.tar.gz -C release tri-linux-arm64 vibee-linux-arm64 + cp zig-out/bin/firebird release/firebird-linux-arm64 + chmod +x release/tri-linux-arm64 release/vibee-linux-arm64 release/firebird-linux-arm64 + tar czf trinity-linux-arm64.tar.gz -C release tri-linux-arm64 vibee-linux-arm64 firebird-linux-arm64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -111,8 +113,9 @@ jobs: mkdir -p release cp zig-out/bin/tri release/tri-macos-amd64 cp zig-out/bin/vibee release/vibee-macos-amd64 - chmod +x release/tri-macos-amd64 release/vibee-macos-amd64 - tar czf trinity-macos-amd64.tar.gz -C release tri-macos-amd64 vibee-macos-amd64 + cp zig-out/bin/firebird release/firebird-macos-amd64 + chmod +x release/tri-macos-amd64 release/vibee-macos-amd64 release/firebird-macos-amd64 + tar czf trinity-macos-amd64.tar.gz -C release tri-macos-amd64 vibee-macos-amd64 firebird-macos-amd64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -149,8 +152,9 @@ jobs: mkdir -p release cp zig-out/bin/tri release/tri-macos-arm64 cp zig-out/bin/vibee release/vibee-macos-arm64 - chmod +x release/tri-macos-arm64 release/vibee-macos-arm64 - tar czf trinity-macos-arm64.tar.gz -C release tri-macos-arm64 vibee-macos-arm64 + cp zig-out/bin/firebird release/firebird-macos-arm64 + chmod +x release/tri-macos-arm64 release/vibee-macos-arm64 release/firebird-macos-arm64 + tar czf trinity-macos-arm64.tar.gz -C release tri-macos-arm64 vibee-macos-arm64 firebird-macos-arm64 - name: Upload artifact uses: actions/upload-artifact@v4 @@ -192,7 +196,8 @@ jobs: mkdir -p release cp zig-out/bin/tri.exe release/tri-windows-amd64.exe cp zig-out/bin/vibee.exe release/vibee-windows-amd64.exe - zip trinity-windows-amd64.zip release/tri-windows-amd64.exe release/vibee-windows-amd64.exe + cp zig-out/bin/firebird.exe release/firebird-windows-amd64.exe + zip trinity-windows-amd64.zip release/tri-windows-amd64.exe release/vibee-windows-amd64.exe release/firebird-windows-amd64.exe - name: Upload artifact uses: actions/upload-artifact@v4 @@ -293,6 +298,7 @@ jobs: - **TRI** - Unified Trinity CLI (chat, code, pipeline, all commands) - **VIBEE** - VIBEE compiler (spec → Zig/Verilog) + - **FIREBIRD** - Firebird CLI (`src/firebird`, built ReleaseFast) ### Documentation diff --git a/src/vibeec/benchmark.zig b/src/vibeec/benchmark.zig index 6ef34ef0d5..8323818cee 100644 --- a/src/vibeec/benchmark.zig +++ b/src/vibeec/benchmark.zig @@ -7,7 +7,7 @@ const json_parser = @import("json_parser.zig"); const simd_json = @import("simd_json.zig"); pub fn main() !void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print("\n", .{}); try stdout.print("╔══════════════════════════════════════════════════════════════════╗\n", .{}); diff --git a/src/vibeec/benchmark_ternary_vs_binary.zig b/src/vibeec/benchmark_ternary_vs_binary.zig index 1c480153c1..51e6019631 100644 --- a/src/vibeec/benchmark_ternary_vs_binary.zig +++ b/src/vibeec/benchmark_ternary_vs_binary.zig @@ -150,7 +150,7 @@ fn benchmark(comptime name: []const u8, comptime func: anytype) u64 { // ═══════════════════════════════════════════════════════════════════════════════ pub fn main() !void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print("\n", .{}); try stdout.print("═══════════════════════════════════════════════════════════════════════════════\n", .{}); diff --git a/src/vibeec/benchmark_trinity.zig b/src/vibeec/benchmark_trinity.zig index 8e25936001..6283499148 100644 --- a/src/vibeec/benchmark_trinity.zig +++ b/src/vibeec/benchmark_trinity.zig @@ -262,6 +262,6 @@ test "golden identity" { } pub fn main() !void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try generateComparisonTable(stdout); } diff --git a/src/vibeec/chrome_headless_demo.zig b/src/vibeec/chrome_headless_demo.zig index 9335900ac6..f118b2e742 100644 --- a/src/vibeec/chrome_headless_demo.zig +++ b/src/vibeec/chrome_headless_demo.zig @@ -6,8 +6,8 @@ const std = @import("std"); const chrome_launcher = @import("chrome_launcher.zig"); pub fn main() !void { - const stdout = std.io.getStdOut().writer(); - const stderr = std.io.getStdErr().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); + const stderr = std.fs.File.stderr().deprecatedWriter(); const allocator = std.heap.page_allocator; diff --git a/src/vibeec/chrome_integration_test.zig b/src/vibeec/chrome_integration_test.zig index 791fcbb969..22598ab6ca 100644 --- a/src/vibeec/chrome_integration_test.zig +++ b/src/vibeec/chrome_integration_test.zig @@ -6,8 +6,8 @@ const std = @import("std"); const chrome_launcher = @import("chrome_launcher.zig"); pub fn main() !void { - const stdout = std.io.getStdOut().writer(); - const stderr = std.io.getStdErr().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); + const stderr = std.fs.File.stderr().deprecatedWriter(); const allocator = std.heap.page_allocator; diff --git a/src/vibeec/cli.zig b/src/vibeec/cli.zig index 21aa176543..40b0a13bbc 100644 --- a/src/vibeec/cli.zig +++ b/src/vibeec/cli.zig @@ -73,7 +73,7 @@ pub const CLI = struct { const Self = @This(); pub fn init(allocator: Allocator, force_color: ?bool) Self { - const stdout = std.io.getStdOut(); + const stdout = std.fs.File.stdout(); return Self{ .allocator = allocator, .writer = ColorWriter.init(stdout.writer().any(), force_color), diff --git a/src/vibeec/competitive_repl.zig b/src/vibeec/competitive_repl.zig index 046c79c666..35d24c1b8b 100644 --- a/src/vibeec/competitive_repl.zig +++ b/src/vibeec/competitive_repl.zig @@ -148,8 +148,8 @@ pub const CompetitiveRepl = struct { /// Main REPL loop pub fn run(self: *Self) !void { - const stdin = std.io.getStdIn().reader(); - const stdout = std.io.getStdOut().writer(); + const stdin = std.fs.File.stdin().deprecatedReader(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try self.printBanner(stdout); diff --git a/src/vibeec/compiler.zig b/src/vibeec/compiler.zig index de3f19395a..138f9ba930 100644 --- a/src/vibeec/compiler.zig +++ b/src/vibeec/compiler.zig @@ -183,7 +183,7 @@ pub const Compiler = struct { // Phase 1: Parse const parse_start = std.time.nanoTimestamp(); var spec = self.parser.parse(source) catch |err| { - var writer = error_reporter.ColorWriter.init(std.io.getStdOut().writer().any(), true); + var writer = error_reporter.ColorWriter.init(std.fs.File.stdout().deprecatedWriter().any(), true); try writer.printColored(.red, "Parse error: {}\n", .{err}); try writer.printColored(.yellow, " Run './bin/vibeec validate ' for detailed validation\n", .{}); return CompileResult{ @@ -204,7 +204,7 @@ pub const Compiler = struct { if (self.options.enable_type_check) { const tc_start = std.time.nanoTimestamp(); var tc_result = self.type_checker.check(&spec) catch |err| { - const stderr = std.io.getStdErr().writer(); + const stderr = std.fs.File.stderr().deprecatedWriter(); var writer = error_reporter.ColorWriter.init(stderr.any(), true); try writer.printColored(.red, "Type check error: {}\n", .{err}); try writer.printColored(.yellow, " Run './bin/vibeec gen --no-type-check' to skip\n", .{}); @@ -226,7 +226,7 @@ pub const Compiler = struct { if (!tc_result.success) { metrics.error_count = @intCast(tc_result.errors.items.len); - const stderr = std.io.getStdErr().writer(); + const stderr = std.fs.File.stderr().deprecatedWriter(); var writer = error_reporter.ColorWriter.init(stderr.any(), true); try writer.printColored(.red, "Type check failed: {} errors\n", .{tc_result.errors.items.len}); try writer.printColored(.yellow, " Suggestion: Use '--no-type-check' for complex nested structures\n", .{}); @@ -236,7 +236,7 @@ pub const Compiler = struct { // Phase 3: Code Generation const cg_start = std.time.nanoTimestamp(); var cg = CodegenV4.init(self.allocator, self.options.target) catch |err| { - var writer = error_reporter.ColorWriter.init(std.io.getStdOut().writer().any(), true); + var writer = error_reporter.ColorWriter.init(std.fs.File.stdout().deprecatedWriter().any(), true); try writer.printColored(.red, "Codegen init error: {}\n", .{err}); return CompileResult{ .success = false, @@ -251,7 +251,7 @@ pub const Compiler = struct { defer cg.deinit(); const gen_result = cg.generate(&spec) catch |err| { - var writer = error_reporter.ColorWriter.init(std.io.getStdOut().writer().any(), true); + var writer = error_reporter.ColorWriter.init(std.fs.File.stdout().deprecatedWriter().any(), true); try writer.printColored(.red, "Codegen generate error: {}\n", .{err}); try writer.printColored(.yellow, " Suggestion: Check specification syntax and required fields\n", .{}); return CompileResult{ @@ -390,7 +390,7 @@ pub fn main() !u8 { defer @constCast(&result).deinit(); if (result.success) { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print("✓ Compiled {s} successfully\n", .{input_path}); // Write output files @@ -425,7 +425,7 @@ pub fn main() !u8 { } return 0; } else { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); var writer = error_reporter.ColorWriter.init(stdout.any(), true); try writer.printColored(.red, "✗ Failed to compile {s}\n", .{input_path}); @@ -521,7 +521,7 @@ fn printVersion() void { } fn printPASInfo() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\ \\ PAS DAEMONS - Predictive Algorithmic Systematics @@ -548,7 +548,7 @@ fn printPhiInfo() void { const inv_phi_sq = 1.0 / phi_sq; const golden = phi_sq + inv_phi_sq; - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\ \\ SACRED CONSTANTS @@ -563,7 +563,7 @@ fn printPhiInfo() void { } fn evalTernary(expr: []const u8) void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\ \\ TERNARY EVAL: {s} @@ -581,7 +581,7 @@ fn evalTernary(expr: []const u8) void { } fn printAgentStatus() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); // Check API keys const anthropic_key = std.posix.getenv("ANTHROPIC_API_KEY"); @@ -627,7 +627,7 @@ fn printAgentStatus() void { } fn printConfig() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); const anthropic_key = std.posix.getenv("ANTHROPIC_API_KEY"); const openai_key = std.posix.getenv("OPENAI_API_KEY"); @@ -678,8 +678,8 @@ fn printConfig() void { fn runChat(allocator: std.mem.Allocator) !u8 { _ = allocator; - const stdout = std.io.getStdOut().writer(); - const stdin = std.io.getStdIn().reader(); + const stdout = std.fs.File.stdout().deprecatedWriter(); + const stdin = std.fs.File.stdin().deprecatedReader(); // Check for API keys const anthropic_key = std.posix.getenv("ANTHROPIC_API_KEY"); @@ -805,7 +805,7 @@ fn runChat(allocator: std.mem.Allocator) !u8 { } fn printChatHelp() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print( \\ \\ CHAT COMMANDS @@ -844,7 +844,7 @@ fn launchAgent(allocator: std.mem.Allocator, args: []const []const u8) !u8 { child.stderr_behavior = .Inherit; _ = child.spawnAndWait() catch |err| { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print("Failed to launch agent: {}\n", .{err}) catch {}; stdout.print("\nRun directly: ./bin/vibee-agent\n", .{}) catch {}; return 1; diff --git a/src/vibeec/e2e_test.zig b/src/vibeec/e2e_test.zig index ba8e05f7c4..e0feab9fc0 100644 --- a/src/vibeec/e2e_test.zig +++ b/src/vibeec/e2e_test.zig @@ -601,7 +601,7 @@ pub const E2ETestSuite = struct { /// Print results pub fn printResults(self: *Self) void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print("\n", .{}) catch {}; stdout.print("╔══════════════════════════════════════════════════════════════════╗\n", .{}) catch {}; diff --git a/src/vibeec/error_reporter.zig b/src/vibeec/error_reporter.zig index 952fdc6026..ec8ddcbb67 100644 --- a/src/vibeec/error_reporter.zig +++ b/src/vibeec/error_reporter.zig @@ -78,7 +78,7 @@ pub const ColorWriter = struct { fn detectTty() bool { // Check if stdout is a TTY - const stdout = std.io.getStdOut(); + const stdout = std.fs.File.stdout(); return std.io.tty.detectConfig(stdout) != .no_color; } diff --git a/src/vibeec/full_matrix_benchmark.zig b/src/vibeec/full_matrix_benchmark.zig index 0a975b9d11..dec0c21024 100644 --- a/src/vibeec/full_matrix_benchmark.zig +++ b/src/vibeec/full_matrix_benchmark.zig @@ -117,7 +117,7 @@ pub fn main() !void { defer _ = gpa.deinit(); const allocator = gpa.allocator(); - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.writeAll("\n"); try stdout.writeAll("═══════════════════════════════════════════════════════════════════════════════\n"); diff --git a/src/vibeec/repl.zig b/src/vibeec/repl.zig index 637aba9c09..5e4066529d 100644 --- a/src/vibeec/repl.zig +++ b/src/vibeec/repl.zig @@ -127,7 +127,7 @@ pub const REPL = struct { const Self = @This(); pub fn init(allocator: Allocator, force_color: ?bool) Self { - const stdout = std.io.getStdOut().writer().any(); + const stdout = std.fs.File.stdout().deprecatedWriter().any(); return Self{ .allocator = allocator, .writer = ColorWriter.init(stdout, force_color), @@ -148,7 +148,7 @@ pub const REPL = struct { try self.printBanner(); - const stdin = std.io.getStdIn().reader(); + const stdin = std.fs.File.stdin().deprecatedReader(); var buf: [4096]u8 = undefined; while (self.running) { diff --git a/src/vibeec/repl_agent.zig b/src/vibeec/repl_agent.zig index 82458bed2a..8100b94800 100644 --- a/src/vibeec/repl_agent.zig +++ b/src/vibeec/repl_agent.zig @@ -88,8 +88,8 @@ pub const ReplAgent = struct { /// Main REPL loop pub fn run(self: *Self) !void { - const stdin = std.io.getStdIn().reader(); - const stdout = std.io.getStdOut().writer(); + const stdin = std.fs.File.stdin().deprecatedReader(); + const stdout = std.fs.File.stdout().deprecatedWriter(); // Welcome banner try stdout.print("\n", .{}); diff --git a/src/vibeec/repl_main.zig b/src/vibeec/repl_main.zig index 87e4e535fe..692c566d8f 100644 --- a/src/vibeec/repl_main.zig +++ b/src/vibeec/repl_main.zig @@ -25,8 +25,8 @@ pub fn main() !void { defer _ = gpa.deinit(); const allocator = gpa.allocator(); - const stdout = std.io.getStdOut().writer(); - const stdin = std.io.getStdIn().reader(); + const stdout = std.fs.File.stdout().deprecatedWriter(); + const stdin = std.fs.File.stdin().deprecatedReader(); // Banner try stdout.print( diff --git a/src/vibeec/simd_vectorizer.zig b/src/vibeec/simd_vectorizer.zig index 1c66d530a4..af21fc3647 100644 --- a/src/vibeec/simd_vectorizer.zig +++ b/src/vibeec/simd_vectorizer.zig @@ -272,7 +272,7 @@ pub const VectorizedArrayOps = struct { // ═══════════════════════════════════════════════════════════════════════════════ pub fn runBenchmark() void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); stdout.print("\n", .{}) catch {}; stdout.print("═══════════════════════════════════════════════════════════════════════════════\n", .{}) catch {}; diff --git a/src/vibeec/universal_varlog_gen.zig b/src/vibeec/universal_varlog_gen.zig index e4ad9b279a..2ae7cf59c0 100644 --- a/src/vibeec/universal_varlog_gen.zig +++ b/src/vibeec/universal_varlog_gen.zig @@ -444,7 +444,7 @@ pub fn main() !void { const specs_dir = if (args.len > 1) args[1] else "specs/tri"; const output_dir = if (args.len > 2) args[2] else "trinity/varlog"; - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print( \\ diff --git a/src/vibeec/validator_engine.zig b/src/vibeec/validator_engine.zig index a0631ac6cc..d65908a62e 100644 --- a/src/vibeec/validator_engine.zig +++ b/src/vibeec/validator_engine.zig @@ -90,7 +90,7 @@ pub const ValidatorEngine = struct { pub fn printReport(self: *const ValidatorEngine, report: *const ValidatorReport, spec_path: []const u8) !void { _ = self; - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print("╔══════════════════════════════════════════════════════════════════════════╗\n", .{}); try stdout.print("║ VIBEE VALIDATION REPORT ║\n", .{}); diff --git a/src/vibeec/varlog_batch_gen.zig b/src/vibeec/varlog_batch_gen.zig index 7d8041f123..54d2ca5d7f 100644 --- a/src/vibeec/varlog_batch_gen.zig +++ b/src/vibeec/varlog_batch_gen.zig @@ -161,7 +161,7 @@ pub fn main() !void { const specs_dir = if (args.len > 1) args[1] else "specs/tri"; const output_dir = if (args.len > 2) args[2] else "trinity/varlog"; - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print( \\ diff --git a/src/vibeec/vibee_benchmark.zig b/src/vibeec/vibee_benchmark.zig index a0baefda5b..6d6b8f561f 100644 --- a/src/vibeec/vibee_benchmark.zig +++ b/src/vibeec/vibee_benchmark.zig @@ -37,7 +37,7 @@ const V12_METRICS = VersionMetrics{ }; pub fn main() !void { - const stdout = std.io.getStdOut().writer(); + const stdout = std.fs.File.stdout().deprecatedWriter(); try stdout.print("\n", .{}); try stdout.print("╔══════════════════════════════════════════════════════════════════╗\n", .{}); From 22cd8ec3f0bbc7b1c41cc4363d0c334c378c19de Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 20:59:51 +0700 Subject: [PATCH 07/10] ci: the enforcement workflow has never run a step GitHub could not parse dev-enforcement.yml. `steps:` was indented one level too deep, under `if:`, so the pr-status job had no steps key. An unschedulable workflow is reported as a failed run with an empty jobs array and the file path where the workflow name should be -- which is exactly what every run since c523c41b0 looks like, on every branch, including branches this work never touched. `gh run view --log-failed` returns nothing because no job ever started. So the "Phase 4 CI enforcement" added in #357 has enforced nothing for its entire life. Fixing the indentation is one line; what the three jobs would then do is the actual question, and two of them answer it badly. session-check is removed. It read .trinity/dev_session.json, a committed snapshot of one developer's local session, currently {"state":"COMMITTED","issue_id":503,...}. The job queried `.issue_number`, which does not exist in that file, so its "no active issue" guard compared the string "null" against "0" and passed. It would have judged every pull request by a file that does not change with the pull request -- green by accident rather than green by absence, which is not an improvement. ci-check is replaced by title-check. The original ran `git log -1` with no checkout step, in an empty directory; even with one, HEAD on a pull_request event is a synthetic merge commit whose subject is "Merge ... into ...". Its regex `^\[a-f]+\((feat|fix|...)\(` requires a literal `[`, then `a-f`, then parens around the type, and matches no conventional commit that has ever been written. `$COMMIT` was never assigned, so the issue-ID branch tested an empty string and took `exit 1` every time. The replacement checks the pull request title, and warns rather than fails. That is a measurement, not timidity: 105 of the last 120 merged pull requests match the pattern and 15 do not, and the 15 are Russian-language prose titles and `README:` prefixes -- a different convention, not malformed input. Making this blocking would reject 12.5% of the repository's own recent history under a rule nobody has agreed to, so the switch is left as a documented one-line change for whoever decides to agree to it. The title reaches the script through env, never through ${{ }} interpolation, so a pull request titled `$(...)` does not run on the runner. pr-status now works. The labels it wants -- status:in-progress, status:completed -- do exist in this repository, so the job was only ever missing `permissions: pull-requests: write`, a GH_TOKEN, and a PR number. Its second step tested for action 'closed' while the workflow listened only for [opened, synchronize], so the label could be applied and never removed; 'closed' is now a trigger and there is a third step for a close without a merge. The job is continue-on-error because labelling is cosmetic and must not stand between a change and its merge, and because a fork pull request gets a read-only token no matter what permissions asks for. Co-Authored-By: Claude Opus 5 --- .github/workflows/dev-enforcement.yml | 135 +++++++++++++++++--------- 1 file changed, 87 insertions(+), 48 deletions(-) diff --git a/.github/workflows/dev-enforcement.yml b/.github/workflows/dev-enforcement.yml index 4f0ae6ceaf..7f48a5f9f3 100644 --- a/.github/workflows/dev-enforcement.yml +++ b/.github/workflows/dev-enforcement.yml @@ -1,62 +1,101 @@ +# Dev Workflow Enforcement +# +# This file has never run a single job. GitHub could not parse it: `steps:` was +# indented under `if:` at what used to be line 54, so `pr-status` had no steps +# key, and an unschedulable workflow is reported as a failed run with an empty +# jobs array and the file path where the name should be. Every branch, every +# push, since c523c41b0. "CI enforcement" that has never executed a step is +# green by absence. +# +# Two of the three jobs were also wrong in ways parsing would not have fixed: +# +# session-check read .trinity/dev_session.json -- a committed snapshot of one +# developer's local session. It holds {"state":"COMMITTED","issue_id":503}, +# while the job queried `.issue_number`, which is null there. So it passed on +# a null, judging every pull request by a file that does not change with the +# pull request. Removed rather than repaired: there is nothing in a local +# session file that describes the branch under test. +# +# ci-check ran `git log -1` with no actions/checkout step, in an empty +# directory. On a pull_request event HEAD is a synthetic merge commit whose +# subject is "Merge ... into ...", so even with a checkout the regex could +# not match. The regex itself was `^\[a-f]+\((feat|fix|...)\(` -- a literal +# `[`, then `a-f`, then parentheses around the type -- which no conventional +# commit has ever matched. And `$COMMIT` was never assigned, so the issue-ID +# branch tested an empty string and took `exit 1` unconditionally. + name: Dev Workflow Enforcement + +# push: [main] is gone with session-check. Every remaining job describes a pull +# request, and there is no pull request on a push. on: pull_request: - types: [opened, synchronize] - push: - branches: [main] + types: [opened, synchronize, closed] jobs: - ci-check: - name: CI Validation + title-check: + name: PR Title Format runs-on: ubuntu-latest + if: github.event.action != 'closed' steps: - - name: Validate Commit Format + # The title is attacker-controlled text. It goes through env, never + # through ${{ }} interpolation into the script body, or a pull request + # named `$(...)` would run that command on the runner. + - name: Validate PR title format + env: + PR_TITLE: ${{ github.event.pull_request.title }} run: | - git log -1 --format=%s | grep -E '^\[a-f]+\((feat|fix|refactor|docs|chore|test|ci)\([^)]+\):' | head -1 - if [[ $(echo "$COMMIT" | grep -oE '(ISSUE-|#)[0-9]+') ]]; then - echo "✅ Valid issue ID format" - else - echo "❌ Missing issue ID (format: feat(scope): description (#123) or fix(scope): description (ISSUE-123))" - exit 1 + set -u + pattern='^(feat|fix|docs|ci|chore|test|refactor|perf|build|style|revert|port|deps|site|website)(\([^)]+\))?!?: .+' + if printf '%s' "$PR_TITLE" | grep -qE "$pattern"; then + echo "OK: $PR_TITLE" + exit 0 fi + echo "Title does not match ${pattern}" + echo " $PR_TITLE" + echo + echo "This is a WARNING, not a failure, and the reason is measured:" + echo "105 of the last 120 merged pull requests match this pattern and" + echo "15 do not -- mostly Russian-language prose titles and 'README:'" + echo "prefixes. Those are a different convention, not malformed input," + echo "and failing them would reject 12.5% of this repository's own" + echo "recent history on a rule nobody has agreed to. To make it" + echo "binding, replace the line below with 'exit 1'." + exit 0 - session-check: - name: Verify Dev Session State + pr-status: + name: Update PR Status runs-on: ubuntu-latest + permissions: + pull-requests: write + # Labelling is cosmetic and must never stand between a change and its + # merge. It also cannot work for a pull request opened from a fork: those + # get a read-only GITHUB_TOKEN no matter what `permissions:` asks for. + continue-on-error: true steps: - - name: Check session state before commit - run: | - if [ ! -f .trinity/dev_session.json ]; then - echo "❌ No dev session found" - exit 1 - fi + - name: Mark in progress + if: github.event.action == 'opened' || github.event.action == 'synchronize' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --add-label "status:in-progress" - STATE=$(jq -r '.state' .trinity/dev_session.json 2>/dev/null || echo "IDLE") - ISSUE=$(jq -r '.issue_number' .trinity/dev_session.json 2>/dev/null || echo "0") - - if [ "$STATE" != "TESTED" ] && [ "$STATE" != "COMMITTED" ]; then - echo "❌ Invalid state: $STATE (must be TESTED or COMMITTED)" - echo " Run: tri dev test to pass tests" - exit 1 - fi - - if [ "$ISSUE" = "0" ]; then - echo "❌ No active issue" - exit 1 - fi - - echo "✅ Session state valid: $STATE for issue #$ISSUE" + # This step existed before and could never fire: it tested for action + # 'closed' while the workflow only listened for [opened, synchronize]. + # 'closed' is now in the trigger list, so the label finally comes off. + - name: Mark completed on merge + if: github.event.action == 'closed' && github.event.pull_request.merged == true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" \ + --remove-label "status:in-progress" \ + --add-label "status:completed" - pr-status: - name: Update PR Status - runs-on: ubuntu-latest - if: github.event_name == 'pull_request' - steps: - - name: Add in-progress label - run: | - gh pr edit "$PR_NUMBER" --add-label "status:in-progress" - - name: Update to done when merged - if: github.event.action == 'closed' && github.event.pull_request.merged == true - run: | - gh pr edit "$PR_NUMBER" --remove-label "status:in-progress" - gh pr edit "$PR_NUMBER" --add-label "status:completed" + - name: Drop in-progress on a close without merge + if: github.event.action == 'closed' && github.event.pull_request.merged != true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: gh pr edit "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --remove-label "status:in-progress" From 1b496806c6088787246b58ab15477802edcb2688 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 21:00:02 +0700 Subject: [PATCH 08/10] ci: retire the probe, now that it has answered all three questions It existed to measure what could not be read, and each answer is now a line of committed code rather than a claim: 1. `zig build -Dci=true` installs firebird unconditionally -- 3.1 MB in zig-out/bin on a clean Linux runner, alongside tri and vibee and 45 others. firebird is in all five archive steps of release.yml because of that run, not because trinity-binary-release.yml used to copy it behind a `[ -f ] || echo "not found"` guard. 2. src/vibeec reported one error per round, because zig analyses lazily and each fix only exposes the next unreferenced body. That is what turned a forty-site mechanical port into a forty-cycle CI loop, and why the whole migration went in at once instead. 3. The extension packages end to end at its new paths: the WASM module builds, both zips assemble, and manifest_version reads back as 3 from the Chrome archive and 2 from the Firefox one -- asserted with `jq -e` inside the probe, so a zip with no manifest in it could not have passed. Co-Authored-By: Claude Opus 5 --- .github/workflows/release-probe.yml | 90 ----------------------------- 1 file changed, 90 deletions(-) delete mode 100644 .github/workflows/release-probe.yml diff --git a/.github/workflows/release-probe.yml b/.github/workflows/release-probe.yml deleted file mode 100644 index fc263bf6fa..0000000000 --- a/.github/workflows/release-probe.yml +++ /dev/null @@ -1,90 +0,0 @@ -# Temporary instrument, deleted before this branch merges. -# -# Three questions the release workflows cannot answer by reading: -# 1. Does the default build step actually install `firebird`, or only -# tri + vibee? trinity-binary-release.yml copied it with a `[ -f ] || -# echo "not found"` guard, which is how that workflow shipped archives -# nobody checked. -# 2. What is the FULL error list for src/vibeec? Zig analyses lazily, so -# each fix exposes the next wave; the local toolchain is 0.16.0 and -# cannot stand in for 0.15.2. -# 3. Does Extension Release produce loadable zips now that its paths point -# at deploy/trinity-nexus/extensions and the manifests are back? A zip -# without manifest.json is a zip Chrome refuses to load. -name: release probe - -on: - push: - branches: [fix/release-workflows] - workflow_dispatch: - -env: - ZIG_VERSION: 0.15.2 - -jobs: - bins: - name: what the default step installs - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - run: | - zig build -Dtarget=x86_64-linux-gnu.2.35 -Doptimize=ReleaseSafe -Dci=true - echo "=== zig-out/bin" - ls -la zig-out/bin/ - - vibeec: - name: every error in src/vibeec - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v4 - - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - # `| tail` would make the pipeline's status tail's, so the step could - # never report a failure. Capture, then decide on the captured text. - - run: | - cd src/vibeec - set +e - zig build -Doptimize=Debug > /tmp/vibeec.log 2>&1 - rc=$? - set -e - tail -150 /tmp/vibeec.log - echo "=== exit $rc, $(grep -c 'error:' /tmp/vibeec.log) error lines" - - extension: - name: extension packages end to end - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: mlugg/setup-zig@v2 - with: - version: ${{ env.ZIG_VERSION }} - - name: Build WASM module - run: | - zig build-exe src/firebird/neodetect_wasm.zig \ - -target wasm32-freestanding \ - -O ReleaseFast \ - -fno-entry \ - -rdynamic \ - -femit-bin=deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm - ls -la deploy/trinity-nexus/extensions/chrome/wasm/neodetect.wasm - - name: Sync, package, and look inside the zips - run: | - cd deploy/trinity-nexus/extensions - cp chrome/wasm/neodetect.wasm firefox/wasm/ - cp chrome/icons/*.png firefox/icons/ - cp chrome/wasm/neodetect-loader.js firefox/wasm/ - cp chrome/popup/popup.html firefox/popup/ - sed 's/chrome\./browser./g' chrome/popup/popup.js > firefox/popup/popup.js - sed 's/chrome\./browser./g' chrome/content/content.js > firefox/content/content.js - (cd chrome && zip -qr ../probe-chrome.zip . -x "*.DS_Store" -x "*.md") - (cd firefox && zip -qr ../probe-firefox.zip . -x "*.DS_Store" -x "*.md") - echo "=== chrome zip"; unzip -l probe-chrome.zip - echo "=== firefox zip"; unzip -l probe-firefox.zip - # The one thing that decides whether these are installable. - unzip -p probe-chrome.zip manifest.json | jq -e '.manifest_version == 3' - unzip -p probe-firefox.zip manifest.json | jq -e '.manifest_version == 2' From bb3107d0eb00b1948f16e2c5b06ef243f11ef2b9 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 21:01:05 +0700 Subject: [PATCH 09/10] ci: the compiler release now proves itself on every pull request src/vibeec had drifted out of step with zig 0.15 and nothing said so. No workflow built it on a pull request, so the first thing to notice was a release tag -- the one moment when discovering it is most expensive and least useful. The port in 5ff98021b was measured through a throwaway probe for exactly that reason. A pull_request trigger scoped to src/vibeec/** and this file closes it. The create-release job is already gated on startsWith(github.ref, 'refs/tags/'), so a pull request builds all four binaries, runs the native smoke test, and publishes nothing. Co-Authored-By: Claude Opus 5 --- .github/workflows/build-compiler-release.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/build-compiler-release.yml b/.github/workflows/build-compiler-release.yml index 4f16f5b9f7..80cc3ec758 100644 --- a/.github/workflows/build-compiler-release.yml +++ b/.github/workflows/build-compiler-release.yml @@ -10,10 +10,20 @@ name: Build Compiler Release # -- on v10.1.0 the surviving body advertised files the run had not produced. # `compiler-v*` was already in this list, so a separate namespace was always the # intent; this just stops the two from racing. +# +# The pull_request trigger is not decoration. Nothing on any pull request built +# src/vibeec, so the tree drifted out of step with zig 0.15 unobserved and the +# first thing to notice was a release tag -- which is the worst possible moment. +# The create-release job below is gated on refs/tags, so a pull request builds +# the four binaries and publishes nothing. on: push: tags: - 'compiler-v*' + pull_request: + paths: + - 'src/vibeec/**' + - '.github/workflows/build-compiler-release.yml' workflow_dispatch: env: From 2613794b6a7cfcf2c839ca6de652c9ade8e19e30 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 20 Sep 2026 21:12:56 +0700 Subject: [PATCH 10/10] port(vibeec): the probe printed "exit 1" and I read the green job The probe's vibeec job was `continue-on-error: true` and its script captured the exit code instead of returning it, so the job was green no matter what zig said. Its last line was `=== exit 1, 3 error lines`, and the error was this one: compiler.zig:827:41: error: struct 'array_list.Aligned([]const u8,null)' has no member named 'init' An enumerator job cannot prove a build. I reported "vibeec compiles" on the strength of a green tick over an error list the same job had already printed. The defect itself is zig 0.15's other rename: std.ArrayList is now the UNMANAGED list, so `.init(allocator)` is gone from it and every call site would have to start passing an allocator to append/deinit/toOwnedSlice. std.array_list.Managed is the old type under its new name, with the same API, so this is a rename rather than a migration -- 33 sites across 12 files, no call site touched. That is deliberate, not lazy. This tree is doing the real unmanaged migration file by file: parser_v3, type_checker, verilog_codegen, gen_vibee_parser and gen_parser_types already say `const ArrayList = std.ArrayListUnmanaged;` at the top and pass allocators through. Converting twelve more files inside a workflow-repair change would bury it. compiler.zig now carries the note saying which line to look at. kv_cache.zig is the one file that is half-migrated in place: four fields are constructed `= .{}` (unmanaged) and five with `.init(allocator)`. Only the latter moved; the unmanaged ones were left exactly as they are. Local zig cannot check this: it is 0.16.0, which has removed std.heap.GeneralPurposeAllocator and std.process.argsAlloc, and stops on the first of those before reaching any ArrayList. CI is the only instrument here. --- src/vibeec/ast.zig | 2 +- src/vibeec/bitnet_pipeline.zig | 2 +- src/vibeec/bytecode.zig | 2 +- src/vibeec/compiler.zig | 12 ++++++++++-- src/vibeec/error_reporter.zig | 6 +++--- src/vibeec/jit.zig | 2 +- src/vibeec/kv_cache.zig | 22 +++++++++++----------- src/vibeec/lsp.zig | 2 +- src/vibeec/optimizer.zig | 2 +- src/vibeec/repl.zig | 2 +- src/vibeec/semantic.zig | 2 +- src/vibeec/trinity_format.zig | 14 +++++++------- 12 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/vibeec/ast.zig b/src/vibeec/ast.zig index 29792d465f..e11d417d32 100644 --- a/src/vibeec/ast.zig +++ b/src/vibeec/ast.zig @@ -9,7 +9,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; // ═══════════════════════════════════════════════════════════════════════════════ // SACRED CONSTANTS diff --git a/src/vibeec/bitnet_pipeline.zig b/src/vibeec/bitnet_pipeline.zig index 8be73991f1..6ff7e3bcc9 100644 --- a/src/vibeec/bitnet_pipeline.zig +++ b/src/vibeec/bitnet_pipeline.zig @@ -752,7 +752,7 @@ pub const BitNetModel = struct { /// Generate text autoregressively pub fn generate(self: *BitNetModel, prompt_tokens: []const u32, max_new_tokens: usize, temperature: f32, top_p: f32) ![]u32 { - var tokens = std.ArrayList(u32).init(self.allocator); + var tokens = std.array_list.Managed(u32).init(self.allocator); try tokens.appendSlice(prompt_tokens); // Clear KV caches diff --git a/src/vibeec/bytecode.zig b/src/vibeec/bytecode.zig index 83330f1db5..ca30c5e2ba 100644 --- a/src/vibeec/bytecode.zig +++ b/src/vibeec/bytecode.zig @@ -9,7 +9,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; // ═══════════════════════════════════════════════════════════════════════════════ // SACRED CONSTANTS diff --git a/src/vibeec/compiler.zig b/src/vibeec/compiler.zig index 138f9ba930..dd1c160c2c 100644 --- a/src/vibeec/compiler.zig +++ b/src/vibeec/compiler.zig @@ -9,7 +9,15 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +// std.ArrayList became the UNMANAGED list in zig 0.15, so `.init(allocator)` is +// gone from it and every call site here would have to start passing an +// allocator to append/deinit/toOwnedSlice. std.array_list.Managed is the old +// type under its new name -- same API, so this is a rename, not a migration. +// The migration is real work and this tree is doing it file by file: the files +// already through it say `const ArrayList = std.ArrayListUnmanaged;` at this +// line (parser_v3, type_checker, verilog_codegen, gen_vibee_parser, +// gen_parser_types). The ones that still say Managed have not been done yet. +const ArrayList = std.array_list.Managed; // Import all compiler components const parser = @import("parser_v3.zig"); @@ -824,7 +832,7 @@ fn printChatHelp() void { fn launchAgent(allocator: std.mem.Allocator, args: []const []const u8) !u8 { // Build command for vibee-agent - var argv = std.ArrayList([]const u8).init(allocator); + var argv = std.array_list.Managed([]const u8).init(allocator); defer argv.deinit(); // Find the agent script relative to the binary diff --git a/src/vibeec/error_reporter.zig b/src/vibeec/error_reporter.zig index ec8ddcbb67..8ef6c8d37a 100644 --- a/src/vibeec/error_reporter.zig +++ b/src/vibeec/error_reporter.zig @@ -8,7 +8,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; // ═══════════════════════════════════════════════════════════════════════════════ // SACRED CONSTANTS @@ -400,9 +400,9 @@ pub const ErrorReporter = struct { pub fn init(allocator: Allocator, source: []const u8, file_name: []const u8) !Self { var self = Self{ .allocator = allocator, - .diagnostics = std.ArrayList(Diagnostic).init(allocator), + .diagnostics = ArrayList(Diagnostic).init(allocator), .source = source, - .source_lines = std.ArrayList([]const u8).init(allocator), + .source_lines = ArrayList([]const u8).init(allocator), .file_name = file_name, .error_count = 0, .warning_count = 0, diff --git a/src/vibeec/jit.zig b/src/vibeec/jit.zig index e63c6d4989..8ced1cc699 100644 --- a/src/vibeec/jit.zig +++ b/src/vibeec/jit.zig @@ -9,7 +9,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; const bytecode = @import("bytecode.zig"); const Opcode = bytecode.Opcode; const Value = bytecode.Value; diff --git a/src/vibeec/kv_cache.zig b/src/vibeec/kv_cache.zig index 82872e3ad3..09245e78fd 100644 --- a/src/vibeec/kv_cache.zig +++ b/src/vibeec/kv_cache.zig @@ -1638,14 +1638,14 @@ pub const KVBlock = struct { pub const BlockTable = struct { allocator: std.mem.Allocator, seq_id: usize, - block_ids: std.ArrayList(usize), // List of block IDs for this sequence + block_ids: std.array_list.Managed(usize), // List of block IDs for this sequence num_tokens: usize, // Total tokens in sequence pub fn init(allocator: std.mem.Allocator, seq_id: usize) BlockTable { return BlockTable{ .allocator = allocator, .seq_id = seq_id, - .block_ids = std.ArrayList(usize).init(allocator), + .block_ids = std.array_list.Managed(usize).init(allocator), .num_tokens = 0, }; } @@ -2492,7 +2492,7 @@ pub const ChunkedRequest = struct { allocator: std.mem.Allocator, request_id: u64, prompt_tokens: []const u32, - chunks: std.ArrayList(PrefillChunk), + chunks: std.array_list.Managed(PrefillChunk), completed_chunks: usize, current_chunk: usize, prefill_complete: bool, @@ -2503,7 +2503,7 @@ pub const ChunkedRequest = struct { .allocator = allocator, .request_id = request_id, .prompt_tokens = prompt_tokens, - .chunks = std.ArrayList(PrefillChunk).init(allocator), + .chunks = std.array_list.Managed(PrefillChunk).init(allocator), .completed_chunks = 0, .current_chunk = 0, .prefill_complete = false, @@ -2583,7 +2583,7 @@ pub const ChunkedRequest = struct { pub const ChunkedPrefillScheduler = struct { allocator: std.mem.Allocator, config: ChunkedPrefillConfig, - requests: std.ArrayList(*ChunkedRequest), + requests: std.array_list.Managed(*ChunkedRequest), // Statistics total_chunks_processed: usize, @@ -2593,7 +2593,7 @@ pub const ChunkedPrefillScheduler = struct { return .{ .allocator = allocator, .config = config, - .requests = std.ArrayList(*ChunkedRequest).init(allocator), + .requests = std.array_list.Managed(*ChunkedRequest).init(allocator), .total_chunks_processed = 0, .total_tokens_prefilled = 0, }; @@ -2616,8 +2616,8 @@ pub const ChunkedPrefillScheduler = struct { } /// Schedule next batch of chunks (round-robin fairness) - pub fn scheduleNextBatch(self: *ChunkedPrefillScheduler) std.ArrayList(*PrefillChunk) { - var batch = std.ArrayList(*PrefillChunk).init(self.allocator); + pub fn scheduleNextBatch(self: *ChunkedPrefillScheduler) std.array_list.Managed(*PrefillChunk) { + var batch = std.array_list.Managed(*PrefillChunk).init(self.allocator); // Round-robin: take one chunk from each request var chunks_added: usize = 0; @@ -2647,7 +2647,7 @@ pub const ChunkedPrefillScheduler = struct { } /// Process a batch of chunks (simulate) - pub fn processBatch(self: *ChunkedPrefillScheduler, batch: *std.ArrayList(*PrefillChunk)) void { + pub fn processBatch(self: *ChunkedPrefillScheduler, batch: *std.array_list.Managed(*PrefillChunk)) void { for (batch.items) |chunk| { // Find owning request and mark complete for (self.requests.items) |req| { @@ -2664,8 +2664,8 @@ pub const ChunkedPrefillScheduler = struct { } /// Remove completed requests - pub fn removeCompleted(self: *ChunkedPrefillScheduler) std.ArrayList(*ChunkedRequest) { - var completed = std.ArrayList(*ChunkedRequest).init(self.allocator); + pub fn removeCompleted(self: *ChunkedPrefillScheduler) std.array_list.Managed(*ChunkedRequest) { + var completed = std.array_list.Managed(*ChunkedRequest).init(self.allocator); var i: usize = 0; while (i < self.requests.items.len) { diff --git a/src/vibeec/lsp.zig b/src/vibeec/lsp.zig index b04cecbdf2..751286cdad 100644 --- a/src/vibeec/lsp.zig +++ b/src/vibeec/lsp.zig @@ -8,7 +8,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; const json = std.json; // ═══════════════════════════════════════════════════════════════════════════════ diff --git a/src/vibeec/optimizer.zig b/src/vibeec/optimizer.zig index 13a5ccbe2c..c1efa9100f 100644 --- a/src/vibeec/optimizer.zig +++ b/src/vibeec/optimizer.zig @@ -9,7 +9,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; const AutoHashMap = std.AutoHashMap; // ═══════════════════════════════════════════════════════════════════════════════ diff --git a/src/vibeec/repl.zig b/src/vibeec/repl.zig index 5e4066529d..935428a66b 100644 --- a/src/vibeec/repl.zig +++ b/src/vibeec/repl.zig @@ -8,7 +8,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; const error_reporter = @import("error_reporter.zig"); const ColorWriter = error_reporter.ColorWriter; const Color = error_reporter.Color; diff --git a/src/vibeec/semantic.zig b/src/vibeec/semantic.zig index 0c0acd3bee..59b57a0842 100644 --- a/src/vibeec/semantic.zig +++ b/src/vibeec/semantic.zig @@ -9,7 +9,7 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const ArrayList = std.ArrayList; +const ArrayList = std.array_list.Managed; const StringHashMap = std.StringHashMap; const ast_mod = @import("ast.zig"); const Ast = ast_mod.Ast; diff --git a/src/vibeec/trinity_format.zig b/src/vibeec/trinity_format.zig index 232eaf4f2f..5bf0bb86e6 100644 --- a/src/vibeec/trinity_format.zig +++ b/src/vibeec/trinity_format.zig @@ -188,8 +188,8 @@ pub const TrinityWriter = struct { allocator: std.mem.Allocator, file: std.fs.File, header: TrinityHeader, - index: std.ArrayList(TensorIndexEntry), - data_buffer: std.ArrayList(u8), + index: std.array_list.Managed(TensorIndexEntry), + data_buffer: std.array_list.Managed(u8), current_offset: u64, pub fn init(allocator: std.mem.Allocator, path: []const u8) !TrinityWriter { @@ -199,8 +199,8 @@ pub const TrinityWriter = struct { .allocator = allocator, .file = file, .header = TrinityHeader{}, - .index = std.ArrayList(TensorIndexEntry).init(allocator), - .data_buffer = std.ArrayList(u8).init(allocator), + .index = std.array_list.Managed(TensorIndexEntry).init(allocator), + .data_buffer = std.array_list.Managed(u8).init(allocator), .current_offset = 0, }; } @@ -298,7 +298,7 @@ pub const TrinityReader = struct { allocator: std.mem.Allocator, file: std.fs.File, header: TrinityHeader, - index: std.ArrayList(TensorIndexEntry), + index: std.array_list.Managed(TensorIndexEntry), data_start: u64, pub fn init(allocator: std.mem.Allocator, path: []const u8) !TrinityReader { @@ -309,7 +309,7 @@ pub const TrinityReader = struct { const header = try TrinityHeader.read(reader); // and index - var index = std.ArrayList(TensorIndexEntry).init(allocator); + var index = std.array_list.Managed(TensorIndexEntry).init(allocator); for (0..header.num_tensors) |_| { const entry = try TensorIndexEntry.read(allocator, reader); try index.append(entry); @@ -596,7 +596,7 @@ test "header write and read" { }; // andwithin in buffer - var buffer = std.ArrayList(u8).init(allocator); + var buffer = std.array_list.Managed(u8).init(allocator); defer buffer.deinit(); try header.write(buffer.writer());