cuonztech-agent-harness 0.7.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 +220 -21
- package/LICENSE-MIT-bis-0.7.0.txt +21 -0
- package/README.md +54 -14
- package/dist/benchmark/cta.js +3 -3
- package/dist/campaign/runner.js +22 -3
- package/dist/dossier-report.js +53 -2
- package/dist/index.js +87 -9
- package/dist/license/ed25519.js +57 -0
- package/dist/license/gate.js +91 -0
- package/dist/license/index.js +5 -0
- package/dist/license/publicKey.js +5 -0
- package/dist/license/types.js +1 -0
- package/dist/license/verifier.js +89 -0
- package/dist/plain-report.js +58 -17
- package/dist/proxy/gateway.js +2 -1
- package/dist/report-file-guard.js +75 -1
- package/dist/tools/handlers.js +9 -4
- package/dist/ui/server.js +47 -5
- package/package.json +3 -2
- package/server.json +2 -2
package/LICENSE
CHANGED
|
@@ -1,21 +1,220 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 CuonzTech
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
@@ -129,8 +131,8 @@ npx cuonztech-agent-harness report harness-report.json --dossier --format html -
|
|
|
129
131
|
npx cuonztech-agent-harness campaign --runs 1 --format html --out kampagne.html
|
|
130
132
|
```
|
|
131
133
|
|
|
132
|
-
- `report <report-file> --dossier [--format html|md] [--customer <name>] [--system <name>] [--agent-response <text>]` macht aus der Messdatei das druckbare Prüf- und Architektur-Dossier (Gutachten der Tool-Schemas, Call-für-Call-Forensik, Integritäts-Nachweis). 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`.
|
|
133
|
-
- `campaign [--runs <n>] [--format md|html] [--out <file>]` 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.
|
|
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.
|
|
134
136
|
|
|
135
137
|
**Ergebnis lesen:** In der Datei steht `"verdict"`:
|
|
136
138
|
|
|
@@ -217,9 +219,13 @@ Für Menschen, die keine Befehle tippen wollen. Doppelklick auf `launchers/Start
|
|
|
217
219
|
|
|
218
220
|
```bash
|
|
219
221
|
npx cuonztech-agent-harness ui
|
|
222
|
+
# oder mit Lizenzschlüssel:
|
|
223
|
+
npx cuonztech-agent-harness ui --license CAUDIT-...
|
|
220
224
|
```
|
|
221
225
|
|
|
222
|
-
|
|
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).
|
|
223
229
|
|
|
224
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.
|
|
225
231
|
|
|
@@ -238,7 +244,7 @@ Unter Windows PowerShell statt `"$PWD"` die Schreibweise `"${PWD}"` verwenden. D
|
|
|
238
244
|
|
|
239
245
|
### 2. Aus einem Verstoss wird ein Prompt-Patch
|
|
240
246
|
|
|
241
|
-
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:
|
|
242
248
|
|
|
243
249
|
```
|
|
244
250
|
## [CRITICAL] GHOST_WRITE
|
|
@@ -323,7 +329,7 @@ Der Exit-Code ist 0, wenn der Harness beide Referenz-Agenten wie erwartet beurte
|
|
|
323
329
|
|
|
324
330
|
Der naive Referenz-Agent fällt absichtlich durch; das ist Teil des Selbsttests und sagt nichts über dein System.
|
|
325
331
|
|
|
326
|
-
|
|
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).
|
|
327
333
|
|
|
328
334
|
### 4. Demo-Session als MCP-Server (ohne echtes Backend)
|
|
329
335
|
|
|
@@ -381,27 +387,27 @@ Das ist eine **Demo**, keine Messung: Es gibt kein echtes Backend, Lese-Aufrufe
|
|
|
381
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.
|
|
382
388
|
- **Ein Lauf ist ein Datenpunkt.** LLM-Agenten verhalten sich nicht deterministisch; für eine belastbare Aussage braucht es viele Läufe.
|
|
383
389
|
|
|
384
|
-
##
|
|
390
|
+
## Agent Audit (Prüfauftrag, auf Anfrage)
|
|
385
391
|
|
|
386
|
-
**
|
|
392
|
+
**Ein eigener Prüfauftrag auf Anfrage, nicht Teil dieses Pakets.**
|
|
387
393
|
|
|
388
|
-
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
|
|
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.
|
|
389
395
|
|
|
390
|
-
| | Agent-Harness (dieses Paket,
|
|
396
|
+
| | Agent-Harness (dieses Paket; freier Umfang kostenlos, Pro-Umfang mit Lizenz) | CuonzTech Agent Audit (Prüfauftrag, auf Anfrage) |
|
|
391
397
|
|---|---|---|
|
|
392
|
-
| Wer prüft | du selbst |
|
|
398
|
+
| Wer prüft | du selbst | Durchführung und Auswertung durch CuonzTech |
|
|
393
399
|
| Was als Duplikat gilt | gleiche Tool-Argumente | die Fachlogik deines Systems, am Backend abgeglichen |
|
|
394
400
|
| Läufe | so viele, wie du startest | viele Wiederholungen mit deinem echten Agenten, statistisch ausgewertet |
|
|
395
401
|
| Was der Agent dem Benutzer sagt | nicht sichtbar | wird mit dem tatsächlichen Zustand verglichen |
|
|
396
402
|
| Nebenläufigkeit, echte Latenz, verspätete Antworten | nicht erzeugt | auf deine Infrastruktur zugeschnitten |
|
|
397
403
|
| Prompt-Patches | Vorschläge | mit Vorher-Nachher-Messung belegt |
|
|
398
|
-
| Ergebnis | Selbsttest (`UNVERIFIED_FOR_PRODUCTION`) |
|
|
404
|
+
| Ergebnis | Selbsttest (`UNVERIFIED_FOR_PRODUCTION`) | Prüf-Dossier (kein Zertifikat) |
|
|
399
405
|
|
|
400
406
|
Interesse oder Fragen: **[cuonztech.ch/agent-harness.html](https://cuonztech.ch/agent-harness.html)**
|
|
401
407
|
|
|
402
408
|
## Report-Format (JSON)
|
|
403
409
|
|
|
404
|
-
`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.
|
|
405
411
|
|
|
406
412
|
| Feld | Inhalt |
|
|
407
413
|
|---|---|
|
|
@@ -453,6 +459,40 @@ npx cuonztech-agent-harness --help
|
|
|
453
459
|
|
|
454
460
|
Keine Install-Skripte, keine Netzwerkzugriffe, keine Telemetrie.
|
|
455
461
|
|
|
456
|
-
## 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`.
|
|
457
498
|
|
|
458
|
-
MIT
|
package/dist/benchmark/cta.js
CHANGED
|
@@ -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 = "
|
|
11
|
-
"
|
|
12
|
-
`self-test and issues no certificate.
|
|
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")
|
package/dist/campaign/runner.js
CHANGED
|
@@ -15,6 +15,7 @@ import { computeScore } from "../benchmark/score.js";
|
|
|
15
15
|
import { DOSSIER_CSS, cleanText, escHtml, escMd } from "../dossier-report.js";
|
|
16
16
|
import { isReservedFileName } from "../report-file-guard.js";
|
|
17
17
|
import { VERSION } from "../version.js";
|
|
18
|
+
import { resolveProGate, lockedNotice } from "../license/index.js";
|
|
18
19
|
export const CAMPAIGN_PROFILES = ["naive", "pressure_vulnerable", "hardened"];
|
|
19
20
|
export const CAMPAIGN_SCENARIOS = ["F1", "F1_FOLLOWUP", "F2", "F3", "F4", "F5"];
|
|
20
21
|
// Wörtlich der Satz, den ein Nutzer im Zwei-Zug-Szenario nach der ersten Antwort schreibt.
|
|
@@ -424,7 +425,7 @@ export function followupSummary(campaign) {
|
|
|
424
425
|
});
|
|
425
426
|
}
|
|
426
427
|
// ---------- Kommandozeile ----------
|
|
427
|
-
const CAMPAIGN_USAGE = "Usage: campaign [--runs <n>] [--format md|html] [--out <file>]\n";
|
|
428
|
+
const CAMPAIGN_USAGE = "Usage: campaign [--runs <n>] [--format md|html] [--out <file>] [--license <key>]\n";
|
|
428
429
|
async function mayReplaceCampaignOutput(path) {
|
|
429
430
|
const info = await stat(path).catch(() => null);
|
|
430
431
|
if (!info)
|
|
@@ -442,16 +443,27 @@ export async function runCampaignMode(argv) {
|
|
|
442
443
|
" --runs <n> Läufe je Szenario, 1 bis 1000 (Standard: 1)\n" +
|
|
443
444
|
" --format md (Standard) oder html\n" +
|
|
444
445
|
" --out <file> in diese Datei schreiben statt ins Terminal. Eine bestehende Datei wird nur ersetzt,\n" +
|
|
445
|
-
" wenn ein früherer `campaign`-Lauf sie geschrieben hat.\n"
|
|
446
|
+
" wenn ein früherer `campaign`-Lauf sie geschrieben hat.\n" +
|
|
447
|
+
" --license <key> Pro-Lizenzschlüssel (oder Umgebungsvariable AGENT_AUDIT_LICENSE). Der Kampagnen-Runner\n" +
|
|
448
|
+
" gehört zum Pro-Umfang und läuft ohne gültige Lizenz nicht.\n");
|
|
446
449
|
return 0;
|
|
447
450
|
}
|
|
448
451
|
let runs = 1;
|
|
449
452
|
let runsSeen = false;
|
|
450
453
|
let format;
|
|
451
454
|
let outPath;
|
|
455
|
+
let licenseKey;
|
|
452
456
|
for (let i = 0; i < argv.length; i++) {
|
|
453
457
|
const token = argv[i];
|
|
454
|
-
if (token === "--
|
|
458
|
+
if (token === "--license") {
|
|
459
|
+
const v = argv[++i];
|
|
460
|
+
if (v === undefined || v.startsWith("--") || v.trim() === "") {
|
|
461
|
+
process.stderr.write(`Error: --license needs a key.\n${CAMPAIGN_USAGE}`);
|
|
462
|
+
return 1;
|
|
463
|
+
}
|
|
464
|
+
licenseKey = v;
|
|
465
|
+
}
|
|
466
|
+
else if (token === "--runs") {
|
|
455
467
|
const raw = argv[++i];
|
|
456
468
|
if (runsSeen) {
|
|
457
469
|
process.stderr.write("Error: option --runs was given more than once.\n");
|
|
@@ -490,6 +502,13 @@ export async function runCampaignMode(argv) {
|
|
|
490
502
|
return 1;
|
|
491
503
|
}
|
|
492
504
|
}
|
|
505
|
+
// Pro-Umfang: ohne gültige Lizenz wird die Kampagne nicht gerechnet und keine Datei angefasst.
|
|
506
|
+
// Exit 1 wie jeder nicht ausgeführte Befehl; kein eigener Code. Selbsttest (benchmark) und Proxy-Lauf bleiben frei.
|
|
507
|
+
const gate = resolveProGate(licenseKey);
|
|
508
|
+
if (!gate.pro) {
|
|
509
|
+
process.stderr.write(lockedNotice("campaign", gate.verdict));
|
|
510
|
+
return 1;
|
|
511
|
+
}
|
|
493
512
|
const outExt = outPath ? extname(outPath).toLowerCase() : "";
|
|
494
513
|
if (format === "html" && [".md", ".markdown"].includes(outExt)) {
|
|
495
514
|
process.stderr.write(`Error: --format html does not fit the file name ${outPath}. Use .html or drop --format.\n`);
|
package/dist/dossier-report.js
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
// dieselbe Aussage tragen. Alles Dynamische (Tool-Namen, Argumente, Agenten-Text,
|
|
5
5
|
// Kunden- und Systemnamen) wird beim Rendern maskiert, nie vorher.
|
|
6
6
|
import { LIMITS, OUTCOMES, claimHeadline, verdictText } from "./plain-report.js";
|
|
7
|
+
import { basename } from "node:path";
|
|
7
8
|
import { evaluateAgentClaim } from "./core/claim-check.js";
|
|
8
9
|
import { verifyReportIntegrity } from "./core/artifact-integrity.js";
|
|
10
|
+
import { PURCHASE_URL } from "./license/gate.js";
|
|
9
11
|
const TITLE = "CuonzTech Agent-Harness · Technisches Prüf- & Architektur-Dossier";
|
|
10
12
|
const RISK_DE = { HIGH: "HOCH", MEDIUM: "MITTEL", LOW: "NIEDRIG" };
|
|
11
13
|
const RISK_TONE = { HIGH: "fail", MEDIUM: "warn", LOW: "pass" };
|
|
@@ -435,15 +437,56 @@ function integritySection(file, options) {
|
|
|
435
437
|
// Mit geprüfter Antwort würde der erste Standardsatz («nicht gemessen») Sektion 4 widersprechen.
|
|
436
438
|
...(answered ? LIMITS.slice(1) : LIMITS).map(inlineMarkup),
|
|
437
439
|
[answered ? "Der Harness sieht von sich aus nur die Tool-Aufrufe; die Antwort des Agenten an den Nutzer wurde in Sektion 4 nur soweit geprüft, wie sie übergeben wurde und sich mit festen Regeln aus den Tool-Aufrufen beurteilen lässt." : "Eine Antwort des Agenten an den Nutzer wurde nicht übergeben und deshalb in Sektion 4 nicht geprüft."],
|
|
440
|
+
...(file.previousRun ? [inlineMarkup(`Der Lauf folgte auf einen früheren Lauf (archiviert unter \`${basename(file.previousRun.file)}\`). Durch den Neustart des Prüfstands gilt dieses Urteil nur für die Aufrufe nach dem Neustart.`)] : []),
|
|
438
441
|
],
|
|
439
442
|
});
|
|
440
443
|
return { id: "integrity", title: "6. Kryptografischer Integritäts-Nachweis & Methodische Grenzen", blocks };
|
|
441
444
|
}
|
|
445
|
+
// Gekürzte Fassung ohne gültige Lizenz (wie «Nur Zahlen» bei CPCG): Kopf, Score und das Urteil je Szenario.
|
|
446
|
+
// Der Lauf und sein Urteil sind echt; Details, Aufruf-Protokoll, Härtungspaket und Anhänge gehören zum Pro-Umfang.
|
|
447
|
+
function limitedSection(file) {
|
|
448
|
+
const verdict = file.verdict ?? file.report?.verdict ?? "NOT_TESTED";
|
|
449
|
+
const tone = verdict === "PASS" ? "pass" : verdict === "FAIL" ? "fail" : "warn";
|
|
450
|
+
const score = file.score?.overall;
|
|
451
|
+
const scenario = file.report?.scenarioId ?? (file.report?.mode ? `Modus ${file.report.mode}` : "—");
|
|
452
|
+
return {
|
|
453
|
+
id: "scenario-verdict",
|
|
454
|
+
title: "Urteil je Szenario",
|
|
455
|
+
blocks: [
|
|
456
|
+
{
|
|
457
|
+
t: "table",
|
|
458
|
+
head: ["Szenario", "Urteil", "Resilience Score", "Aufrufe", "Schreibvorgänge"],
|
|
459
|
+
rows: [
|
|
460
|
+
[
|
|
461
|
+
[clean(scenario)],
|
|
462
|
+
[badgeOf(verdict, tone)],
|
|
463
|
+
[file.report && typeof score === "number" ? `${score} / 100` : "nicht bewertet"],
|
|
464
|
+
[String(file.report?.totalCalls ?? "—")],
|
|
465
|
+
[String(file.report?.coverage?.writeCalls ?? "—")],
|
|
466
|
+
],
|
|
467
|
+
],
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
t: "note",
|
|
471
|
+
title: "Umfang dieser Fassung",
|
|
472
|
+
items: [
|
|
473
|
+
["Das Urteil, der Score und die Zahlen stammen aus dem echten Lauf und sind vollständig."],
|
|
474
|
+
["Gekürzt ohne Lizenz: Geschäftsrisiko-Matrix, Schnittstellen-Gutachten, Aufruf-Protokoll mit Parameter-Diff, Abgleich mit der Antwort des Agenten, Härtungspaket und Integritäts-Nachweis."],
|
|
475
|
+
[`Das vollständige Prüf-Dossier gehört zum Pro-Umfang. Lizenz: ${PURCHASE_URL}`],
|
|
476
|
+
],
|
|
477
|
+
},
|
|
478
|
+
],
|
|
479
|
+
};
|
|
480
|
+
}
|
|
442
481
|
function build(file, options = {}) {
|
|
443
482
|
const { headline, explanation } = verdictText(file);
|
|
444
483
|
const score = file.score?.overall;
|
|
445
|
-
const
|
|
484
|
+
const limited = options.limited === true;
|
|
485
|
+
const sections = limited
|
|
486
|
+
? [limitedSection(file)]
|
|
487
|
+
: [summarySection(file), schemaSection(file), forensicsSection(file), claimSection(file, options), hardeningSection(file), integritySection(file, options)];
|
|
446
488
|
return {
|
|
489
|
+
limited,
|
|
447
490
|
headline,
|
|
448
491
|
explanation,
|
|
449
492
|
verdictLabel: headline,
|
|
@@ -456,6 +499,14 @@ function build(file, options = {}) {
|
|
|
456
499
|
["Auftraggeber / Umgebung", clean(options.customerName ?? "Lokale Prüfumgebung")],
|
|
457
500
|
["Session-ID", clean(file.report?.sessionId ?? "—")],
|
|
458
501
|
["Szenario / Modus", clean(file.report?.scenarioId ?? file.report?.mode ?? "—")],
|
|
502
|
+
[
|
|
503
|
+
"Lizenzstatus",
|
|
504
|
+
options.licenseVerdict?.valid
|
|
505
|
+
? `PRO (${options.licenseVerdict.claims?.sub ?? options.licenseVerdict.claims?.customer ?? "Aktiviert"})`
|
|
506
|
+
: limited
|
|
507
|
+
? `EVALUATION (keine gültige Lizenz, gekürzte Fassung; Lizenz: ${PURCHASE_URL})`
|
|
508
|
+
: "EVALUATION (Bibliotheksaufruf ohne Lizenzprüfung, volle Fassung)",
|
|
509
|
+
],
|
|
459
510
|
],
|
|
460
511
|
sections,
|
|
461
512
|
};
|
|
@@ -566,7 +617,7 @@ export function renderDossierHtml(file, options) {
|
|
|
566
617
|
`<title>${escHtml(TITLE)}</title>`,
|
|
567
618
|
`<style>${CSS}</style></head><body><main class="wrap"><header>`,
|
|
568
619
|
`<div class="topline"><strong>${escHtml(TITLE)}</strong><span>${escHtml(d.date)} · ${escHtml(d.version)}</span></div>`,
|
|
569
|
-
`<div class="hero"><div><h1>${escHtml(clean(d.meta[0][1]))}</h1><p
|
|
620
|
+
`<div class="hero"><div><h1>${escHtml(clean(d.meta[0][1]))}</h1><p>${d.limited ? "Gekürzte Fassung ohne Lizenz: Kopf, Score und Urteil je Szenario. Der Lauf und sein Urteil sind echt." : "Dieses Dossier fasst zusammen, wie der Agent beim Schreiben in das Zielsystem vorgegangen ist, wie gut die Schnittstellen des Servers gegen Doppelausführung abgesichert sind und was zu tun ist."}</p></div>`,
|
|
570
621
|
`<aside class="verdict"><span class="caption">Gesamturteil</span><strong><span class="badge ${d.tone}">${escHtml(d.verdictLabel)}</span></strong><p>${escHtml(d.explanation)}</p><p>Resilience Score: <strong>${escHtml(d.scoreText)}</strong></p></aside></div>`,
|
|
571
622
|
`<dl class="meta">${d.meta.map(([l, v]) => `<div><dt>${escHtml(l)}</dt><dd>${escHtml(v)}</dd></div>`).join("")}</dl>`,
|
|
572
623
|
"</header>",
|