Bound investigation prompts and paginate research evidence
This commit is contained in:
1 parent
377644ffa0
commit
682f275590
24 files changed
+1005
-37
No files matched your search
@@ -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"
|
||||
]
|
||||
}
|
||||
}
|
||||
+59
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user