fix(AMD): retry ROCm llama-server with bundled HIP on HIP/ROCR mismatch by indrajeetapache · Pull Request #9002 · unslothai/unsloth · GitHub
Skip to content

fix(AMD): retry ROCm llama-server with bundled HIP on HIP/ROCR mismatch - #9002

Merged
Etherll merged 26 commits into
unslothai:mainfrom
indrajeetapache:studio-rocm-hip-rocr-mismatch-8998
Aug 19, 2026
Merged

fix(AMD): retry ROCm llama-server with bundled HIP on HIP/ROCR mismatch#9002
Etherll merged 26 commits into
unslothai:mainfrom
indrajeetapache:studio-rocm-hip-rocr-mismatch-8998

Conversation

@indrajeetapache

Copy link
Copy Markdown
Contributor

Summary

Fixes the ROCm load failure in #8998.

Studio prepends system ROCm on LD_LIBRARY_PATH so bundled HIP matches the host amdkfd driver (#7233). On this host that mix still binds bundled libamdhip64.so.7, which then looks up hsa_amd_queue_create@ROCR_1 in a different libhsa-runtime64 and llama-server exits 127. Vulkan works. A terminal llama-server from ~/.unsloth works, because it does not get that prepend.

Studio then treated the 127 as an optimistic VRAM estimate and retried with --fit on, which cannot load a missing ROCr symbol.

What this PR does

  • Detects the HIP/ROCR symbol lookup (libamdhip64 + hsa_amd_queue_create / ROCR_1)
  • Retries once with use_system_rocm=False (same as UNSLOTH_LLAMA_NO_SYSTEM_ROCM=1 / a shell launch)
  • Skips the --fit on / --fit off retries for this crash
  • Classifies the failure as a HIP/ROCR mix, not a missing binary and not out of VRAM

Default launch still prepends system ROCm (#7233). WSL's librocdxg prepend is unchanged.

Test plan

  • cd studio/backend && python -m pytest tests/test_llama_cpp_start_failure_classification.py tests/test_llama_cpp_darwin_loader_env.py -q --tb=short
  • On a native Linux ROCm box that hits hsa_amd_queue_create, version ROCR_1, load a GGUF with the ROCm backend and confirm the bundled-HIP retry starts the server
  • Confirm Vulkan loads are unchanged
  • Confirm UNSLOTH_LLAMA_NO_SYSTEM_ROCM=1 still skips the system prepend on the first attempt

Made with Cursor

System ROCm on LD_LIBRARY_PATH plus bundled libamdhip64.so dies on
hsa_amd_queue_create@ROCR_1 (exit 127). That is not a VRAM miss, so do
not flip --fit; retry once without the system prepend instead.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 50e59148f9

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +16760 to +16761

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve fit recovery after the ROCm retry

When a host has the HIP/ROCR mismatch and the bundle-only launch then fails for an independent fit-related reason, this continue consumes the second and final iteration of for _spawn_attempt in (0, 1). The subsequent failure therefore cannot take either existing --fit on or --fit off recovery because both are gated on _spawn_attempt == 0, so models affected by both conditions now fail even though each condition has a supported retry. Give the ROCm environment correction its own retry state/budget so the corrected launch can still enter the fit recovery logic if it produces a different failure.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in a5b9458: ROCm and fit recovery now have independent bounded retry state, with behavioral coverage for mismatch -> bundled HIP -> fit-adjusted success.

@indrajeetapache

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: 5c5cde030f

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@Etherll

Etherll commented Aug 16, 2026

Copy link
Copy Markdown
Collaborator

This fixes the ROCm library mismatch, but it shares the same two-attempt budget as the existing --fit retry. Could we give the ROCm fallback its own retry and add a behavioral test for that sequence?

indrajeetapache and others added 2 commits August 17, 2026 00:22
The library-mix retry was sharing the (0, 1) slot with --fit, so a later
VRAM crash after bundled HIP could not fit-retry. Keep the two recoveries
independent and pin the mix → bundled HIP → --fit on sequence.

Co-authored-by: Cursor <cursoragent@cursor.com>
@indrajeetapache

Copy link
Copy Markdown
Contributor Author

@Etherll Agreed. The ROCm env retry was sharing the same (0, 1) slot as --fit

Pushed a follow-up: ROCm and --fit each gets their own retry (three launches max). Also added a behavioural test for mix → bundled HIP → --fit on, and one that a healthy bundled-HIP retry does not flip --fit

@indrajeetapache

Copy link
Copy Markdown
Contributor Author

@codex review

@LeoBorcherding

Copy link
Copy Markdown
Collaborator

@codex review

@LeoBorcherding LeoBorcherding self-assigned this Aug 17, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: bca0bcfc74

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@LeoBorcherding LeoBorcherding changed the title Studio: retry ROCm llama-server with bundled HIP on HIP/ROCR mismatch fix(AMD): retry ROCm llama-server with bundled HIP on HIP/ROCR mismatch Aug 17, 2026
indrajeetapache and others added 6 commits August 18, 2026 05:21
unslothai#7233 prepends the whole system ROCm dir, so any lib in it can be the one that
fails to resolve, not just HIP. Parse glibc's ``symbol lookup error: <object>:
undefined symbol: <sym>`` line and match the ROCm family on the object's
basename, so librocblas / libhipblaslt reach the same bundle-only retry instead
of the generic 127 text plus a --fit retry that cannot load a missing symbol.
The message now names the object and symbol the loader reported: it hardcoded
hsa_amd_queue_create while the predicate also fired on any rocr_ match.

_run_full_offload_spawns recorded every subprocess.Popen, so a host with the
rocm_sdk wheel installed also captured the offload-arch probe that
discover_current_target_family() shells out to from inside load_model. That
landed at index 0 and shifted the assertions onto the wrong process, which is
why the test passed in a full-file run and failed on its own. Record only the
fake server and delegate the rest.

Also guard the empty LD_LIBRARY_PATH case, cover the mix the retry does not fix
(both fit-branch guards had no test), and drop three source-text assertions the
behavioural tests already prove.
@LeoBorcherding

Copy link
Copy Markdown
Collaborator

@indrajeetapache thank you so much for building out this fix, am pushing my review changes, cleaned up a few tests and methods

@LeoBorcherding

Copy link
Copy Markdown
Collaborator

Reviewed at 7d3b762. Diagnosis and shape are right: this is a loader version mix, --fit cannot fix a missing symbol, and giving the ROCm correction its own flag rather than sharing the --fit slot is the correct answer to the earlier P2. The fragile parts hold up: _stdout_lines resets per attempt so one crash cannot classify the next, and the WSL librocdxg prepend is genuinely untouched because /dev/dxg short-circuits _native_linux_system_rocm_lib_dirs first.

I pushed four corrections plus a merge of latest main to your branch rather than asking you to round-trip. The first one does not show up in a normal run, and your test plan does not include test_gpu_init_crash_message.py at all, so there was no way for you to see it.

1. The behavioral test asserted against the wrong process. _run_full_offload_spawns patches subprocess.Popen globally, so on a host with the rocm_sdk wheel it also captures the offload-arch probe that discover_current_target_family() shells out to inside load_model. Running your test on its own:

0 LD=None                        cmd0=offload-arch
1 LD='/opt/rocm/lib:/bundle/bin' cmd0=/fake/llama-server  --fit off
2 LD='/opt/rocm/lib:/bundle/bin' cmd0=/fake/llama-server  --fit on

That lands at index 0, shifts everything, and eats returncodes[0] = 127. error is None, loaded, and len(launches) == 3 still pass, so the test looks alive while the retry never ran (launch 2 still carries /opt/rocm/lib). rocm_sdk caches the lookup per process, so whichever test hits load_model first absorbs the probe and everything after it in that process is clean, which is why a full-file run passes and an isolated one does not. The harness now records only the fake server and delegates the rest to the real Popen.

2. The detector could not match the other object this failure has. _native_linux_system_rocm_lib_dirs prepends the whole system ROCm dir on purpose, and its own docstring says mixing the bundle's rocBLAS with a different-version system HIP "risks missing symbols". So librocblas or libhipblaslt failing the same lookup is predicted by our own code, and it was falling through to the generic 127 "reinstall llama-server" plus a wasted --fit retry. It now parses glibc's format and matches the ROCm family on the object's basename, so a path like /opt/librocm-vendor/lib/ cannot stand in for the object and libggml-hip.so still does not match.

3. The message named a symbol the predicate did not require. It hardcoded hsa_amd_queue_create while the check also fired on any rocr_ match. It now interpolates what the loader actually reported.

4. Small one: _retry_ld != env.get("LD_LIBRARY_PATH") is "" != None on Windows and macOS, which would set an empty LD_LIBRARY_PATH and spend an attempt. Unreachable today, but if _retry_ld and ... closes it.

I also added a test for when bundle-only does not help. Both and not _hip_rocr_mismatch guards had no coverage: deleting them broke nothing. That test pins them and stops at two launches instead of burning --fit on a symbol error. And I dropped the three source-text assertions in test_hip_rocr_retry_is_checked_before_the_fit_on_retry, since the behavioral tests already prove ordering and budget while assert "for _spawn_attempt in (0, 1, 2)" in body breaks on a no-op refactor.

Two things still open that are not code review. No workflow has run here, so pre-commit is the only green check. And the hardware line in your test plan is unchecked, so nobody has run this on a host that reproduces the crash. Worth asking the reporter, since the premise is one line on their machine: if UNSLOTH_LLAMA_NO_SYSTEM_ROCM=1 makes the same load succeed on main, this PR automates exactly that.

For the record, two follow-ups, not asks for this PR: the durable fix is comparing system ROCm against the bundle's version before launching rather than after a crash, and the correction does not outlive the load, so the STT sidecar builds the same env with no retry and stays broken on this host.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0fcbfa3a7f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread studio/backend/core/inference/llama_cpp.py Outdated
Both captures are runs of non-whitespace taken straight from the child, and
_drain_stdout keeps an unterminated line whole, so a wrapper on
LLAMA_SERVER_PATH printing a megabyte-scale token would put all of it in the
API error. _short is the existing bound for exactly this and every other
capture in _classify_start_failure_text already uses it.
Twelve issue citations across four files for one fix, several of them
restating the line below. Keep unslothai#8998 where it identifies the crash signature
and unslothai#7233 where it names the prepend being undone, drop the rest, and cut the
prose that repeated the code. One was already stale: the ggml test said the
ROCm branch "names libamdhip64", which stopped being true when the detector
started matching the whole ROCm family.
@LeoBorcherding

Copy link
Copy Markdown
Collaborator

Confirmed and fixed in c4af9a8. This was a regression I introduced: the old text hardcoded the strings, so it was bounded by construction, and interpolating the captures removed that. _drain_stdout only does rstrip() per line with no cap, so an oversized token does reach _stdout_lines whole, _short is documented for exactly this, and every other capture in _classify_start_failure_text already uses it. Both interpolations are now wrapped, with a test covering an 8 KB object and an 8 KB symbol.

Also pushed a comment pass in 07c4f0cc, separate commit. The fix had accumulated twelve issue citations across four files, several of them restating the line underneath. Kept #8998 where it identifies the crash signature and #7233 where it names the prepend being undone, dropped the other ten, and cut the prose that repeated the code. One was already stale: the ggml test said the ROCm branch "names libamdhip64", which stopped being true once the detector started matching the whole ROCm family.

213 pass, ruff clean, formatted with the pinned ruff 0.6.9.

The retry repaired one launch and recorded nothing, so each load paid another
crashing spawn, and the STT sidecar never recovered at all: it builds its child
env through the same _llama_server_env_for_binary and has no retry of its own,
leaving dictation broken on the host chat had just been fixed on.

Record the build dir once a bundle-only launch reaches health and skip the
prepend there from then on. Written only from that proof, so a host the unslothai#7233
prepend is right for cannot land in it, and kept in-process so a ROCm or driver
upgrade re-tests on restart.
@LeoBorcherding

LeoBorcherding commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

Follow-up in 6d9e83c, closing the gap I flagged as out of scope last time.

The problem it fixes. The retry repaired one launch and recorded nothing. So on a host that hits the mix, every load rebuilt the prepend and crashed into it again before recovering, and the STT sidecar never recovered at all: stt_mtmd_sidecar.py:156 builds its child env through the same _llama_server_env_for_binary and has no retry of its own, which left dictation broken on the host chat had just been fixed on.

The fix. The build dir is recorded once a bundle-only launch reaches health, and the prepend is skipped there from then on. The sidecar needed no code of its own: it calls the same helper, so it inherits the correction. Three constraints keep it safe. Written only from that proof, so a host the #7233 prepend is right for cannot land in it. Keyed on the resolved build/bin dir, so a second install tree still gets the prepend. In-process only, so a ROCm or driver upgrade re-tests on restart. Locked rather than a bare set, since the sidecar spawns on its own thread and can overlap a chat load.

Tests cover both directions, including that a retry which does not fix the crash leaves no record, and the harness resets the state per run so a correction cannot leak between tests. Still unverified on real hardware, same as the rest of the PR.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6d9e83c662

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread studio/backend/core/inference/llama_cpp.py
glibc echoes the object verbatim, so a custom LLAMA_SERVER_PATH under a
directory with spaces kept them and \S+? stopped at the first one, dropping the
crash into the generic 127 text instead of the bundle-only retry. Split on the
": undefined symbol:" that follows the object, the same way the missing-library
branch above already keeps "/opt/My Runtime/libfoo.so" whole.

Bounded at PATH_MAX rather than to end of line: no longer path can exist, and
an unbounded lazy capture let one hostile line drive the scan quadratically
(200 prefixes on a 400 KB line went 3ms -> 803ms; with the bound, 16ms).
@LeoBorcherding

Copy link
Copy Markdown
Collaborator

Confirmed and fixed in f525e59. The repo had already solved this 200 lines up: the missing-library branch at llama_cpp.py:11544 splits on the ": " that introduces the diagnostic for exactly this reason, and its comment uses the same /opt/My Runtime/ example. Mine was the inconsistent one.

One thing worth recording, since the obvious fix has a cost. Widening \S+? to [^\r\n]+? restores spaced paths but also lets the lazy capture expand to end of line on every symbol lookup error: occurrence, and _drain_stdout keeps an unterminated line whole. On a 400 KB line carrying 200 of those prefixes the classifier went from 3 ms to 803 ms. Bounding the object to PATH_MAX keeps spaced paths and brings that to 16 ms, better than the original, since no longer path can exist anyway.

Tests: a bundle under /opt/My Runtime/ now classifies as the mix, and an object past PATH_MAX does not.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f525e59ccd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread studio/backend/core/inference/llama_cpp.py
…he first

_did_rocm_retry lived in _spawn_and_wait, but the correction edits the shared
env, so it outlives that call: the drafterless, no-flash, arch-fallback and CPU
replay paths all call _spawn_and_wait again with the corrected env and a fresh
flag. A load that recovered through one of those came up healthy without
recording anything, and the STT sidecar kept the prepend it had already proved
wrong.

Hoist the flag to the load scope. Verified both ways: mix, signal crash, fit
retry, then a healthy no-flash launch now records; with the per-call flag that
same sequence does not.
@LeoBorcherding

Copy link
Copy Markdown
Collaborator

Confirmed and fixed in 64c0899. _did_rocm_retry was local to _spawn_and_wait, but the correction edits the env dict built in the enclosing scope, so it outlives that call: -archfallback, -noflash, -noflash-mtp, -retry and -cpu all call _spawn_and_wait again with the corrected env and a fresh flag. A load that recovered through any of them came up healthy and recorded nothing.

Reproduced before fixing. Driving load_model with mismatch, signal crash, signal crash, healthy gives four launches through two _spawn_and_wait calls: the correction is applied on launch 0 and the load succeeds on launch 3, and the preference was not recorded. Hoisting the flag to the load scope records it. The mutation holds in both directions, so the new test fails if the flag goes back to per-call.

Worth noting the flag only widens where a success is recorded. It cannot cause a second correction, since the retry is still guarded on the rebuilt LD_LIBRARY_PATH differing from the one in use, which it no longer does once applied.

@danielhanchen

Copy link
Copy Markdown
Member

Confirmed this hits the path in studio/backend/core/inference/llama_cpp.py where the system ROCm prepend is applied unconditionally and the resulting 127 is then treated as a VRAM problem and sent into the --fit retries. Will get this reviewed.

@Etherll

Etherll commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8a202181a4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@staticmethod
def _remember_bundle_only_rocm(binary: str) -> None:
with LlamaCppBackend._bundle_only_rocm_lock:
LlamaCppBackend._bundle_only_rocm_dirs.add(str(_llama_lib_dir(binary)))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Invalidate the bundle-only preference after runtime updates

When an in-app unsloth studio update or backend switch replaces llama-server and its libraries in place, this cache entry survives because it is keyed only by the unchanged build directory. A later ROCm load therefore skips the system prepend without testing the new bundle, even though the replacement bundle may again require system ROCm to avoid the hsa_init()/driver mismatch that motivated the default prepend; this recovery can only remove the prepend, so it cannot recover in the opposite direction. Include the binary/runtime revision in the key or clear this preference when the install is replaced.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in b4ee47b: the cache now pairs each resolved install directory with the binary inode/size/mtime revision and invalidates after a same-path runtime replacement. A regression test atomically replaces llama-server and proves the system ROCm prepend is retried. The fingerprint uses Python stat fields documented at https://docs.python.org/3/library/os.html#os.stat_result.

@Etherll

Etherll commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

@codex review

1 similar comment
@Etherll

Etherll commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: b4ee47b519

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 51169057be

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# The prepend covers the whole system ROCm dir, so any lib in it can be the
# one that fails to resolve, not just HIP. Matched on the basename so a path
# component (/opt/librocm-custom/...) cannot stand in for the object.
_ROCM_OBJECT_HINTS = ("libamdhip", "libamd_comgr", "libhsa-runtime", "libhip", "libroc")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restrict the ROCm prefix to actual ROCm objects

On native-Linux AMD launches using a custom LLAMA_SERVER_PATH, an unrelated lookup failure from a library such as librocksdb.so is classified as a HIP/ROCR mismatch because librocksdb starts with the overly broad libroc hint. This triggers an irrelevant bundle-only retry, suppresses the existing fit recovery while the same diagnostic persists, and ultimately tells the user to change the ROCm backend instead of fixing the custom library. Match explicit ROCm library families (for example, librocblas/libroctracer/librocm_*) rather than every basename beginning with libroc.

Useful? React with 👍 / 👎.

@Etherll

Etherll commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

@codex review

1 similar comment
@Etherll

Etherll commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@Etherll
Etherll merged commit b38490f into unslothai:main Aug 19, 2026
1 check passed
@chatgpt-codex-connector

Copy link
Copy Markdown

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.

4 participants