diff --git a/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1.json b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1.json new file mode 100644 index 00000000000..4b730a6a281 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1.json @@ -0,0 +1,62 @@ +{ + "label": "a1", + "singles": 2, + "steps": [ + { + "ttft": 2.1236, + "wall": 2.404, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 1.9774, + "wall": 2.887, + "chars": 303, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Field Name**", + "step": "C1" + }, + { + "ttft": 2.4723, + "wall": 2.995, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.5088, + "wall": 1.042, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.3359, + "wall": 0.481, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.547, + "wall": 1.075, + "chars": 149, + "finish": "stop", + "text": "Based on the handbook provided, there are **17** rules that mention a field starting with `gamma`. Here is the list:\n\n* ", + "step": "C3" + }, + { + "ttft": 2.3137, + "wall": 2.53, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1s6.json b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1s6.json new file mode 100644 index 00000000000..5f6539850b0 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a1s6.json @@ -0,0 +1,94 @@ +{ + "label": "a1s6", + "singles": 6, + "steps": [ + { + "ttft": 2.1021, + "wall": 2.379, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 1.9756, + "wall": 2.866, + "chars": 303, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Field Name**", + "step": "C1" + }, + { + "ttft": 2.447, + "wall": 2.97, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.5071, + "wall": 1.042, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.3323, + "wall": 0.477, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.3349, + "wall": 0.869, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.3361, + "wall": 0.47, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.3265, + "wall": 0.467, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3294, + "wall": 0.492, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.5565, + "wall": 1.086, + "chars": 149, + "finish": "stop", + "text": "Based on the handbook provided, there are **17** rules that mention a field starting with `gamma`. Here is the list:\n\n* ", + "step": "C3" + }, + { + "ttft": 2.3375, + "wall": 2.553, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4.json b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4.json new file mode 100644 index 00000000000..6351697d1d7 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4.json @@ -0,0 +1,62 @@ +{ + "label": "a4", + "singles": 2, + "steps": [ + { + "ttft": 2.2761, + "wall": 2.531, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 2.2006, + "wall": 3.011, + "chars": 278, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Required** a", + "step": "C1" + }, + { + "ttft": 0.5634, + "wall": 1.096, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.5574, + "wall": 1.084, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.4861, + "wall": 0.629, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.659, + "wall": 1.195, + "chars": 175, + "finish": "stop", + "text": "There are many rules in the handbook that mention fields starting with `gamma`. Here is the complete list of rules invol", + "step": "C3" + }, + { + "ttft": 0.3135, + "wall": 0.529, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4s6.json b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4s6.json new file mode 100644 index 00000000000..5cc5d203762 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/2026-11-09/mixed-a4s6.json @@ -0,0 +1,94 @@ +{ + "label": "a4s6", + "singles": 6, + "steps": [ + { + "ttft": 2.2508, + "wall": 2.507, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 2.2228, + "wall": 3.019, + "chars": 278, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Required** a", + "step": "C1" + }, + { + "ttft": 0.5696, + "wall": 1.091, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.5501, + "wall": 1.069, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.4826, + "wall": 0.626, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.4819, + "wall": 1.013, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.4491, + "wall": 0.583, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.3283, + "wall": 0.47, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3271, + "wall": 0.487, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.545, + "wall": 1.082, + "chars": 175, + "finish": "stop", + "text": "There are many rules in the handbook that mention fields starting with `gamma`. Here is the complete list of rules invol", + "step": "C3" + }, + { + "ttft": 2.3026, + "wall": 2.518, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/conf-ba1.json b/dirigo-results/0.2.13-port/intercept/mixed/conf-ba1.json new file mode 100644 index 00000000000..2447a4a6e11 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/conf-ba1.json @@ -0,0 +1,63 @@ +{ + "exe": "/home/bob/bin/strata-sycl-host.sh", + "args": [ + "--pack", + "/home/bob/XeStrata-data/packs/coder-iq1_m", + "--native", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00001-of-00002.gguf", + "--ple-gguf", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00002-of-00002.gguf", + "--expert-profile", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/expert-profile-mine.bin", + "--expert-cache", + "auto", + "--stream-experts", + "--prefill", + "auto", + "--prompt-cache", + "6", + "--prompt-cache-every", + "4096", + "--batch", + "0", + "--spec", + "6", + "--spec-min-p", + "0.5", + "--mtp", + "/home/bob/XeStrata-data/mtp/rt", + "--mtp-draft-vocab", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/draft_vocab_en.bin", + "--mtp-window", + "8192", + "--max-context", + "131072", + "--kv", + "int8", + "--kv-resident", + "32768", + "--vram-reserve-mib", + "700", + "--conversation-cache-mib", + "2048" + ], + "cwd": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13", + "tokenizer": "/home/bob/XeStrata-data/packs/coder-iq1_m/tokenizer", + "model_name": "qwen3.8-flash-next-coder-iq1_m", + "log": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/strata-coder-iq1_m-sycl-tuned.log", + "port": 8095, + "backend": "sycl", + "open_browser": false, + "thinking_policy": "on", + "conv_route": "on", + "conv_route_batch_after": 1, + "short_answer": { + "spec": 0, + "max_tokens": 16 + }, + "spec_window": 0, + "spec_window_needle_min": 6000, + "code_tune": { + "mode": "off" + } +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/conf-ba4.json b/dirigo-results/0.2.13-port/intercept/mixed/conf-ba4.json new file mode 100644 index 00000000000..522f818e182 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/conf-ba4.json @@ -0,0 +1,63 @@ +{ + "exe": "/home/bob/bin/strata-sycl-host.sh", + "args": [ + "--pack", + "/home/bob/XeStrata-data/packs/coder-iq1_m", + "--native", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00001-of-00002.gguf", + "--ple-gguf", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00002-of-00002.gguf", + "--expert-profile", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/expert-profile-mine.bin", + "--expert-cache", + "auto", + "--stream-experts", + "--prefill", + "auto", + "--prompt-cache", + "6", + "--prompt-cache-every", + "4096", + "--batch", + "0", + "--spec", + "6", + "--spec-min-p", + "0.5", + "--mtp", + "/home/bob/XeStrata-data/mtp/rt", + "--mtp-draft-vocab", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/draft_vocab_en.bin", + "--mtp-window", + "8192", + "--max-context", + "131072", + "--kv", + "int8", + "--kv-resident", + "32768", + "--vram-reserve-mib", + "700", + "--conversation-cache-mib", + "2048" + ], + "cwd": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13", + "tokenizer": "/home/bob/XeStrata-data/packs/coder-iq1_m/tokenizer", + "model_name": "qwen3.8-flash-next-coder-iq1_m", + "log": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/strata-coder-iq1_m-sycl-tuned.log", + "port": 8095, + "backend": "sycl", + "open_browser": false, + "thinking_policy": "on", + "conv_route": "on", + "conv_route_batch_after": 4, + "short_answer": { + "spec": 0, + "max_tokens": 16 + }, + "spec_window": 0, + "spec_window_needle_min": 6000, + "code_tune": { + "mode": "off" + } +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1-inert.json b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1-inert.json new file mode 100644 index 00000000000..94b9d47c71c --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1-inert.json @@ -0,0 +1,94 @@ +{ + "label": "ba1", + "singles": 6, + "steps": [ + { + "ttft": 2.2613, + "wall": 2.516, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 2.2045, + "wall": 2.997, + "chars": 278, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Required** a", + "step": "C1" + }, + { + "ttft": 0.5548, + "wall": 1.075, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.553, + "wall": 1.071, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.4874, + "wall": 0.63, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.4947, + "wall": 1.024, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.4443, + "wall": 0.578, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.3273, + "wall": 0.469, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3256, + "wall": 0.486, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.5454, + "wall": 1.082, + "chars": 175, + "finish": "stop", + "text": "There are many rules in the handbook that mention fields starting with `gamma`. Here is the complete list of rules invol", + "step": "C3" + }, + { + "ttft": 2.3062, + "wall": 2.521, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1.json b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1.json new file mode 100644 index 00000000000..6f83fafa198 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba1.json @@ -0,0 +1,94 @@ +{ + "label": "ba1", + "singles": 6, + "steps": [ + { + "ttft": 2.1338, + "wall": 2.407, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 1.9727, + "wall": 2.862, + "chars": 303, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Field Name**", + "step": "C1" + }, + { + "ttft": 2.4646, + "wall": 2.987, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.517, + "wall": 1.048, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.3279, + "wall": 0.47, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.3251, + "wall": 0.848, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.3271, + "wall": 0.461, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.3266, + "wall": 0.468, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3268, + "wall": 0.487, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.5444, + "wall": 1.066, + "chars": 149, + "finish": "stop", + "text": "Based on the handbook provided, there are **17** rules that mention a field starting with `gamma`. Here is the list:\n\n* ", + "step": "C3" + }, + { + "ttft": 2.3164, + "wall": 2.531, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4-inert.json b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4-inert.json new file mode 100644 index 00000000000..c487ceed4d8 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4-inert.json @@ -0,0 +1,94 @@ +{ + "label": "ba4", + "singles": 6, + "steps": [ + { + "ttft": 2.2713, + "wall": 2.527, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 2.1964, + "wall": 2.992, + "chars": 278, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Required** a", + "step": "C1" + }, + { + "ttft": 0.6028, + "wall": 1.124, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.5619, + "wall": 1.08, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.4927, + "wall": 0.636, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.5007, + "wall": 1.029, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.4461, + "wall": 0.58, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.3277, + "wall": 0.468, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3267, + "wall": 0.487, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.5449, + "wall": 1.081, + "chars": 175, + "finish": "stop", + "text": "There are many rules in the handbook that mention fields starting with `gamma`. Here is the complete list of rules invol", + "step": "C3" + }, + { + "ttft": 2.3159, + "wall": 2.53, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4.json b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4.json new file mode 100644 index 00000000000..7e0a4a700a5 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/mixed-ba4.json @@ -0,0 +1,94 @@ +{ + "label": "ba4", + "singles": 6, + "steps": [ + { + "ttft": 2.2626, + "wall": 2.522, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 2.2116, + "wall": 3.006, + "chars": 278, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Required** a", + "step": "C1" + }, + { + "ttft": 0.5874, + "wall": 1.107, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.564, + "wall": 1.081, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.498, + "wall": 0.641, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 0.5031, + "wall": 1.032, + "chars": 192, + "finish": "length", + "text": "Based on the record provided, there is **no explicit status field** listed.\n\nThe available data points are:\n* **Record", + "step": "S3" + }, + { + "ttft": 0.4537, + "wall": 0.588, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S4" + }, + { + "ttft": 0.328, + "wall": 0.47, + "chars": 47, + "finish": "stop", + "text": "The status is not provided in the given record.", + "step": "S5" + }, + { + "ttft": 0.3277, + "wall": 0.488, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S6" + }, + { + "ttft": 0.5492, + "wall": 1.086, + "chars": 175, + "finish": "stop", + "text": "There are many rules in the handbook that mention fields starting with `gamma`. Here is the complete list of rules invol", + "step": "C3" + }, + { + "ttft": 2.3302, + "wall": 2.545, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-probe.py b/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-probe.py new file mode 100755 index 00000000000..b80e6a0e1e8 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-probe.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +"""mixed-probe: does the cache router's threshold cost anything OUTSIDE the single-shot lane? + +The router flips the engine's `prompt_cache` to 0 after `batch_after` consecutive never-seen single-shot prompts +and back to the shipped value when a conversational request arrives. The question this probe answers is not +"is a single shot faster" (that is strata-shortrun-probe.py) but "does flipping the pool off throw away work a +later request would have reused": + + R1 a repeat of one prompt -> the repeat lane (router must keep this on) + C1 a long conversation, turn 1 -> full prefill + C2 the same conversation, turn 2 -> must be a cache hit + S N unique single-shot prompts -> this is what moves the router to BATCH + C3 the same conversation, turn 3 -> if the parked context was dropped, this re-prefills + R2 the same prompt as R1 again -> is R1's parked context still there? + +Every step reports its streaming TTFT, so an eviction shows up as a step that jumps from ~0.3 s to seconds. + strata-mixed-probe.py --url http://127.0.0.1:8097 --label a4 --singles 2 --out ~/mixed-a4.json +""" +import argparse, json, random, statistics as st, time, urllib.request + +def post_stream(url, model, messages, cap, tools=None): + body = {"model": model, "messages": messages, "max_tokens": cap, "temperature": 0, "stream": True, + # thinking would spend the whole cap before any answer text: this probe measures the CACHE, and a + # reasoning-only stream has no content piece at all (first iteration got finish=length, 0 chars) + "chat_template_kwargs": {"enable_thinking": False}} + if tools: + body["tools"] = tools + req = urllib.request.Request(url.rstrip("/") + "/v1/chat/completions", + data=json.dumps(body).encode(), headers={"content-type": "application/json"}) + t0 = time.monotonic(); ttft = None; out = []; finish = None + with urllib.request.urlopen(req, timeout=900) as r: + for raw in r: + line = raw.decode("utf-8", "replace").strip() + if not line.startswith("data:"): + continue + p = line[5:].strip() + if p == "[DONE]": + break + try: + d = json.loads(p) + except json.JSONDecodeError: + continue + ch = (d.get("choices") or [{}])[0] + delta = ch.get("delta") or {} + if ttft is None and (delta.get("content") or delta.get("reasoning_content")): + ttft = time.monotonic() - t0 # first token of any kind: that is when the client sees life + piece = delta.get("content") + if piece: + out.append(piece) + if ch.get("finish_reason"): + finish = ch["finish_reason"] + return {"ttft": round(ttft, 4) if ttft else None, "wall": round(time.monotonic() - t0, 3), + "chars": len("".join(out)), "finish": finish, "text": "".join(out)[:120]} + +def doc(seed, n_rules=120): + rnd = random.Random(seed) + lines = [f"RULE {i:03d}: field {rnd.choice(['alpha','beta','gamma','delta'])}{rnd.randrange(100,999)} " + f"is {'required' if rnd.random() < .5 else 'optional'} and maps to column {rnd.randrange(1,90)}." + for i in range(n_rules)] + return "Handbook excerpt:\n" + "\n".join(lines) + +def main(): + p = argparse.ArgumentParser() + p.add_argument("--url", default="http://127.0.0.1:8097") + p.add_argument("--model", default="qwen3.8-flash-next-coder-iq1_m") + p.add_argument("--label", required=True) + p.add_argument("--singles", type=int, default=2, help="unique single-shot prompts inserted between C2 and C3") + p.add_argument("--cap", type=int, default=64) + p.add_argument("--seed", type=int, default=11) + p.add_argument("--out", required=True) + a = p.parse_args() + rnd = random.Random(a.seed) + text = doc(a.seed) + steps = [] + + def run(name, messages, tools=None): + r = post_stream(a.url, a.model, messages, a.cap, tools) + r["step"] = name + steps.append(r) + print(f" {a.label} {name:<3} ttft {r['ttft'] if r['ttft'] is not None else -1:.3f} s " + f"wall {r['wall']:6.2f} s chars {r['chars']:>3} {r['finish']}") + return r + + # R1 / R2: one prompt, sent twice, with everything else in between + r_prompt = f"Summarise rule 007 of this handbook in one line.\n{text}" + first = run("R1", [{"role": "user", "content": r_prompt}]) + + # the conversation: turn 1 and 2 + conv = [{"role": "user", "content": f"Here is a handbook. Read it.\n{text}"}] + c1 = run("C1", conv) + conv.append({"role": "assistant", "content": c1["text"] or "Understood."}) + conv.append({"role": "user", "content": "Which rule maps to column 42?"}) + c2 = run("C2", conv) + conv.append({"role": "assistant", "content": c2["text"] or "Not stated."}) + + # the single-shot run that moves the router + for i in range(a.singles): + q = f"Extract the status from record R{rnd.randrange(10**6)}; owner {rnd.choice(['a','b','c'])}; " \ + f"amount {rnd.randrange(100,999)}.{rnd.randrange(10,99)} EUR; date 2024-0{rnd.randrange(1,9)}-1{rnd.randrange(0,9)}." + run(f"S{i+1}", [{"role": "user", "content": q}]) + + # C3: does the conversation's parked context survive the flip? + conv.append({"role": "user", "content": "And which rule mentions gamma?"}) + c3 = run("C3", conv) + + # R2: is the R1 context still parked? + run("R2", [{"role": "user", "content": r_prompt}]) + + json.dump({"label": a.label, "singles": a.singles, "steps": steps}, open(a.out, "w"), indent=1) + c2t, c3t = steps[2]["ttft"], steps[3 + a.singles]["ttft"] + r2t = steps[-1]["ttft"] + # absolute, not relative to C2: comparing C3 with C2 calls a warm C2 followed by a warm C3 "re-prefilled", and + # a cold C2 followed by a warm C3 "still warm" (the a1 arm of 2026-11-09 read exactly that way) + label = lambda t: "hit" if t is not None and t < 1.0 else "RE-PREFILL" + print(f" {a.label}: C2 {c2t:.3f} s [{label(c2t)}] C3 {c3t:.3f} s [{label(c3t)}] R2 {r2t:.3f} s [{label(r2t)}]" + f" after {a.singles} single shot(s)") + +if __name__ == "__main__": + main() diff --git a/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-sweep.sh b/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-sweep.sh new file mode 100755 index 00000000000..0b29d6731c2 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/mixed/strata-mixed-sweep.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# strata-mixed-sweep.sh - does turning the cache off sooner cost a conversation anything? +# +# Two card windows on the 0.2.13 tree, the same engine and model, differing only in conv_route_batch_after: +# ba4 the deployed value (4 consecutive single-shot prompts before the cache goes off) +# ba1 the value the single-shot probe favoured (1) +# +# Each window runs ~/bin/strata-mixed-probe.py --singles 6: a repeated prompt, a two-turn conversation, six unique +# single-shot prompts, then the conversation's next turn and the repeated prompt again. A step that jumps from +# ~0.3 s to seconds is a re-prefill, which is the cost of a flip. +# +# UNDO: rm this file and ~/strata-mixed-sweep +set -uo pipefail +S=/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731 +TREE=$S/strata-0.2.13 +BASE=$TREE/strata-coder-iq1_m-sycl-tuned.json +OUT=$HOME/strata-mixed-sweep +PROBE=$HOME/bin/strata-mixed-probe.py +mkdir -p "$OUT" + +variant() { # name key value + python3 - "$BASE" "$OUT/conf-$1.json" "$2" "$3" <<'PY' +import json, sys +src, dst, key, val = sys.argv[1:5] +d = json.load(open(src)); d[key] = json.loads(val) +json.dump(d, open(dst, "w"), indent=1); print(dst, key, "=", d[key]) +PY +} + +arm() { # tag [server args] + local tag=$1; shift + local conf="$OUT/conf-$tag.json" + # the batch_after value is a SERVER flag: serve/server.py reads --conv-route-batch-after and ignores the + # config's "conv_route_batch_after" key, so a config variant alone is inert (measured 2026-11-14). + echo "[$(date +%H:%M:%S)] ===== mixed-$tag SRV_ARGS='$*'" + SRV_ARGS="$*" ~/bin/strata-card-window.sh "$TREE" 8097 --conf "$conf" -- bash -c " + curl -s -m 5 http://127.0.0.1:\$PORT/v1/status | python3 -c 'import json,sys;d=json.load(sys.stdin);print(\" engine:\",d[\"engine\"])' + /usr/bin/python3 $PROBE --url http://127.0.0.1:\$PORT --label $tag --singles 6 --out $OUT/mixed-$tag.json + " 2>&1 | grep -E '=====|engine:|conv route:|ttft|C2|wrote|restore' +} + +variant ba4 conv_route_batch_after 4 +variant ba1 conv_route_batch_after 1 + +arm ba4 # the deployed value (server default 4) +arm ba1 --conv-route-batch-after 1 # the value the single-shot probe favoured +echo "[$(date +%H:%M:%S)] mixed sweep done" diff --git a/docs/PERF-NEXT.md b/docs/PERF-NEXT.md index 71e2235f970..d3dc0478edf 100644 --- a/docs/PERF-NEXT.md +++ b/docs/PERF-NEXT.md @@ -36,6 +36,7 @@ important as the open one. | `--ple-row-cache` 4 M / 16 M rows, `--ple-inflight` 1024 | 4 M rows and inflight 1024 are **flat** (inside the 0.2–3.6 % drift band); 16 M rows (1.44 GB) costs **−8 % on fresh 4.2k, −8…−12 % on 8.8k, −17 % on a 4.4k follow-up, −10 % on 30k**. The 94 MB default and inflight 256 stand — [the sweep](../dirigo-results/0.2.13-port/ple-sweep/) | | `spec_window` policy | recovered only half the retrieval loss (+1.3…4.8 % vs +3.6…7.5 %) — left off | | DFlash2 / DSpark drafters | **CUDA/HIP only**; the SYCL delta in 0.2.12 is 3 lines in `prefill.cpp` | +| `conv-route-batch-after` 1 | wins 0.52 s over the first six single-shot requests of a burst, loses **1.88 s** on the conversation turn that follows it — §7 | | `--spec 0` to remove drafting entirely | the engine refuses it on a native IQ pack: *"it needs `--native` SHARD1, `--spec T (T >= 2)` and `--prefill` CHUNK"* — so drafting cannot be excluded this way | ## 3. Where the remaining time is @@ -49,7 +50,7 @@ fixed term. | # | idea | evidence it could pay | cost | first test | | --- | --- | --- | --- | --- | -| 1 | ship `conv-route-batch-after` 1–2 | measured **−21 % median TTFT** (0.371 → 0.293 s); §6 prices what it saves at **+212 ms per request** while the cache is on, and at `batch_after 4` the first three fresh requests of a run still pay it | a flag + a probe | a chat-after-single-shot shape to price the flip-back | +| 1 | ~~ship `conv-route-batch-after` 1–2~~ | **closed, keep 4.** §7: 1 buys 0.52 s across the first six single-shot requests and costs **1.88 s** on the next conversation turn (`C2` 2.465 s against 0.587) — break-even at ~21 single-shots per conversation re-open | — | done; the config key that would have set it was also dead (PR #16) | | 2 | engine-side per-request timer | §6 leaves **~165 ms** inside prefill that no configuration lever explains (PLE reads excluded, cache slots ~58 ms of it); naming it needs a phase timer in the request path | code, a day | timestamp slot setup / first-layer expert reach / KV alloc per request | | 3 | a one-shot mode that also drops the cache slots | §6: `--prompt-cache 0` is **58 ms cheaper per request** than the router's cache-off path at 75 tokens, and far more stable (324 ms against 382, spread 323–339 against 327–537). The setting is restart-class today | engine work to make it per-request | the same ladder with a 0-slot variant | | 4 | residency-biased router on SYCL | `route_prior.cu` is CUDA-only; here **12,288 of 24,576** experts are resident, so half of every token's experts cross PCIe. Upstream measured +15 % / +37 % on a 12 GB NVIDIA card | engine port, days | decode lanes, 5 interleaved pairs | @@ -112,7 +113,45 @@ on, like stock) — client TTFT from the first content delta, and the engine's o Artifacts: [`0.2.13-port/intercept/`](../dirigo-results/0.2.13-port/intercept/) — both ladders, the three cause-sweep arms, `summary.json`, the probe and both drivers, and the logs with every restore line. -## 7. Method rules these numbers were produced under +## 7. Mixed traffic: why `batch_after` stays at 4 + +One traffic shape, two card windows, the same build and model, differing only in the server's +`--conv-route-batch-after` (4, the deployed value, against 1). Each window: a repeated ~3,000-token prompt, a +two-turn conversation, six unique single-shot prompts, then the conversation's next turn and the repeat again. TTFT in +seconds: + +| step | what it is | `batch_after 4` | `batch_after 1` | +| --- | --- | --- | --- | +| R1 | the 3k prompt, first time | 2.263 | 2.134 | +| C1 | conversation, turn 1 | 2.212 | 1.973 | +| **C2** | **conversation, turn 2 — should reuse** | **0.587** | **2.465** | +| S1 | single-shot 1 | 0.564 | 0.517 | +| S2 | single-shot 2 | 0.498 | 0.328 | +| S3 | single-shot 3 | 0.503 | 0.325 | +| S4 | single-shot 4 | 0.454 | 0.327 | +| S5–S6 | single-shot 5–6 | 0.328 / 0.328 | 0.327 / 0.327 | +| C3 | conversation, turn 3 | 0.549 | 0.544 | +| R2 | the 3k prompt again | 2.330 | 2.316 | + +1. **`batch_after 1` wins 0.52 s across six single-shot requests** — 0.17 s, 0.18 s and 0.13 s on the second, third + and fourth, then nothing, because the cache is off either way by the fifth. +2. **It loses 1.88 s on the conversation's second turn.** Served with the cache off, the first turn parks nothing, so + the second turn re-reads its whole context: 2.465 s against 0.587 s. +3. **Break-even is ~21 single-shot requests per conversation re-open** (1.88 s ÷ 0.087 s saved per request). A one-shot + extraction queue clears that easily; anything that alternates a tool call with a chat turn never does. +4. **The flip costs the request right after it, and nothing else** — `C3` reuses in both arms (0.549 / 0.544), and the + repeat `R2` re-reads in both (2.330 / 2.316), because another conversation's context displaced it either way. +5. **The value was never actually settable.** Both configs produced identical results on all eleven steps until the flag + was passed by hand: `serve/server.py` read `--conv-route-batch-after` and ignored the config's + `conv_route_batch_after`, while the launcher writes the key and passes no flag. Fixed in + [PR #16](https://github.com/rwkeyes/Strata/pull/16) (unmerged — it must not touch `serve/` on this branch). + +Decision: **4 stands.** 1 is only right for a pure single-shot queue, and this fork is not sold as one. + +Artifacts: [`0.2.13-port/intercept/mixed/`](../dirigo-results/0.2.13-port/intercept/mixed/) — both arms, the two inert +runs that exposed the dead key, the probe and the driver. + +## 8. Method rules these numbers were produced under - Paired or interleaved arms; median of repeats; the box's run-to-run spread stated next to the effect. - One prompt per configuration is not a measurement: every lane here has several requests, and a single-prompt