Some checks failed
jouleclaw fabrics / cuda (linux, RTX 4050 + Vulkan loader) (pull_request) Successful in 32s
jouleclaw fabrics / vulkan (linux, RTX 4050 + Vulkan loader) (pull_request) Successful in 31s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 12s
repository checks / lockfiles, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Failing after 1m3s
standards workspaces build + test / mesh-rs (mesh/mesh-rs, -p mesh-engine-gguf -p mesh-openai --features mesh-engine-gguf/gguf,mesh-openai/server, mesh-rs, linux-arm64) (pull_request) Successful in 1m58s
standards workspaces build + test / jouleclaw-rs (-nodebug, jouleclaw/jouleclaw-rs, -p jouleclaw-energy --features rapl,nvml, jouleclaw-rs, linux-arm64, -C target-feature=+fp16) (pull_request) Successful in 4m14s
jouleclaw fabrics / metal (macOS, Apple GPU) (pull_request) Has been cancelled
jouleclaw public surface must stay documented / Public-surface audit (jouleclaw-rs) (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (jouledesk/jouledesk-rs, jouledesk-rs, macos) (pull_request) Has been cancelled
Of the 286, 175 were one mistake repeated: `Model` was wrapped in `Arc<RwLock<Model>>` and these files, never having been compiled, kept passing `&self.model` where `&Model` was wanted. 169 call sites in 10 files now deref the read guard, which is the idiom those same files already use elsewhere (`self.model.read().get_weight(..)`). Five stragglers were the same shape on a local rather than a field. The sixth was a real boundary: parler_tts held `Arc<RwLock<Model>>` and called `T5Encoder::new`, which takes `Arc<Model>`, as do its three other callers. Two facts decided that one rather than guesswork. The conventions split 22 files on `Arc<Model>` against 16 on `Arc<RwLock<Model>>`, so the lock-free form is the majority, not the exception -- changing T5Encoder would have dragged three working callers toward the minority. And **no file ever takes a write lock through it**: not one `model.write()` in any of the 16. The lock guards read-only access. So parler_tts drops it and matches its callee. That leaves the same simplification available across the other 15: an `Arc<RwLock<Model>>` nobody writes through, and ~147 `&*self.model.read()` derefs that exist only to satisfy it. Collapsing them to `Arc<Model>` would delete both. Not done here -- the current state is correct, only over-synchronised, and finishing the error count comes first. errors 286 -> 111, with E0308 gone entirely. Default build unchanged at 0 errors and the same 29 warnings, 44 tests still passing. What remains is mostly not drift but absence: 53 E0425 for things that do not exist (27 of them the shader kernels `PHASE27_OPS`, `MATVEC`, `MATMUL_Q8_0`, and ~20 `gpu_ops` helpers named `<op>_on`), 27 E0716 lifetime errors, 11 E0599 missing methods. Co-Authored-By: Claude Opus 5 <[email protected]>
33 lines
1.4 KiB
Shell
Executable file
33 lines
1.4 KiB
Shell
Executable file
#!/bin/bash
|
|
cd "$(dirname "$0")"; export PATH="$HOME/.cargo/bin:$PATH"
|
|
timeout 3000 cargo check --manifest-path jouleclaw/jouleclaw-rs/Cargo.toml -p jouleclaw-omni \
|
|
--features metal --keep-going --message-format=json -j 6 >/tmp/m2.json 2>/dev/null
|
|
python3 - <<'PY'
|
|
import json, collections, re
|
|
msgs=collections.Counter(); files=collections.Counter(); pairs=collections.Counter(); tot=0
|
|
for line in open('/tmp/m2.json'):
|
|
try: m=json.loads(line)
|
|
except Exception: continue
|
|
if m.get('reason')!='compiler-message': continue
|
|
msg=m.get('message') or {}
|
|
if msg.get('level')!='error': continue
|
|
tot+=1
|
|
t=(msg.get('message') or '')
|
|
code=(msg.get('code') or {}).get('code') or '?'
|
|
norm=re.sub(r'`[^`]*`','`X`',t)[:72]
|
|
msgs[(code,norm)]+=1
|
|
sp=msg.get('spans') or []
|
|
f=sp[0]['file_name'].split('/')[-1] if sp else '?'
|
|
files[f]+=1
|
|
# for E0308 capture the actual expected/found pair
|
|
if code=='E0308':
|
|
exp=re.search(r'expected `([^`]*)`, found `([^`]*)`', t)
|
|
if exp: pairs[(exp.group(1)[:28], exp.group(2)[:28])]+=1
|
|
print(f" TOTAL {tot}\n")
|
|
print(" === distinct (code, message) ===")
|
|
for (c,t),n in msgs.most_common(14): print(f" {n:4} {c:7} {t}")
|
|
print("\n === E0308: what is expected vs found ===")
|
|
for (e,f),n in pairs.most_common(12): print(f" {n:4} expected {e:28} found {f}")
|
|
print("\n === worst files ===")
|
|
for f,n in files.most_common(10): print(f" {n:4} {f}")
|
|
PY
|