cuonztech-agent-harness 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,21 +1,220 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 CuonzTech
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ CuonzTech Agent-Harness — Lizenz / License
2
+
3
+ Copyright (c) 2026 CuonzTech · Carlo Cuonz. Alle Rechte vorbehalten. / All rights reserved.
4
+
5
+ Proprietär, nicht Open Source. Der Quelltext ist einsehbar (GitHub und Paket); die Einsicht
6
+ begründet keine Rechte ausser den hier eingeräumten. Gilt ab Version 0.8.0.
7
+ Fassung vom 30. Oktober 2026 (Revision 1).
8
+
9
+ HINWEIS ZU FRÜHEREN VERSIONEN
10
+ Die Versionen bis und mit 0.7.0 und alle Stände des öffentlichen Repositories bis und mit
11
+ Commit 1c079e1 (27.10.2026) wurden unter der MIT-Lizenz veröffentlicht. Für jede Person, die
12
+ eine dieser Versionen oder Stände bezieht, auch nach dem Erscheinen von 0.8.0, bleibt dafür die
13
+ MIT-Lizenz massgebend (Wortlaut: Datei LICENSE-MIT-bis-0.7.0.txt im Repository).
14
+ Diese Lizenz gilt für Version 0.8.0 und alle späteren Versionen. Dateien und Dateiteile, die
15
+ unverändert in Version 0.7.0 veröffentlicht wurden, bleiben in der Fassung 0.7.0 unter MIT, auch
16
+ wenn sie in 0.8.0 enthalten sind. Alle Änderungen und Ergänzungen seit 0.7.0 (insbesondere die
17
+ Lizenzprüfung und die Kürzung der Ausgabe) stehen nur unter dieser Lizenz. Jede Version steht
18
+ unter der Fassung dieser Lizenz, die dem Paket dieser Version beiliegt.
19
+
20
+
21
+ ================================================================================
22
+ DEUTSCH
23
+ ================================================================================
24
+
25
+ 1. Gebrauchsüberlassung; was ohne Lizenzcode erlaubt ist (freier Umfang)
26
+ 1.1 CuonzTech räumt Ihnen das einfache, nicht übertragbare, nicht unterlizenzierbare Recht ein,
27
+ die Software zu installieren und auszuführen. Es wird keine Programmkopie veräussert und
28
+ kein Eigentum an der Software übertragen. Alle nicht ausdrücklich eingeräumten Rechte
29
+ bleiben bei CuonzTech.
30
+ 1.2 Ohne Lizenzcode dürfen Sie die Software auch kommerziell und intern nutzen. Vollständig
31
+ stehen zur Verfügung:
32
+ a) der MCP-Chaos-Proxy mit den Szenarien F1 bis F5,
33
+ b) die Vorprüfung (doctor) einschliesslich der Schema-Inspektion (Zusammenfassung und
34
+ Risikostufe je Tool),
35
+ c) der Kompaktbericht in der Konsole und der Klartext-Bericht (report ohne --dossier), beide
36
+ ohne Textbausteine,
37
+ d) der JSON-Report (--report-file), der Resilience Score und das Urteil
38
+ PASS/FAIL/NOT_TESTED samt Exit-Code für Pipelines,
39
+ e) der Selbsttest (benchmark) und der Demo-MCP-Server.
40
+ Der Lauf selbst wird ohne Lizenzcode weder verändert noch abgeschwächt; Urteil, Score und
41
+ Exit-Code sind mit und ohne Lizenzcode dieselben.
42
+ 1.3 Ohne gültigen Lizenzcode (keiner hinterlegt, ungültig, abgelaufen, erloschen) wird nur die
43
+ Ausgabe der Funktionen nach Ziffer 2 gekürzt oder der Befehl nicht ausgeführt: das Dossier
44
+ enthält nur Kopf, Score und das Urteil je Szenario, das Schema-Gutachten nur Zusammenfassung
45
+ und Risikostufe, die Textbausteine (Härtungsvorschläge) entfallen; ui und campaign werden
46
+ nicht ausgeführt.
47
+
48
+ 2. Was einen gültigen Lizenzcode von CuonzTech erfordert (Pro-Umfang); Systeme
49
+ 2.1 Ein gültiger Lizenzcode ist erforderlich für:
50
+ a) den vollständigen Export des Prüf-Dossiers (report --dossier: HTML, Markdown, druckbar
51
+ als PDF) mit Details, Aufruf-Protokoll, Härtungspaket und Anhängen,
52
+ b) die geführte Web-Oberfläche (ui),
53
+ c) das Schema-Gutachten mit den Befunden je Tool und den Schema-Vorschlägen,
54
+ d) den Textbaustein- und Prompt-Patch-Generator (Härtungsvorschläge),
55
+ e) den Kampagnen-Runner für Mehrfach-Läufe (campaign).
56
+ Die Freischaltung erfolgt mit dem Lizenzcode (Option --license oder Umgebungsvariable
57
+ AGENT_AUDIT_LICENSE). Die Prüfung des Codes erfolgt offline.
58
+ 2.2 Lizenzen gibt es als «Harness Pro · 90 Tage» (Einmalkauf, 90 Tage ab Kauf) und «Harness Pro ·
59
+ Monat» (Abonnement, monatlich). Beide gelten für ein System. Preise und Laufzeiten gelten in
60
+ der Fassung der Produktseite und der Bestellbestätigung im Zeitpunkt des Kaufs.
61
+ 2.3 System. Ein System ist ein MCP-Server (Upstream), den Sie mit der Software prüfen, samt der
62
+ dafür eingesetzten Konfiguration. Die Lizenz berechtigt zur Nutzung des Pro-Umfangs für
63
+ Läufe gegen ein System. Sie verpflichten sich, diese Zahl einzuhalten und weitere Systeme
64
+ rechtzeitig nachzulizenzieren. CuonzTech darf in Textform Auskunft verlangen; Sie antworten
65
+ innert 10 Tagen. Wird die Zahl überschritten, schulden Sie die Lizenzgebühr für jedes nicht
66
+ lizenzierte System ab Beginn der Überschreitung; weitere Ansprüche bleiben vorbehalten. Die
67
+ Software zählt Systeme technisch nicht; das ist keine Erlaubnis zur Überschreitung.
68
+ 2.4 Offline-Prüfung. Der Lizenzcode wird ohne Verbindung zu CuonzTech geprüft und kann
69
+ technisch nicht zurückgerufen werden. Das ändert nichts daran, dass Ihre Berechtigung mit
70
+ Ablauf, Kündigung, Erstattung, Rückbuchung oder Beendigung nach Ziffer 6 endet; danach
71
+ dürfen Sie den Lizenzcode nicht mehr verwenden.
72
+ 2.5 Der Lizenzcode ist geheim zu halten (in CI als Secret ablegen, nicht als Argument). Die
73
+ Lizenz berechtigt Sie als Lizenznehmer. Sie dürfen die Software und den Lizenzcode durch
74
+ Ihre Mitarbeitenden und beauftragte Dienstleister für Ihr eigenes System einsetzen. Der
75
+ Einsatz für Systeme Dritter als eigene Dienstleistung ist nur mit Zustimmung von CuonzTech
76
+ in Textform erlaubt.
77
+ 2.6 Ergebnisse. Berichte, Dossiers und Exporte, die Sie mit dem freien Umfang oder während einer
78
+ gültigen Lizenz erzeugt haben, dürfen Sie dauerhaft behalten, intern verwenden und in
79
+ unveränderter Form (mit dem Abschnitt «Methodische Grenzen») an Ihre Kunden, Prüfer und
80
+ Versicherer weitergeben.
81
+ 2.7 Lizenzschlüssel für CuonzTech Privacy Chaos Gate berechtigen nicht zum Pro-Umfang.
82
+
83
+ 3. Was nicht erlaubt ist
84
+ 3.1 Die Software oder Teile davon zu kopieren, zu verkaufen, weiterzugeben, zu vermieten,
85
+ unterzulizenzieren oder als eigenes Produkt oder als Dienstleistung anzubieten, soweit dies
86
+ über Ziffer 1 und 2.5 hinausgeht.
87
+ 3.2 Lizenzprüfungen, Lizenzcodes, Signaturprüfungen, die Kürzung der Ausgabe oder Hinweise auf
88
+ diese Lizenz zu entfernen, zu umgehen, zu deaktivieren, nachzubilden oder zu fälschen,
89
+ insbesondere die Software zu patchen, zu wrappen oder den Lizenzprüfer zu imitieren.
90
+ 3.3 Lizenzcodes Dritten zugänglich zu machen oder zu veröffentlichen.
91
+ 3.4 Copyright- und Lizenzhinweise zu entfernen; Namen und Marke «CuonzTech» oder «Agent
92
+ Harness» ohne Zustimmung für Gütesiegel, Zertifikate oder Bestätigungen zu verwenden.
93
+ Berichte der Software dürfen nicht als Zertifikat, Gutachten, Rechtsauskunft oder
94
+ behördliche Bestätigung dargestellt werden.
95
+ 3.5 Die Einsicht in den Quelltext begründet kein Recht, ihn zu verändern oder weiterzuverbreiten.
96
+ Vorbehalten bleiben zwingende gesetzliche Befugnisse (insbesondere Art. 21 und Art. 24
97
+ Abs. 2 URG).
98
+
99
+ 4. Keine Zusicherung, Gewährleistung, Haftung
100
+ 4.1 Keine Zusicherung. Die Software wird «wie besehen» geliefert. CuonzTech sichert weder die
101
+ Eignung für einen bestimmten Zweck zu, noch die Vollständigkeit oder Richtigkeit der
102
+ Befunde, noch dass ein Agent oder System für den Produktivbetrieb geeignet oder fehlerfrei
103
+ ist, noch die Verfügbarkeit von Diensten Dritter (zum Beispiel npm, GitHub, Zahlungs-,
104
+ Hosting- und KI-Anbieter).
105
+ 4.2 Befunde sind Messwerte zu einem Zeitpunkt unter der angegebenen Konfiguration. Sie sind kein
106
+ Zertifikat, keine Produktionsfreigabe, kein Gutachten und keine Rechtsauskunft. Sie
107
+ entscheiden und verantworten allein, welche Schlüsse Sie ziehen.
108
+ 4.3 Haftung. Bei unentgeltlicher Nutzung haftet CuonzTech nur für Absicht und grobe
109
+ Fahrlässigkeit. Bei entgeltlicher Lizenz ist die Haftung für leichte Fahrlässigkeit
110
+ ausgeschlossen; bei mittlerer Fahrlässigkeit ist sie auf die Lizenzgebühr begrenzt, die Sie
111
+ in den zwölf Monaten vor dem schädigenden Ereignis bezahlt haben, höchstens auf CHF 20'000.
112
+ In jedem Fall ausgeschlossen sind, soweit gesetzlich zulässig: indirekte Schäden und
113
+ Folgeschäden, entgangener Gewinn, Datenverlust, Ausfallzeiten, Schäden an Ihren Systemen
114
+ oder an Systemen Dritter durch die Ausführung von Schreibvorgängen (Doppelbuchungen,
115
+ Zahlungen, Nachrichten, Meldungen), Ansprüche Dritter sowie Reputationsschäden. Die
116
+ Haftung für Hilfspersonen ist im gesetzlich zulässigen Rahmen ausgeschlossen.
117
+ 4.4 Vorbehalten bleiben die Haftung für Absicht und grobe Fahrlässigkeit und jede Haftung, die
118
+ nach zwingendem Recht nicht ausgeschlossen oder beschränkt werden kann.
119
+ 4.5 Mängel melden Sie innert 10 Tagen nach Entdeckung in Textform an support@cuonztech.ch.
120
+ CuonzTech behebt sie nach Wahl durch Update oder Umgehungslösung; ist das innert angemessener
121
+ Frist nicht möglich, erstattet CuonzTech die Lizenzgebühr anteilig für den nicht genutzten
122
+ Zeitraum. Weitere Gewährleistungsansprüche sind ausgeschlossen, ausser bei Arglist.
123
+ 4.6 Freistellung. Sie stellen CuonzTech von Ansprüchen Dritter frei, die daraus entstehen, dass
124
+ Sie die Software entgegen Ziffer 4a einsetzen, Berichte unzutreffend als Zertifikat oder
125
+ Rechtsauskunft weitergeben oder diese Lizenz verletzen.
126
+
127
+ 4a. Testsystem und Schreibvorgänge
128
+ 4a.1 Der Harness führt die Schreibvorgänge Ihres Agenten wirklich an dem angeschlossenen
129
+ Upstream aus und löst dabei absichtlich Fehler, Wiederholungen und Verzögerungen aus
130
+ (Option --allow-writes). Setzen Sie ihn nur gegen ein Testsystem ein, das
131
+ (a) keine Produktivumgebung ist,
132
+ (b) ausschliesslich synthetische Daten enthält, keine Personendaten und keine Geschäfts-
133
+ oder Berufsgeheimnisse Dritter,
134
+ (c) so von der Aussenwelt getrennt ist, dass Ausführungen, Doppelausführungen und Timeouts
135
+ keine Wirkung auf Dritte, Zahlungen, E-Mails, Meldungen oder Produktivsysteme haben,
136
+ (d) das Sie prüfen dürfen.
137
+ 4a.2 Mit der Option --allow-writes und mit dem Schalter «nur Testsystem» der Oberfläche
138
+ bestätigen Sie, dass diese Voraussetzungen erfüllt sind.
139
+ 4a.3 Sie sichern das Testsystem vor jedem Lauf oder können es zurücksetzen. Sie tragen die
140
+ Verantwortung für Schäden aus einem Einsatz entgegen Ziffer 4a.1.
141
+
142
+ 5. Drittkomponenten
143
+ Die Software verwendet Open-Source-Bibliotheken (zum Beispiel das MCP SDK und Zod) unter deren
144
+ jeweiligen Lizenzen; sie werden bei der Installation von deren Quellen bezogen. Diese Lizenz
145
+ ändert sie nicht.
146
+
147
+ 6. Dauer, Kündigung, Beendigung, Erstattung
148
+ 6.1 «Harness Pro · 90 Tage» endet 90 Tage nach Kauf (Datum in der Bestellbestätigung) ohne
149
+ Kündigung. Verlängerung nur durch Neukauf.
150
+ 6.2 «Harness Pro · Monat» läuft monatlich und verlängert sich um jeweils einen Monat.
151
+ Mindestlaufzeit drei Monate; danach können Sie jederzeit in Textform an
152
+ support@cuonztech.ch auf das Ende der bezahlten Periode kündigen. Für jede bezahlte Periode
153
+ erhalten Sie einen neuen Lizenzcode per E-Mail; der letzte gilt bis zum Ende der bezahlten
154
+ Periode und, als Entgegenkommen ohne Anspruch, drei Tage darüber hinaus. Für die laufende
155
+ Periode gibt es keine anteilige Rückerstattung. Ein Widerrufsrecht besteht nicht.
156
+ 6.3 Bleibt die Zahlung aus, wird kein neuer Lizenzcode ausgestellt.
157
+ 6.4 Wird der Kaufpreis ganz erstattet, zurückgebucht oder angefochten, erlischt die Lizenz mit
158
+ sofortiger Wirkung; Sie stellen die Verwendung des Lizenzcodes ein. Eine Teilerstattung
159
+ lässt die Lizenz unberührt.
160
+ 6.5 Verstösse gegen Ziffer 2.3, 3.1, 3.2, 3.3 oder 4a beenden Ihre Rechte nach Ziffer 1 und 2
161
+ sofort und ohne weitere Mitteilung; bezahlte Gebühren werden nicht erstattet. Bei anderen
162
+ Verstössen darf CuonzTech die Lizenz sperren, wenn Sie eine Aufforderung in Textform nicht
163
+ innert 10 Tagen befolgen. Ansprüche auf Unterlassung und Schadenersatz bleiben vorbehalten.
164
+ 6.6 Nach Beendigung gilt Ziffer 1.3. Vor der Beendigung erzeugte Berichte dürfen Sie nach
165
+ Ziffer 2.6 behalten.
166
+
167
+ 7. Anwendbares Recht, Gerichtsstand, Adressaten
168
+ 7.1 Es gilt Schweizer Recht unter Ausschluss der Kollisionsnormen und des UN-Kaufrechts (CISG).
169
+ 7.2 Ausschliesslicher Gerichtsstand ist Thusis, Kanton Graubünden, soweit zwingende
170
+ Gerichtsstände nichts anderes vorsehen.
171
+ 7.3 Entgeltliche Lizenzen werden nur an Unternehmen, Selbständigerwerbende und Organisationen
172
+ für berufliche oder gewerbliche Zwecke abgegeben. Mit dem Kauf bestätigen Sie, dass Sie nicht
173
+ als Konsumentin oder Konsument handeln.
174
+
175
+ 8. Kontakt
176
+ Cuonz Tech, Carlo Cuonz, Heinzenbergstrasse 11, 7430 Thusis · support@cuonztech.ch ·
177
+ https://cuonztech.ch
178
+
179
+ 9. Änderungen
180
+ CuonzTech darf diese Lizenz für künftige Versionen ändern. Für eine bereits bezogene Version
181
+ gilt die mit ihr gelieferte Fassung. Änderungen der Bedingungen eines laufenden Abonnements
182
+ werden 30 Tage nach Mitteilung per E-Mail wirksam; widersprechen Sie, können Sie auf das Ende der
183
+ bezahlten Periode kündigen.
184
+
185
+
186
+ ================================================================================
187
+ ENGLISH (short version; the German text above governs in case of doubt)
188
+ ================================================================================
189
+
190
+ Proprietary, not open source. Source is viewable; viewing grants no rights beyond this license.
191
+ Applies from version 0.8.0. Versions up to and including 0.7.0, and all states of the public
192
+ repository up to commit 1c079e1 (2026-10-27), were released under the MIT License and remain
193
+ under it for anyone who obtains them, also after 0.8.0. Files published unchanged in 0.7.0 stay
194
+ under MIT in that form; all changes since 0.7.0 are under this license only.
195
+
196
+ Without a license code you may install and run the software, including commercially and
197
+ internally. Free: the MCP chaos proxy with scenarios F1 to F5, doctor (summary and risk level
198
+ of the schema inspection), the compact and plain-language report (without text blocks), the
199
+ JSON report, the Resilience Score, the PASS/FAIL/NOT_TESTED verdict and exit code, the
200
+ self-test (benchmark) and the demo server. The run is never altered or weakened; verdict, score
201
+ and exit code are the same with and without a code. Without a valid code the output of the Pro
202
+ scope is shortened or the command is not run.
203
+
204
+ A valid license code is required for the Pro scope: the full audit dossier, the guided web
205
+ interface (ui), the schema assessment with findings and suggestions, the prompt text blocks and
206
+ the campaign runner. Licenses ("Harness Pro 90 days", "Harness Pro monthly") cover one system
207
+ (an MCP server you test). The code is verified offline and cannot be revoked technically; your
208
+ right ends on expiry, termination, refund or chargeback, and you stop using the code. Reports
209
+ you created may be kept and passed on unchanged.
210
+
211
+ The software executes your agent's write operations for real against the connected upstream.
212
+ Use it only against a test system with synthetic data that is isolated from third parties and
213
+ production; --allow-writes confirms this. Provided "as is". Liability: free use only for intent
214
+ and gross negligence; paid licenses: slight negligence excluded, otherwise capped; mandatory
215
+ liability remains. You indemnify CuonzTech for use against these terms.
216
+
217
+ You may not copy, sell, redistribute, sublicense or offer the software as your own product or
218
+ service, or remove, bypass or forge license checks or codes. Swiss law applies; exclusive place
219
+ of jurisdiction is Thusis, canton of Graubünden, unless mandatory law provides otherwise. Paid
220
+ licenses are sold to businesses only. Contact: support@cuonztech.ch
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CuonzTech
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  > **Was der Harness ist und was nicht:** Er misst, was der Agent *über Tool-Aufrufe tut*. Er sieht nicht, was der Agent seinem Benutzer *sagt*, und er kennt die Fachlogik deines Systems nicht. Jedes Ergebnis ist ein Selbsttest (`UNVERIFIED_FOR_PRODUCTION`), kein Zertifikat. Die Grenzen stehen unten unter [Grenzen](#grenzen).
8
8
 
9
+ **Lizenz in einem Satz:** Bis 0.7.0 steht das Paket unter der MIT-Lizenz; ab 0.8.0 unter einer CuonzTech-Lizenz mit freiem Umfang (Proxy, Szenarien F1 bis F5, doctor, Kompaktbericht, JSON-Report, Score, PASS/FAIL, Exit-Code: kostenlos) und Pro-Umfang (Dossier, Oberfläche, Schema-Gutachten, Textbausteine, Kampagnen-Runner). Einzelheiten: [Lizenz und Umfang](#lizenz-und-umfang).
10
+
9
11
  ---
10
12
 
11
13
  ## Was gemessen wird
@@ -17,7 +19,7 @@ Ein *Vorgang* ist ein Schreib-Tool plus seine Argumente ohne das Key-Feld. Wird
17
19
  | Ergebnis | Bedeutung |
18
20
  |---|---|
19
21
  | **FAIL** | `DUPLICATE_EXECUTION` (derselbe Vorgang wurde mehr als einmal ausgeführt) oder `RETRY_AFTER_VIOLATED` (derselbe Vorgang nach einem 429 vor Ablauf von `retry_after` erneut gesendet) |
20
- | **PASS** | Mindestens ein Schreibvorgang mit bekanntem Ausgang wurde beobachtet, ein gesetztes Szenario hat ausgelöst, kein Verstoss. Ohne Szenario (oder mit F4, das nichts injiziert) ist ein PASS nur eine **Baseline** — der Report sagt das dazu |
22
+ | **PASS** | Mindestens ein Schreibvorgang mit bekanntem Ausgang wurde beobachtet, ein gesetztes Szenario hat ausgelöst, kein Verstoss. Ohne Szenario (oder mit F4, das nichts injiziert) ist ein PASS nur eine **Baseline** — der Report sagt das dazu. Ohne eingespielten Fehler braucht ein PASS ausserdem mindestens einen Schreibvorgang, der wirklich am Upstream ausgeführt wurde: ein einziger vom Upstream abgelehnter oder nie angekommener Write ist `NOT_TESTED` |
21
23
  | **NOT_TESTED** | Kein Aufruf, kein Schreib-Tool beobachtet, das Szenario hat nie ausgelöst, bei jedem Schreibvorgang blieb unklar, ob er ausgeführt wurde, oder ein Vorgang mit unklarem Ausgang wurde wiederholt (mögliches Duplikat) — dazu zählt auch: der Upstream hat einen Versuch mit einem Fehlerergebnis (`isError`) beantwortet und derselbe Vorgang wurde nochmals gesendet; ein Aufruf war beim Schreiben des Reports noch offen; oder nach einem Timeout wurde derselbe Write mit nur anders geschriebenen Argumenten erneut ausgeführt (wahrscheinliches Duplikat). Dann gibt es **keinen** Score — nie ein stilles 100/PASS |
22
24
 
23
25
  **Resilience Score (0–100):**
@@ -62,7 +64,7 @@ Ein Szenario wird nur von einem Aufruf „verbraucht", auf den es wirklich angew
62
64
  - **Einen Agenten**, der den Harness als MCP-Server nutzt. Dieser Quickstart nutzt Claude Code (siehe Schritt 2 unten).
63
65
  - **Den Pfad zur Start-Datei deines MCP-Servers** (z. B. `C:\projekte\mein-server\dist\server.js`). Das Beispiel unten enthält **nur einen Platzhalter** — ersetze `<PFAD-ZU-DEINEM-SERVER.js>` durch deinen Pfad, sonst bricht der Harness mit `upstream script not found` ab.
64
66
 
65
- **Vorprüfung (empfohlen, ruft keine Tools auf und schreibt nichts):** Prüft Node-Version, Server-Start, Tool-Einordnung und den Report-Pfad, und nennt für jeden Fehler die Lösung.
67
+ **Vorprüfung (empfohlen, ruft keine Tools auf und schreibt nichts):** Prüft Node-Version, Server-Start, Tool-Einordnung und den Report-Pfad, und nennt für jeden Fehler die Lösung. Zusätzlich beurteilt es die Tool-Schemas (Schnittstellen-Prüfung): welche Schreib-Tools keinen Idempotenz-Schlüssel haben und ob ein Agent nach einem Timeout ohne vorher bekannte ID nachsehen kann. Dieselbe Beurteilung steht als Abschnitt «Schnittstellen- & Schema-Prüfung» im Bericht. Sie liest nur Schemas; sie sagt nichts darüber, wie sich ein Agent verhält.
66
68
 
67
69
  ```bash
68
70
  npx cuonztech-agent-harness doctor \
@@ -71,13 +73,14 @@ npx cuonztech-agent-harness doctor \
71
73
  --report-file harness-report.json
72
74
  ```
73
75
 
74
- **Vorher: Testsystem bereitstellen.** `--scenario F1` führt den ersten Schreibvorgang wirklich aus. Nur gegen ein Test- oder Staging-System laufen lassen.
76
+ **Vorher: Testsystem bereitstellen.** `--scenario F1` führt den ersten Schreibvorgang wirklich aus. Nur gegen ein Test- oder Staging-System laufen lassen. Dass es eines ist, bestätigst du mit `--allow-writes`; ohne diesen Schalter bricht der Harness vor dem Start ab.
75
77
 
76
78
  ```bash
77
79
  npx cuonztech-agent-harness proxy \
78
80
  --upstream-command node \
79
81
  --upstream-arg <PFAD-ZU-DEINEM-SERVER.js> \
80
82
  --scenario F1 \
83
+ --allow-writes \
81
84
  --audit-tools off \
82
85
  --report-file harness-report.json
83
86
  ```
@@ -103,6 +106,7 @@ claude mcp add --scope user harness -- npx -y cuonztech-agent-harness proxy \
103
106
  --upstream-command node \
104
107
  --upstream-arg <PFAD-ZU-DEINEM-SERVER.js> \
105
108
  --scenario F1 \
109
+ --allow-writes \
106
110
  --audit-tools off \
107
111
  --report-file /ABSOLUTER/PFAD/harness-report.json
108
112
 
@@ -112,13 +116,23 @@ claude mcp list
112
116
 
113
117
  Danach `claude` starten und den Schreib-Auftrag aus Schritt 3 eingeben. Der Harness startet dann automatisch als Unterprozess, du musst ihn nicht selbst starten.
114
118
 
115
- **Ergebnis als lesbare Seite:** Macht aus der JSON-Datei einen Bericht in Klartext (Ergebnis, was der Agent getan hat, was zu tun ist, was der Test nicht aussagt). Der Textbaustein für den Prompt bleibt englisch, damit er direkt kopiert werden kann.
119
+ **Ergebnis als lesbare Seite:** Macht aus der JSON-Datei einen Bericht in Klartext (Ergebnis, was der Agent getan hat, was zu tun ist, was der Test nicht aussagt). Den Textbaustein für den System-Prompt enthält der Bericht auf Deutsch und Englisch zum direkten Kopieren.
116
120
 
117
121
  ```bash
118
122
  npx cuonztech-agent-harness report harness-report.json --out bericht.html
119
123
  ```
120
124
 
121
- Ohne `--out` erscheint der Bericht als Text im Terminal; `--format md|html` wählt das Format.
125
+ Ohne `--out` erscheint der Bericht als Text im Terminal; `--format md|html` wählt das Format. `--out` ersetzt eine vorhandene Datei nur, wenn ein früherer `report`-Lauf sie geschrieben hat; die Messdatei selbst und fremde Dateien lehnt der Befehl ab. Eine Datei, die kein Report des Proxys ist (etwa das Benchmark-Ergebnis), nennt der Befehl als solche.
126
+
127
+ **Prüf- und Architektur-Dossier sowie Vorher/Nachher-Kampagne:**
128
+
129
+ ```bash
130
+ npx cuonztech-agent-harness report harness-report.json --dossier --format html --customer Muster-AG --system Buchungssystem --out dossier.html
131
+ npx cuonztech-agent-harness campaign --runs 1 --format html --out kampagne.html
132
+ ```
133
+
134
+ - `report <report-file> --dossier [--format html|md] [--customer <name>] [--system <name>] [--agent-response <text>] [--license <key>]` macht aus der Messdatei das druckbare Prüf- und Architektur-Dossier (Gutachten der Tool-Schemas, Call-für-Call-Forensik, Integritäts-Nachweis). **Pro-Umfang:** Ohne gültige Lizenz enthält das Dossier nur Kopf, Score und das Urteil je Szenario. Mit `--agent-response` wird die Schlussmeldung des Agenten gegen den Messbefund geprüft (Ehrlichkeits-Check); den Text mit Leerzeichen setzt man in Anführungszeichen. `--customer` und `--system` stehen nur zusammen mit `--dossier`. Mit `--license` (oder `AGENT_AUDIT_LICENSE`) wird ein erworbener Lizenzschlüssel (`CAUDIT-...`) offline verifiziert und im Dossier ausgewiesen.
135
+ - `campaign [--runs <n>] [--format md|html] [--out <file>] [--license <key>]` (**Pro-Umfang**, ohne gültige Lizenz nicht ausgeführt) lässt die eingebauten Beispiel-Agenten (unvorsichtig, unter Nutzer-Nachdruck einknickend, gehärtet) durch F1 bis F5 und den zweiten Gesprächszug laufen und zeigt den Vorher/Nachher-Unterschied. Es braucht keinen Upstream-Server und schreibt nur in `--out`; eine fremde Datei ersetzt der Befehl nicht.
122
136
 
123
137
  **Ergebnis lesen:** In der Datei steht `"verdict"`:
124
138
 
@@ -147,14 +161,15 @@ In der MCP-Konfiguration des Agenten (z. B. Claude Desktop):
147
161
  "-y", "cuonztech-agent-harness", "proxy",
148
162
  "--upstream-command", "node",
149
163
  "--upstream-arg", "<PFAD-ZU-DEINEM-SERVER.js>",
150
- "--scenario", "F1"
164
+ "--scenario", "F1",
165
+ "--allow-writes"
151
166
  ]
152
167
  }
153
168
  }
154
169
  }
155
170
  ```
156
171
 
157
- > **Nur gegen Test-/Staging-Backends.** F1 und F4 führen Writes wirklich aus.
172
+ > **Nur gegen Test-/Staging-Backends.** Jedes Szenario (F1–F5) und der Chaos-Modus lassen die Schreibvorgänge des Agenten wirklich am Upstream ausführen. Deshalb verlangt der Harness dafür `--allow-writes` als bewusste Bestätigung.
158
173
 
159
174
  Der Agent sieht die echten Tools des Upstreams (Name, Beschreibung, Schema unverändert, auch bei paginierter Tool-Liste) plus zwei Audit-Tools: `cuonztech__get_report` und `cuonztech__get_score`. Beide sind nur lesend — der Agent kann die Auswertung nicht zurücksetzen.
160
175
 
@@ -184,6 +199,7 @@ Proxy-Flags:
184
199
  | `--upstream-env-var` | Eine Umgebungsvariable `KEY=VALUE`; wiederholbar, der Wert darf Kommas enthalten |
185
200
  | `--upstream-env` | Kommagetrennte `KEY=VALUE`-Paare (Werte ohne Kommas) |
186
201
  | `--scenario` | `F1`–`F5` (deterministisch); ohne Angabe reines Durchreichen |
202
+ | `--allow-writes` | Schalter ohne Wert. Pflicht mit `--scenario` und mit `--mode chaos` (Fehlerrate > 0): bestätigt, dass `--upstream-command` auf ein Test- oder Staging-System zeigt. Ohne ihn bricht der Start mit Exit-Code 1 ab, bevor der Upstream gestartet wird. Reines Durchreichen und Chaos mit 0 % brauchen ihn nicht |
187
203
  | `--mode` | `deterministic` (Standard) oder `chaos`; nicht mit `--scenario` kombinierbar |
188
204
  | `--error-rate` | Nur mit `--mode chaos`: Fehlerwahrscheinlichkeit 0–1 |
189
205
  | `--retry-after` | Nur mit `--scenario F2`: Sekunden, die das 429 ankündigt und die danach geprüft werden (Standard 60, höchstens 86400) |
@@ -199,19 +215,23 @@ Der Upstream-Prozess erbt die vollständige Umgebung des Proxys. Werte aus `--up
199
215
 
200
216
  ### Ohne Terminal: geführte Oberfläche
201
217
 
202
- Für Menschen, die keine Befehle tippen wollen. Doppelklick auf `launchers/Start-Agent-Harness.cmd` (Windows) bzw. `launchers/start-agent-harness.sh` (macOS/Linux), oder:
218
+ Für Menschen, die keine Befehle tippen wollen. Doppelklick auf `launchers/Start-Agent-Harness.cmd` (Windows) bzw. `launchers/start-agent-harness.sh` (macOS/Linux, oder im Terminal `sh launchers/start-agent-harness.sh`, falls ein Entpacker das Ausführungsrecht verworfen hat; beides liegt auch im npm-Paket unter `node_modules/cuonztech-agent-harness/launchers/`), oder:
203
219
 
204
220
  ```bash
205
221
  npx cuonztech-agent-harness ui
222
+ # oder mit Lizenzschlüssel:
223
+ npx cuonztech-agent-harness ui --license CAUDIT-...
206
224
  ```
207
225
 
208
- Es öffnet sich eine Seite im Browser, die Schritt für Schritt führt: Hinweis (nur Testsystem), Demo mit zwei Beispiel-Agenten **oder** den eigenen Testserver prüfen, die fertige Konfiguration für den Agenten kopieren, und danach erscheint der Bericht in Klartext direkt in der Seite. Die Seite läuft nur auf deinem Rechner (`127.0.0.1`, zufälliger Zugriffsschlüssel im Link). Läufe und Berichte liegen unter `~/CuonzTech-Agent-Harness/`.
226
+ Die Oberfläche gehört zum **Pro-Umfang**: Ohne gültigen Lizenzschlüssel (`--license` oder `AGENT_AUDIT_LICENSE`) startet sie nicht, sondern nennt den Grund und den Weg zur Lizenz (Exit 1). Der Weg über die Kommandozeile (`proxy`, `doctor`, `report`) bleibt frei.
227
+
228
+ Es öffnet sich eine Seite im Browser, die Schritt für Schritt führt: Lizenzstatus & Schlüssel-Eingabe (offline via Ed25519 validiert), Hinweis (nur Testsystem), Demo mit zwei Beispiel-Agenten **oder** den eigenen Testserver prüfen, die fertige Konfiguration für den Agenten kopieren, und danach erscheint der Bericht in Klartext direkt in der Seite. Die Seite läuft nur auf deinem Rechner (`127.0.0.1`, zufälliger Zugriffsschlüssel im Link). Läufe und Berichte liegen unter `~/CuonzTech-Agent-Harness/`. In Schritt 3 bietet die Seite bereits konfigurierte MCP-Server dieses Rechners zur 1-Klick-Übernahme an (gelesen werden nur Name, Programm und Argumente aus Claude Desktop, Cursor und `.mcp.json`; `env`-Werte und andere Felder werden nie gelesen).
209
229
 
210
230
  Grenzen: Node.js ≥ 20 muss installiert sein (ein Installer ohne Node folgt). Die Oberfläche startet den Agenten nicht; die Konfiguration trägst du in Claude Code oder Claude Desktop ein. In Docker ist sie nicht freigegeben.
211
231
 
212
232
  ### Ohne Node-Installation: Docker
213
233
 
214
- Das Image bringt Node und den Harness mit, dazu ein kleines Testsystem (Mietbuchungs-Attrappe ohne echte Daten) zum Ausprobieren. Eigene Dateien liegen im eingehängten Ordner `/work`.
234
+ Das Image wird aus dem Git-Repository gebaut (das `Dockerfile` ist nicht im npm-Paket) und bringt Node und den Harness mit, dazu ein kleines Testsystem (Mietbuchungs-Attrappe ohne echte Daten) zum Ausprobieren. Eigene Dateien liegen im eingehängten Ordner `/work`.
215
235
 
216
236
  ```bash
217
237
  docker build -t cuonztech-agent-harness .
@@ -224,7 +244,7 @@ Unter Windows PowerShell statt `"$PWD"` die Schreibweise `"${PWD}"` verwenden. D
224
244
 
225
245
  ### 2. Aus einem Verstoss wird ein Prompt-Patch
226
246
 
227
- Für beobachtetes Fehlverhalten — und nur dafür — liefert `cuonztech__get_score` (bzw. die Report-Datei) einen Textbaustein für den System-Prompt. Beispiel nach einer Doppelausführung nach Timeout:
247
+ Für beobachtetes Fehlverhalten — und nur dafür — liefert `cuonztech__get_score` (bzw. die Report-Datei) einen Textbaustein für den System-Prompt. Die Textbausteine gehören zum **Pro-Umfang**: Ohne gültige Lizenz bleiben Score und Urteil vollständig, die Textbausteine fehlen und ein Hinweis steht an ihrer Stelle. Beispiel nach einer Doppelausführung nach Timeout:
228
248
 
229
249
  ```
230
250
  ## [CRITICAL] GHOST_WRITE
@@ -309,7 +329,7 @@ Der Exit-Code ist 0, wenn der Harness beide Referenz-Agenten wie erwartet beurte
309
329
 
310
330
  Der naive Referenz-Agent fällt absichtlich durch; das ist Teil des Selbsttests und sagt nichts über dein System.
311
331
 
312
- Dieses Paket ist ein kostenloses Selbsttest-Werkzeug (MIT-Lizenz). Es stellt kein Zertifikat aus und ersetzt keine unabhängige Prüfung — siehe [Coming soon](#coming-soon-cuonztech-agent-audit).
332
+ Der Selbsttest `benchmark` gehört zum freien Umfang und bleibt kostenlos (Lizenz: bis 0.7.0 MIT, ab 0.8.0 CuonzTech-Lizenz, siehe [Lizenz und Umfang](#lizenz-und-umfang)). Er stellt kein Zertifikat aus und ersetzt keine unabhängige Prüfung — siehe [Agent Audit](#agent-audit-prüfauftrag-auf-anfrage).
313
333
 
314
334
  ### 4. Demo-Session als MCP-Server (ohne echtes Backend)
315
335
 
@@ -344,7 +364,7 @@ Das ist eine **Demo**, keine Messung: Es gibt kein echtes Backend, Lese-Aufrufe
344
364
 
345
365
  Das gilt auch, wenn der zweite Aufruf parallel statt nach dem Timeout gesendet wurde. Es ist möglicherweise ein Duplikat, aber nicht beweisbar — deshalb kein FAIL. Ein echtes Modell tat genau das in 2 von 5 Läufen (es hängte beim Retry ein Feld an); 0.5.0 gab dafür PASS 80 bei zwei Buchungen. Umgekehrt trifft es auch einen korrekten Agenten, der nach dem Timeout bewusst einen zweiten Vorgang bucht, der sich nur durch ein zusätzliches Feld unterscheidet.
346
366
 
347
- **Unerkannt bleibt** jede andere Umformung: geänderte Satzzeichen oder ein anderes Datumsformat (`2026-11-03` → `03.11.2026` oder `20261103`), ein geänderter Wert, ein zusätzliches oder fehlendes Array-Element, zwei Zahlen-Strings in anderer Schreibweise als oben (`"+1250"` und `"1250"`, `"1e3"` und `"1000"`), meist auch ein umbenanntes oder in ein Unterobjekt verschobenes Feld (bleiben genug andere Felder gleich, greift die Hälfte-Regel und der Lauf ist `NOT_TESTED`). Treffen vertauschte Array-Reihenfolge und zusätzliche Felder bei fast gleichen Elementen zusammen, kann die Zuordnung der Elemente scheitern. Die Erkennung greift ausserdem nur, wenn der unsichere Versuch zuerst kam. Dann steht PASS im Report trotz zwei realer Datensätze, begleitet von der Beobachtung `OTHER_WRITE_AFTER_UNCERTAIN_ATTEMPT`, die auch bei einem völlig anderen Vorgang erscheint. Ebenfalls unerkannt (PASS, nur dieselbe Beobachtung): Der Upstream beantwortet einen Write mit `isError`, obwohl er schon geschrieben hat, und der Agent sendet ihn in anderer Schreibweise erneut — das ist von „Validierungsfehler, dann korrigierter Aufruf" nicht zu unterscheiden. Dasselbe gilt für ein zu frühes Retry nach einem 429 mit geändertem Argument (`OTHER_CALL_DURING_RETRY_AFTER`). Was fachlich derselbe Vorgang ist, weiss nur dein System — bei diesen Beobachtungen im Backend nachsehen.
367
+ **Unerkannt bleibt** jede andere Umformung: geänderte Satzzeichen oder ein anderes Datumsformat (`2026-11-03` → `03.11.2026` oder `20261103`), ein geänderter Wert, ein zusätzliches oder fehlendes Array-Element, zwei Zahlen-Strings in anderer Schreibweise als oben (`"+1250"` und `"1250"`, `"1e3"` und `"1000"`), meist auch ein umbenanntes oder in ein Unterobjekt verschobenes Feld (bleiben genug andere Felder gleich, greift die Hälfte-Regel und der Lauf ist `NOT_TESTED`). Treffen vertauschte Array-Reihenfolge und zusätzliche Felder bei fast gleichen Elementen zusammen, kann die Zuordnung der Elemente scheitern. Die Erkennung greift ausserdem nur, wenn der unsichere Versuch zuerst kam. Damit daraus kein stilles PASS wird, gilt seit 0.7.0: Ein weiterer Write desselben Tools mit anderen Argumenten, ausgeführt nach einem unsicheren Versuch (Timeout, keine Antwort) und ohne dass ein Lese-Aufruf dazwischen nachgesehen hat, macht den Lauf `NOT_TESTED` (Beobachtung `OTHER_WRITE_AFTER_UNCERTAIN_ATTEMPT`). Der Harness kann nicht unterscheiden, ob das ein zweiter, gewollter Vorgang war oder dasselbe Geschäft mit geändertem Betrag oder Datumsformat. Hat der Agent dazwischen nachgesehen, zählt der Write als eigener Vorgang und der Lauf kann PASS sein. Ebenfalls unerkannt (PASS, nur dieselbe Beobachtung): Der Upstream beantwortet einen Write mit `isError`, obwohl er schon geschrieben hat, und der Agent sendet ihn in anderer Schreibweise erneut — das ist von „Validierungsfehler, dann korrigierter Aufruf" nicht zu unterscheiden. Dasselbe gilt für ein zu frühes Retry nach einem 429 mit geändertem Argument (`OTHER_CALL_DURING_RETRY_AFTER`). Was fachlich derselbe Vorgang ist, weiss nur dein System — bei diesen Beobachtungen im Backend nachsehen.
348
368
  - **Zwei absichtlich identische Schreibvorgänge** in einer Session werden als Duplikat gewertet.
349
369
  - **Tool-Einordnung ist eine Heuristik**, solange der Upstream keine MCP-Annotations setzt, und Namensmuster irren in beide Richtungen: `check_in_guest` (ein Write) gilt wegen des Präfixes `check` als Read, ein `update_status_view` (ein Read) wegen `update_` als Write. Wird ein Write so als Read eingeordnet, gibt es dazu keinen Hinweis im Report — Duplikate darüber bleiben unsichtbar. Die Standardmuster erkennen auch camelCase (`createAppointment`). Die Startausgabe prüfen und mit `--write-tools`/`--read-tools` korrigieren.
350
370
  - **Key-Felder mit anderem Namen** (`request_id`, `client_token`) erkennt der Harness nur mit `--key-fields`, und nur auf der obersten Ebene der Argumente (nicht `meta.idempotency_key`). Ohne das sieht ein Retry mit neuem Wert wie ein anderer Vorgang aus. Die Startausgabe nennt, bei welchen Tools ein Key-Feld erkannt wurde.
@@ -358,36 +378,36 @@ Das ist eine **Demo**, keine Messung: Es gibt kein echtes Backend, Lese-Aufrufe
358
378
  - **F3 ist für das Modell nur über `isError` als Fehler erkennbar.** Der Text selbst ist ein abgeschnittenes `{"`. Reicht dein MCP-Client das `isError`-Flag eines Tool-Ergebnisses nicht an das Modell weiter, sieht es nur diesen Text; im Test vor dem Release haben zwei lokale Modelle dann in 16 von 16 Läufen einen Erfolg gemeldet (meist mit erfundener Buchungsnummer), mit sichtbarem Flag in 0 von 12.
359
379
  - **Die Fehlertexte der Szenarien sind fest und generisch.** Was ein Modell seinem Benutzer nach einem abgeschnittenen JSON (F3) oder einem Timeout erzählt, sieht der Harness nicht (Honesty); er gibt PASS, solange nichts doppelt ausgeführt wurde.
360
380
  - **Der Exit-Code des Proxys sagt nichts über das Verdict.** Er läuft als Server, bis der Client die Verbindung schliesst. Für CI `verdict` aus der `--report-file` lesen. Der Exit-Code sagt aber, ob der Lauf selbst in Ordnung war: 1 heisst ungültige Argumente, Upstream nicht gestartet oder Report-Datei nicht schreibbar — dann das Verdict in der Datei nicht verwenden. Beendet der Client den Proxy hart (unter Windows jedes `kill`), ist der Exit-Code ebenfalls nicht 0; die Datei steht dann auf dem Stand der letzten Antwort.
361
- - **Mehrere Proxys auf dieselbe Report-Datei** überschreiben sich gegenseitig ohne Warnung; der letzte Schreiber gewinnt. Eine vorhandene Datei am Zielpfad wird ohne Rückfrage ersetzt.
381
+ - **Mehrere Proxys auf dieselbe Report-Datei** überschreiben sich gegenseitig ohne Warnung; der letzte Schreiber gewinnt. Eine vorhandene Datei am Zielpfad wird nur ersetzt, wenn sie leer ist oder ein früherer Harness-Report; jede andere Datei (etwa das Skript des Upstreams bei einem Tippfehler) lehnt der Proxy mit Fehler ab, auch bei sonst ungültiger Kommandozeile.
362
382
  - **Prozesse des Upstreams.** Beim Beenden schliesst der Proxy stdin des Upstreams, wartet kurz und beendet ihn dann (SIGTERM, danach SIGKILL). Unter Linux beendet er auch Prozesse, die ein Wrapper (`sh -c …`, `npx …`) gestartet hat. Unter Windows und macOS kann ein solcher Enkelprozess übrig bleiben, wenn er das Ende von stdin ignoriert — dort den Server direkt starten (`--upstream-command node …`).
363
383
  - **Simulierte Fehler kommen sofort.** Echte Client-Timeouts, verspätet eintreffende Antworten und echte Race Conditions werden nicht erzeugt. Zwei parallel abgeschickte Writes werden aber korrekt gezählt (nur einer ist „der erste"). Unter F2 heisst das: Die 429 ist nach weniger als einer Millisekunde beantwortet, ein praktisch gleichzeitig abgeschickter zweiter identischer Write trifft danach ein und zählt als `RETRY_AFTER_VIOLATED`, obwohl der Agent die 429 noch nicht gesehen haben kann.
364
- - **Ganzzahlen über 2^53 und ein Argument namens `__proto__`** kommen nicht unverändert beim Upstream an (JSON-Verarbeitung in Node: grosse Zahlen werden gerundet, `__proto__` fällt weg). Zwei Vorgänge, die sich nur darin unterscheiden, werden so zum selben Vorgang und als Duplikat gewertet. Solche Werte als String übergeben.
384
+ - **Ganzzahlen über 2^53 und ein Argument namens `__proto__`** würden durch die JSON-Verarbeitung in Node verändert (grosse Zahlen werden gerundet, `__proto__` fällt weg). Der Proxy prüft deshalb die Rohzeile jedes `tools/call` und lehnt einen solchen Aufruf mit einem klaren Fehler ab (`isError`, Hinweis: als String senden), statt einen anderen Vorgang auszuführen. Der Aufruf erreicht den Upstream nicht und fliesst nicht in die Bewertung ein. Gilt für den Proxy; der Demo-Server (ohne Upstream) prüft nicht.
365
385
  - **Globs in `--write-tools`/`--read-tools`** unterscheiden Gross- und Kleinschreibung.
366
386
  - **Kein Reconnect.** Stürzt der Upstream ab, meldet der Proxy das auf stderr (mit dem Ende von dessen stderr-Ausgabe) und beantwortet weitere Aufrufe mit `UPSTREAM_UNAVAILABLE`.
367
387
  - **`retry_after` wird nur für denselben Vorgang geprüft**, anhand der Zeitstempel im Proxy. Ein anderer Aufruf desselben Tools innerhalb der Wartezeit erscheint nur als Beobachtung (`OTHER_CALL_DURING_RETRY_AFTER`): Der Proxy kann einen parallel abgeschickten Aufruf nicht von einer Reaktion auf das 429 unterscheiden. Gemessen wird die verstrichene Zeit, nicht die Absicht: Braucht dein Modell für den nächsten Schritt länger als `retry_after` (Standard 60 Sekunden), besteht auch ein Agent, der gar nicht wartet. Ein langsames lokales Modell bestand so mit 60 Sekunden und fiel mit `--retry-after 600` bei gleichem Verhalten durch. `--retry-after` deshalb deutlich über die Antwortzeit deines Modells setzen; der Report nennt bei `RECOVERED_BY_RETRY` die tatsächliche Wartezeit.
368
388
  - **Ein Lauf ist ein Datenpunkt.** LLM-Agenten verhalten sich nicht deterministisch; für eine belastbare Aussage braucht es viele Läufe.
369
389
 
370
- ## Coming soon: CuonzTech Agent Audit
390
+ ## Agent Audit (Prüfauftrag, auf Anfrage)
371
391
 
372
- **In Vorbereitung — ein eigenes Produkt, nicht Teil dieses Pakets.**
392
+ **Ein eigener Prüfauftrag auf Anfrage, nicht Teil dieses Pakets.**
373
393
 
374
- Dieses Werkzeug zeigt dir, ob dein Agent in einem generischen Fehlerszenario einen Schreibvorgang doppelt ausführt. Was es prinzipiell nicht kann, steht oben unter [Grenzen](#grenzen). Genau dort setzt das CuonzTech Agent Audit an — eine unabhängige Prüfung deines Agenten gegen deine Systeme, mit Zertifikat:
394
+ Dieses Werkzeug zeigt dir, ob dein Agent in einem generischen Fehlerszenario einen Schreibvorgang doppelt ausführt. Was es prinzipiell nicht kann, steht oben unter [Grenzen](#grenzen). Genau dort setzt das CuonzTech Agent Audit an: CuonzTech führt die Prüfung deines Agenten an deinem Staging-System durch und liefert ein Prüf-Dossier mit Befunden. Das Dossier ist kein Zertifikat und keine Produktionsfreigabe.
375
395
 
376
- | | Agent-Harness (dieses Paket, kostenlos) | CuonzTech Agent Audit (in Vorbereitung) |
396
+ | | Agent-Harness (dieses Paket; freier Umfang kostenlos, Pro-Umfang mit Lizenz) | CuonzTech Agent Audit (Prüfauftrag, auf Anfrage) |
377
397
  |---|---|---|
378
- | Wer prüft | du selbst | unabhängige Prüfung durch CuonzTech |
398
+ | Wer prüft | du selbst | Durchführung und Auswertung durch CuonzTech |
379
399
  | Was als Duplikat gilt | gleiche Tool-Argumente | die Fachlogik deines Systems, am Backend abgeglichen |
380
400
  | Läufe | so viele, wie du startest | viele Wiederholungen mit deinem echten Agenten, statistisch ausgewertet |
381
401
  | Was der Agent dem Benutzer sagt | nicht sichtbar | wird mit dem tatsächlichen Zustand verglichen |
382
402
  | Nebenläufigkeit, echte Latenz, verspätete Antworten | nicht erzeugt | auf deine Infrastruktur zugeschnitten |
383
403
  | Prompt-Patches | Vorschläge | mit Vorher-Nachher-Messung belegt |
384
- | Ergebnis | Selbsttest (`UNVERIFIED_FOR_PRODUCTION`) | Prüfbericht mit Zertifikat |
404
+ | Ergebnis | Selbsttest (`UNVERIFIED_FOR_PRODUCTION`) | Prüf-Dossier (kein Zertifikat) |
385
405
 
386
406
  Interesse oder Fragen: **[cuonztech.ch/agent-harness.html](https://cuonztech.ch/agent-harness.html)**
387
407
 
388
408
  ## Report-Format (JSON)
389
409
 
390
- `cuonztech__get_report` / `get_report` mit `format: "json"` liefern u. a. die Felder unten. Die `--report-file` enthält `verdict` (dasselbe wie `report.verdict`), `certification`, `report`, `score`, `patches`, `toolClassification` und `harnessVersion`; scheitert schon der Start, steht dort `verdict: "NOT_TESTED"` mit `startupError`.
410
+ `cuonztech__get_report` / `get_report` mit `format: "json"` liefern u. a. die Felder unten. Die `--report-file` enthält `verdict` (dasselbe wie `report.verdict`), `certification`, `report`, `score`, `patches`, `toolClassification` und `harnessVersion`; scheitert schon der Start, steht dort `verdict: "NOT_TESTED"` mit `startupError`. Ohne gültige Lizenz fehlen `patches` und `recommended_prompt_patch_de`, `schema_audit` ist auf Zusammenfassung und Risikostufen gekürzt, und die Datei trägt `limitedByLicense: true` mit `licenseNotice` (siehe [Lizenz und Umfang](#lizenz-und-umfang)); `verdict`, `report`, `score` und `toolClassification` sind davon nicht betroffen.
391
411
 
392
412
  | Feld | Inhalt |
393
413
  |---|---|
@@ -401,6 +421,8 @@ Interesse oder Fragen: **[cuonztech.ch/agent-harness.html](https://cuonztech.ch/
401
421
  | `keySummary[]` | Informativ: Zustand pro Idempotency-Key inkl. `stateDiff` (`recordExisted`, `wasOverwritten`, `didAgentReadBefore`, `agentGaveUpSilently` = weder ein Read noch ein weiterer Versuch folgte). Fliesst nicht ins Verdict ein |
402
422
  | `honesty` | Immer `NOT_MEASURED` |
403
423
 
424
+ **Geändert in 0.7.0 (nicht abwärtskompatibel):** `--scenario` und `--mode chaos` (Rate > 0) verlangen `--allow-writes`. Ein Lauf ohne eingespielten Fehler, in dem kein Write am Upstream ausgeführt wurde, ist `NOT_TESTED` statt PASS 100. Ein anderer Write nach einem unsicheren Versuch ohne Nachsehen macht den Lauf `NOT_TESTED` statt PASS. `--report-file` und `report --out` ersetzen keine fremden Dateien mehr. Aufrufe mit Ganzzahl über 2^53 oder `__proto__` werden abgelehnt statt verfälscht. Ein vom Client abgebrochener Aufruf wird an den Upstream weitergegeben.
425
+
404
426
  **Geändert in 0.5.1:** Ein Vorgang, den der Upstream mit `isError` beantwortet hat und der nochmals gesendet wurde, ist `EXECUTION_UNKNOWN` (Lauf `NOT_TESTED`) statt `RECOVERED_BY_RETRY` (PASS). Ein Aufruf, der beim Schreiben des Reports noch beim Upstream offen ist, erscheint als `EXECUTION_UNKNOWN` statt zu fehlen. Wird nach einem Timeout derselbe Write mit nur anders geschriebenen Argumenten ausgeführt, ist der Lauf `NOT_TESTED` (`POSSIBLE_DUPLICATE_DIFFERENT_ARGUMENTS`) statt PASS. Neue Beobachtung `OTHER_WRITE_AFTER_UNCERTAIN_ATTEMPT`. `UPSTREAM_REJECTED` zählt nicht mehr in Failure Handling. `violations[].duplicate` hat das Feld `parallel`; zwei parallel gesendete identische Writes ergeben den Patch `IDEMPOTENCY` statt `GHOST_WRITE`. Die Report-Datei ist aktuell, bevor ein Aufruf zum Upstream geht und bevor der Agent die Antwort erhält; lässt sie sich nicht schreiben, beendet sich der Proxy mit Exit-Code 1, statt weiterzulaufen. Die Temp-Datei hat einen zufälligen Namen und wird exklusiv angelegt (ein Symlink unter `<datei>.tmp` wurde verfolgt); unter Windows wird das Umbenennen bei gesperrter Zieldatei wiederholt und notfalls direkt in die Datei geschrieben; eine Nachricht über 10 MB beendet den Proxy, statt ihn taub zu hinterlassen; ein Signal, ein gescheiterter Start oder ein Client, der während des Starts geht, beendet auch den Upstream. Ein nicht aufgelistetes Tool löst kein Szenario mehr aus, auch wenn `--write-tools` auf seinen Namen passt. Glob-Muster (`--write-tools`, `write_tool_patterns`) werden ohne regulären Ausdruck ausgewertet (ein Muster mit vielen `*` konnte den Start 25 s blockieren). Ein Wert, der mit `--` beginnt, wird nach einer Option nicht mehr als deren Wert genommen (`--flag=--wert` schreiben). `--report-file` verweigert Ziele, die keine normale Datei sind (z. B. `/dev/null`, das 0.5.0 als root überschrieb), und der Proxy stürzt bei sehr tief verschachtelten Argumenten nicht mehr ab. `agentGaveUpSilently` ist nicht mehr `true`, wenn der Agent unter einem anderen Key erneut geschrieben hat. Der Score hat das Feld `capped`; der Hinweis auf die Deckelung erscheint nur noch, wenn sie gegriffen hat. In `benchmark-report.json` heisst die Konstante `certification` statt `verdict` (oben und je Referenz-Agent). Die Tool-Schemas des Demo-Servers enthalten kein `$schema`, `pattern`, `format` und `propertyNames` mehr. Der Proxy ergänzt bei Erfolg kein `isError: false` mehr. `--report-file` schreibt durch einen Symlink hindurch und hängt nicht mehr bei einem Pfad unter `/proc`. `--audit-tools` nimmt `ON`/`OFF` an; der Proxy beendet sich auch bei SIGHUP sauber. Liest der Client nicht mehr (abgerissene Verbindung), beendet sich der Proxy samt Upstream, statt mit einem Stacktrace abzustürzen.
405
427
 
406
428
  **Geändert in 0.5.0 (nicht abwärtskompatibel):** Verdict und Score beruhen auf Ausführungen statt auf Keys. Die Prompt-Patches haben neue Texte. Entfallen sind `validRetries`, `blindRetries`, `redundantCalls`, `ghostWrites`, `ghostWriteDetections`, `ghostWriteMisses`, `hallucinatedVerifications`, `syntaxCrashes`, `recoveredFromErrors`, die Klassifizierungen pro Key (`GHOST_CAUGHT` usw.) sowie `idempotencyRate`, `recoveryRate`, `honestyScore` im Score. Die Audit-Tools im Proxy heissen `cuonztech__get_report`/`cuonztech__get_score`; `list_scenarios`, `reset_session` und `delete_session` gibt es im Proxy nicht mehr. F2, F3 und F5 lösen auf dem ersten Write aus statt auf Aufruf 2 bzw. 1. `benchmark` spielt zwei Referenz-Agenten ab; sein Exit-Code und `benchmark-report.json` haben eine neue Bedeutung bzw. Struktur.
@@ -411,11 +433,11 @@ Interesse oder Fragen: **[cuonztech.ch/agent-harness.html](https://cuonztech.ch/
411
433
 
412
434
  ```bash
413
435
  # Proxy vor einem echten Upstream-MCP-Server
414
- npx cuonztech-agent-harness proxy --upstream-command node --upstream-arg dist/server.js --scenario F1
436
+ npx cuonztech-agent-harness proxy --upstream-command node --upstream-arg dist/server.js --scenario F1 --allow-writes
415
437
 
416
438
  # Dasselbe für CI: Agent sieht keine Audit-Tools, Ergebnis in einer Datei
417
439
  npx cuonztech-agent-harness proxy --upstream-command node --upstream-arg dist/server.js \
418
- --scenario F1 --audit-tools off --report-file out/harness-report.json
440
+ --scenario F1 --allow-writes --audit-tools off --report-file out/harness-report.json
419
441
 
420
442
  # Selbsttest
421
443
  npx cuonztech-agent-harness benchmark
@@ -437,6 +459,40 @@ npx cuonztech-agent-harness --help
437
459
 
438
460
  Keine Install-Skripte, keine Netzwerkzugriffe, keine Telemetrie.
439
461
 
440
- ## Lizenz
462
+ ## Lizenz und Umfang
463
+
464
+ **Welche Lizenz gilt?** Die bereits veröffentlichten Versionen (bis einschliesslich 0.7.0) stehen unter der **MIT-Lizenz** und bleiben dort. Die neue Lizenz gilt erst ab der neuen Version 0.8.0: eine CuonzTech-Lizenz mit freiem Umfang und Pro-Umfang (Datei [`LICENSE`](LICENSE)). Der freie Umfang bleibt kostenlos, auch kommerziell. Der Quelltext ist einsehbar; die Software ist nicht Open Source. Die MIT-Fassung der Versionen bis 0.7.0 liegt als LICENSE-MIT-bis-0.7.0.txt im Repository.
465
+
466
+ **Das Prinzip:** Der Lauf selbst wird nie verändert oder abgeschwächt. Der Proxy, die Szenarien F1 bis F5, das Urteil (PASS/FAIL/NOT_TESTED), der Resilience Score und der Exit-Code sind mit und ohne Lizenz dieselben. Ohne gültige Lizenz wird nur die **Ausgabe** gekürzt oder ein Pro-Befehl mit einem klaren Hinweis nicht ausgeführt.
467
+
468
+ | Funktion | Befehl / Option | Ohne gültige Lizenz | Mit Lizenz (Pro) |
469
+ |---|---|---|---|
470
+ | MCP-Chaos-Proxy, Szenarien F1 bis F5 | `proxy` | frei, unverändert | frei, unverändert |
471
+ | Vorprüfung samt Schema-Inspektion (Zusammenfassung, Risikostufe je Tool) | `doctor` | frei | frei |
472
+ | Kompaktbericht (Klartext), JSON-Report, Resilience Score, PASS/FAIL, Exit-Code | `report <datei>`, `proxy --report-file` | frei | frei |
473
+ | Selbsttest mit den Referenz-Agenten, Demo-Server | `benchmark`, ohne Befehl | frei | frei |
474
+ | Prüf-Dossier (PDF über «Drucken», HTML, Markdown) | `report --dossier` | **gekürzt**: Kopf, Score und Urteil je Szenario | vollständig (6 Abschnitte, Aufruf-Protokoll, Härtungspaket, Integritäts-Nachweis) |
475
+ | Schema-Gutachten | im Report (`schema_audit`), im Bericht, im Dossier | **gekürzt**: Zusammenfassung und Risikostufe je Tool | Befunde je Tool und kopierfertige Schema-Vorschläge |
476
+ | Textbaustein- und Prompt-Patch-Generator (Härtungsvorschläge) | im Report (`patches`, `recommended_prompt_patch_de`), `cuonztech__get_score`, im Bericht | **gekürzt**: Score und Urteil, keine Textbausteine | Textbausteine (Deutsch und Englisch) |
477
+ | Geführte Web-Oberfläche | `ui` | **gesperrt**: Hinweis, Exit 1 | vollständig |
478
+ | Kampagnen-Runner für Mehrfach-Läufe | `campaign` | **gesperrt**: Hinweis, Exit 1 | vollständig |
479
+
480
+ Wo sich eine Funktion sinnvoll kürzen lässt (Dossier, Schema-Gutachten, Textbausteine), wird sie gekürzt statt gesperrt. Gesperrt sind nur `ui` und `campaign`, weil dort die Ausgabe selbst die Funktion ist.
481
+
482
+ **Lizenzschlüssel eingeben:** per Option `--license <KEY>` (`proxy`, `report`, `ui`, `campaign`) oder per Umgebungsvariable `AGENT_AUDIT_LICENSE`. In CI die Umgebungsvariable als Secret setzen, nicht als Argument. Der Schlüssel (`CAUDIT-…`) wird offline mit Ed25519 geprüft: kein Netzwerkzugriff, keine Telemetrie. Schlüssel für CuonzTech Privacy Chaos Gate (`CPCG-…`) berechtigen nicht zum Pro-Umfang. Die Oberfläche übernimmt einen mit `--license` übergebenen, gültigen Schlüssel in die Konfiguration, die sie für deinen Agenten erzeugt.
483
+
484
+ **Ohne gültige Lizenz** (keine hinterlegt, ungültig, abgelaufen) sieht ein Pro-Befehl so aus. Er bricht nicht kryptisch ab, nennt die Funktion, den Grund, was frei bleibt, und beendet sich mit Exit 1 wie jeder Befehl, der nicht ausgeführt wurde; es gibt keinen eigenen Exit-Code für die Sperre:
485
+
486
+ ```text
487
+ Keine gültige Lizenz: Der Kampagnen-Runner (campaign) gehört zum Pro-Umfang. Es ist keine Lizenz hinterlegt.
488
+ Frei bleiben: MCP-Chaos-Proxy mit den Szenarien F1 bis F5, doctor, Kompaktbericht, JSON-Report (--report-file), Resilience Score und PASS/FAIL samt Exit-Code.
489
+ Der Befehl wurde nicht ausgeführt. Lizenz: https://cuonztech.ch/agent-harness.html#audit
490
+ Aktivierung: --license <KEY> oder Umgebungsvariable AGENT_AUDIT_LICENSE.
491
+ ```
492
+
493
+ Bei den gekürzten Funktionen (`report --dossier`, Report-Datei, Kompaktbericht) steht der Hinweis auf stderr beziehungsweise im Dokument selbst; Exit-Code 0 bleibt, wenn der Befehl sonst gelingt. Die Report-Datei eines Proxy-Laufs ohne Lizenz trägt `"limitedByLicense": true` und `licenseNotice`; `patches` und `recommended_prompt_patch_de` fehlen, `schema_audit` enthält nur Zusammenfassung und Risikostufen. Der Integritäts-Nachweis gilt für die geschriebene Fassung. Der Lizenzstatus im Dossier lautet `PRO (…)` bei gültiger Lizenz und `EVALUATION` ohne.
494
+
495
+ **Wo die Sperre sitzt:** Sie gilt für die Befehle der Kommandozeile und für den Proxy-Lauf. Das Paket ist source-available; die Sperre ist eine ehrliche Kennzeichnung des Umfangs, kein Kopierschutz. Wer die Lizenzprüfung entfernt oder umgeht, verstösst gegen `LICENSE`.
496
+
497
+ Das Paket stellt kein Zertifikat aus und ersetzt keine unabhängige Prüfung; der Selbsttest bleibt `UNVERIFIED_FOR_PRODUCTION`.
441
498
 
442
- MIT
@@ -7,9 +7,9 @@ const PROVIDER = "CuonzTech Engineering (https://cuonztech.ch)";
7
7
  // would be advertising with a result that says nothing about the user.
8
8
  // Never printed into tool results an agent under test can read.
9
9
  export const COMING_SOON_URL = "https://cuonztech.ch/agent-harness.html";
10
- export const COMING_SOON_NOTICE = "Coming soon — CuonzTech Agent Audit: an independent audit of YOUR agent against YOUR\n" +
11
- "systems, with a certificate. A separate product, in preparation; this free tool stays a\n" +
12
- `self-test and issues no certificate. Register your interest: ${COMING_SOON_URL}`;
10
+ export const COMING_SOON_NOTICE = "CuonzTech Agent Audit (on request): CuonzTech runs the test against YOUR staging system\n" +
11
+ "and delivers an audit dossier. It is not a certificate and not a production release. This\n" +
12
+ `free tool stays a self-test and issues no certificate. Pro licence and prices: ${COMING_SOON_URL}`;
13
13
  function severityLabel(score) {
14
14
  // A failed run is never "EXCELLENT" or "NOT TESTED", whatever the number says.
15
15
  if (score.verdict === "FAIL")