open-standards/.m308.sh
Transaction Science 2c72f2b6d7
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
jouleclaw-omni: the metal model references, 286 errors down to 111
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]>
2026-10-20 03:58:06 -04:00

29 lines
1.2 KiB
Shell
Executable file

#!/bin/bash
cd "$(dirname "$0")"
python3 - <<'PY'
import json, collections, re
pairs=collections.Counter(); labels=collections.Counter(); names=collections.Counter()
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
code=(msg.get('code') or {}).get('code') or '?'
for sp in (msg.get('spans') or []):
lbl=sp.get('label') or ''
if code=='E0308' and lbl:
mm=re.search(r'expected `?([^`,]+)`?,?\s*found `?([^`]+)`?', lbl)
if mm: pairs[(mm.group(1).strip()[:30], mm.group(2).strip()[:30])]+=1
else: labels[lbl[:60]]+=1
if code=='E0425':
mm=re.match(r"cannot find (?:value|function) `([^`]+)`", msg.get('message',''))
if mm: names[mm.group(1)]+=1
print(" === E0308 expected -> found (from span labels) ===")
for (e,f),n in pairs.most_common(14): print(f" {n:4} expected {e:30} found {f}")
if labels:
print(" --- E0308 labels that did not parse ---")
for l,n in labels.most_common(6): print(f" {n:4} {l}")
print("\n === E0425 missing names ===")
for n_,c in names.most_common(14): print(f" {c:4} {n_}")
PY