ADR-0019: Profilidentitaet ist mehr als ein Metadaten-Hash
Status: Akzeptiert · 2026-09-09 Betrifft: ADR-0016 (unbestaetigte Profile), Spec G-010, L-014; Paket NV-03 Ausloeser: Der Fingerabdruck aus ADR-0016 kann den haeufigsten stillen Fehlerfall nicht sehen — ausgetauschte Gewichte unter gleicher Versionsnummer
Kontext
ADR-0016 hat die richtige Frage gestellt: Gilt dieses Profil hier noch? Die Antwort war ein FNV-1a-Hash ueber das, was das Backend ueber sich meldet — Servername, Serverversion, Modellname, Modellversionen, Plattform, I/O-Signatur. Das faengt Serverwechsel, Backendwechsel und geaenderte Tensorformen, und es faengt sie billig.
Vier Faelle faengt es nicht, und alle vier sind im Feld ueblich:
- Getauschte Gewichte. Jemand legt eine neu trainierte Datei unter dieselbe Versionsnummer. Name, Form, Datentyp, Plattform: unveraendert. Der Hash schweigt, die Laufzeit ist eine andere.
- Andere Runtime unter gleicher Metadatenlage. Ein TensorRT-Plan, neu gebaut mit einer anderen TensorRT-Version, meldet dieselbe Plattform.
- Andere Aufteilung derselben Karte. Zwei Instanzen statt einer, MPS statt exklusiv, ein aktivierter Rate Limiter. Nichts davon steht in den Modellmetadaten.
- Anderes Geraet. Der Inferenzserver kennt seine GPU nicht und meldet sie nicht.
In allen vier Faellen plant der Governor weiter mit Zahlen, die fuer eine andere Umgebung gemessen wurden — und meldet dabei "Profil passt".
Entscheidung
Das Profil bekommt neben dem Hash ein Manifest (ProfileManifest,
Revision 2) mit fuenf Bloecken: Artefakt, Runtime, Geraet, Ressourcenaufteilung,
Messbedingungen — dazu die beanspruchte Gueltigkeitsdomaene.
Der Artefakt-Digest liest das Dateisystem. SHA-256 ueber die Dateien in
den Versionsverzeichnissen des Modells (<modell>/<version>/…).
Korrektur vom 10.09.2026. Zuerst hiess die Regel „alle Dateien des Modellverzeichnisses ausser
config.pbtxt". Sie hielt genau so lange, bis im Modellverzeichnis einePROVENANCE.txtlag: der Digest aenderte sich, weil jemand eine Notiz bearbeitet hatte. Ein Artefaktdigest, den ein Kommentar verschiebt, ist keiner. Digestiert wird deshalb nur, was unter den rein numerischen Unterverzeichnissen liegt — das ist Tritons eigene Aussage darueber, wo das Artefakt endet und die Verwaltung anfaengt. Gibt es keine Versionsverzeichnisse, gilt die alte Regel weiter. Das ist die einzige Stelle, an der Fall 1 ueberhaupt sichtbar ist; ueber das Inferenzprotokoll ist er es nicht. Der Pfad steht alsbackend.model_repositoryin der Konfiguration und ist optional: wo der Governor das Repository nicht sieht — entfernter Server, Container ohne gemeinsames Volume — bleibt das Feld leer.
config.pbtxt gehoert nicht zum Artefakt. Darin stehen Instanzanzahl,
Batchgrenzen und Rate-Limiter-Ressourcen. Das ist die Aufteilung des Geraets,
und die hat einen eigenen Block. Waere sie im Artefakt-Digest, waere jede
Umkonfiguration ein "anderes Modell", und die Unterscheidung, um die es hier
geht, waere wieder verloren. Geaenderte Tensorformen faengt weiterhin die
I/O-Signatur im Hash aus ADR-0016 — beide Mechanismen ergaenzen sich.
Ein fehlendes Feld ist unknown, nie verified. Der Gesamtbefund ist so
gut wie das schwaechste identitaetstragende Feld: ein Widerspruch macht das
Profil ungueltig, eine Luecke macht es unbelegt. Zwei Mal Schweigen ergibt
ausdruecklich keine Uebereinstimmung.
Identitaetstragend sind Artefakt, Runtime, Geraet und Aufteilung — nicht die Messbedingungen und nicht die Gueltigkeitsdomaene. Ein mit anderer Batchgroesse gemessener Wert ist keine Aussage ueber ein anderes Modell, sondern ueber einen anderen Betriebspunkt. Abweichungen dort werden gemeldet, aber sie invalidieren nichts; was daraus folgt, entscheidet die Planung (NV-06), nicht die Identitaetspruefung.
Was der Betreiber weiss, sagt der Betreiber. Geraetename, Treiber,
Bibliotheksversion und Aufteilung sind ueber das Protokoll nicht erreichbar.
vig profile und vig calibrate nehmen sie als Flags entgegen und schreiben
sie mit. Nicht angegeben heisst nicht angegeben — geraten wird nichts. Die
automatische Erfassung (NV-04) wird diese Flags vorbelegen, nicht ersetzen.
Konsequenzen
Die Folge einer erkannten Abweichung bleibt die aus ADR-0016: weitere Marge,
kein verweigerter Start. Ein Governor auf einem Roboter, der den Dienst
verweigert, laesst die Wahrnehmung komplett ausfallen; ein zu vorsichtig
geplantes Modell liefert nur weniger. Neu ist allein, dass mehr Abweichungen
ueberhaupt erkannt werden — und dass doctor das abweichende Feld nennt
statt nur zweier Hashes.
Solange NV-04 fehlt, sind Geraet, Treiber und Aufteilung zur Laufzeit nicht
beobachtbar. Ein vollstaendig ausgefuelltes Manifest ist dann Unverified und
nicht Verified. Das ist gewollt: es beschreibt den Wissensstand korrekt. Es
loest deshalb auch keine Margenerhoehung aus — die bleibt Widerspruechen
vorbehalten.
Alte Konfigurationen laufen unveraendert weiter. Ein Profil ohne Manifestblock
wird als Legacy-Manifest der Revision 1 gelesen, in dem jedes Feld unknown
ist. Ein Hash laesst sich nicht in eine Herkunftsangabe zurueckrechnen, und so
zu tun, als koenne er das, waere genau der Fehler, den dieses ADR abstellt.
Alternativen
Nur den Hash um den Artefakt-Digest erweitern. Billiger, aber der Befund bliebe "irgendetwas ist anders". Ein Betreiber, der auf einem Roboter im Feld steht, braucht "der Treiber ist ein anderer", nicht "der Hash ist ein anderer".
Den Digest verpflichtend machen. Haette den haeufigen Fall des entfernten Servers unbedienbar gemacht und Betreiber dazu gebracht, die Pruefung ganz abzuschalten. Eine Warnung, die zu oft grundlos kommt, schuetzt am Ende nichts — dasselbe Argument wie in ADR-0016.
Fehlende Felder als "passt" werten. Waere bequem und ist der Fehler, um den es geht. Ein leeres Feld auf beiden Seiten sagt nichts ueber die Wirklichkeit, nur etwas ueber die Sorgfalt beim Messen.