docs/novaberg-memory-qualitaetsprofil.md
Rama master · réplica de lectura del repositorio original.
# Novaberg — Die abstrakte Schicht: Qualitätsprofile
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Moduldokument — `memory/quality_profile.py` (Prompt, Annahme der Modellantwort, gedeckelter Lauf), `memory/repositories/quality_profile_repository.py` (Speicher), `ei/fascination.py` (Merkmalszug); ~~der Aufrufer ist der achte Schritt des Tageslaufs in `agents/synapsen_decay/agent.py`~~ → der Aufrufer ist seit dem 06.09.2026 der eigene Agent `agents/qualitaet_profil/` (täglich, `PIXIE_QUALITAET_INTERVALL_SEKUNDEN = 86_400`; am Code geprüft am 22.10.2026, §2)
**Stand:** 22. Oktober 2026, 22:24 UTC (`date -u`; am Code geprüft und berichtigt — der Aufrufer ist der eigene Agent, der Tageslauf hat zehn Schritte, Längenschwelle und Sortierung in §4, 52 Zeugen in §8, §6d als überholt markiert). Davor 13. Oktober 2026, 22:41 UTC (`date -u`; §9: vier der fehlenden Punkte sind seit dem 05.09. gebaut, markiert). Davor 11. September 2026, 06:40 UTC (`date -u`; **§4a neu — die Frische steht vor der Gesamtlesespur**: Die Faszination meldete in **74,1 %** von 363 Turns `werte: {}`, und von 42 gelesenen Trägern ohne Profil standen **22 als offene Kandidaten in der Warteschlange** — richtig eingereiht und nicht an der Reihe. Bei 1497 offenen Kandidaten und 20 je Tag sind das 75 Tage. Betriebsbeleg am selben Tag: **9 neue Profile, davon 7 für Träger der laufenden Reihe** gegen vorher 0 von 20). Davor 6. September 2026, 21:00 UTC (`date -u`; **der Längenfilter ist entschieden** — `QUALITAET_LAENGE_MIN` 400 → 100, weil die Länge Sachaussage (271) und Sprechakt-Vermerk (281) nicht trennt und die Warteschlange 0 von 95 gelesenen Trägern enthielt; die Faszination rechnet seither im Turn). Davor 6. September 2026, 12:45 UTC (`date -u`; **§2 — der Erzeuger ist aus dem Tageslauf ausgezogen**: Er stand dort in der `cpu`-Spur, in der das Sprachmodell verriegelt ist, und hat in drei Tagen **keinen einzigen Träger profiliert** (zwei Läufe, beide `0 von 20`). Eigener Agent `agents/qualitaet_profil/`, Takt täglich; im Betrieb **20 von 20** gegen vorher 0 von 20). Davor 5. September 2026, 14:19 UTC (`date -u`; **§4a/§4b neu — die Abgrenzung Sachtext gegen Sprechakt ist gemessen und nicht gebaut**: Die Themen trennen nicht (bestes häufiges Thema 29,2 % bei 106 Vorkommen), die **Eröffnungsformel** schon (Frageform 0 von 115 lang, Einsichtsformel 56,7 % von 409). Der Längenfilter kostet **177 Einsichten** unter 400 Zeichen. Dabei die vorgelagerte Frage aufgeworfen, **ob überhaupt vorab gefiltert werden soll**: 49 von 50 Trägern schlagen voll aus, **keine gemessene Null im Bestand** — die Gegenprobe zum Vorbehalt aus §6b fehlt deshalb. Drei Wege benannt, keiner entschieden). Davor 5. September 2026, 10:20 UTC (`date -u`; **die Auswahl folgt der Lesespur** statt `haeufigkeit` — in zwei Anläufen berichtigt, weil auch die Brücke die falsche Größe zählt (Entstehung statt Lektüre); **ein Totalausfall ist seither ein Fehler** (20 versucht, 0 profiliert, `error: None`), und der Lauf ist über `POST /admin/qualitaet/lauf` anstoßbar. **Bestand 50 Träger, 300 Kanten.** Offen bleibt der Längenfilter: nur 7 von 36 gelesenen Knoten passieren ihn.). Davor 3. September 2026, 21:38 UTC (`date -u`; **Scheibe 1 gebaut und gegen den Bestand gemessen** — **28 Träger, 168 Kanten**, 6,5–8,1 s je Träger. **Die Dominanz kollabiert auf `komplexitaet`: 23 von 25**, was der Handmessung des Konzepts §6.2 widerspricht; die Gegenprobe schließt die Textlänge als Ursache aus. Ein Defekt dabei gefunden und behoben)
**Pfad:** novaberg/docs/novaberg-memory-qualitaetsprofil.md
**Konzept:** `novaberg-thinking-faszination_k.md` §4 (der Träger), §5 (das gesetzte Vokabular), §6 (die sechs Dimensionen), §10.1 (der Merkmalszug)
**Zustand:** 🟠 gebaut, läuft, **und sein Ergebnis steht unter einem Vorbehalt** — Speicher, Erzeuger und Leser stehen, aber vier der sechs Dimensionen sind an keinem einzigen Träger die stärkste
---
## 1. Aufgabe
Ein Träger, der oft genug wiedergekehrt ist, bekommt eine Bewertung auf sechs
Qualitätsdimensionen. Aus diesen sechs Zahlen rechnet der **Merkmalszug** einen Wert — den
zweiten von neun Faktoren der Faszination (Konzept §10.6).
**Der Träger ist nicht die Entität.** Wer sich für ein Werkzeug fasziniert und ein
baugleiches daneben aufnimmt, fasziniert sich für dasselbe; die Zuwendung erbt der Zwilling
nicht. Deshalb hängt die Faszination an einem Merkmalsprofil und nicht an einem Gegenstand.
**Heute ist der Träger ein LZG-Knoten.** Entitäten und Themen sind vorgesehen und nicht
gebaut — die erste Scheibe nimmt den Knoten, weil §6.2 den Dimensionssatz genau daran
geprüft hat.
## 2. Position
Der Erzeuger sitzt **nicht** im Turn, sondern in einem **eigenen Pixie-Agenten**:
`agents/qualitaet_profil/`, Takt täglich, Spur `llm`.
> **Bis zum 06.09.2026 war er der achte Schritt im Tageslauf des `SynapsenDecayAgent` — und hat
> dort in drei Tagen keinen einzigen Träger profiliert.** Zwei Läufe im `hintergrund_log`, beide
> `0 von 20`, jedes Mal `SpurVerletzungError`, der ganze Schritt in **0,09 Sekunden**
> `[gemessen 06.09.2026]`.
>
> **Der Riegel hat gehalten, was er verspricht.** Der Tageslauf fährt die `cpu`-Spur, in der das
> Sprachmodell verriegelt ist (`services/model_services/spur.py`) — und ein Profil kostet **einen
> Modellaufruf je Träger**. Gebrochen war die Zusicherung daneben: `lastart` von `synapsen_decay`
> sagt in seinem eigenen Docstring *„Reine Rechnung über Bestandswerte, kein Modellaufruf"*.
>
> **Warum der Bau trotzdem richtig aussah:** Der Erstlauf am 03.09.2026 lief von Hand, also
> **außerhalb jeder Spur** — dort schweigt der Riegel ausdrücklich.
>
> **Ein eigener Agent statt `lastart = "llm"` am Tageslauf:** Der ist zu neun Zehnteln reine
> Rechnung, und seine übrigen Schritte hätten hinter dem Modell gewartet. Der neue Agent setzt
> `lastart` **nicht** — die Vorgabe in `agents/base.py` ist `llm` und für genau diesen Fall so
> gewählt.
>
> **Beleg:** 05.09. im Tageslauf `0 von 20`; 06.09. 11:28 im eigenen Agenten **20 von 20**.
> Bestand 50 → **72 Träger / 432 Kanten**, offene Kandidaten 350 → **328**.
~~Der Tageslauf trägt seither neun Schritte, Nummer 8 bleibt als benannte Lücke stehen:~~ → Der Tageslauf trug danach, bis zum 18.10.2026, neun Schritte; Nummer 8 bleibt als benannte Lücke stehen:
```
Knoten-Decay → pipeline_log-TTL → Queue-Verfall → Prägungs-Faltung
→ Strang-Nachzug → Strang-Richtungen → Einfärbung → (8: ausgezogen)
→ Trägerseite der Faszination → Preiswächter
```
→ **Seit dem 18.10.2026 sind es zehn:** Der Verfall der Fakten-Kanten läuft als Schritt 11 vor dem Preiswächter, der seine Nummer 10 behält (am Code geprüft am 22.10.2026, `agents/synapsen_decay/agent.py`, `_fakten_verfall`):
```
Knoten-Decay → pipeline_log-TTL → Queue-Verfall → Prägungs-Faltung
→ Strang-Nachzug → Strang-Richtungen → Einfärbung → (8: ausgezogen)
→ Trägerseite der Faszination → Fakten-Verfall (11) → Preiswächter (10)
```
**Der Grund ist die Sorte der Größe.** Ein Profil beschreibt den Gegenstand und ändert sich
zwischen zwei Tagen nicht; es entscheidet nichts, was der Turn braucht. Der Turn-Pfad liest
es später — er erzeugt es nicht.
**Gedeckelt auf 20 Träger je Lauf.** Am 03.09.2026 standen 368 Kandidaten im Bestand, und
ebenso viele Modellaufrufe passen nicht in einen Heartbeat-Platz. Bei diesem Deckel füllt
sich der Bestand in rund drei Wochen, und ein Ausfall kostet einen Tag statt eines Laufs.
## 3. Das Schema — zwei Tabellen, und warum sie eigene sind
```
abstrakt_knoten art ('qualitaet' | 'wert'), name, beschreibung, herkunft
traeger_qualitaet knoten_id → lzg_knoten, qualitaet_id → abstrakt_knoten,
auspraegung [0..1], quelle, haeufigkeit
```
**`art` ist der Typ-Diskriminator, und er ist kein Ordnungsmerkmal.** Ohne ihn sickert die
Valenz von der Werte- auf die Qualitätsseite (Konzept §4.4), und Kriegsgeschichte trüge
weniger Faszination als Gartenkräuter — der Fehler wäre fest im Schema verbaut.
| | Werte-Kante (`lzg_knoten_haltung.ladung`) | Qualitäts-Kante (`traeger_qualitaet.auspraegung`) |
|---|---|---|
| Vorzeichen | **ja**, −1,0 bis +1,0 | **nein**, 0,0 bis 1,0 |
| Aussage | normativ: was gelten soll | deskriptiv: wie viel wovon |
| Revidierbar | ja, mit Wegfall der Prämisse | nein — sie beschreibt den Gegenstand |
### 3a. Die Abweichung vom Konzept, und ihr Messwert
Konzept §4.4 legt Qualitäts- und Werte-Knoten in dieselbe Schicht wie `opinion_k`, und
`lzg_knoten_haltung.praemisse_knoten_id` zeigt auf `lzg_knoten`. **Die abstrakten Knoten
liegen trotzdem in einer eigenen Tabelle.**
`[gemessen]` 03.09.2026: **24 Stellen in 13 Modulen** lesen aus `lzg_knoten`, **22 davon
nach Kriterien statt nach `id`** — Enricher, emotionale Gravitation, Spreading,
Charakter-Agent, Wissenslücken, Gravitation, Re-Embedding. Sechs abstrakte Knoten dort wären
aus jeder einzelnen auszuschließen, und ein vergessener Ausschluss ist ein stiller Fehler:
eine Qualität, die im Spreading als Erinnerung auftaucht.
**Der Preis des Umzugs ist null:** `lzg_knoten_haltung` trägt 0 Zeilen, `praemisse_knoten_id`
ist nie benutzt worden. §6.1 stützt es zusätzlich — `neuheit` wurde ausdrücklich
ausgesondert, weil es *„die Lage im Graphen"* ist. Die sechs Dimensionen sind es gerade
nicht.
**Zwei Zustände genügen, nicht drei.** §4.5 verlangt für die **Wert**-Kante
anwesend/abwesend/ungeprüft. Hier trägt die Zeilenanwesenheit dieselbe Unterscheidung: Ein
Profillauf schreibt alle sechs Dimensionen auf einmal, also heißt keine Zeile *ungeprüft*
und `auspraegung = 0.0` *gemessen abwesend*.
**Nebenbefund:** `lzg_knoten.dimension` trägt bereits eine Inhaltskategorie (kognition,
kontext, emotion, …) und darunter ausgerechnet den Wert `werte` — **161 Zeilen** am
03.09.2026. Wer sie als Knotentyp liest, bekommt 161 Episoden als Werte-Knoten.
## 4. Die Kandidaten
`candidates_load`: `aktiv` **und** `haeufigkeit >= 2` **und** ~~`length(inhalt) >= 400`~~ →
`length(inhalt) >= QUALITAET_LAENGE_MIN` (100 seit dem 06.09.2026, §4b) **und** noch keine Kante. ~~Die häufigsten zuerst.~~ → **Berichtigt am 05.09.2026, in zwei Anläufen.**
~~**Sortiert wird nach der Lesespur** — wie oft ein Knoten in den `lzg_resonanz_ids` des Enrichers
vorkam —, danach nach Brücken-Turns, zuletzt nach `haeufigkeit`.~~ → **Seit dem 11.09.2026 steht die
Frische davor** (§4a): Sortiert wird zuerst nach der Lesezahl der letzten `QUALITAET_FRISCHE_TAGE` (7)
Tage, dann nach der Lesespur — wie oft ein Knoten in den `lzg_resonanz_ids` des Enrichers vorkam —,
nach den Brücken-Turns, nach `haeufigkeit` und nach `id` (am Code geprüft am 22.10.2026,
`memory/repositories/quality_profile_repository.py`, `candidates_load`).
**Der erste Anlauf am selben Tag war schon eine Berichtigung und traf trotzdem daneben.** Er
sortierte nach der Zahl verschiedener Turns aus `verbindung`, weil `haeufigkeit` Wiederholung misst
statt Wiederkehr (`novaberg-memory-synapsen_k.md` §7.1a). Das war richtig und nicht genug: **Die
Brücke zählt, wie oft ein Knoten entstand — nicht, wie oft er gelesen wird.**
Der Betriebslauf zeigte es: Von **neun in drei Turns gelesenen Knoten erfüllten vier alle
Filterkriterien und hatten trotzdem kein Profil.** Sie waren nie an der Reihe.
> **Ein Profil dient der Faszination, und die rechnet über die Träger, die der Lesepfad im Turn
> anbietet.** Was gelesen wird, ist deshalb der erste Schlüssel.
### 4a. Dritter Anlauf am 11.09.2026: die Frische steht davor
**Die Lesespur war richtig und wieder nicht genug.** Sie zählt **alle** Lesevorgänge und wählt
damit die historisch häufigen — ein Knoten, der heute zum ersten Mal gelesen wird, trägt 1 und
steht hinter allen, die zwanzigmal gelesen wurden. Genau ihn braucht die Faszination aber **jetzt**.
`[gemessen 11.09.2026]` Über **363 Turns** meldete die Faszination in **74,1 %** der Fälle
`werte: {}`. Von **410 je gelesenen Trägern hatten 376 kein Profil.** Die Ursache ist dreigeteilt —
von 42 gelesenen Trägern einer Messreihe:
| | Zahl |
|---|---|
| offene Kandidaten in der Warteschlange — richtig eingereiht, nicht an der Reihe | **22** |
| unter der Längenschwelle (100 Zeichen) | 11 |
| unter der Wiederkehr (`haeufigkeit >= 2`) | 9 |
| inaktiv | 0 |
**Der Tageslauf fällt zuverlässig** — 20 Träger je Tag, lückenlos seit dem 03.09.2026. Er reicht
nur nicht: **1497 offene Kandidaten** sind bei 20 je Tag **75 Tage**.
Erster Schlüssel ist seither, wie oft ein Träger in den letzten `QUALITAET_FRISCHE_TAGE` (7) Tagen
gelesen wurde; die Gesamtlesespur bleibt zweiter. **Sieben Tage, weil das Fenster den
Gesprächsverlauf abdecken soll und nicht den Bestand:** kürzer finge nur den heutigen Tag, länger
näherte sich wieder der Gesamtzahl an, deren Schlagseite die Sortierung gerade behebt.
> **Der Betriebsbeleg, am selben Tag:** Ein angestoßener Lauf erzeugte **9 neue Profile, davon 7
> für Träger der laufenden Messreihe (78 %)**; die offene Warteschlange dieser Reihe fiel von 32
> auf 25. **Vor der Änderung waren es 0 von 20.**
**Was das nicht behebt:** Die Sortierung ändert die Reihenfolge, nicht die Rate — 1511 offene
Kandidaten bleiben 1511. Und 14 der 60 gelesenen Träger fallen weiter unter die Längenschwelle,
14 unter die Wiederkehr.
`[gemessen 05.09.2026]`: Die profilierten Knoten trugen `haeufigkeit` **56,1** gegen **5,5** im
Schnitt aller aktiven — die alte Sortierung wählte genau die durch die KZG-Schleife aufgeblähten.
Die Lesespur kostet **2,8 ms** über 13.554 Enricher-Zeilen.
~~**Der Längenfilter bleibt der größere Engpass, und er ist nicht behoben:**~~ → **behoben am 06.09.2026, siehe unten.** Von 36 je Turn gelesenen
Knoten passieren nur **7** die 400 Zeichen. Der Rest sind Sprechakt-Vermerke — dieselbe Familie wie
`DESTILLAT-SUBJEKT-SCHABLONE`. Der Filter tut, was er soll; der Befund ist, dass der Lesepfad
überwiegend Material liefert, das als Träger untauglich ist.
**Profiliert wird erst, was wiedergekehrt ist** (Konzept §6.3) — man fragt sich nicht beim
ersten Mal, was einen an einer Sache fasziniert. ~~Der Längenfilter trifft fast dieselbe Menge
wie eine Formklassifikation: Die Sachtexte sind mehrere hundert Wörter, die Sprechakt-Vermerke
ein bis zwei Sätze.~~ → **Widerlegt am 05.09.2026** gegen die Eröffnungsformel als Stellvertreter
der Formklassifikation: In der Einsichtsklasse gehen **43 %** verloren (§4a).
`[gemessen]` 03.09.2026 über 3318 Knoten: Wiederkehr ≥ 2 allein trifft **1538**, Länge ≥ 400
allein **1283**, beide zusammen **368**.
### 4a. Sachtext gegen Sprechakt — eine geprüfte Möglichkeit, nicht umgesetzt
**Stand 05.09.2026: gemessen, nicht gebaut.** Der Längenfilter steht unverändert. Was hier steht,
ist der geprüfte Ersatz und der Grund, warum er nicht eingesetzt ist.
**Die Themen tragen es nicht.** Der naheliegende Ersatz wäre `lzg_knoten.themen` — er kostet
keinen Modellaufruf, weil der Salienz-Knoten die Themen ohnehin vergibt. Gemessen über die
**1598** Knoten mit `aktiv` und `haeufigkeit >= 2`, je Thema mit mindestens 15 Vorkommen der
Anteil mit `length(inhalt) >= 400`:
| Thema | Vorkommen | Anteil ≥ 400 |
|---|---|---|
| `Gravitationslinseneffekt` | 16 | 87,5 % |
| `Neutronensterne` | 23 | 56,5 % |
| `Hawking-Strahlung` | 30 | 43,3 % |
| `Entropie` | 106 | 29,2 % |
| `Kohärenz` | 33 | 9,1 % |
**Kein häufiges Thema trennt.** Der Grund steht im Erzeugungspfad: Die Themen entstehen im
Salienz-Knoten aus dem **Turn**, nicht aus dem gespeicherten Satz. Ein Sprechakt-Vermerk aus
einem Fachgespräch trägt dieselben Tags wie der Sachtext daneben.
**Was trennt, ist die Eröffnungsformel** — und sie ist kein Textzufall, sondern in
`prompts/default/kzg_verdichtung.impuls_task.txt` als Form vorgeschrieben. Dieselbe Menge,
dieselbe Messung:
| Eröffnung | Knoten | Anteil ≥ 400 | Länge ⌀ |
|---|---|---|---|
| `… hat gefragt …` | 115 | **0,0 %** | 172 |
| `… hat erklärt …` | 417 | 4,3 % | 249 |
| sonstige mit Trägerpräfix | 366 | 5,5 % | 214 |
| `… ist aufgegangen, dass …` | 409 | **56,7 %** | 412 |
| ohne Trägerpräfix | 281 | 44,1 % | 763 |
Die Frageform liegt bei **null** langen Knoten von 115. Die Klasse ohne Trägerpräfix ist gemischt
— Rechercheergebnisse über 1400 Zeichen neben Situationsvermerken unter 70; dort trägt
`dimension` mit (`interessen` gegen `kontext`).
**Damit ist der Preis des heutigen Filters beziffert:** 409 Knoten tragen die Einsichtsformel,
**232** davon sind ≥ 400 Zeichen. **177 Einsichten fallen durch den Zeichenschnitt** — Stichproben
liegen zwischen 250 und 365 Zeichen und tragen Sachgehalt.
### 4b. Warum sie nicht umgesetzt ist
**Weil die Messung eine vorgelagerte Frage aufgeworfen hat: ob überhaupt vorab gefiltert werden
soll.** Solange die offen ist, wäre ein besserer Filter eine Verbesserung am möglicherweise
falschen Bauteil.
**Der Filter schützt nicht die Richtigkeit.** Die Skala kann selbst Null sagen — §6b hält die
Gegenprobe: ein 34-Zeichen-Satz und ein 125-Zeichen-Termin liegen auf allen sechs Dimensionen bei
0,0. Was der Filter stattdessen tut, zeigt der Bestand vom 05.09.2026:
| Ausschlag über die sechs Dimensionen | Träger |
|---|---|
| trägt (Maximum 1,0) | 49 |
| schwach (Maximum 0,5) | 1 |
| ganz null | **0** |
Der kürzeste Träger misst **410** Zeichen — einen über der Schwelle. **Im ganzen Bestand steht
keine gemessene Null**, weil das Unauffällige nie hineinkommt. Damit fehlt genau die Gegenprobe,
die den Vorbehalt aus §6b entscheiden könnte: homogener Korpus oder abweichende Bewertung.
Dazu ein zweiter Effekt. `bestandslauf` rechnet über `_TRAEGER_MIT_PROFIL`, und der Kommentar
daneben begründet das richtig: *ein Träger ohne Profil hat keinen Merkmalszug und gehört in die
Fußnote, nicht in die Reihe.* **Die Vorentscheidung fällt aber schon im Filter** — ein
ausgefilterter Knoten ist kein Träger mit Faszination 0, sondern gar kein Träger. *Nicht geprüft*
und *nicht faszinierend* sind an dieser Stelle nicht unterscheidbar.
**Die Dämpfung steht ohnehin an anderer Stelle.** `QUALITAET_PROFIL_JE_LAUF` deckelt auf 20
Profile je Lauf (seit 06.09.2026 je Agentenlauf, täglich — Setzung des Eigentümers), und `candidates_load` sortiert nach ~~Lesespur, Brücken-Turns und
`haeufigkeit`~~ → Frische (seit dem 11.09.2026, §4a), Lesespur, Brücken-Turns, `haeufigkeit` und `id`. **Eine Reihenfolge verzögert, ein Filter schließt aus.** Bei hartem Tagesdeckel
leistet die Reihenfolge dieselbe Dämpfung, ohne die Menge dauerhaft zu beschneiden; der Preis ist
Zeit — 1598 statt 395 Kandidaten, bei 20 je Lauf rund 80 statt 20 Tage bis zur Sättigung, und die
ersten 20 Tage füllen dieselben Träger, weil die Sortierung sie zuerst nimmt.
**Der Wiederkehr-Filter ist davon nicht berührt.** Seine Begründung trägt unabhängig (Konzept
§6.3): Man fragt sich nicht beim ersten Mal, was einen an einer Sache fasziniert.
~~**Drei Wege stehen offen, und die Wahl ist eine Absichtsfrage:** die Formel als Filter an Stelle
der Länge · die Formel als zusätzlicher Sortierschlüssel bei gestrichenem Längenfilter · den
Längenfilter behalten. **Entschieden ist keiner, gebaut ist keiner.**~~
→ **Am 06.09.2026 entschieden und gebaut, und zwar über einen vierten Weg, den die drei nicht
nannten: Der Filter bleibt, sein Zweck fällt weg.** `QUALITAET_LAENGE_MIN` steht auf **100** und
fängt seither nur noch den Ein-Satz-Vermerk (50–59 Zeichen im Bestand); die inhaltliche Ablehnung
liegt beim Modell, das 0.0 auf allen sechs Dimensionen sagen darf und dessen Nullprofil geschrieben
wird — der Träger fällt danach über `NOT EXISTS` aus der Auswahl.
**Der Anlass war eine Zahl, die die Sperre der Faszination erklärt:** Von 95 je gelesenen Knoten
standen bei Schwelle 400 **null** als Kandidat offen — 18 passierten beide Filter, und alle 18
trugen längst ein Profil. Die Warteschlange enthielt keinen Träger, den der Lesepfad im Turn
anbietet, und die Faszination meldete in jedem protokollierten Turn `werte: {}`.
**Die Länge trennt die beiden Klassen nicht** `[gemessen 06.09.2026]`:
| Art | n | Mittel | davon ≥ 400 |
|---|---:|---:|---:|
| Sachaussage im Rahmen | 32 | **271** | **1** |
| Sprechakt / Beziehung | 29 | **281** | **8** |
| ohne erkennbaren Rahmen | 22 | 753 | 9 |
Die Schwelle 400 ließ acht Sprechakt-Vermerke durch und genau eine Sachaussage — **sie trifft nicht
zu streng, sie trifft falsch herum.**
> **Der erste der drei Wege wurde versucht und ist an der Gegenprobe gescheitert.** Ein Regex auf den
> Satzanfang sortierte drei von sechs Stichproben falsch ein: *„Nova ist aufgegangen, dass…"* ist eine
> Einsicht, kein Sprechakt. Eine Formklassifikation vor dem Modell ist eine zweite, schlechtere Kopie
> eines Urteils, das im Prompt bereits steht.
**Wirkung:** Warteschlange 0 → 55 → **35** nach einem Lauf von 20, Bestand **92 Träger / 552 Kanten**
(davor 72 / 432), **0 von 20** neuen Profilen sind Nullprofile. Am 06.09.2026, 20:52:54 UTC trug ein
Turn zum ersten Mal einen Faszinationswert: `werte {"6982": 0.5725}`.
## 5. Der Merkmalszug — ein weiches ODER
```
merkmalszug = m_max + 0,35 × Mittel(übrige fünf) # 0,0 … 1,35
```
**Die stärkste Dimension trägt allein und vollständig; Kombination ist ein Zuschlag, keine
Bedingung.** Beide naheliegenden Formen sind falsch, aus verschiedenen Gründen:
- **Ein Mittelwert** gäbe bei einer Dimension auf 1,0 und fünf auf 0 den Wert **0,17** — der
Zauberer bekäme keine Faszination, obwohl gerade seine Ungewissheit sie trägt.
- **Ein Produkt** verstieße gegen Regel (a) aus §10.0: Keine Null aus einer Multiplikation.
Die Obergrenze 1,35 ist durch Konstruktion erreichbar (alle sechs auf 1,0) und wird deshalb
nicht gekappt — was darüber läge, wäre ein Rechenfehler.
## 6. Was gemessen ist
### 6a. Der Erstlauf, 03.09.2026, 21:20–21:30 UTC
Die Vorhersage wurde vor dem ersten Kandidaten aufgeschrieben, die Rohdaten liegen bei den
Messreihen dieses Projekts.
| | |
|---|---:|
| Träger versucht (drei Läufe) | 29 |
| profiliert | **25** |
| Bestand danach | **25 Träger, 150 Kanten** |
| Dauer je Träger | 6,5 bis 8,1 s |
| Merkmalszug | **1,0350 bis 1,2100** |
**Sechs Vorhersagen, drei getroffen.** Ohne Ausschlag 0 (vorhergesagt 0–2) ✅ ·
`bedrohungsrelevanz` 0 (≤ 2) ✅ · kein Merkmalszug 0,0 ✅ · `schemasprengung`+`konflikt` **0**
statt ≥ 8 ❌ · 4 Fehlschläge statt ≤ 3 ❌ · **und der Kollaps** ❌.
### 6b. Der Vorbehalt: die Dominanz kollabiert auf `komplexitaet`
**23 von 25 Trägern sind dominant `komplexitaet`, die übrigen zwei `weite`.** Vier der sechs
Dimensionen sind an keinem einzigen Träger die stärkste.
Das widerspricht der Handmessung in Konzept §6.2 unmittelbar. Dort stand nach 50 von Hand
bewerteten Knoten: *„Der Satz trägt. **Kein Kollaps auf `komplexitaet`.**"* — und
`komplexitaet` war mit **2 von 26** die zweitschwächste Dimension.
**Die naheliegende Erklärung ist widerlegt.** Der Verdacht war, `komplexitaet` messe die
Textlänge; vier kurze Texte bekannter Komplexität, alle unter der Filterschwelle:
| Probe | Zeichen | kompl | weite |
|---|---:|---:|---:|
| *„Der Mülleimer steht neben der Tür."* | 34 | **0,0** | 0,0 |
| ein Zahnarzttermin | 125 | **0,0** | 0,0 |
| Page-Kurve, Informationsparadoxon | 203 | **1,0** | 1,0 |
| Leerräume zwischen Galaxienhaufen | 139 | **0,5** | **1,0** |
Ein 203-Zeichen-Text bekommt 1,0, ein 125-Zeichen-Text 0,0; und `weit-kurz` trennt `weite`
von `komplexitaet` bei fast gleicher Länge wie der triviale. **Die Dimensionen trennen
innerhalb eines kurzen Textes, und die Skala kann Null sagen.**
**Zwei Erklärungen stehen noch, und diese Messung trennt sie nicht:**
1. **Der Korpus ist homogen.** Der Filter wählt die oft reaktivierten langen Sachtexte, und
die sind bei diesem Paar durchweg Astrophysik und Systemtheorie. Sie *sind* alle komplex.
2. **Modell und Mensch bewerten verschieden.** §6.2 ist eine Handbewertung durch eine
Person, dieser Lauf eine Modellbewertung.
> **Die Messung, die sie trennt, ist nicht gemacht:** dieselben Knoten maschinell **und** von
> Hand, Zeile für Zeile. Die Handmessung liegt nur als Verteilung vor, nicht als Liste.
**Was nicht behauptet wird:** dass der Satz falsch ist. Vier Dimensionen ohne dominanten
Träger sind ein Warnzeichen und kein Urteil — bei 25 Trägern aus einer gefilterten Ecke eines
einzigen Paares.
### 6c. Der Defekt, den die Messung fand und der behoben ist
Alle vier Fehlschläge des zweiten Laufs trugen **dieselbe Ursache**: Das Modell schrieb
`"un gewissheit"` statt `"ungewissheit"` — ein Leerzeichen in einem Bezeichner, den es
wörtlich vorgegeben bekam. Die Kanon-Prüfung machte es in einem Zug sichtbar.
Behoben durch eine Normalisierung, die **nur Leerraum** abräumt, ihre Zeile ins Log schreibt
und die Kanon-Prüfung darunter scharf lässt. **Im Bestand belegt:** die drei erneut gezogenen
Träger sind profiliert, 6 von 6, 0 gescheitert.
> **Ohne die Behebung wäre der Träger dauerhaft verloren:** Der nächste Lauf sieht ihn ohne
> Kanten, ruft dasselbe Modell und bekommt dasselbe Leerzeichen.
### 6d. Die zweite Kontrolle — der Betrieb statt der Zeugen
**Der gewählte Zugriff war einer, den der Bau nicht benutzt hat.** Der Erstlauf rief
`traeger_profilieren` je Kandidat direkt; **`profil_lauf` selbst** — die Funktion, die der
Tageslauf ruft — war bis dahin **nur gegen Mocks bezeugt**.
`[gemessen]` 03.09.2026, 21:38 UTC, gegen den echten Bestand mit Deckel 3:
```
{'versucht': 3, 'profiliert': 3, 'gescheitert': 0,
'traeger_gesamt': 28, 'kanten_gesamt': 168, 'error': None}
```
**Seit dem 05.09.2026 ist ein Totalausfall ein Fehler.** `profil_lauf` meldete `error: None` nach
**20 versuchten und 0 profilierten** Trägern, weil seine einzige Prüfung war, ob die Buchführung
aufgeht — und 0 + 20 = 20 tut das. Der Tageslauf hätte `erledigt` ins `hintergrund_log` geschrieben.
Einzelne Fehlschläge bleiben nur gezählt: Sie sind der erwartete Betrieb, ein Totalausfall ist es
nicht.
**Und der Lauf ist seither anstoßbar:** `POST /admin/qualitaet/lauf` — er braucht den Serverprozess,
weil `traeger_profilieren` den Hintergrund-Worker ruft und der im Lifespan lebt; ein Labor-Skript
daneben scheitert mit *Worker nicht gestartet*.
Die Buchführung geht auf, der Deckel greift, `qualities_load` und `candidates_load` liefern
gegen das echte Schema. **Die Dominanz bleibt: 26 von 28 `komplexitaet`.**
> **Und die Kontrolle hat eine Lücke gefunden, die sie nicht schließen konnte: Der
> Betriebsbeleg über den Tageslauf steht aus.** `hintergrund_log` zeigt den letzten
> `synapsen_decay`-Lauf am **03.09.2026 um 19:58 UTC** — anderthalb Stunden **vor** diesem Bau.
> Der Lauf ist täglich; der erste, der den achten Schritt enthält, ist der vom **04.09.2026**.
>
> Damit ist die Verdrahtung **bezeugt** (`test_invoke_ruft_den_profillauf`) und **nicht im
> Betrieb belegt** — genau die Trennung, die an dieser Schicht schon dreimal der Befund war.
→ **Überholt am 06.09.2026** (§2): Im Tageslauf hat der achte Schritt nie einen Träger profiliert.
Seither ruft der eigene Agent `agents/qualitaet_profil/` den Profillauf, im Betrieb belegt mit 20 von
20, und `test_invoke_ruft_den_profillauf` bezeugt diesen Agenten (am Code geprüft am 22.10.2026,
`tests/test_quality_profile.py`, `DerProfilAgentRuftDenErzeugerTest`).
## 7. Die Annahme der Modellantwort
Die Antwort eines Sprachmodells ist die unzuverlässigste Quelle im System. Fünf Prüfungen,
jede mit eigener Meldung:
| Prüfung | Verworfen wird |
|---|---|
| leer | eine leere Antwort — sie ist **kein** Profil aus lauter Nullen |
| JSON | kein Objekt, oder gar kein JSON (Codezaun wird abgeräumt) |
| Leerraum in Schlüsseln | **nicht** verworfen, sondern laut zusammengezogen (§6c) |
| Schlüsselsatz | gegen den **Kanon**, nicht gegen eine Teilmenge |
| Werte | außerhalb 0,0/0,5/1,0 — **verworfen, nicht gerundet** |
**Gegen den Kanon und nicht gegen eine Teilmenge:** Ein erfundener Dimensionsname und ein
gültiges *„trifft nicht zu"* wären sonst dasselbe Ergebnis. **Nicht gerundet:** Eine stille
Rundung machte eine erfundene Skala von der vorgegebenen ununterscheidbar — und daran hängt
die Aussage, dass das Modell drei Stufen benutzt und nicht heimlich eine eigene.
## 8. Die Zeugen
`tests/test_quality_profile_schema.py` (6) · `tests/test_quality_profile.py` (~~32~~ → 52, gezählt am
22.10.2026 gegen `7c16bf5` mit `grep -cE '^ def test_|^def test_'`, gegengezählt mit
`grep -cE 'def test\w*\('`; der Schematest trägt mit beiden Mustern 6).
Der Schematest ist **der Zünder** und importiert nichts aus dem Bauteil — die rote
Phase war 6 von 6, `relation "abstrakt_knoten" does not exist`.
**Gegenprobe: 3 vorhergesagt, 3 gezählt** (`MERKMALSZUG_BONUS` auf 0.0). Sie fand dabei einen
Zeugendefekt: Die erste Fassung bezog ihre Erwartung aus der Konstante, die sie prüfen sollte,
und ließ **alle 37 grün**. Die Literale stehen jetzt ausgeschrieben.
## 9. Was fehlt
> **Gegen den Code gehalten am 13.10.2026:** Die ersten vier Punkte sind gebaut, alle am 05.09.2026 in `ei/fascination.py` — der Leser (`faszination`, gerufen aus `graph/nodes/praegung.py` und `memory/fascination_store.py`), `bindung_roh`, `modulatoren_aus_turn` und `profil_verfallen`. Offen bleiben die drei letzten.
- ~~**Ein Leser des Merkmalszugs.**~~ Er rechnet und niemand liest ihn — dieselbe Lage wie beim
Prägungszug und der Einfärbung. Der Verbraucher ist §10.6, und der braucht `bindung_roh`
und die sechs Turn-Modulatoren.
- ~~**`bindung_roh`**~~ (§10.2): drei Zähler am Träger — Wiederkehr, Verweildauer, Eigenimpuls.
- ~~**Die sechs Turn-Modulatoren**~~ (§10.5). Reine Funktionen, ohne Träger baubar.
- ~~**Der Verfall der Qualitäten**~~ (§10.4). Je Dimension verschieden: `ungewissheit` verfällt
mit der **Zahl der Berührungen**, alle übrigen mit der **Zeit**. Nicht gebaut, und er gehört
an den Leser, nicht an den Speicher.
- **Die Werte-Seite der abstrakten Schicht.** `abstrakt_knoten` trägt `art = 'wert'` im
Schema und keine Zeile; sie ist das, worauf `praemisse_knoten_id` wartet.
- **Entitäten und Themen als Träger.** Heute nur LZG-Knoten.
- **Die Stabilität eines Profils.** Zwei Läufe über denselben Träger sind nicht verglichen;
bei Temperatur 0,0 wäre Gleichheit zu erwarten, gemessen ist sie nicht.