Bound investigation prompts and paginate research evidence

This commit is contained in:
Nico committed 2026-10-20 17:04:49 +02:00
1 parent 377644ffa0
commit 682f275590
24 files changed
+1005 -37

No files matched your search

+102
View File
@@ -0,0 +1,102 @@
# Begrenztes Arbeitsfenster für die Hypothesenuntersuchung
## Ziel und Geltungsbereich
Normale Untersuchungsschritte sollen ungefähr 10.000 Zeichen umfassen. Kein
Aufruf der Untersuchungsphase darf 20.000 Zeichen überschreiten. Das gilt auch
für Initialabfragen, gemeinsame Startbewertungen, Checkpoints und Reparaturen.
Caseinterpretation, Hypothesenplanung und finale Diagnose werden nicht gekürzt.
Es gibt keine neue finanzielle Abbruchgrenze.
Gezählt werden Unicode-Zeichen der System- und übrigen Nachrichten sowie des
zusätzlich übertragenen Antwortschemas. Gecachte Inhalte zählen vollständig.
Eine identische Schemaangabe, die Gemini lediglich aus der Nachricht in den
Präfix verschiebt, wird bei der Vorprüfung nicht doppelt gezählt. Die Adapter
prüfen anschließend den vollständigen logischen Providerinput, einschließlich
Cachepräfix und gegebenenfalls nativem Antwortschema. JSON-HTTP-Escaping und
Providerparameter wie Timeout oder Modellname sind keine Promptzeichen.
Untersuchungsaufrufe speichern zusätzlich `outcome.prompt_size` mit Nachrichten-
und konservativer Gesamtzeichenzahl, Richtwert und Obergrenze. Die tatsächliche
Providerdarstellung wird nach der Cachepartition nochmals geprüft.
Der Vorprüfung bleiben 1.500 Zeichen Reserve für Transportinstruktionen und
Präfixrahmen. Der 10.000-Zeichen-Richtwert darf für benötigte aktuelle Ergebnisse
überschritten werden, die harte Grenze niemals. Tokens und Denkarbeit lassen
sich daraus nicht exakt ableiten; der kostenpflichtige Qualitätstest steht aus.
## Darstellung und Validierung
`config/investigation.bounded.toml` aktiviert `prompt_window_version = 1` mit
schlanker Schleife v2 und gemeinsamer Startbewertung. Die Policy wird für eine
neue Analyserevision eingefroren. Bereits gespeicherte Kontexte und Requests
werden nicht umgeschrieben. Alte Presets bleiben für reproduzierbare lokale
Vergleiche erhalten; übergroße alte Anfragen werden von der allgemeinen
Sicherheitsprüfung vor dem Provideraufruf abgelehnt.
Das Arbeitsfenster enthält die aktuelle Hypothese, beobachtetes/erwartetes
Verhalten, relevante Entities, den Arbeitsstand und benötigte Ergebnisfenster.
Interne Source-Konfiguration, Provenienzverwaltung und Budgetbuchhaltung werden
nicht ständig mitübertragen. Die Werkzeugprofile bleiben mit Namen und Zweck
sichtbar. Die vollständigen Ausführungsregeln und Bindungen bleiben im Controller.
Der strenge Antwort-/Werkzeugvertrag wird einmal in kompakter struktureller
Notation beschrieben: Pflichtfelder, optionale Felder, Alternativen, Typen,
Enums und Arraygrenzen. Das Provider-Schema prüft die äußere Form; anschließend
gelten weiterhin die vollständigen lokalen Schema-, Referenz-, Parameter- und
Zustandsprüfungen. Die kompakte Darstellung autorisiert keine weiteren Aktionen.
Unklare oder erfundene Aktionen/Belege werden weiterhin abgelehnt.
Der Cache kann den festen Vertrag und den gezielten Fallkontext verlustfrei
auslagern; der vollständige rekonstruierte Input muss dieselbe Grenze einhalten.
Kurze Präfixe können unterhalb anbieterseitiger Cache-Mindestgrößen liegen.
Sie werden nicht künstlich aufgebläht, um einen Cache zu erzwingen. Vorhandene
bevorzugte/verpflichtende Cache-Policies bleiben maßgeblich.
## Rechercheergebnisse und Wachstum
Neue und explizit nachgeladene Ergebnisse haben Vorrang. Zusätzliche ältere
Rohbelege werden nur aufgenommen, solange der Größenrichtwert Platz lässt.
Ein begrenzter Katalog zeigt die letzten IDs und den Umfang des Archivs.
Das Archiv bleibt vollständig im Case; seine fehlende Darstellung behauptet
weder die Abwesenheit von Evidenz noch deren Löschung.
Große Ergebnisse werden als `json_fragment` mit Seitenindex, Seitenanzahl,
Zeichenposition, Gesamtlänge und SHA-256 der vollständigen bisherigen
Modelldarstellung angeboten. Eine Seite enthält höchstens 1.600 Zeichen des
serialisierten Belegs. Die JSON-Fragmente sind ausdrücklich keine vollständigen
Queryantworten. Seiten können mitten in einem JSON-Token enden; erst die
Verkettung aller Fragmente ergibt die vollständige JSON-Darstellung. Strukturierte
Query-/Coverageinformationen und vorhandene relationale Aggregationen bleiben
zusätzlich sichtbar. Deren Aussagekraft bleibt auf den erklärten Scope begrenzt.
Mit `{"kind":"recall","evidence_refs":["E000001"],"page":1}` wird eine
andere nullbasierte Seite lokal nachgeladen, ohne externe Wiederholungsquery.
Pro Aktion wird ein Beleg gelesen. Ungültige IDs oder Seiten werden abgelehnt.
Seitenwahl und Request bleiben nach Wiederaufnahme nachvollziehbar. Das nächste
normale Arbeitsfenster trägt nicht alle früher gelesenen Seiten weiter.
Ein Checkpoint wird unabhängig von der abgeschalteten periodischen Vier-Schritt-
Regel angefordert, wenn die bereits bewerteten Sitzungsergebnisse mehr als 4.000
Bytes oder das Sitzungsprotokoll mehr als 2.000 Bytes umfassen. Das ist ein
Bedarfsauslöser, keine weitere Promptobergrenze. Auch Checkpoints nutzen begrenzte
Ergebnisfenster und dürfen zum Nachlesen `recall` wählen, bevor sie konsolidieren.
In diesem Fall bleibt die provisorische Sitzung erhalten. Erst eine erfolgreiche
Konsolidierung leert sie. Die vorhandene Delta-Verarbeitung bewahrt frühere
Findings; die Darstellung kennzeichnet ausgelassene Findings und Gegenbelege.
Passt selbst der notwendige Grundkontext nicht unter die Sicherheitsgrenze,
wird der Fall kontrolliert mit `INVESTIGATION_PROMPT_LIMIT` zurückgestellt.
Es wird kein kostenpflichtiger übergroßer Request gesendet und kein Text still
abgeschnitten. Das interne JSON-Kontextlimit ist weiterhin eine getrennte,
konfigurierbare Sicherheitsgrenze und wird hierdurch nicht aufgehoben.
## Lokale Verifikation
`tests/test_investigation_window.py` prüft unter anderem harte Grenzen vor dem
Provider, Reparatur-/Reviewversionen, exakte Seitendarstellung, begrenztes Wachstum
bis 138 Ergebnissen, strenge Aktionsvalidierung, Cache-Rekonstruktion,
Startbewertung, Wiederaufnahme und Abschluss.
Die Größenmessung an gespeicherten Bug-20-Kontexten liegt getrennt vom Paket in
`docs/test-results/token-usage/investigation-window-offline-20261020.json`.
Sie enthält keine Prompts und ist kein Nachweis gleicher LLM-Ergebnisqualität.
@@ -0,0 +1,95 @@
{
"format": "viano-offline-prompt-window-measurement",
"format_version": 1,
"date": "2026-10-20",
"source_trial": "bug20-startup-batch-20261020",
"source_generation": 67,
"paid_llm_calls": 0,
"target_characters": 10000,
"hard_limit_characters": 20000,
"notes": [
"Offline reconstruction, not an LLM quality or token benchmark.",
"Full Gemini character counts include system, cached prefix, live input, response contract and outer schema.",
"Archived contexts and source packages were not modified.",
"Original message characters exclude provider-added framing; new accounted counts include separately supplied schema."
],
"measurements": [
{
"context_ref": "analysis/investigation/0001/contexts/H1-0001.json",
"old_message_characters": 25084,
"new_accounted_characters": 8106,
"new_full_gemini_json_object_characters": 9056
},
{
"context_ref": "analysis/investigation/0001/contexts/H2-0001.json",
"old_message_characters": 32867,
"new_accounted_characters": 11271,
"new_full_gemini_json_object_characters": 12221
},
{
"context_ref": "analysis/investigation/0001/contexts/H3-0001.json",
"old_message_characters": 39172,
"new_accounted_characters": 14316,
"new_full_gemini_json_object_characters": 15266
},
{
"context_ref": "analysis/investigation/0001/startup/contexts/H1.json",
"old_message_characters": 29981,
"new_accounted_characters": 9821,
"new_full_gemini_json_object_characters": 10771
},
{
"context_ref": "analysis/investigation/0001/startup/contexts/H2.json",
"old_message_characters": 30075,
"new_accounted_characters": 9780,
"new_full_gemini_json_object_characters": 10730
},
{
"context_ref": "analysis/investigation/0001/startup/contexts/H3.json",
"old_message_characters": 29352,
"new_accounted_characters": 7997,
"new_full_gemini_json_object_characters": 8947
},
{
"context_ref": "analysis/investigation/0001/contexts/H1-0002.json",
"old_message_characters": 23596,
"new_accounted_characters": 8148,
"new_full_gemini_json_object_characters": 9098
},
{
"context_ref": "analysis/investigation/0001/contexts/H1-0003.json",
"old_message_characters": 51599,
"new_accounted_characters": 10881,
"new_full_gemini_json_object_characters": 11831
},
{
"phase": "startup_joint_review",
"new_accounted_characters": 12576,
"new_full_gemini_json_object_characters": 12594
}
],
"source_manifest_sha256": "cf721c7c2b152f9decc0c51d7c1574f120a0dd95ee8c33305472bc3f9abf6d46",
"implementation_sha256": {
"src/viano_bug_analysis/analysis/investigation_window.py": "9f219c67535aec01d73a85675c4ab4be591ad2c95f30091fb00f6db1150fa95f",
"src/viano_bug_analysis/llm/investigation_size.py": "425f3d983da62b0ed7ffacf3e7119612f1736d0a7e4cb32545f368ee1f8bd41b",
"config/investigation.bounded.toml": "cf5317fbcf43494043ecd574843588888a5f756d8c9c52987b6411df4ba98250"
},
"local_verification": {
"passed_tests": 286,
"elapsed_seconds": 150.04,
"paid_api_calls": 0,
"coverage": [
"bounded window",
"startup batch",
"lean loop and controller",
"gateway",
"Gemini caching",
"stable case cache",
"response recovery",
"repair admission",
"failure diagnostics",
"tool repair feedback",
"bootstrap schemas"
]
}
}
@@ -0,0 +1,59 @@
{
"trial": "bug20-startup-batch-20261020",
"snapshot": "g00000067",
"account_eur": {
"start": 12.55,
"final": 12.7,
"difference": 0.15,
"scope": "Complete ten-dispatch trial snapshot, not startup calls alone"
},
"comparison": {
"baseline": "bug20-joint-planning-20261019",
"old_three_start_calls_input_tokens": 23929,
"new_three_start_calls_input_tokens": 33087,
"new_joint_review_input_tokens": 9442,
"new_startup_total_input_tokens": 42529
},
"request_component_characters": {
"measurement": "Compact JSON sections; section sizes do not sum to serialized request size",
"old_h1": {
"system": 5950,
"user": 13730,
"output_schema": 2279,
"tool_schema": 3020,
"hypotheses": 2107,
"interpretation": 3371
},
"new_h1": {
"system": 2162,
"user": 22922,
"output_schema": 6718,
"tool_schema": 9535,
"hypothesis": 346,
"interpretation": 2715
},
"old_evidence_by_hypothesis": [
2,
5466,
6211
],
"new_evidence_by_hypothesis": [
2,
7065,
11644
]
},
"findings": [
"Shorter instructions were offset by larger strict response and tool schemas.",
"The startup builder duplicates output_schema.properties.next in input.tool_schema.request_contract.",
"Later startup calls also carry larger shared evidence payloads.",
"The joint review is an additional call performing assessment work deferred by the baseline.",
"Input totals include cached tokens; they are not equivalent to uncached billable input."
],
"uncached_input_tokens": {
"old_three": 8554,
"new_three": 9534,
"new_joint_review": 7382,
"new_total": 16916
}
}