- Web search with five services in turn, no key needed, pages read like a reader view
- A long video renders in the background, videos made in the chat play there, Wan 2.1 saves mp4
- A graphics card per task with two cards, AMD on Windows gets the current ROCm build, Intel Arc its own
- The LU Engine plans memory from the model file, says what a long context costs, keeps one copy of the model
- Settings from the chat with a confirmation card, Storage puts models, gallery and runtime in one folder
- Remove refusals from a local model in the Model Manager
- Native HiRes in Edit, LoRA stack with search and strength from -20 to 20
- Ask in Code asks before every external tool, REA shows only in Agent and Code
- Your phone on this computer (Remote), paired by QR code
- Wan 2.2 14B runs from Animate and Video, Train new on a Mac shows the trigger word field
- Temperature is held to 1.5, memories can be deleted, the onboarding runs once
- GitHub issues 187, 188, 190, 191, 193 and 194
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The exception for the two names is withdrawn; the pricing page and the video
generator page read the new names and the counts of names without the word.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The web catalogue adds Create Studio models (FLUX 3 Klein, Krea 2 Turbo,
MOSS Image, LTX 2.5, MiniMax H3 Singularity and more), retires eight and
publishes three more open video models. The pricing page, the image and
video generator pages and the counts on every sales page follow: 17 open
video and 9 open image models, 48 chat and 109 Create models in the
complete list, 64 Create Studio prices from studioBaseCredits.
David's decisions of 24.10.2026: the two MiniMax H3 Singularity models keep
their catalogue names without the word, as an exception like OpenVideo, and
the panel's image and video totals count the studio generators too (18 and
32, the generation groups of the complete list), so it never names more open
models than models. The guard now holds the panel to those groups and checks
every id in them against the web catalogue and the retired list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cloud sales guard read only the object literals in tier-models.ts and
missed what CLOUD_CATALOG spreads in from direct-catalog.ts, so it held the
pages at 47 while the live catalogue has 48. It now counts
FIXED_UPSTREAM_CATALOG when tier-models.ts spreads it; older web states
without the spread count as before. Every count on the site, the pricing
catalogue (Kimi K3.1 Pro added, 145 models) and the in-app pitch follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A trained character works in every part of Create and in chat, and a Mac can train one
- ComfyUI workflows import in the format ComfyUI saves, with subgraphs and the node packs they need
- Edit takes more reference images, as many as the graphics memory holds
- A chat can be duplicated or branched, edits keep the old answer as a version
- Character cards become personas, personas carry sampling and a reminder
- Several OpenAI-compatible servers side by side, group members that sit out
- Auto compact is on by default, digits and encoded text are counted at their real cost
- How it works: short films for the main parts of the app
- On a Mac, Create gains Talking Character, Motion Control, Music, Enhance Image, Remove Background and masks
- Reasoning effort and a reply timeout for local servers, the REA plugin for Agent and Code
- ComfyUI shared model folders are used, AMD and Intel cards get a clearer GPU path
- GitHub issues 156, 162, 165 to 177, 180, 181 and 183
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The web catalogue now writes `Wan 2.2 ${STATEMENT_NAME_WORD}`, a word apart
from the mark. The guard accepts both placeholders and reads the name word
first, so older web stands still pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit c834851ee0)
credits.ts gained TIER_TRAININGS with the same plan keys, so the first object
with a hosted number was the training count (2), not the credits (900,000).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 9b90255119)
The site and the README name 3.0.6 and the Mac build for Apple Silicon.
The download card on the home page picks the installer for the visitor's
system and lets them switch between Windows, macOS and Linux.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Voice (Beta): talk to LU and hear it answer
- Computer control (Beta): a model works in the apps you approve, off by default
- Local models with image input download with their image part
- Create in chat (Beta): ask for an image or a clip in a Cloud chat
- Ten more chat models on LU Cloud
- A running task says what it is doing, and dialogs have a new look
- The Linux packages carry the voice engine
- Ten security fixes in the new features
- A microphone field in the settings, and seven fixes from user reports
Co-authored-by: Alan Vo <101240385+ALANDVO@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every build carries the NSS and MSI values once as literals, so looking for
the first value that occurs called each signed copy an NSIS build and the
MSI round of the probe stopped. The marked type is the value that occurs
more often, with no unmarked value left.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release workflow can sign Windows builds through SignPath (two signing
requests per release: the app, then the installers built around it) or
through Azure Artifact Signing, and macOS builds with a Developer ID plus
notarization. Each lane switches on only when its own secrets and variables
are present. Without them every step runs as before and the installers are
unsigned.
A probe workflow runs the SignPath lane with a test certificate. It creates
no release and never touches latest.json.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cloud pages, the pricing page, the handbook, llms files, the facts file
and ten blog posts named the open media models with two other words. They now
say uncensored, and the media model names follow the catalogue. Numbers,
prices, links, slugs and anchors are unchanged. The one FAQ entry on the image
generator page stays as it was. Two sentences about a competitor's price table
and terms are gone because they could not be said without the words.
The sales guard checks the model names against the new brand word.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Qwen3 30B A3B, Qwen3 Coder 480B, Llama 4 Scout, DeepSeek V4 Flash 0731 and
Qwen 3.5 397B A17B declined in round two or three of the test of 2026-10-05
and go from 'full' to 'partial' in the desktop measurement file. 19 of the 46
measured models carry the mark now, 24 hold back. The sales numbers, the
guards, the README and the pages under docs/ follow. The web side made the
same change in 4f88fd9b.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Durchsicht des Werkzeugsatzes MSVC 14.51.36256 (VS 2026) auf den
Runner-Disassemblaten in lu-301/bau/isa-review-14.51/, Bericht in
lu-301/bau/isa-review-1451.md.
Die zwei vpmullq in llama.dll (000000018007AA0D und 000000018007AA28,
Lambda in llama-kv-cache.obj) sind kein K1-Rueckfall, sondern ein
Falschrot der bekannten Form (i): davor steht
cmp dword ptr [__isa_available],6 und ein jl auf 000000018007AA4E,
also hinter beide Treffer in den skalaren Zweig, nur hat der Scheduler
ein mov r11,qword ptr [rcx] zwischen Vergleich und Sprung gelegt. Die
alte Regel verlangte den Sprung unmittelbar nach dem Vergleich.
checkDominance folgt dem Sprung jetzt ueber Befehle hinweg, die EFLAGS
nicht schreiben koennen (Allowlist FLAG_PRESERVING_MNEMONICS, Deckel
MAX_SCHEDULED_INSTRUCTIONS_BEFORE_JUMP). Das Loch aus N1 bleibt zu: die
Fehlgruen-Form A schreibt mit test rax,rax die Flaggen und bleibt
UNPROTECTED. Neue Fixtures scheduled-jump-own-code (die echte
14.51-Form, ALLOWED_PROTECTED) und scheduled-jump-no-guard-own-code
(dieselbe Form ohne den Sprung, bleibt UNPROTECTED).
Werkzeugsatz-Pin auf "14.44 14.51" erweitert, Kopfkommentar um den
Durchsichtsstand 21.09.2026 ergaenzt.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Der K1-Windows-Waechter meldete auf dem CI-Runner zwei ungeschuetzte
EVEX-Treffer, die keine Befehle sind: mtmd.dll 0000000180097301
"vorps zmm25{k4}{z},zmm15,zmmword ptr [r25]" (fn=$LN4275, clip.obj) und
llama-server-impl.dll 00000001800dcadc "vpshufb xmm16,xmm30,xmmword ptr
[r25]" (fn=$LN191, server-tools.obj). r25 ist ein Allzweckregister aus
Intel APX; MSVC erzeugt fuer x64 kein APX, der Besitzer ist in beiden
Faellen ein lokales $LN-Label (Sprungtabelle oder Datenblock in .text),
und die Operanden sind AVX-512 in Modulen ohne /arch:AVX512. Der Runner
hat einen neueren Werkzeugsatz (Linker 14.51 statt 14.44), dessen dumpbin
APX kennt und dieselben Datenbytes jetzt als APX-Befehl ausschreibt.
Neue Klasse DECODE_ARTIFACT_APX: ein Treffer, dessen Operanden r16 bis
r31 nennen, wird als Fehldekodierung von Daten gefuehrt. Sie steht je
Treffer im Bericht und zusaetzlich als gezaehlte NOTE-Zeile, wird also
nicht still verschluckt, und sie zaehlt nicht als ungeschuetzt. Die Regel
sitzt nach der Besitzerbestimmung, damit die Kartenkontrolle unveraendert
streng bleibt, und vor Freigabeliste und Dominanzpruefung. Keine
Allowlist nach Dateiname: entschieden wird allein am dekodierten
Operandentext. Nur die Allzweckregister zaehlen, zmm16 bis zmm31,
k-Masken und {z} bleiben ohne Wirkung, ein echter ungeschuetzter
AVX-512-Befehl mit rax bis r15 bleibt UNPROTECTED.
Fixture apx-decode-artifact mit beiden Richtungen in einem Modul plus
sieben Tests, darunter der Gegenbeweis ueber eine umbenannte Karte und
die Kontrolle, dass Rot-Probe und beide Fehlgruen-Muster unberuehrt rot
bleiben. node --test 29/29, npm run lint sauber,
verify-sidecar-isa.selftest.sh 67/0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A1: give the empty-active-conversation landing block its own inner testid
so e2e measures content against the flex-1 area, not against itself.
A3: extend activeConvIsEmpty to remote mode so a dispatched, still empty
remote chat shows the same landing block instead of a blank area.
B2: document in cloud-offload-defer.ts that a hung local run holds VRAM
until it ends (Stop), since the offload only waits for the booking flag.
N1: raise the Linux ISA guard MIN_DISASM_LINES from 20 to 200 (real Linux
run measured 761 for the smallest module), grow the realistic fixture to
234 lines and update the selftest assertions.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
B1: an empty or too-short disassembly used to read as "no AVX found", a
pass for the wrong reason. objdump/llvm-objdump no longer swallow stderr
(2>/dev/null gone), a nonzero exit turns the guard red with the tool's own
error text, and every module (plus the exe) must clear a minimum
disassembled-instruction-line count before its ISA ceiling is even
evaluated.
B2: the SONAME-sibling pattern only required a suffix to START with a
digit, so a loadable "libggml-cpu-haswell.so.0.so" (extension exactly
.so, matching ggml's own dlopen scan) was silently trusted as an
already-checked sibling and never disassembled. The suffix is now
anchored to digits-and-dots only, and a real sibling is additionally
required to be byte-identical (cmp -s) to its canonical file before this
guard trusts it.
Auflagen also closed: the selftest now runs in ci.yml and release.yml
before any real build; a missing expected base Linux module (e.g. mtmd
silently dropped) now fails the guard the same way the Windows branch
already does; AVX-512 detection picks up k0, freestanding %kN opmask
operands, extended ymm16-31/xmm16-31 registers and AVX-512-exclusive
mnemonics regardless of register width (AVX512VL); the AVX2 heuristic now
treats any vp*-integer mnemonic on a %ymm operand as AVX2, closing the
"vpaddd on ymm slips through" gap the review named as overstated in the
prior round; and the disassembler-choice section documents why -d (not
-D) is used and how to tell a genuine ISA hit from a disassembled data
byte.
67 selftest assertions pass (up from 37), shellcheck 0.11.0 clean, bash -n
clean on all three shell files, both workflow YAML files parse.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
SKEPTIKER-LINUX-WEB-K1.md found verify-sidecar-isa.sh only checked x64,
sse42, ggml-base and the exe on Linux, skipping every other base module
(ggml, llama, llama-common, llama-server-impl, mtmd, ggml-vulkan) and every
CPU-tier variant's own ISA ceiling. Exactly those modules carried 24-98 VEX
hits on the Windows side of the same regression.
The decision logic (module classification against the llama.cpp
GGML_CPU_ALL_VARIANTS tier table, baseline/avx-only/avx2/avx512 ceiling
checks) now lives in scripts/lib/isa-guard-linux-rules.sh, shared with a
new scripts/verify-sidecar-isa.selftest.sh that proves it against
checked-in disassembly-text fixtures on any platform, no ELF file or
objdump needed. verify-sidecar-isa.sh sources the same file and feeds it
real objdump output; the two can never silently drift (a runtime assertion
compares EXPECTED_VARIANTS against the lib's own tier table). An
unrecognised module staged in the companions directory now fails the guard
closed instead of being skipped.
Also adds a built-.deb companion check to release.yml alongside the
existing built-AppImage one (K1-18): a completely different bundler
(dpkg-deb, not linuxdeploy) with its own independent silent-drop failure
mode, and bundle.targets is "all" so this workflow already ships a .deb
every release.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Vier weitere Halbgeviertstriche in ci.yml, release.yml,
build-llama-flags.test.mjs und build-llama.sh, alle aelter als dieser
Zweig, aber innerhalb release/3.0.1..HEAD hinzugefuegt. Durch Semikolon
oder Komma ersetzt, Sinn unveraendert. YAML-Parse und Node-Tests danach
weiter sauber.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Zwoelf Halbgeviertstriche steckten bereits in scripts/win-isa-guard.mjs
und scripts/verify-sidecar-isa.sh, aus fruehren K1-AVX-Commits. Die
Strichmessung fuer 3.0.1 verlangt Null, deshalb hier durch Komma,
Semikolon oder Klammer ersetzt, ohne den Sinn zu aendern.
Node-Tests danach weiter gruen: 27/27, 22/22.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Auflage A3: Kopfkommentar beschrieb noch die lockere Regel aus Runde 1
(memcmp/wmemcmp ohne Objektbindung, Dominanzpruefung ohne Bindung an
cmp/test unmittelbar vor dem Sprung). Jetzt beschreibt er die tatsaechlich
gehaertete Regel aus BL3 und N1. Die N2-Begruendung "thousands of lines"
war durch die eigene Messung nicht gedeckt (868 Zeilen fuer die exe im
Runde-2-Protokoll), jetzt steht die echte Zahl da.
Auflage A2: die UNPROTECTED-Meldung von checkDominance beschrieb nur die
Innenseite der Regel. Nach dem Vorbild der Toolset-Pin-Meldung sagt sie
jetzt, was der naechste Mensch tun soll: die Adresse von Hand
disassemblieren, pruefen ob ein isa-Check den Treffer wirklich
uebersprint, und dann entweder mit Fixture und Begruendung erweitern oder
den Fund als echten K1-Rueckfall behandeln. Die vier bekannten
Fehlalarm-Formen (Scheduler-Zwischenbefehle, Register-Cache,
Teilregister, bt/jae) stehen jetzt benannt im Kopf von checkDominance.
Node-Tests danach weiter gruen: 27/27 (win-isa-guard, build-llama-flags),
22/22 (build-llama-script.test.ts).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Echter Neubau auf der Box (C:\lu300trial\301\guard2, unveraendertes
Skript aus Commit 8c3f6d57) zeigte: die neun ggml-cpu-*.dll und
ggml-vulkan.dll sind CMake-MODULE-Bibliotheken
(ggml/src/CMakeLists.txt:267, add_library(... MODULE ...)), nicht
SHARED. MSVC linkt ein MODULE-Target ueber CMAKE_MODULE_LINKER_FLAGS,
eine dritte, eigene cmake-Cache-Variable, die CMAKE_SHARED_LINKER_FLAGS
nie erreicht. Der erste Bau mit nur SHARED/EXE=-MAP erzeugte .map-Dateien
fuer ggml.dll, ggml-base.dll, llama*.dll, mtmd.dll und die exe, aber
keine einzige fuer irgendeine ggml-cpu-*.dll oder ggml-vulkan.dll,
genau die Dateien, auf die es dem Waechter am meisten ankommt.
Alle drei Linker-Flag-Variablen tragen jetzt -MAP.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Nachbesserung zu review-waechter-windows.md (Opus, NACHBESSERN):
BL1: -MAP statt /MAP in build-llama.sh, Kommentar korrigiert. /MAP wird
von Git-Bash/MSYS in einen Windows-Pfad umgeschrieben (auch auf der
cmake-Kommandozeile, nicht nur ueber LDFLAGS), der Linker hat also nie
eine echte .map-Datei erzeugt. -MAP geht unveraendert durch, auf der Box
gemessen.
BL2: die Rot-Probe in verify-sidecar-isa.sh wertet jetzt nur noch den
exakten Exitcode 1 zusammen mit der Zeichenkette UNPROTECTED in stdout
als korrekt rot; jeder andere Exitcode (fehlende Fixture, kaputte
Argumente) macht den Waechter mit klarer Meldung rot statt die Kontrolle
faelschlich als bestanden zu werten. Gleiches Prinzip fuer die
Negativkontrolle (haswell, --expect-unprotected).
BL3: die memcmp/wmemcmp-Freigabe in win-isa-guard.mjs prueft jetzt
exakte Symbolgleichheit UND bindet sie an eine feste Liste tatsaechlich
gepruefter Objekte (common.obj, unicode.obj, ggml-backend-reg.obj,
server-context.obj) statt an eine Teilstring-Regex auf den Namen. Das
Opus-Gegenbeispiel (?fast@memcmp@ggml@@YAXXZ in ggml-cpu.obj) kommt
jetzt UNPROTECTED heraus.
Nicht-Blocker behoben:
- Dominanzpruefung verlangt jetzt einen bedingten Sprung, der
UNMITTELBAR auf ein cmp/test folgt, das an denselben isa-Lesezugriff
gebunden ist (Register- oder Direktvergleich); die zwei von Opus
nachgestellten Fehlgruen-Muster (unabhaengiger Sprung, Adresse nur als
Konstante) sind als Fixtures eingecheckt und kommen jetzt rot heraus.
- win-isa-guard.mjs prueft je Modul eine Mindestzahl geparster
Disassembly-Zeilen (Default 40), sonst rot statt stillschweigend
hitCount=0.
- find_map_for faellt nicht mehr auf llama-server.map zurueck; jedes
Modul braucht seine eigene Map oder wird rot.
- Modulliste wird jetzt gegen eine feste EXPECTED_BASE_WINDOWS_MODULES-
Liste geprueft; ein unbekanntes neues Modul oder eine leere Glob-Suche
macht rot mit Anweisung, es einzuordnen. Die Ausnahmeliste fuer hoehere
CPU-Stufen wird jetzt aus EXPECTED_VARIANTS abgeleitet statt separat
gepflegt.
- Skriptkopf von verify-sidecar-isa.sh dokumentiert den Toolset-Pin und
die Nachpruefanleitung.
- win-isa-guard.mjs dokumentiert ehrlich, dass die Abdeckung VEX/EVEX
ist, nicht die volle Basis-ISA; BMI ist ueber VEX bereits abgedeckt,
popcnt/lzcnt/tzcnt sind bewusst nicht abgedeckt (F3-Praefix ist im
64-Bit-Modus nicht eindeutig, haette Fehlalarme erzeugt).
Kein App-Code angefasst. Node-Tests: 26 (23 win-isa-guard.test.mjs + 3
build-llama-flags.test.mjs), alle gruen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
review-k1-avx.md (Opus) zeigte einen konstruktiven Fehlalarm im alten
Waechter: die Mnemonik-Regel "kein Mnemonik mit v" ist unter MSVC nicht
haltbar, weil die MSVC-STL und wmemcmp ihre AVX2-Pfade laufzeitgeschuetzt
in jedes Modul mitbringen, und sie erzeugte reine Fehltreffer aus
verr/verw-Datenbytes.
Windows-Regel neu gebaut wie in R1 bis R6 vorgegeben: Erkennung ueber
Opcode-Byte (C4/C5/62) statt Mnemonik, /MAP fest im MSVC-Zweig von
cmake_flags_for, Zuordnung ueber die Linker-Map (Freigabeliste fuer
CRT/STL-Objekte, Dominanzpruefung isa-Lesezugriff plus bedingter Sprung
fuer eigenen Code), Abdeckung aller neun von jeder CPU geladenen Module
plus exe, drei Kontrollen (Positiv, Negativ auf haswell, kuenstliche
Rot-Probe), MSYS2_ARG_CONV_EXCL fest im Disassembler, Toolset-Pin.
Der Windows-Analyseteil ist ein kleines, abhaengigkeitsfreies Node-Skript
(scripts/win-isa-guard.mjs) mit 13 Unit-Tests gegen eingecheckte
Fixture-Ausschnitte. Auf der echten Windows-Box gegen den fertigen
3.0.1-Sidecar samt .map gelaufen: gruen ueber alle zehn Module, Rot-Probe
korrekt rot, Toolset-Version bestaetigt. Dabei einen echten
Windows-spezifischen Bug im Skript selbst gefunden und gefixt
(Einstiegspunkt-Erkennung verglich eine file://-URL gegen einen nativen
Pfad mit Backslashes und lief auf Windows nie an).
CI: ein Schritt in sidecar-windows.yml und release.yml ergaenzt, der
dumpbin ueber msvc-dev-cmd auf PATH bringt.
Linux-Pfad des Waechters unveraendert (Diff zeigt nur eine entfernte
Kopfkommentarzeile). Kein App-Code angefasst.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
House rule: no em or en dashes anywhere, restructure the sentence instead.
The mandatory dash-check (git diff release/3.0.1..HEAD, count U+2013/U+2014
on added lines) turned up 35 hits, all of them in comments and test
descriptions this branch itself added across the R2-44, R2-51, R5-4/5/6,
R5-9, R5-51, R5-53, R5-66, R5-67, aq and R5-59 fixes. Reworded each one with
a comma or a period, no wording or behavior change, code untouched except
inside comments/doc-comments/describe-it strings.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der D-DOCS-Teil von R5-57/58/59 verlangt den Seed-Abgleich in diesem
Skript. Der neue Abschnitt vergleicht die editfaehigen Modelle (edit: true
ODER ops: ['edit']) zwischen dem Desktop-Seed (src/lib/render/cloud-models.ts)
und dem Web-Katalog (apps/web/lib/render/cloud-models.ts) nach Id und
Beschriftung. qwen-image-edit fehlte im Desktop-Seed komplett und war damit
unerreichbar (siehe den vorigen Commit, R5-57/R5-58); genau diese Klasse von
Drift faengt der neue Abschnitt beim naechsten Modell ab.
Bewusst nur Id/Beschriftung, keine Preise: der Seed darf beim Preis
veralten (die Katalogmodul-Kopfzeile sagt das ausdruecklich, die Live-
Antwort ist die Preiswahrheit), ein Waechter, der dort schluege, waere
Laerm ohne Handlungsmoeglichkeit. wan-2.2-spicy-extend wird wie jede andere
Zeile gelesen, nicht umbenannt und nicht gesondert behandelt.
Das Skript ist ein manueller Vor-Release-Lauf ausserhalb von CI/vitest
(siehe R2-46, die-verkaufszahlen-sind-von-hand-gehalten.test.ts). Ein Lauf
gegen den echten Web-Checkout bricht schon vorher an einer aelteren,
unabhaengigen Stelle ab (docs/pricing/index.html hat sich strukturell
geaendert, die Preiszelle traegt heute die ganze Karte statt nur "EUR 19";
das ist keine dieser drei Zeilen und wird hier nicht angefasst). Die neue
Logik selbst wurde isoliert mit node -e gegen beide echten Dateien
verifiziert: sie findet heute genau zwei editfaehige Modelle (flux-dev,
qwen-image-edit) auf beiden Seiten mit identischer Beschriftung.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
review-sidecar.md Runde 2, BLOCKER B4: check_no_absolute_build_rpath only
ever ran on ggml-base and the exe, the two files that structurally never
need a sibling RPATH. The fourteen ggml-cpu-* variants and ggml-vulkan are
exactly the files that DO need $ORIGIN to find libggml-base beside them,
and none of them were ever checked: a broken CMAKE_BUILD_RPATH_USE_ORIGIN
combined with a missing patchelf would leave them all with an absolute
build-tree RUNPATH while this guard stayed green. Now every staged
companion is checked, and a file with a NEEDED entry matching a sibling
file in the same directory but no RPATH/RUNPATH at all is red, not silently
accepted as "nothing to check".
Real proof: took the real libggml-cpu-x64.so built for the Runde 2 report
(sibling NEEDED on libggml-base.so.0, RUNPATH [$ORIGIN:]) and used patchelf
--remove-rpath to reconstruct the exact failure this blocker describes (the
"no flag and no patchelf" case). check_no_absolute_build_rpath now correctly
goes red on that reconstructed file ("needs sibling library ... but carries
NO RPATH/RUNPATH entry at all") and stays green on the real fixed one and
on ggml-base (no sibling NEEDED, no RPATH required).
BLOCKER B5: find_variant_file/find_named_module matched a WIDER pattern
than ggml itself ever opens. Read at the pin (ggml-backend-reg.cpp:472-520):
the CPU-variant scan requires filename.find(prefix) == 0 AND
entry.path().extension() == exact ".so"/".dll" (a versioned SONAME copy
like "libggml-cpu-x64.so.0" has extension ".0" and is invisible to the
scan); "vulkan" is never found by that scan at all (its own prefix would be
"libggml-vulkan-", which "libggml-vulkan.so" does not start with) and is
only found through the FALLBACK branch, which requires the single EXACT
filename "[lib]ggml-vulkan.<ext>". Fixed both helpers to do an exact
filename check (the "lib" prefix is not even a wildcard, it is a fixed,
platform-determined string), not a substring/wildcard match.
Real proof: renamed a real libggml-cpu-x64.so to libggml-cpu-x64.so.0
(exactly the failure mode B5 describes) against the fixed guard: red with
"expected CPU variant(s) missing: x64". Renamed libggml-vulkan.so to
libggml-vulkan-1.so: red with "ggml-vulkan.so missing". Restored both
names: green again, all 14 variants and vulkan found by exact match.
Bug found and fixed along the way: the initial exact-match rewrite used
`[ -f "$exact" ] && printf ...` as the last statement of each helper. Under
`set -e` (already on for this whole script), a variable assignment whose
command substitution's last command fails aborts the ENTIRE SCRIPT right
there, silently, with no message: a missing file (an everyday, expected
outcome the caller is supposed to collect and report) was being treated as
a fatal shell error. Confirmed by the very first end-to-end run of the
rewrite exiting 1 with no output at all. Fixed by giving both helpers an
explicit `return 0` after an `if`, so "not found" is not a script-ending
failure.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
review-sidecar.md BLOCKER B3: CMAKE_BUILD_WITH_INSTALL_RPATH defaults to
OFF, so CMake writes a build-tree RPATH into linked ELF files even with no
RPATH line anywhere in CMakeLists.txt, and that RPATH is commonly an
absolute path into the CI runner's own build directory, a path that will
not exist once shipped. Real measurement in a linux/amd64 Docker container,
same cmake invocation with and without the fix:
without -DCMAKE_BUILD_RPATH_USE_ORIGIN=ON:
RUNPATH Library runpath: [/src/build-noflag/bin:]
with it:
RUNPATH Library runpath: [$ORIGIN:]
Fix: -DCMAKE_BUILD_RPATH_USE_ORIGIN=ON for the Linux triple in
cmake_flags_for, plus a best-effort patchelf --set-rpath '$ORIGIN' pass in
stage_dynamic_isa_companions for the CI runner (patchelf is already in its
apt list) as a second line of defense if the cmake flag were ever ignored
by a future toolchain.
$ORIGIN is only half the story for the exe itself: on deb/AppImage the exe
lives in a different directory from its resource-staged companions, so
$ORIGIN there does not reach across. scripts/build-llama.sh --check now
sets LD_LIBRARY_PATH on Linux too (Nachbesserung N1: it previously only set
cwd and claimed in its own comment to start "exactly like the app does",
which was not true).
New CI step in release.yml, Linux triple only: copies the built exe and its
staged companions into a directory with a DIFFERENT name (not just a
different path under the same tree) before booting it, so a green run is
evidence the RPATH/LD_LIBRARY_PATH plumbing carries the layout, not that
the original build directory happened to still exist on the runner
(review-sidecar.md Beweisliste Punkt 3's explicit ask).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
BLOCKER B1 (review-sidecar.md): find_variant_file matched only unprefixed
names like ggml-cpu-x64.so, but ggml/CMakeLists.txt strips the "lib" prefix
only on WIN32, so real Linux output is libggml-cpu-x64.so. The guard never
matched a single Linux file, neither green nor red for the right reason.
Fixed with a leading wildcard (name and extension stay anchored, so it
cannot pick up an unrelated file), and ggml-base is now actually checked
instead of only claimed in the header comment (Nachbesserung N2).
Real proof, not just reasoning: built ggml-base, ggml-cpu-x64, ggml-cpu-sse42
and ggml-cpu-haswell for real against the pinned llama.cpp commit in a
linux/amd64 Docker container, ran this exact script against the real files
inside the container. Before the fix: all 14 variants reported missing,
red for the wrong reason. After the fix: all 14 variants found (14
placeholder files completed the set beyond the four real ones, matching
cmake's own variant list for this pin), baseline files show no AVX, haswell
shows AVX2. Negative control (haswell file removed): red with the exact
variant name. Positive control (haswell content substituted as the x64
baseline): red with real objdump AVX lines.
Also fixed along the way: the disassembler-name log line was being written
to stdout from inside a function whose stdout every caller captures via
$(disassemble ...), so it was silently swallowed into the disassembly text
instead of ever reaching the terminal. Split into log_disassembler_choice,
which writes to stderr.
BLOCKER B3 (partial, guard-script half): review-sidecar.md correctly says
"grep -rn RPATH" over CMakeLists.txt cannot see CMake's own default
build-tree RPATH behavior. New check_no_absolute_build_rpath reads real
readelf -d output on the Linux exe and ggml-base, red on an absolute
build-tree path in RPATH/RUNPATH. The cmake-flag and patchelf half of B3
lives in scripts/build-llama.sh, next commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ursache gemessen (nicht vermutet), siehe bau/sidecar.md: scripts/build-llama.sh
baute Windows/Linux bisher mit GGML_NATIVE=OFF, was im gepinnten llama.cpp
(ggml/CMakeLists.txt:141-166) INS_ENB=ON erzwingt und damit SSE4.2+AVX+AVX2+
BMI2+FMA+F16C fest in die EINE ausgelieferte Binaerdatei einbaut. Jede CPU
aelter als Haswell/Excavator (2013+) stirbt mit 0xC000001D unter Windows bzw.
SIGILL unter Linux, bevor llama-server ueberhaupt eine Zeile loggen kann.
Fix: GGML_BACKEND_DL=ON + GGML_CPU_ALL_VARIANTS=ON + BUILD_SHARED_LIBS=ON fuer
beide Triples (mac bleibt statisch, Metal, unveraendert). Belegt gegen den
echten gepinnten llama.cpp-Checkout, nicht geraten: cmake -S/-B mit diesen
Flaggen in einem Ubuntu-22.04-Docker-Container konfiguriert UND gebaut
(x64/sse42/haswell real kompiliert), Ausgabe zeigt genau die MSVC-9- bzw.
Linux-14-Varianten aus ggml/src/CMakeLists.txt:378-402.
scripts/build-llama.sh: stage_dynamic_isa_companions kopiert nach dem Bau alle
ggml-cpu-*/ggml-vulkan/ggml-base/llama-Bibliotheken (find -L, damit Linux'
versionierte SONAME-Symlinks nicht uebersehen werden) nach
src-tauri/resources/llama/<triple>/, sha256 je Datei im Log. --check startet
jetzt mit cwd auf diesem Verzeichnis, genau wie die App es tut.
tauri.windows.conf.json / tauri.linux.conf.json: bundle.resources buendelt die
Bibliotheken zusaetzlich zum externalBin-Sidecar (Windows: flach in den
Resource-Root, der dort = Exe-Verzeichnis ist; Linux: unter resources/llama/,
weil deb/AppImage externalBin und resources getrennt halten).
engine.rs: NUR die Spawn-Stelle angefasst (Auftrag). resolve_engine_backend_dir
+ apply_engine_backend_dir setzen cwd (der einzige Hebel, den
ggml_backend_load_best laut Quelltext liest, ggml-backend-reg.cpp:479-486;
GGML_BACKEND_PATH laedt nur EINE Datei, keine Verzeichnisliste) und unter Linux
zusaetzlich LD_LIBRARY_PATH davor (kein $ORIGIN-rpath im gepinnten Build).
Bewusst Command::new statt foreign_system_command: eigener Sidecar, will die
geerbte AppImage-Umgebung (K11/K14) gerade behalten. Betrifft beide Spawn-Orte
(spawn_engine_attempt fuer den Chat-Motor, start_bundled_embed_blocking fuer
den Embeddings-Server), sonst keine Datei des Engine-Bauers angefasst.
CI: verify-sidecar-isa.sh disassembliert nach dem Bau (objdump/llvm-objdump/
dumpbin) die x64- und sse42-Variante sowie die Exe gegen ymm/zmm-Register und
vex-kodierte Mnemonics (muss leer sein) und die haswell-Variante als
Gegenprobe (muss AVX2 zeigen, sonst ist der Check selbst blind); fehlende
erwartete Varianten sind rot. Eingehaengt in release.yml (beide Triples) und
sidecar-windows.yml. sidecar-windows.yml startet die Boot-Probe jetzt aus dem
Resource-Layout statt der nackten Exe und laedt die Bibliotheken mit hoch.
ci.yml: die Stub-Schritte fuer cargo check und den ungesignten tauri-build-Gate
legen zusaetzlich eine leere Platzhalter-Bibliothek an, sonst bricht
bundle.resources' Glob dort auf einen leeren Treffer.
Tests: 22 vitest-Faelle in build-llama-script.test.ts (neu: dynamische Flaggen,
is_dynamic_isa_triple, resource_llama_dir_for, drei Faelle fuer
stage_dynamic_isa_companions inkl. SONAME-Symlink-Dereferenzierung). Negativkontrolle
gefahren: find ohne -L uebersieht die symlinkten SONAMEs auf Linux, Test faellt
exakt darauf um (rot), mit -L gruen (22/22). Fuenf neue Rust-Tests fuer
apply_engine_backend_dir/resolve_engine_backend_dir (current_dir gesetzt,
No-op ohne Verzeichnis, LD_LIBRARY_PATH-Voranstellung inkl. leerem und fehlendem
Ausgangswert). Negativkontrolle gefahren: current_dir-Zeile entfernt, Test
apply_engine_backend_dir_sets_current_dir_when_given_one wird rot
("left: None, right: Some(...)"), zurueckgestellt, wieder gruen.
Tore: cargo test 1378 passed; 0 failed; 5 ignored. cargo clippy --all-targets
-- -D warnings: sauber NACH einem temporaeren Fix der vorbestehenden,
unveraendert uebernommenen Zeile install/pip.rs:1248 (gehoert nicht zu K1,
sofort zurueckgesetzt, siehe bau/sidecar.md). Ohne diesen Fremdfix bricht
--all-targets bereits auf fix/301-engine vor meinem Commit, belegt gegen den
Fork-Punkt 3ad57d38. npx tsc -p tsconfig.app.json --noEmit: sauber. Ganze
vitest-Suite: 817 passed | 5 failed Dateien, 10855 passed | 16 failed | 31
skipped Tests -- alle 16 roten Faelle bereits auf 3ad57d38 rot (per
Worktree-Gegenprobe bestaetigt, reine Marketing/Preis-Texttests, unberuehrt
von diesem Commit). actionlint auf allen drei geaenderten Workflows: sauber.
E2E noch zu beweisen: echter CI-Lauf von release.yml auf diesem Zweig (Windows
+ Linux, objdump-Gegenprobe real auf CI-Hardware statt QEMU-Emulation),
Installer auf der Windows-Box mit Intel SDE (-snb/-nhm) gegen eine
AVX2-freie CPU MIT Gegenprobe gegen den heutigen 3.0.0-Sidecar (muss dort
sterben). Einzelheiten und die drei vom Melder benoetigten Zahlen in
bau/sidecar.md.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Nachtrag zum Entscheid vom 13.09.2026: Chroma, Prefect Pony XL und Neta Lumina
(anime) sind erwachsenenfaehig, trugen aber keinen Hinweis im Namen. Sie
bekommen das Suffix, die Ids bleiben unberuehrt. Beim dritten faellt die
Suffixregel auseinander, weil der Klammerzusatz stehen bleibt; das Web schreibt
es genauso (acaa0c9d), also steht hier "Neta Lumina (anime) Spicy".
Das Web hat mit 4bdef6cd nachgezogen und traegt alle vierzehn Namen. Damit
faellt der Namensstamm-Behelf weg: Paritaetstest und Verkaufswaechter
vergleichen die Beschriftung wieder Zeichen fuer Zeichen, und das Markenwort
wird zusaetzlich gegen den Entscheid geprueft, damit ein Rueckfall des Webs
nicht als blosse Abweichung durchgeht.
Zwei Funde nebenbei behoben. Der Paritaetstest nahm den Worktree
lu-300-web-katalog vor dem Release-Checkout und haette die Paritaet gegen einen
eingeflossenen Altstand geprueft, ohne dass es auffaellt. Und der Kommentar in
cloud-pitch.ts nannte CLAIM_IN_NAME als Auswahl der Zahlungsdomain; die haengt
seit d914adb0 am Katalogfeld adult, CLAIM_IN_NAME ist im Web geloescht. Eine
eigene Namenspruefung fuehrt der Desktop nicht, es war nur der Kommentar.
Kontrollen am Zustand, alle rot: Bildmodell ohne Spicy, Videomodell zurueck auf
Open, angefasste Id, weggelassener Klammerzusatz. Dazu ein eingefrorener
Web-Stand c5d9d2cd als Gegenprobe, gegen den der volle Vergleich drei Tests rot
faerbt statt sie stillschweigend durchzulassen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Entscheid David vom 13.09.2026, er kehrt den Entscheid vom 12.09. um. Der
Grund steht dabei: "Open" versteht kein Kunde.
Geaendert sind ausschliesslich Anzeigenamen, elf im Seed und zehn auf der
LUC-Preisseite. Die Ids sind unberuehrt, sie tragen ohnehin `-spicy`, also
bricht weder ein Auftrag noch eine Preiszeile. Die Beschreibungstexte sind
unberuehrt: die drei Zeilen im Panel, im Blatt und im CHANGELOG stehen
zeichengleich wie vorher, es ging nur um die Namen.
Zwei Waechter mussten mit, und zwar ohne ihre Aufgabe zu verlieren. Sie hielten
die Beschriftung Zeichen fuer Zeichen gegen den Web-Katalog, und das Web fuehrt
zum Stand c5d9d2cd noch "Open". Verglichen wird jetzt der STAMM des Namens,
also alles ausser dem Markenwort, und das Markenwort selbst wird gegen den
Entscheid geprueft. Reihenfolge, Ids, Preise, Faehigkeiten und der Rest der
Beschriftung haengen unveraendert am Web. Zieht das Web nach, aendert sich hier
nichts. Dasselbe in scripts/check-cloud-sales.mjs.
Was NICHT zurueckkommt: eine Beschriftung, die die Faehigkeit ausspricht.
uncensored, nsfw, adult, nude und porn bleiben verboten, und der Waechter
prueft das weiter. Auf der Zahlungsdomain taucht keiner dieser Endpunkte auf,
Entscheid dbf663fe, daran aendert dieser Commit nichts.
Negativkontrollen, gefahren:
ein Name im Seed zurueck auf Open: vitest rot, Waechter gruen (der Seed steht nicht auf der Seite)
ein Name auf der LUC-Seite zurueck auf Open: Waechter rot
Stamm verdreht bei richtigem Markenwort: vitest rot
verbotenes Wort in der Beschriftung: vitest rot
mit Fix: beide gruen
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Die Sperre ist aufgehoben, der Web-Merge ist durch (c5d9d2cd). Uebernommen
sind die Stufen, die dort auf Verkauf stehen, gelesen aus
apps/web/lib/billing/topup.ts und nicht aus einer Nachricht:
pack-15 450.000, pack-35 1.100.000, pack-75 2.400.000, pack-125 4.050.000,
pack-300 9.750.000 Credits.
Die Kurse habe ich selbst nachgerechnet: 30.000, 31.428,6, 32.000, 32.400 und
32.500 Credits je Euro. Ein Hosted-Monat sind 900.000 fuer 19 Euro, also
47.368,4. Geteilt gegen das beste Paket ergibt das 1,4575 und gerundet 1,5.
Der Abo-Satz bleibt damit zeichengleich "about 1.5x", unveraendert.
Stufe fuer Stufe geprueft, wo ein Satz das Paket mit einem Abomonat vergleicht:
"more credits than a Hosted month" stimmt ab 35 Euro, fuer die Einstiegsstufe
NICHT, denn 450.000 sind weniger als 900.000. Der Satz ist deshalb auf die 35
gewandert, die Einstiegsstufe traegt einen Bildanker, und die Preisseite sagt
den Nachteil ausdruecklich dazu.
Nachgezogen sind 24 Dateien: die Preisseite mit der vollen Leiter, die
Wolkenseite, neun Vergleichsseiten, elf Artikel samt der JSON-LD-Bloecke darin
und die Spiegeltabelle pricing-page.test.ts. Abgeleitete Mengen sind neu
gerechnet statt nur die Zahl daneben zu tauschen: 450.000 Credits sind 1.500
Schnell-Bilder und 375 auf Flux 2 Dev, 1.100.000 sind 916 auf Flux 2 Dev.
Die drei alten Stufen kommen in keinem Kundentext mehr vor. Nirgends steht,
wie viele Tokens das Geld kauft.
check-cloud-sales.mjs zaehlte bisher JEDES Objekt aus topup.ts als Paket, also
auch RETIRED_PACKS. Damit haette die Preisseite drei stillgelegte Stufen
anbieten muessen, und der Abo-Faktor waere gegen ein Paket geteilt worden, das
niemand mehr kaufen kann. Er filtert jetzt auf verkaeuflich (kein retiredOn),
an beiden Stellen. Am Faktor aendert das nichts, das beste stillgelegte Paket
lag mit 32.000 unter den 32.500 der neuen Spitze.
Befund am Rande, nicht von mir geaendert: die Desktop-Seiten nannten fuer
small/medium/large 230.000, 465.000 und 1.175.000, waehrend RETIRED_PACKS im
Web fuer dieselben Ids 150.000, 310.000 und 800.000 fuehrt. Eine der beiden
Seiten hat die Zwischenstufe vom 10.09. nie nachgezogen. Fuer den Desktop ist
das jetzt gegenstandslos, die Ids sind draussen.
Negativkontrollen, gefahren:
eine Packmenge verstellt: Waechter rot, vitest rot
stillgelegtes Paket wieder angeboten: Waechter rot, vitest rot
Filter fuer stillgelegte Pakete entfernt: Waechter rot
Vergleichsseite auf der alten Stufe: Waechter rot
mit Fix: beide gruen
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Ein Klick auf den Wolkenschalter stellte einem abgemeldeten Besucher bisher
ein Anmeldefenster hin. Das ist die falsche Frage an dieser Stelle: wer noch
nichts gekauft hat, kann sich nicht anmelden, und ein Anmeldefeld sagt ihm
nicht, wofuer. Jetzt steht dort das Argument.
Das Panel nennt drei gezaehlte Zeilen (24 Chatmodelle ohne Ablehnung, 10
offene Video-, 3 offene Bildmodelle), den Preis aus der Preiskonstante und den
Abo-Satz. Gekauft wird im Browser: der Knopf oeffnet /pricing, die App fasst
Stripe nicht an. Wer schon zahlt, nimmt den Textlink darunter und landet im
bestehenden Anmeldeweg.
Der abgemeldete Weg hat damit zwei Schritte statt drei. Der mittlere zeigte
die Plaene als Knopfreihe und schickte den Klick doch auf dieselbe Preisseite;
er ist geloescht, nicht auskommentiert. PlanGrid bleibt, denn ein ANGEMELDETES
Konto ohne Plan sieht die Plaene unveraendert.
Bestehende Kunden merken nichts: mit gueltiger Sitzung schaltet der Schalter
wie bisher direkt um, der Zwei-Klick-Schutz steht unveraendert, und das Panel
erscheint nur ohne Sitzung. Genau das ist die Gegenprobe im Playwright-Lauf.
Keine Zahl ist getippt. Sie kommen aus lib/cloud-pitch.ts, die Reissleine haelt
jede einzeln, und check-cloud-sales.mjs zaehlt die offenen Modelle im
Medienkatalog des Web-Repos nach, ohne das Verlaengerungs-Werkzeug, das keinen
eigenen Clip erzeugt.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Beleg steht im Waechter selbst. D-Docs hatte in scripts/check-cloud-sales.mjs
geschrieben: "planPays haengt heute noch an paidBefore (apps/web/lib/pricing.ts),
also an je gezahlt. Sobald W-API das laufende Abo verlangt, wird aus der
Wortlautschranke wieder eine Codeschranke, eine Zeile." Genau das ist mit dem
Merge von fix/300-david-w eingetreten: planPays(tier) nimmt seit Entscheid V3
vom 12.09.2026 nur noch den Rang der aktiven Lizenz und liest die Kaufhistorie
nicht mehr. Das Tor fiel danach mit "planPays no longer requires a paying
account at all, the whole Flash wording is stale".
Neu gebunden wird die Regel, die jetzt gilt: planPays nimmt genau ein Argument,
sein Rumpf ruft isSubscriptionTier und nennt paidBefore nirgends. Ein zweites
Argument waere wieder die Kaufhistorie und faellt auf. Die zweite Zusicherung
ist umgedreht: sie verbot frueher, dass planPays auf das laufende Abo wechselt,
und verbietet jetzt die Rueckkehr zu paidBefore. Der alte Name
flashNeedsPaidAccount und der alte Kommentar sind weg, kein toter Rest.
Negativkontrolle gefahren: mit apps/web/lib/pricing.ts aus 97f68146, also mit
dem alten planPays(tier, paidBefore), faellt das Tor woertlich mit "planPays no
longer requires an active paid plan at all, the whole Flash wording is stale".
Mit der gemergten Quelle laufen alle Abschnitte durch.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Die ausgelieferte Datei endete bei 2.6.9, obwohl alle fuenf Manifeste auf
3.0.0 stehen. Der Abschnitt kommt aus
deliverables/CHANGELOG-3.0.0-ENTWURF.md und aus src/lib/release-notes.ts,
auf die Entscheide von heute gezogen:
- Marke 24 statt 27, mit demselben Satz wie die LUC-Seiten.
- Freimenge am laufenden Abo, mit dem Blattsatz zeichengleich.
- Etikett "No credits" statt "Included".
- Willkommens-Credits nicht erwaehnt, sie sind abgeschaltet.
Dazu die sechs Posten, die im Entwurf fehlten oder zu schmal waren: die
getrennten Erinnerungssammlungen mit Sync nur nach zwei Haken, Remote Access
mit gereihtem Start, Stopp und Neustart, das Cloud-Tor mit seinen drei Zeilen
und echten Zahlen, der Wortlaut am Dismiss des Stale-Banners, die
Paketbeschreibungen und die Startpruefung des Updaters mit "Last checked".
Englisch, durch den Humanizer, kein Adult-Vokabular, keine Gedankenstriche in
den neuen Zeilen, kein Satz darueber, wie viele Tokens Geld kauft.
Waechter: neuer Changelog-Abschnitt in scripts/check-cloud-sales.mjs. Er
sucht den Abschnitt ueber die Version aus package.json, liest ihn ohne
Zeilenumbrueche und verlangt Markensatz und Freimengensatz zeichengleich,
dazu null alte Schwelle, null alte Bedingung, null altes Etikett, null
Willkommens-Credits, null Gedankenstriche und null Tokenangabe je Geld.
Gegenprobe rot a: Marke im Abschnitt auf 27, "the mark sentence does not read
as the decision writes it".
Gegenprobe rot b: alte Freimengen-Bedingung eingesetzt, "the Flash sentence
does not read as the decision writes it".
Gegenprobe rot c: ein Gedankenstrich in die Einleitung, "1 typographic
dash(es) in the new section".
Gruen: 159 neue Zeilen, alle 29 Waechter des Skripts gruen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Entscheid David: nicht "Included", sondern wieder "No credits". Der Tooltip
daneben sagte ohnehin "No credits", und "Included" sagt nicht, worin etwas
enthalten ist.
Zwei Stellen im Handbuch, Kapitel 8: der Satz am Bildschirmtext und der erste
Punkt der Markenliste. Die Vergleichsseite zu Ollama Cloud behaelt ihr
"Included usage" des Wettbewerbers, das ist kein Etikett von uns.
Waechter: neuer Abschnitt in scripts/check-cloud-sales.mjs. Er verbietet das
alte Etikett in Anfuehrungszeichen in ganz docs/, verlangt die Entscheidform
an beiden Handbuchstellen und liest FLASH_MARK_LABEL aus
src/lib/flash-entitlement.ts mit, damit die noch nicht nachgezogene App im
Torlauf sichtbar bleibt statt still zu bleiben.
Gegenprobe rot: eine Stelle zurueck auf "Included", "1 page(s) still quote
Included [guide/cloud/index.html]".
Gruen: 2 Handbuchstellen mit der Entscheidform, 0 Seiten mit dem alten
Etikett, Desktop-App traegt noch "Included" (D-UI und W-UI ziehen nach).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Entscheid David zum Zusatzfund V3: ein einmaliger Pack oeffnet die Freimenge
nicht auf Dauer. Kundentexte gehen voran, der Code im Web zieht nach.
Vorher 4 Stellen mit "never paid" (Startseite, Handbuch Kapitel 8,
Wolkenseite, Preisseite) und 20 Stellen mit "on a paid plan". Nachher 0 mal
"never paid", 0 mal "paid benefit", 20 mal "on an active paid plan", und vier
Flaechen sagen ausdruecklich "accounts without an active plan keep paying
credits". Die Willkommens-Credits sind aus den zwei Saetzen gefallen, die sie
als Trost angeboten haben; sie sind abgeschaltet.
Waechter: der Handbuchabschnitt in scripts/check-cloud-sales.mjs prueft nicht
mehr die alte Bedingung, sondern verbietet "never paid" und "paid benefit" in
ganz docs/ und verlangt die neue Bedingung auf vier Flaechen, dazu den
Halbsatz ueber den Pack im Handbuch. Er haengt weiter an einer Codeaussage:
faellt die Zahlungsbedingung ganz aus planPays, ist alles rot, und sobald
planPays das laufende Abo verlangt, meldet sich der Waechter selbst zum
Nachziehen.
Gegenprobe rot a: die alte Wolkenzeile zurueckgesetzt, "has never paid may
not stand in docs/: 1 page(s) [cloud/index.html]".
Gegenprobe rot b: der Pack-Halbsatz im Handbuch entfernt, "the handbook has
to say that a pack alone does not open the allowance".
Gruen: 0 Seiten mit der alten Zusage, 4 Flaechen mit der neuen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Nachzug zu Posten 2. Die Beschreibung im Kopf von docs/cloud/index.html sagte
"27 chat models that answer without refusing" und fiel damit durch die erste
Fassung des Waechters, weil sie kein "N of the M" trug. Sie traegt jetzt
denselben zeichengleichen Satz wie die drei anderen Stellen.
Waechter: das Muster im Nennerabschnitt greift jetzt auch die Kurzform ohne
Nenner, also jede Stelle in docs/, die eine Zahl von Chatmodellen mit
"answer" verbindet.
Gegenprobe rot: die alte Kurzform zurueckgesetzt, "1 deviation(s)
[docs/cloud/index.html: 27 chat models that answer without refusing.]".
Gruen: der Satz steht an 4 Stellen zeichengleich.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Entscheid David R6-5: Schwelle 24, also nur was in beiden Laeufen nach der
strengen Regel voll geantwortet hat. Hergeleitet in
e2e/6-nachlauf/marken-nachmessung.md, Abschnitt 13.2. Katalogzahl bleibt 47,
Messzahl bleibt 46.
Drei Stellen vorher mit 27, drei nachher mit 24: die Beschreibung im Kopf und
der erste Punkt der Preisseite, dazu der erste Punkt der Wolkenseite. Alle
drei tragen jetzt denselben Satz, zeichengleich:
"24 of the 46 cloud chat models we measured answer in full without refusing,
and only those carry the No refusals mark."
Waechter: der Nennerabschnitt in scripts/check-cloud-sales.mjs haelt die
Anker nicht mehr gegen die lockere Katalogzahl, sondern gegen die
Entscheidzahl, und laesst den Entscheid nur enger sein als die Messung.
Dazu ein neuer Vergleich ueber alle Dateien unter docs/: jedes Verhaeltnis
von Chatmodellen wird ohne Auszeichnung gelesen und muss genau der Satz
sein, die Beschreibung im Kopf eingeschlossen.
Gegenprobe rot a: eine Seite allein zurueck auf 27,
"docs/cloud/index.html: unfiltered count drift".
Gegenprobe rot b: den halben Satz zurueckgedreht, "1 deviation(s)".
Gruen: 24 von 46 gemessen, 47 im Katalog, Satz an 3 Stellen zeichengleich.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Entscheid David R3-8: die LUC-Preisseite nennt die sechs Videoendpunkte ohne
eingebaute Inhaltsbeschraenkung einzeln, mit dem Etikett aus cloud-models.ts
und dem Credit-Preis je Clip aus MEDIA_MODEL_USD und CREDIT_USD. Fuenf
Sekunden je Clip, weil keiner der sechs einen Achtsekundensatz traegt und
clipLengths den Knopf genau daran ausblendet. Keine Tokenmenge je Geld.
lu-labs.ai bleibt unberuehrt, dort filtert keptOffThisDomain weiter.
Waechter: neuer Abschnitt in scripts/check-cloud-sales.mjs. Er liest die
sechs Zeilen aus cloud-models.ts, rechnet den Clip-Preis aus credits.ts und
haelt Reihenfolge, Id, Etikett und Creditzahl gegen die Seite; ausserdem
verlangt er, dass keiner der sechs einen 8-Sekunden-Satz hat, solange der
Satz "renders a clip of five seconds" auf der Seite steht.
Gegenprobe rot a: ein Clip-Preis von 26.000 auf 12.000 verstellt,
"clip price drift for seedance-1.5-pro-spicy".
Gegenprobe rot b: eine der sechs Zeilen geloescht,
"the page lists 5 adult video models, the catalogue has 6".
Gruen: 6 Endpunkte, 15000/10000/50000/50000/20000/26000 Credits je Clip.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
package.json:3 sagt 3.0.0. docs/index.html trug 2.6.9 an sieben Stellen,
docs/llms.txt:9 sagte v2.6.3, docs/llms-full.txt:5 ebenfalls v2.6.3 und :15
zehn Zeilen weiter v2.5.9. Drei Angaben, keine stimmte, zwei widersprachen
sich in derselben Datei.
Sechs Stellen in docs/index.html sind gezogen, dazu der Abschnitt New in,
der noch 2.6.9 beschrieb. Er ist aus dem 3.0.0-Eintrag von
src/lib/release-notes.ts neu geschrieben: Marken aus einer Messung, Flash
ohne Credits, die Inhaltsregel im Konto, die sechs Video- und drei
Bildmodelle ohne eingebaute Beschraenkung, die Sampling-Regler neben dem
Prompt und die Fixe. Keine Zahl im Abschnitt, die nicht anderswo gebunden
waere; die Decke und die Liste stehen verlinkt auf der Preisseite.
In llms-full.txt ist die zweite Versionsangabe geloescht, damit es je Datei
nur eine gibt, und der Waechter verlangt genau eine.
Der Waechter liest package.json und prueft jede Stelle, die eine Aussage
ueber die laufende Version ist: softwareVersion, die beiden Abzeichen, New
in, der Changelog-Link und die Kopfzeilen der beiden Sprachmodell-Dateien.
Historische Versionen in Blogzeilen bleiben unangetastet.
Negativkontrolle: vor dem Fix 9 veraltete Aussagen, nach dem Fix 0; eine
Stelle wieder auf 2.6.9 gestellt macht das Skript rot mit genau dieser
Stelle.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/llms-full.txt:3 sagte unbedingt "No cloud, no telemetry, no account", in
genau der Datei, aus der Sprachmodelle zitieren. Der Brief nannte nur
docs/index.html, die Falschaussage steht aber auch hier.
Der Waechter deckt jetzt Startseite, llms.txt und llms-full.txt ab. Bedingte
Stellen bleiben erlaubt und stehen unveraendert: no cloud calls unless you
enable a cloud route, und die beiden RAG-Saetze mit local embeddings.
Negativkontrolle: 4 Treffer beim Ausweiten, davon 3 bedingt und richtig,
1 unbedingt und gefixt. Danach 0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
scripts/check-cloud-sales.mjs prueft pitch.videoModels gegen die volle
Katalogliste, waehrend lu-labs.ai ueber keptOffThisDomain filtert und weniger
zeigt. Beide Zahlen sind je fuer sich bewacht, nirgends stand, dass der
Unterschied gewollt ist. Reiner Kommentar, keine Zahl angefasst.
Den gleichlautenden Kommentar an videoModels in src/lib/cloud-pitch.ts setzt
D-UI. Ob der Desktop weiter elf nennen soll, ist Entscheid David.
Negativkontrolle: das Skript bleibt gruen, alle Waechter unveraendert.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/pricing/index.html:24 schrieb "Twelve models are in that class" als Wort,
von nichts bewacht, waehrend das Web dieselbe Zahl aus dem Katalog rechnet
(apps/web/app/(marketing)/pricing/flash-policy.tsx:5). Die Zahl traegt jetzt
data-flash-model-count und haengt am Katalog, wo usageClass flash steht.
Im Handbuch standen die 500.000 zweimal ausserhalb des Ankers, in den beiden
zitierten Bildschirmtexten. Beide sitzen jetzt im selben
data-flash-limit-Span, und der Waechter liest nicht mehr nur den ersten Anker
je Seite, sondern alle.
Negativkontrolle: die Zahl wieder als Wort getippt macht das Skript rot.
Zurueckgestellt gruen mit 5 verankerten Nennungen der Decke und 12 Modellen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/blog/what-a-mac-can-run-locally-2026.html:110 nannte 11 Videomodelle und
verlinkte im selben Satz auf lu-labs.ai/pricing. Dort rechnet
publicMediaModels ueber keptOffThisDomain und zeigt fuenf, weil die sechs
erwachsenenfaehigen Endpunkte auf der Zahlungsdomain nicht beworben werden.
Die Elf darf auf LUC stehen, nur nicht als Verlinkung.
Der Link steht jetzt in einem eigenen Satz auf Raten und Plaene.
Der Waechter verbietet in docs/blog/ jeden Satz, der eine Videomodellzahl und
einen Link auf lu-labs.ai/pricing zusammen traegt. Derselbe Satz ohne den
Link bleibt erlaubt, und genau so steht er jetzt da.
Negativkontrolle: vor dem Fix 1 Satz, nach dem Fix 0.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/cloud/index.html:16 trug datetime 2026-09-09, waehrend :23 auf derselben
Seite den Lauf vom 2026-09-10 zitiert. Die Messtabelle datiert sich selbst:
apps/web/lib/chat/model-facts.md:3 "Produced by the owner on 2026-09-10".
Der Waechter liest das Datum aus der Messtabelle und haelt auf beiden
Verkaufsseiten Stempel, ausgeschriebenes Datum und die Stelle im Fliesstext
dagegen. Kein Datum steht getippt in der Pruefung.
Negativkontrolle: vor dem Fix rot fuer docs/cloud/index.html,
docs/pricing/index.html:16 bleibt unveraendert und gruen.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>