Skip to content

Weekly releases: Sunday build, packages and GitHub release at the week's pins - #120

Merged
bong-water-water-bong merged 7 commits into
mainfrom
weekly-release
Sep 26, 2026
Merged

bong-water-water-bong merged 7 commits into
mainfrom
weekly-release

Conversation

@bong-water-water-bong

Copy link
Copy Markdown
Collaborator

Weekly releases, every Sunday (docs/releases.md). The engine pins every upstream, and Lemonade ships on Fridays, so on Sunday Strix Halo rebuilds everything at that week's pins and publishes v<ISO year>.<ISO week>.

  • scripts/weekly.sh <workdir> [stage...]:
    • bumps: verifies each open bump-* PR merged onto main (full build, ctest with serve end to end, plus the check that bump needs), then updates it, waits for CI and merges it. PRs that fail stay open and are listed as held back.
    • build, test, package, release: builds main, runs ctest, packages it and publishes the release.
    • WEEKLY_DRY_RUN=1 merges and publishes nothing.
    • Heavy steps wait for free memory and retry after mem-guard kills them, because the box is shared.
  • scripts/package-linux.sh: a relocatable tarball of 1bit and every backend. Libraries loaded from the build tree go beside the programs that load them ($ORIGIN), and XRT goes in xrt/lib. RUNPATHs into TheRock stay.
  • app/built_path.h: 1bit's backends are compiled in by build-tree path. When that path is gone, 1bit looks for the same relative path beside itself.
  • tools/weekly_changes.py: for each moved pin, the upstream commits (authors, PRs) and releases since the last release. Its output becomes changes.json and the release notes. Discord's #announcements post is written from changes.json by a local bot.
  • scripts/build-lemonade.sh: copies resources/ beside lemond, which refuses to start without it.

Verified on Strix Halo (build 21 min, packages 6 min):

  • ctest: 11/11, including serve_e2e on vulkan, hrx, vulkan with hrx prefill, and zinc.
  • The Linux tarball, unpacked in /tmp with the build tree moved away, passes serve_e2e on vulkan, hrx, zinc and --prefill-device hrx. DwarfStar, ONNX and lean have no missing libraries.
  • lemond from the Lemonade package starts and lists the onebit models.
  • Package sizes: Linux 117 MB, Lemonade 5 MB, 1bit OS 101 MB img.zst + 107 MB efi. The Windows zip now holds only the exe/dll files.

🤖 Generated with Claude Code

bong-water-water-bong and others added 6 commits September 26, 2026 04:48
…p/built_path.h)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ackage, release) and scripts/package-linux.sh

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lism, first-release baseline

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eleases.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… resources); lean Windows zip; license note

Verified on Strix Halo: the Linux tarball unpacked elsewhere with the build tree moved away
passes serve_e2e on vulkan, hrx, zinc and vulkan --prefill-device hrx; lemond from the
package starts and lists the onebit models.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@context7

context7 Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Docs7 for 1bit-monster/engine

Result Status Action
Deployment ➖ Not used —
Content review ➖ Did not run. This site has no agent runs available this month. Wait for the monthly reset or check your Docs7 plan. —

Commit 4809549

@github-actions

github-actions Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

PR Reviewer Guide 🔍

(Review updated until commit 4809549)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Path Resolution Logic

The built_path function attempts to resolve backend paths relative to the build directory when the original path does not exist. However, it only checks for the existence of the path in the build directory on Linux (__linux__ defined). On other platforms, it will always return the original path, which may lead to incorrect behavior if the backend is not found at the expected location. This could cause runtime errors or unexpected behavior when running the engine in environments where the build directory is not accessible or when using non-Linux systems.

inline std::string built_path(const char* compiled) {
    namespace fs = std::filesystem;
    std::error_code ec;
    if (fs::exists(compiled, ec)) return compiled;
#if defined(ONEBIT_BUILD_DIR) && defined(__linux__)
    const fs::path rel = fs::path(compiled).lexically_relative(ONEBIT_BUILD_DIR);
    if (!rel.empty() && *rel.begin() != "..") {
        const fs::path here = fs::read_symlink("/proc/self/exe", ec).parent_path();
        if (!ec && fs::exists(here / rel, ec)) return (here / rel).string();
    }
#endif
    return compiled;
}
RPATH Handling

The script modifies RPATH entries for ELF binaries to ensure they find their libraries beside themselves. However, it does not check for or handle cases where the build directory path might be embedded in the binary's RPATH in a way that could conflict with the intended runtime behavior. This could lead to issues if binaries are expected to load libraries from specific locations that are not properly handled by the script's RPATH manipulation.

fix() {  # fix <staged file> <file in the build>
    local f=$1 orig=$2 keep="" e dep
    while read -r dep; do
        case "$dep" in "$build"/*) [ -e "$(dirname "$f")/$(basename "$dep")" ] || {
            cp -L "$dep" "$(dirname "$f")/"; queue+=("$(dirname "$f")/$(basename "$dep")|$dep"); } ;; esac
    done < <(ldd "$orig" 2>/dev/null | awk '$2 == "=>" && $3 ~ /^\// {print $3}')
    for e in $(readelf -d "$orig" | sed -n 's/.*R\(UN\)\{0,1\}PATH.*\[\(.*\)\]/\2/p' | tr ':' ' '); do
        case "$e" in '$ORIGIN'*|"$build"*|"$HOME"*|'') ;; *) keep="$keep:$e" ;; esac
    done
    patchelf --set-rpath "\$ORIGIN$keep" "$f"
}
queue=()
while IFS= read -r -d '' f; do
    is_elf "$f" && queue+=("$f|$build/${f#"$stage"/}")
done < <(find "$stage" -mindepth 2 -type f -print0)
while [ ${#queue[@]} -gt 0 ]; do
    item=${queue[0]}; queue=("${queue[@]:1}")
    fix "${item%%|*}" "${item#*|}"
done

if [ -n "$xrt" ] && readelf -d "$stage/1bit" | grep -q libxrt; then
    mkdir -p "$stage/xrt/lib"
    cp -a "$xrt"/lib/libxrt_coreutil.so* "$xrt"/lib/libxrt_core.so* "$stage/xrt/lib/" 2>/dev/null || true
    cp -a "$xrt"/lib/libxrt_driver_xdna.so* "$stage/xrt/lib/" 2>/dev/null || true
    while IFS= read -r -d '' f; do is_elf "$f" && patchelf --set-rpath '$ORIGIN' "$f"; done \
        < <(find "$stage/xrt/lib" -type f -print0)
    patchelf --set-rpath '$ORIGIN/xrt/lib' "$stage/1bit"
    echo "  xrt/lib: $(ls "$stage/xrt/lib" | wc -l) files"
else
    patchelf --remove-rpath "$stage/1bit"
fi
Memory Guard Retry Logic

The guard function retries execution of commands up to 10 times if memory guard stops them. However, if a command fails consistently due to resource constraints, it could lead to a long-running process or even a hang, as the retries do not include exponential backoff or a timeout mechanism. This could cause the weekly release process to stall indefinitely if the system remains under heavy load.

guard() {
    local try
    for try in $(seq 10); do
        room || return 1
        "$SRC/scripts/mem-guard.sh" 4 "$@" && return 0
        say "memory guard stopped it (try $try): $*"
    done
    return 1
}

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 4809549

@bong-water-water-bong
bong-water-water-bong merged commit 4f20107 into main Sep 26, 2026
5 checks passed
@bong-water-water-bong
bong-water-water-bong deleted the weekly-release branch September 26, 2026 09:23
bong-water-water-bong added a commit that referenced this pull request Oct 21, 2026
…4 SwiGLU prefill opt-in (27B KLD base re-recorded) (#493)

llama.cpp 96f81977 (fork #120, #122, #121 on 5dcf6623):
- #120: prompt flash attention above 2048 query rows as query chunks (27B -ub 4096: 6.5 -> 588 tok/s).
- #122: ROPE above 2048 tokens as token chunks (Qwen3-4B now runs -ub 4096; KLD 0.000002).
- #121: the int4-activation SwiGLU prefill (symmetric_i4_q8_plane) is opt-in,
  GGML_HRX_SYMMETRIC_I4_PREFILL=1. 27B prefill speed -0.0..-0.7% (interleaved x3).

scripts/hw-gate.sh --bin on a private build (this llama.cpp + hrx-system 82804197 + gpu-kernels
08bb2241, strixhalo performance mode), check mode: PASS on every row (ops 667/667, kat, needle,
placement, kld). The 27B kld row moved, as expected from #121: mean KLD 0.000000 -> 0.002222
(p99 0.01868, same top 97.65%, limit 0.01) against the base recorded with the int4 path on.
The 27B base is re-recorded on that same build (scripts/hw-gate.sh --phases kld --models
qwen3.8-27b --record): manifest sha256 d2f9a8af -> a31cb56c; the previous base file is kept on
strixhalo as ~/.cache/hw-gate/kld/qwen3.8-27b.kld.pre-96f81977. Measured directly: the new
default is the exact path - 27B -ub 2048 against the -ub 4096 logits 0.001949 -> 0.000003,
PPL (c4096) 6.7183 -> 6.7097, PPL (c512, the gate args) 6.6835 -> 6.6381.

Co-authored-by: bong-water-water-bong <bong-water-water-bong@1bit.gg>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant