Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- app/src/je_validation/console/catalog.py +14 -2
- app/src/je_validation/console/runs.py +1 -1
- app/src/je_validation/console/static/content/tasks.html +73 -32
- app/src/je_validation/envir/briefs.py +33 -0
- app/src/je_validation/envir/instance.py +1 -0
- app/src/je_validation/envir/issue_types.py +44 -0
- app/src/je_validation/envir/llm_agent.py +23 -3
- app/src/je_validation/envir/tool_vocab.py +2 -0
- app/src/je_validation/envir/toolmodels.py +16 -4
- app/src/je_validation/envir/tools.py +33 -14
- app/src/je_validation/envir/toolspecs.py +8 -7
- app/src/je_validation/generator/docgen/contracts.py +23 -0
- app/src/je_validation/generator/docgen/memos.py +51 -0
- app/src/je_validation/generator/je11.py +131 -0
- app/src/je_validation/generator/je12.py +541 -0
- app/src/je_validation/generator/je13.py +343 -0
- app/src/je_validation/generator/je14.py +348 -0
- app/src/je_validation/generator/je15.py +177 -0
- app/src/je_validation/generator/l2common.py +40 -0
- app/src/je_validation/generator/persist.py +5 -0
- app/src/je_validation/generator/slicing.py +26 -6
- app/src/je_validation/scoring/gates.py +20 -18
- app/src/je_validation/scoring/gates_common.py +25 -0
- app/src/je_validation/scoring/gates_l3.py +112 -0
- app/src/je_validation/scoring/task_scoring.py +32 -1
- app/src/je_validation/scoring/verifiers/__init__.py +2 -0
- app/src/je_validation/scoring/verifiers/je02.py +2 -2
- app/src/je_validation/scoring/verifiers/je03.py +3 -3
- app/src/je_validation/scoring/verifiers/je04.py +3 -2
- app/src/je_validation/scoring/verifiers/je05.py +2 -2
- app/src/je_validation/scoring/verifiers/je11.py +62 -0
- app/src/je_validation/scoring/verifiers/je12.py +22 -0
- app/src/je_validation/scoring/verifiers/je13.py +29 -0
- app/src/je_validation/scoring/verifiers/je14.py +37 -0
- app/src/je_validation/scoring/verifiers/je15.py +41 -0
- data/runs/console/c5-grid-je01/deepseek_deepseek-v4-flash/seed3/score.json +0 -16
- data/runs/console/c5-grid-je02/baseline_flag_everything/seed1/JE-02_seed1.jsonl +0 -62
- data/runs/console/c5-grid-je02/baseline_flag_everything/seed2/JE-02_seed2.jsonl +0 -62
- data/runs/console/c5-grid-je02/baseline_flag_everything/seed3/JE-02_seed3.jsonl +0 -62
- data/runs/console/c5-grid-je02/baseline_flag_everything/seed4/JE-02_seed4.jsonl +0 -62
- data/runs/console/c5-grid-je02/baseline_flag_everything/seed5/JE-02_seed5.jsonl +0 -62
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed1/JE-02_seed1.jsonl +0 -0
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed1/score.json +0 -16
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed2/JE-02_seed2.jsonl +0 -0
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed3/JE-02_seed3.jsonl +0 -0
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed4/JE-02_seed4.jsonl +0 -0
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed5/JE-02_seed5.jsonl +0 -0
- data/runs/console/c5-grid-je02/baseline_no_evidence/seed5/score.json +0 -16
- data/runs/console/c5-grid-je02/deepseek_deepseek-v4-flash/seed1/JE-02_seed1.jsonl +0 -0
- data/runs/console/c5-grid-je02/deepseek_deepseek-v4-flash/seed1/score.json +0 -16
app/src/je_validation/console/catalog.py
CHANGED
|
@@ -19,6 +19,11 @@ from je_validation.generator import (
|
|
| 19 |
je08,
|
| 20 |
je09,
|
| 21 |
je10,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
)
|
| 23 |
from je_validation.generator.persist import spec_task_path
|
| 24 |
|
|
@@ -26,7 +31,8 @@ GENERATORS = {
|
|
| 26 |
"JE-01": je01.generate, "JE-02": je02.generate, "JE-03": je03.generate,
|
| 27 |
"JE-04": je04.generate, "JE-05": je05.generate, "JE-06": je06.generate,
|
| 28 |
"JE-07": je07.generate, "JE-08": je08.generate, "JE-09": je09.generate,
|
| 29 |
-
"JE-10": je10.generate,
|
|
|
|
| 30 |
}
|
| 31 |
# The population knob is editable only for L1; L2 populations are spec-pinned
|
| 32 |
# in the generators (JE-06/07/10 accept n_entries but the pinned default is
|
|
@@ -51,6 +57,12 @@ _L2_POPULATIONS: dict[str, int] = {
|
|
| 51 |
# would otherwise compare it against this nominal value.
|
| 52 |
POPULATION_SEED_VARIABLE: frozenset[str] = frozenset({"JE-10"})
|
| 53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
# JE-01's spec scenario is "a batch of 400 posted journal entries"; at the
|
| 55 |
# generic DEFAULT_KNOBS population (60) the generator can't find its required
|
| 56 |
# 15 clean multi-line distractor entries (seed 1 yields only 14), so
|
|
@@ -62,7 +74,7 @@ _L1_POPULATIONS: dict[str, int] = {"JE-01": 400}
|
|
| 62 |
def default_population(task_id: str) -> int:
|
| 63 |
if task_id in POPULATION_EDITABLE:
|
| 64 |
return _L1_POPULATIONS.get(task_id, int(DEFAULT_KNOBS["population"]))
|
| 65 |
-
return _L2_POPULATIONS[task_id]
|
| 66 |
|
| 67 |
|
| 68 |
@cache
|
|
|
|
| 19 |
je08,
|
| 20 |
je09,
|
| 21 |
je10,
|
| 22 |
+
je11,
|
| 23 |
+
je12,
|
| 24 |
+
je13,
|
| 25 |
+
je14,
|
| 26 |
+
je15,
|
| 27 |
)
|
| 28 |
from je_validation.generator.persist import spec_task_path
|
| 29 |
|
|
|
|
| 31 |
"JE-01": je01.generate, "JE-02": je02.generate, "JE-03": je03.generate,
|
| 32 |
"JE-04": je04.generate, "JE-05": je05.generate, "JE-06": je06.generate,
|
| 33 |
"JE-07": je07.generate, "JE-08": je08.generate, "JE-09": je09.generate,
|
| 34 |
+
"JE-10": je10.generate, "JE-11": je11.generate, "JE-12": je12.generate,
|
| 35 |
+
"JE-13": je13.generate, "JE-14": je14.generate, "JE-15": je15.generate,
|
| 36 |
}
|
| 37 |
# The population knob is editable only for L1; L2 populations are spec-pinned
|
| 38 |
# in the generators (JE-06/07/10 accept n_entries but the pinned default is
|
|
|
|
| 57 |
# would otherwise compare it against this nominal value.
|
| 58 |
POPULATION_SEED_VARIABLE: frozenset[str] = frozenset({"JE-10"})
|
| 59 |
|
| 60 |
+
# L3 populations are spec-pinned like L2; all five generators fill to an
|
| 61 |
+
# exact count, so none joins POPULATION_SEED_VARIABLE.
|
| 62 |
+
_L3_POPULATIONS: dict[str, int] = {
|
| 63 |
+
"JE-11": 260, "JE-12": 320, "JE-13": 600, "JE-14": 240, "JE-15": 380,
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
# JE-01's spec scenario is "a batch of 400 posted journal entries"; at the
|
| 67 |
# generic DEFAULT_KNOBS population (60) the generator can't find its required
|
| 68 |
# 15 clean multi-line distractor entries (seed 1 yields only 14), so
|
|
|
|
| 74 |
def default_population(task_id: str) -> int:
|
| 75 |
if task_id in POPULATION_EDITABLE:
|
| 76 |
return _L1_POPULATIONS.get(task_id, int(DEFAULT_KNOBS["population"]))
|
| 77 |
+
return {**_L2_POPULATIONS, **_L3_POPULATIONS}[task_id]
|
| 78 |
|
| 79 |
|
| 80 |
@cache
|
app/src/je_validation/console/runs.py
CHANGED
|
@@ -468,7 +468,7 @@ class RunManager:
|
|
| 468 |
inst = read_public_instance(bundle_dir / "instance")
|
| 469 |
ti = read_instance(bundle_dir)
|
| 470 |
|
| 471 |
-
if task["tier"]
|
| 472 |
n = len(ti.instance.entries)
|
| 473 |
knobs = {**req.knobs, "population": n}
|
| 474 |
if req.task_id not in default_catalog.POPULATION_SEED_VARIABLE:
|
|
|
|
| 468 |
inst = read_public_instance(bundle_dir / "instance")
|
| 469 |
ti = read_instance(bundle_dir)
|
| 470 |
|
| 471 |
+
if task["tier"] in ("L2", "L3"):
|
| 472 |
n = len(ti.instance.entries)
|
| 473 |
knobs = {**req.knobs, "population": n}
|
| 474 |
if req.task_id not in default_catalog.POPULATION_SEED_VARIABLE:
|
app/src/je_validation/console/static/content/tasks.html
CHANGED
|
@@ -19,9 +19,9 @@
|
|
| 19 |
<!-- example:JE-01 -->
|
| 20 |
<div class="example-run">
|
| 21 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 22 |
-
<span class="ex-score">final 0.
|
| 23 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 24 |
-
<a class="ex-link" href="#console/run/
|
| 25 |
</div>
|
| 26 |
<!-- /example:JE-01 --></div>
|
| 27 |
<div class="task-card"><h3><span class="je-id">JE-02</span> Coding validity
|
|
@@ -32,9 +32,9 @@
|
|
| 32 |
<!-- example:JE-02 -->
|
| 33 |
<div class="example-run">
|
| 34 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 35 |
-
<span class="ex-score">final
|
| 36 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.22</span>
|
| 37 |
-
<a class="ex-link" href="#console/run/
|
| 38 |
</div>
|
| 39 |
<!-- /example:JE-02 --></div>
|
| 40 |
<div class="task-card"><h3><span class="je-id">JE-03</span> Period cut-off
|
|
@@ -44,9 +44,9 @@
|
|
| 44 |
<!-- example:JE-03 -->
|
| 45 |
<div class="example-run">
|
| 46 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 47 |
-
<span class="ex-score">final 0.
|
| 48 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 49 |
-
<a class="ex-link" href="#console/run/
|
| 50 |
</div>
|
| 51 |
<!-- /example:JE-03 --></div>
|
| 52 |
<div class="task-card"><h3><span class="je-id">JE-04</span> Duplicate payments
|
|
@@ -56,9 +56,9 @@
|
|
| 56 |
<!-- example:JE-04 -->
|
| 57 |
<div class="example-run">
|
| 58 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 59 |
-
<span class="ex-score">final 0.
|
| 60 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 61 |
-
<a class="ex-link" href="#console/run/
|
| 62 |
</div>
|
| 63 |
<!-- /example:JE-04 --></div>
|
| 64 |
<div class="task-card"><h3><span class="je-id">JE-05</span> Foreign currency
|
|
@@ -68,10 +68,9 @@
|
|
| 68 |
<!-- example:JE-05 -->
|
| 69 |
<div class="example-run">
|
| 70 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 71 |
-
<span class="ex-score">final 0.
|
| 72 |
<span class="ex-base">baselines: flag-everything −1.71 · no-evidence 0.18</span>
|
| 73 |
-
<
|
| 74 |
-
<a class="ex-link" href="#console/run/c5-grid-je05">View the full run →</a>
|
| 75 |
</div>
|
| 76 |
<!-- /example:JE-05 --></div>
|
| 77 |
</div>
|
|
@@ -89,9 +88,9 @@
|
|
| 89 |
<!-- example:JE-06 -->
|
| 90 |
<div class="example-run">
|
| 91 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 92 |
-
<span class="ex-score">final 0.
|
| 93 |
<span class="ex-base">baselines: flag-everything −1.76 · no-evidence 0.00</span>
|
| 94 |
-
<a class="ex-link" href="#console/run/
|
| 95 |
</div>
|
| 96 |
<!-- /example:JE-06 --></div>
|
| 97 |
<div class="task-card"><h3><span class="je-id">JE-07</span> Subledger reconciliation
|
|
@@ -101,9 +100,10 @@
|
|
| 101 |
<!-- example:JE-07 -->
|
| 102 |
<div class="example-run">
|
| 103 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 104 |
-
<span class="ex-score">final 0.
|
| 105 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 106 |
-
<
|
|
|
|
| 107 |
</div>
|
| 108 |
<!-- /example:JE-07 --></div>
|
| 109 |
<div class="task-card"><h3><span class="je-id">JE-08</span> Accrual reversals
|
|
@@ -113,9 +113,9 @@
|
|
| 113 |
<!-- example:JE-08 -->
|
| 114 |
<div class="example-run">
|
| 115 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 116 |
-
<span class="ex-score">final 0.
|
| 117 |
<span class="ex-base">baselines: flag-everything −1.79 · no-evidence 0.00</span>
|
| 118 |
-
<a class="ex-link" href="#console/run/
|
| 119 |
</div>
|
| 120 |
<!-- /example:JE-08 --></div>
|
| 121 |
<div class="task-card"><h3><span class="je-id">JE-09</span> Interfund transfers
|
|
@@ -125,9 +125,9 @@
|
|
| 125 |
<!-- example:JE-09 -->
|
| 126 |
<div class="example-run">
|
| 127 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 128 |
-
<span class="ex-score">final 0.
|
| 129 |
<span class="ex-base">baselines: flag-everything −1.63 · no-evidence 0.31</span>
|
| 130 |
-
<a class="ex-link" href="#console/run/
|
| 131 |
</div>
|
| 132 |
<!-- /example:JE-09 --></div>
|
| 133 |
<div class="task-card"><h3><span class="je-id">JE-10</span> Budget integrity
|
|
@@ -137,39 +137,80 @@
|
|
| 137 |
<!-- example:JE-10 -->
|
| 138 |
<div class="example-run">
|
| 139 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 140 |
-
<span class="ex-score">final 0.
|
| 141 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.25</span>
|
| 142 |
<span class="ex-fail">1 of 5 seeds auto-failed (fabrication)</span>
|
| 143 |
-
<a class="ex-link" href="#console/run/
|
| 144 |
</div>
|
| 145 |
<!-- /example:JE-10 --></div>
|
| 146 |
</div>
|
| 147 |
|
| 148 |
<div class="tier-head tier-l3"><span class="tier-tag">L3</span><h2>Cross-document evidence</h2>
|
| 149 |
-
<span class="badge-
|
| 150 |
<p class="section-intro">The answer isn't in the ledger alone — it takes
|
| 151 |
assembling evidence across documents and master data.</p>
|
| 152 |
<div class="task-grid">
|
| 153 |
<div class="task-card"><h3><span class="je-id">JE-11</span> Split purchases
|
| 154 |
-
<span class="badge-
|
| 155 |
<p>Purchases split into pieces to stay under approval limits — versus
|
| 156 |
-
legitimate installment payments. Tell them apart.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
<div class="task-card"><h3><span class="je-id">JE-12</span> Posting behavior
|
| 158 |
-
<span class="badge-
|
| 159 |
<p>Odd hours, unusual users, period-end clustering. Most such entries are
|
| 160 |
-
still legitimate — find the ones that aren't.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
<div class="task-card"><h3><span class="je-id">JE-13</span> Rare combinations
|
| 162 |
-
<span class="badge-
|
| 163 |
<p>Every value is ordinary on its own; the combination is almost
|
| 164 |
-
unprecedented in the ledger. Spot it and say why it matters.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
<div class="task-card"><h3><span class="je-id">JE-14</span> Vendor red flags
|
| 166 |
-
<span class="badge-
|
| 167 |
<p>Fictitious-vendor and related-party traces that live in the vendor
|
| 168 |
-
master data, not in any single entry.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 169 |
<div class="task-card"><h3><span class="je-id">JE-15</span> Population screening
|
| 170 |
-
<span class="badge-
|
| 171 |
<p>Digit patterns and round-amount concentrations point the way in — the
|
| 172 |
-
deliverable is the specific entries worth an auditor's time.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
</div>
|
| 174 |
|
| 175 |
<div class="tier-head tier-l4"><span class="tier-tag">L4</span><h2>Judgment calls</h2>
|
|
|
|
| 19 |
<!-- example:JE-01 -->
|
| 20 |
<div class="example-run">
|
| 21 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 22 |
+
<span class="ex-score">final 0.03 ± 0.03 <small>(5 seeds)</small></span>
|
| 23 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 24 |
+
<a class="ex-link" href="#console/run/c7-je01-ds">View the full run →</a>
|
| 25 |
</div>
|
| 26 |
<!-- /example:JE-01 --></div>
|
| 27 |
<div class="task-card"><h3><span class="je-id">JE-02</span> Coding validity
|
|
|
|
| 32 |
<!-- example:JE-02 -->
|
| 33 |
<div class="example-run">
|
| 34 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 35 |
+
<span class="ex-score">final 0.84 ± 0.35 <small>(5 seeds)</small></span>
|
| 36 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.22</span>
|
| 37 |
+
<a class="ex-link" href="#console/run/c7-je02-ds">View the full run →</a>
|
| 38 |
</div>
|
| 39 |
<!-- /example:JE-02 --></div>
|
| 40 |
<div class="task-card"><h3><span class="je-id">JE-03</span> Period cut-off
|
|
|
|
| 44 |
<!-- example:JE-03 -->
|
| 45 |
<div class="example-run">
|
| 46 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 47 |
+
<span class="ex-score">final 0.38 ± 0.35 <small>(5 seeds)</small></span>
|
| 48 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 49 |
+
<a class="ex-link" href="#console/run/c7-je03-ds">View the full run →</a>
|
| 50 |
</div>
|
| 51 |
<!-- /example:JE-03 --></div>
|
| 52 |
<div class="task-card"><h3><span class="je-id">JE-04</span> Duplicate payments
|
|
|
|
| 56 |
<!-- example:JE-04 -->
|
| 57 |
<div class="example-run">
|
| 58 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 59 |
+
<span class="ex-score">final 0.58 ± 0.53 <small>(5 seeds)</small></span>
|
| 60 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 61 |
+
<a class="ex-link" href="#console/run/c7-je04-ds">View the full run →</a>
|
| 62 |
</div>
|
| 63 |
<!-- /example:JE-04 --></div>
|
| 64 |
<div class="task-card"><h3><span class="je-id">JE-05</span> Foreign currency
|
|
|
|
| 68 |
<!-- example:JE-05 -->
|
| 69 |
<div class="example-run">
|
| 70 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 71 |
+
<span class="ex-score">final 0.34 ± 0.36 <small>(5 seeds)</small></span>
|
| 72 |
<span class="ex-base">baselines: flag-everything −1.71 · no-evidence 0.18</span>
|
| 73 |
+
<a class="ex-link" href="#console/run/c7-je05-ds">View the full run →</a>
|
|
|
|
| 74 |
</div>
|
| 75 |
<!-- /example:JE-05 --></div>
|
| 76 |
</div>
|
|
|
|
| 88 |
<!-- example:JE-06 -->
|
| 89 |
<div class="example-run">
|
| 90 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 91 |
+
<span class="ex-score">final 0.80 ± 0.14 <small>(5 seeds)</small></span>
|
| 92 |
<span class="ex-base">baselines: flag-everything −1.76 · no-evidence 0.00</span>
|
| 93 |
+
<a class="ex-link" href="#console/run/c7-je06-ds">View the full run →</a>
|
| 94 |
</div>
|
| 95 |
<!-- /example:JE-06 --></div>
|
| 96 |
<div class="task-card"><h3><span class="je-id">JE-07</span> Subledger reconciliation
|
|
|
|
| 100 |
<!-- example:JE-07 -->
|
| 101 |
<div class="example-run">
|
| 102 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 103 |
+
<span class="ex-score">final 0.30 ± 0.08 <small>(5 seeds)</small></span>
|
| 104 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.00</span>
|
| 105 |
+
<span class="ex-fail">1 of 5 seeds auto-failed (fabrication)</span>
|
| 106 |
+
<a class="ex-link" href="#console/run/c7-je07-ds">View the full run →</a>
|
| 107 |
</div>
|
| 108 |
<!-- /example:JE-07 --></div>
|
| 109 |
<div class="task-card"><h3><span class="je-id">JE-08</span> Accrual reversals
|
|
|
|
| 113 |
<!-- example:JE-08 -->
|
| 114 |
<div class="example-run">
|
| 115 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 116 |
+
<span class="ex-score">final 0.80 ± 0.10 <small>(5 seeds)</small></span>
|
| 117 |
<span class="ex-base">baselines: flag-everything −1.79 · no-evidence 0.00</span>
|
| 118 |
+
<a class="ex-link" href="#console/run/c7-je08-ds">View the full run →</a>
|
| 119 |
</div>
|
| 120 |
<!-- /example:JE-08 --></div>
|
| 121 |
<div class="task-card"><h3><span class="je-id">JE-09</span> Interfund transfers
|
|
|
|
| 125 |
<!-- example:JE-09 -->
|
| 126 |
<div class="example-run">
|
| 127 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 128 |
+
<span class="ex-score">final 0.72 ± 0.14 <small>(5 seeds)</small></span>
|
| 129 |
<span class="ex-base">baselines: flag-everything −1.63 · no-evidence 0.31</span>
|
| 130 |
+
<a class="ex-link" href="#console/run/c7-je09-ds">View the full run →</a>
|
| 131 |
</div>
|
| 132 |
<!-- /example:JE-09 --></div>
|
| 133 |
<div class="task-card"><h3><span class="je-id">JE-10</span> Budget integrity
|
|
|
|
| 137 |
<!-- example:JE-10 -->
|
| 138 |
<div class="example-run">
|
| 139 |
<span class="ex-model">deepseek-v4-flash</span>
|
| 140 |
+
<span class="ex-score">final 0.73 ± 0.21 <small>(5 seeds)</small></span>
|
| 141 |
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.25</span>
|
| 142 |
<span class="ex-fail">1 of 5 seeds auto-failed (fabrication)</span>
|
| 143 |
+
<a class="ex-link" href="#console/run/c7-je10-ds">View the full run →</a>
|
| 144 |
</div>
|
| 145 |
<!-- /example:JE-10 --></div>
|
| 146 |
</div>
|
| 147 |
|
| 148 |
<div class="tier-head tier-l3"><span class="tier-tag">L3</span><h2>Cross-document evidence</h2>
|
| 149 |
+
<span class="badge-live">Live</span></div>
|
| 150 |
<p class="section-intro">The answer isn't in the ledger alone — it takes
|
| 151 |
assembling evidence across documents and master data.</p>
|
| 152 |
<div class="task-grid">
|
| 153 |
<div class="task-card"><h3><span class="je-id">JE-11</span> Split purchases
|
| 154 |
+
<span class="badge-live">Live</span></h3>
|
| 155 |
<p>Purchases split into pieces to stay under approval limits — versus
|
| 156 |
+
legitimate installment payments. Tell them apart.</p>
|
| 157 |
+
<!-- example:JE-11 -->
|
| 158 |
+
<div class="example-run">
|
| 159 |
+
<span class="ex-model">deepseek-v4-flash</span>
|
| 160 |
+
<span class="ex-score">final 0.38 ± 0.24 <small>(5 seeds)</small></span>
|
| 161 |
+
<span class="ex-base">baselines: flag-everything −1.77 · no-evidence 0.14</span>
|
| 162 |
+
<span class="ex-fail">4 of 5 seeds auto-failed (fabrication)</span>
|
| 163 |
+
<a class="ex-link" href="#console/run/c7-je11-ds">View the full run →</a>
|
| 164 |
+
</div>
|
| 165 |
+
<!-- /example:JE-11 --></div>
|
| 166 |
<div class="task-card"><h3><span class="je-id">JE-12</span> Posting behavior
|
| 167 |
+
<span class="badge-live">Live</span></h3>
|
| 168 |
<p>Odd hours, unusual users, period-end clustering. Most such entries are
|
| 169 |
+
still legitimate — find the ones that aren't.</p>
|
| 170 |
+
<!-- example:JE-12 -->
|
| 171 |
+
<div class="example-run">
|
| 172 |
+
<span class="ex-model">deepseek-v4-flash</span>
|
| 173 |
+
<span class="ex-score">final 0.76 ± 0.08 <small>(5 seeds)</small></span>
|
| 174 |
+
<span class="ex-base">baselines: flag-everything −1.80 · no-evidence 0.36</span>
|
| 175 |
+
<a class="ex-link" href="#console/run/c7-je12-ds">View the full run →</a>
|
| 176 |
+
</div>
|
| 177 |
+
<!-- /example:JE-12 --></div>
|
| 178 |
<div class="task-card"><h3><span class="je-id">JE-13</span> Rare combinations
|
| 179 |
+
<span class="badge-live">Live</span></h3>
|
| 180 |
<p>Every value is ordinary on its own; the combination is almost
|
| 181 |
+
unprecedented in the ledger. Spot it and say why it matters.</p>
|
| 182 |
+
<!-- example:JE-13 -->
|
| 183 |
+
<div class="example-run">
|
| 184 |
+
<span class="ex-model">deepseek-v4-flash</span>
|
| 185 |
+
<span class="ex-score">final 0.59 ± 0.16 <small>(5 seeds)</small></span>
|
| 186 |
+
<span class="ex-base">baselines: flag-everything −1.69 · no-evidence 0.00</span>
|
| 187 |
+
<a class="ex-link" href="#console/run/c7-je13-ds">View the full run →</a>
|
| 188 |
+
</div>
|
| 189 |
+
<!-- /example:JE-13 --></div>
|
| 190 |
<div class="task-card"><h3><span class="je-id">JE-14</span> Vendor red flags
|
| 191 |
+
<span class="badge-live">Live</span></h3>
|
| 192 |
<p>Fictitious-vendor and related-party traces that live in the vendor
|
| 193 |
+
master data, not in any single entry.</p>
|
| 194 |
+
<!-- example:JE-14 -->
|
| 195 |
+
<div class="example-run">
|
| 196 |
+
<span class="ex-model">deepseek-v4-flash</span>
|
| 197 |
+
<span class="ex-score">final 0.54 ± 0.04 <small>(5 seeds)</small></span>
|
| 198 |
+
<span class="ex-base">baselines: flag-everything −1.79 · no-evidence 0.29</span>
|
| 199 |
+
<a class="ex-link" href="#console/run/c7-je14-ds">View the full run →</a>
|
| 200 |
+
</div>
|
| 201 |
+
<!-- /example:JE-14 --></div>
|
| 202 |
<div class="task-card"><h3><span class="je-id">JE-15</span> Population screening
|
| 203 |
+
<span class="badge-live">Live</span></h3>
|
| 204 |
<p>Digit patterns and round-amount concentrations point the way in — the
|
| 205 |
+
deliverable is the specific entries worth an auditor's time.</p>
|
| 206 |
+
<!-- example:JE-15 -->
|
| 207 |
+
<div class="example-run">
|
| 208 |
+
<span class="ex-model">deepseek-v4-flash</span>
|
| 209 |
+
<span class="ex-score">final 0.56 ± 0.25 <small>(5 seeds)</small></span>
|
| 210 |
+
<span class="ex-base">baselines: flag-everything −1.65 · no-evidence 0.18</span>
|
| 211 |
+
<a class="ex-link" href="#console/run/c7-je15-ds">View the full run →</a>
|
| 212 |
+
</div>
|
| 213 |
+
<!-- /example:JE-15 --></div>
|
| 214 |
</div>
|
| 215 |
|
| 216 |
<div class="tier-head tier-l4"><span class="tier-tag">L4</span><h2>Judgment calls</h2>
|
app/src/je_validation/envir/briefs.py
CHANGED
|
@@ -31,6 +31,12 @@ CLAIM_INSTRUCTIONS: dict[str, str] = {
|
|
| 31 |
"available authority as [claim:available_cents=VALUE], computed "
|
| 32 |
"as budget - (actual + open encumbrance); the value is negative "
|
| 33 |
"when the account is over budget."),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
}
|
| 35 |
|
| 36 |
# Per-task world-rules: instance-independent facts about how the world is
|
|
@@ -57,6 +63,24 @@ TASK_RULES: dict[str, str] = {
|
|
| 57 |
"counterpart_entry_id on the disposition to that entry's id; a "
|
| 58 |
"duplicate flag without the correct counterpart (an entry id you "
|
| 59 |
"have actually seen in tool results) earns no outcome credit."),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
}
|
| 61 |
|
| 62 |
# Per-task reporting requirements (c5): how findings must be REPRESENTED in
|
|
@@ -79,6 +103,15 @@ REPORTING_RULES: dict[str, str] = {
|
|
| 79 |
"compared with the flagged entry); the master:obligation:... "
|
| 80 |
"record key may also be cited as provenance, but it does not "
|
| 81 |
"replace that field-value citation."),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
}
|
| 83 |
|
| 84 |
PROMPT_VERSIONS: tuple[str, ...] = ("minimal", "standard", "detailed")
|
|
|
|
| 31 |
"available authority as [claim:available_cents=VALUE], computed "
|
| 32 |
"as budget - (actual + open encumbrance); the value is negative "
|
| 33 |
"when the account is over budget."),
|
| 34 |
+
"JE-11": ("When you flag entries as one split group, give every member "
|
| 35 |
+
"of that group the same [claim:split_group=N] token (N = any "
|
| 36 |
+
"integer label you choose, one label per group)."),
|
| 37 |
+
"JE-13": ("Rank your anomalies: give each flagged entry a "
|
| 38 |
+
"[claim:anomaly_rank=N] token, 1 = most anomalous. Unranked "
|
| 39 |
+
"flags count after ranked ones."),
|
| 40 |
}
|
| 41 |
|
| 42 |
# Per-task world-rules: instance-independent facts about how the world is
|
|
|
|
| 63 |
"counterpart_entry_id on the disposition to that entry's id; a "
|
| 64 |
"duplicate flag without the correct counterpart (an entry id you "
|
| 65 |
"have actually seen in tool results) earns no outcome credit."),
|
| 66 |
+
"JE-11": (
|
| 67 |
+
"Delegated approval limits are published in the 'approval_limits' "
|
| 68 |
+
"policy. An instalment or progress-payment series is legitimate "
|
| 69 |
+
"only when a contract clause authorises it; contract documents are "
|
| 70 |
+
"attached to the entries they govern."),
|
| 71 |
+
"JE-12": (
|
| 72 |
+
"Business hours are 07:00-19:00. The period ends on the last "
|
| 73 |
+
"calendar day of the month. Automated interface accounts are "
|
| 74 |
+
"identified by the system_account field in the user master; their "
|
| 75 |
+
"batch postings are normal operation."),
|
| 76 |
+
"JE-13": (
|
| 77 |
+
"Entries carry a program code; entries sharing a program code "
|
| 78 |
+
"belong to an authorised program, and a new program legitimately "
|
| 79 |
+
"introduces attribute combinations with no ledger history."),
|
| 80 |
+
"JE-14": (
|
| 81 |
+
"The competitive-bid threshold is $50,000.00 per transaction. "
|
| 82 |
+
"Vendor onboarding is documented by procurement memos attached to "
|
| 83 |
+
"the payments of the round's vendors."),
|
| 84 |
}
|
| 85 |
|
| 86 |
# Per-task reporting requirements (c5): how findings must be REPRESENTED in
|
|
|
|
| 103 |
"compared with the flagged entry); the master:obligation:... "
|
| 104 |
"record key may also be cited as provenance, but it does not "
|
| 105 |
"replace that field-value citation."),
|
| 106 |
+
"JE-15": (
|
| 107 |
+
"Reporting requirements: every department has one DEPARTMENT "
|
| 108 |
+
"SUMMARY row, id 'JE15-DEPT-<department>'. Report a "
|
| 109 |
+
"population-level digit-profile finding by flagging that summary "
|
| 110 |
+
"row (issue type digit_profile_deviation) and separately "
|
| 111 |
+
"disposition the specific entries driving the deviation (issue "
|
| 112 |
+
"type fabricated_amounts). A department whose distribution is "
|
| 113 |
+
"explained by a fee or rate schedule must be approved on its "
|
| 114 |
+
"summary row with the schedule document cited in evidence_ids."),
|
| 115 |
}
|
| 116 |
|
| 117 |
PROMPT_VERSIONS: tuple[str, ...] = ("minimal", "standard", "detailed")
|
app/src/je_validation/envir/instance.py
CHANGED
|
@@ -45,6 +45,7 @@ class Instance:
|
|
| 45 |
documents: tuple[Document, ...]
|
| 46 |
policies: dict[str, str]
|
| 47 |
master_data: dict[str, dict]
|
|
|
|
| 48 |
|
| 49 |
|
| 50 |
@dataclass(frozen=True)
|
|
|
|
| 45 |
documents: tuple[Document, ...]
|
| 46 |
policies: dict[str, str]
|
| 47 |
master_data: dict[str, dict]
|
| 48 |
+
info_responses: dict[str, str] = field(default_factory=dict)
|
| 49 |
|
| 50 |
|
| 51 |
@dataclass(frozen=True)
|
app/src/je_validation/envir/issue_types.py
CHANGED
|
@@ -29,6 +29,13 @@ ISSUE_TYPES: dict[str, tuple[str, ...]] = {
|
|
| 29 |
"JE-09": ("amount_mismatch", "timing", "unmatched", "wrong_counterparty"),
|
| 30 |
"JE-10": ("budget_exceeded", "no_liquidation", "over_liquidation",
|
| 31 |
"wrong_document"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
}
|
| 33 |
|
| 34 |
|
|
@@ -140,6 +147,43 @@ ISSUE_TYPE_DEFINITIONS: dict[str, dict[str, str]] = {
|
|
| 140 |
"over_liquidation": "liquidation exceeding the obligation balance",
|
| 141 |
"wrong_document": "payment referencing the wrong obligating document",
|
| 142 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
}
|
| 144 |
|
| 145 |
|
|
|
|
| 29 |
"JE-09": ("amount_mismatch", "timing", "unmatched", "wrong_counterparty"),
|
| 30 |
"JE-10": ("budget_exceeded", "no_liquidation", "over_liquidation",
|
| 31 |
"wrong_document"),
|
| 32 |
+
"JE-11": ("split_transaction", "threshold_hugging"),
|
| 33 |
+
"JE-12": ("after_hours", "novel_user", "role_violation"),
|
| 34 |
+
"JE-13": ("global_anomaly", "local_anomaly"),
|
| 35 |
+
"JE-14": ("bid_threshold_avoidance", "employee_address_match",
|
| 36 |
+
"name_similarity", "rapid_creation_payment",
|
| 37 |
+
"shared_bank_details"),
|
| 38 |
+
"JE-15": ("digit_profile_deviation", "fabricated_amounts"),
|
| 39 |
}
|
| 40 |
|
| 41 |
|
|
|
|
| 147 |
"over_liquidation": "liquidation exceeding the obligation balance",
|
| 148 |
"wrong_document": "payment referencing the wrong obligating document",
|
| 149 |
},
|
| 150 |
+
"JE-11": {
|
| 151 |
+
"split_transaction": "one obligation divided across multiple "
|
| 152 |
+
"payments to stay under a delegated approval limit",
|
| 153 |
+
"threshold_hugging": "a single payment priced just under an "
|
| 154 |
+
"approval limit with no supporting justification",
|
| 155 |
+
},
|
| 156 |
+
"JE-12": {
|
| 157 |
+
"after_hours": "a material manual entry posted outside business "
|
| 158 |
+
"hours at period end",
|
| 159 |
+
"novel_user": "posted by a user with no prior activity in that account",
|
| 160 |
+
"role_violation": "posted by a user whose role does not permit "
|
| 161 |
+
"that account",
|
| 162 |
+
},
|
| 163 |
+
"JE-13": {
|
| 164 |
+
"global_anomaly": "an attribute value that is rare outright in "
|
| 165 |
+
"the ledger",
|
| 166 |
+
"local_anomaly": "an attribute combination that is jointly "
|
| 167 |
+
"near-unique though each value is common",
|
| 168 |
+
},
|
| 169 |
+
"JE-14": {
|
| 170 |
+
"bid_threshold_avoidance": "payments priced just under the "
|
| 171 |
+
"competitive-bid threshold",
|
| 172 |
+
"employee_address_match": "vendor address matches an employee record",
|
| 173 |
+
"name_similarity": "vendor name is a near-duplicate of an "
|
| 174 |
+
"established vendor",
|
| 175 |
+
"rapid_creation_payment": "vendor created and paid material "
|
| 176 |
+
"amounts within days",
|
| 177 |
+
"shared_bank_details": "vendor shares banking details with "
|
| 178 |
+
"another vendor",
|
| 179 |
+
},
|
| 180 |
+
"JE-15": {
|
| 181 |
+
"digit_profile_deviation": "a subpopulation's amount digit "
|
| 182 |
+
"distribution departs materially from "
|
| 183 |
+
"expectation",
|
| 184 |
+
"fabricated_amounts": "an entry whose amount was fabricated, "
|
| 185 |
+
"driving the digit-profile deviation",
|
| 186 |
+
},
|
| 187 |
}
|
| 188 |
|
| 189 |
|
app/src/je_validation/envir/llm_agent.py
CHANGED
|
@@ -55,7 +55,7 @@ class OpenRouterAgent:
|
|
| 55 |
def __init__(self, model: str, api_key: str, tools_enabled: Sequence[str], *,
|
| 56 |
token_ceiling: int | None,
|
| 57 |
base_url: str = "https://openrouter.ai/api/v1",
|
| 58 |
-
max_tokens: int = 4096, max_retries: int =
|
| 59 |
abort_check: Callable[[], str | None] | None = None,
|
| 60 |
on_usage: Callable[[float], None] | None = None,
|
| 61 |
issue_types: Sequence[str] | None = None,
|
|
@@ -140,7 +140,16 @@ class OpenRouterAgent:
|
|
| 140 |
last: httpx.Response | None = None
|
| 141 |
malformed_body: dict | None = None
|
| 142 |
for attempt in range(self._max_retries + 1):
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
if last.status_code == 402:
|
| 145 |
# OpenRouter's signal that this key hit its own credit limit:
|
| 146 |
# no retry can fix a dead key, so fail fast instead of
|
|
@@ -171,7 +180,14 @@ class OpenRouterAgent:
|
|
| 171 |
malformed_body = body
|
| 172 |
if attempt < self._max_retries:
|
| 173 |
retry_after = last.headers.get("Retry-After")
|
| 174 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
if malformed_body is not None:
|
| 176 |
err = malformed_body.get("error")
|
| 177 |
detail = (f"OpenRouter reply had no choices after retries: {err}"
|
|
@@ -218,6 +234,10 @@ class OpenRouterAgent:
|
|
| 218 |
|
| 219 |
def _parse(self, reply: dict) -> ToolCall:
|
| 220 |
msg = reply["choices"][0]["message"]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 221 |
self._messages.append(msg)
|
| 222 |
text = msg.get("content") or ""
|
| 223 |
calls = msg.get("tool_calls") or []
|
|
|
|
| 55 |
def __init__(self, model: str, api_key: str, tools_enabled: Sequence[str], *,
|
| 56 |
token_ceiling: int | None,
|
| 57 |
base_url: str = "https://openrouter.ai/api/v1",
|
| 58 |
+
max_tokens: int = 4096, max_retries: int = 6,
|
| 59 |
abort_check: Callable[[], str | None] | None = None,
|
| 60 |
on_usage: Callable[[float], None] | None = None,
|
| 61 |
issue_types: Sequence[str] | None = None,
|
|
|
|
| 140 |
last: httpx.Response | None = None
|
| 141 |
malformed_body: dict | None = None
|
| 142 |
for attempt in range(self._max_retries + 1):
|
| 143 |
+
try:
|
| 144 |
+
last = self._client.post("/chat/completions", json=payload)
|
| 145 |
+
except httpx.TransportError:
|
| 146 |
+
# dropped connection / read timeout / protocol error: the
|
| 147 |
+
# request is stateless, so re-posting is as safe as a 502
|
| 148 |
+
# retry. Out of retries -> let it escape to the run manager.
|
| 149 |
+
if attempt >= self._max_retries:
|
| 150 |
+
raise
|
| 151 |
+
time.sleep(2.0 ** attempt)
|
| 152 |
+
continue
|
| 153 |
if last.status_code == 402:
|
| 154 |
# OpenRouter's signal that this key hit its own credit limit:
|
| 155 |
# no retry can fix a dead key, so fail fast instead of
|
|
|
|
| 180 |
malformed_body = body
|
| 181 |
if attempt < self._max_retries:
|
| 182 |
retry_after = last.headers.get("Retry-After")
|
| 183 |
+
if retry_after:
|
| 184 |
+
time.sleep(float(retry_after))
|
| 185 |
+
elif last.status_code == 429:
|
| 186 |
+
# shared-pool 429s (e.g. qwen upstream) last minutes;
|
| 187 |
+
# 10,20,40,80,160,160... rides out ~5 min of outage
|
| 188 |
+
time.sleep(min(10.0 * 2.0 ** attempt, 160.0))
|
| 189 |
+
else:
|
| 190 |
+
time.sleep(2.0 ** attempt)
|
| 191 |
if malformed_body is not None:
|
| 192 |
err = malformed_body.get("error")
|
| 193 |
detail = (f"OpenRouter reply had no choices after retries: {err}"
|
|
|
|
| 234 |
|
| 235 |
def _parse(self, reply: dict) -> ToolCall:
|
| 236 |
msg = reply["choices"][0]["message"]
|
| 237 |
+
if msg.get("content") is None:
|
| 238 |
+
# some providers (Alibaba/qwen) emit content: null on empty
|
| 239 |
+
# replies, then 400 when that message is replayed back to them
|
| 240 |
+
msg["content"] = ""
|
| 241 |
self._messages.append(msg)
|
| 242 |
text = msg.get("content") or ""
|
| 243 |
calls = msg.get("tool_calls") or []
|
app/src/je_validation/envir/tool_vocab.py
CHANGED
|
@@ -15,6 +15,8 @@ MASTER_DATA_TYPES: dict[str, tuple[str, ...]] = {
|
|
| 15 |
"JE-04": ("vendor_aliases",),
|
| 16 |
"JE-05": ("fx_rates", "vendor_currencies"),
|
| 17 |
"JE-10": ("budget", "obligation"),
|
|
|
|
|
|
|
| 18 |
"JE-TOY": ("vendor",),
|
| 19 |
}
|
| 20 |
|
|
|
|
| 15 |
"JE-04": ("vendor_aliases",),
|
| 16 |
"JE-05": ("fx_rates", "vendor_currencies"),
|
| 17 |
"JE-10": ("budget", "obligation"),
|
| 18 |
+
"JE-12": ("user",),
|
| 19 |
+
"JE-14": ("employee", "vendor"),
|
| 20 |
"JE-TOY": ("vendor",),
|
| 21 |
}
|
| 22 |
|
app/src/je_validation/envir/toolmodels.py
CHANGED
|
@@ -20,7 +20,7 @@ from __future__ import annotations
|
|
| 20 |
|
| 21 |
from typing import Any, Literal
|
| 22 |
|
| 23 |
-
from pydantic import BaseModel, ConfigDict, Field
|
| 24 |
|
| 25 |
|
| 26 |
class _Closed(BaseModel):
|
|
@@ -47,7 +47,7 @@ class ListDocumentsArgs(_Closed):
|
|
| 47 |
|
| 48 |
class OpenDocumentArgs(_Closed):
|
| 49 |
doc_id: str
|
| 50 |
-
page: int | None = None
|
| 51 |
|
| 52 |
|
| 53 |
class GetPolicyArgs(_Closed):
|
|
@@ -64,10 +64,22 @@ class RecomputeArgs(_Closed):
|
|
| 64 |
|
| 65 |
|
| 66 |
class AggregateArgs(_Closed):
|
| 67 |
-
group_by: str
|
| 68 |
-
metric: Literal["count", "sum"] = "count"
|
| 69 |
filters: dict[str, Any] = Field(default_factory=dict)
|
| 70 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
class ComparePeriodArgs(BaseModel):
|
| 73 |
# coerce_numbers_to_str: periods live as ints in headers and agents
|
|
|
|
| 20 |
|
| 21 |
from typing import Any, Literal
|
| 22 |
|
| 23 |
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
| 24 |
|
| 25 |
|
| 26 |
class _Closed(BaseModel):
|
|
|
|
| 47 |
|
| 48 |
class OpenDocumentArgs(_Closed):
|
| 49 |
doc_id: str
|
| 50 |
+
page: int | None = Field(None, ge=1)
|
| 51 |
|
| 52 |
|
| 53 |
class GetPolicyArgs(_Closed):
|
|
|
|
| 64 |
|
| 65 |
|
| 66 |
class AggregateArgs(_Closed):
|
| 67 |
+
group_by: str | list[str]
|
| 68 |
+
metric: Literal["count", "sum", "first_digit"] = "count"
|
| 69 |
filters: dict[str, Any] = Field(default_factory=dict)
|
| 70 |
|
| 71 |
+
@field_validator("group_by")
|
| 72 |
+
@classmethod
|
| 73 |
+
def _group_by_valid(cls, v):
|
| 74 |
+
if isinstance(v, list):
|
| 75 |
+
if not v:
|
| 76 |
+
raise ValueError("group_by list must not be empty")
|
| 77 |
+
if not all(isinstance(x, str) for x in v):
|
| 78 |
+
raise ValueError("group_by list entries must be strings")
|
| 79 |
+
if len(set(v)) != len(v):
|
| 80 |
+
raise ValueError("group_by list has duplicate fields")
|
| 81 |
+
return v
|
| 82 |
+
|
| 83 |
|
| 84 |
class ComparePeriodArgs(BaseModel):
|
| 85 |
# coerce_numbers_to_str: periods live as ints in headers and agents
|
app/src/je_validation/envir/tools.py
CHANGED
|
@@ -236,27 +236,41 @@ class ToolRegistry:
|
|
| 236 |
|
| 237 |
def _aggregate(self, args):
|
| 238 |
group_by = args.get("group_by")
|
| 239 |
-
if group_by
|
| 240 |
-
|
|
|
|
|
|
|
| 241 |
metric = args.get("metric", "count")
|
| 242 |
-
if metric not in ("count", "sum"):
|
| 243 |
-
raise ToolError("aggregate: metric must be 'count' or 'sum'")
|
| 244 |
filters = args.get("filters") or {}
|
| 245 |
for k in ("order_by", "offset", "limit"):
|
| 246 |
if k in filters:
|
| 247 |
raise ToolError(f"aggregate: '{k}' is not a filter; aggregate "
|
| 248 |
"always runs over the full population")
|
| 249 |
-
if metric
|
| 250 |
-
raise ToolError("aggregate: this ledger has no 'amount' field
|
| 251 |
-
"to sum")
|
| 252 |
rows = self._select(filters) # uncapped
|
| 253 |
-
groups: dict[
|
| 254 |
for r in rows:
|
| 255 |
-
|
| 256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
"value": len(rs) if metric == "count"
|
| 258 |
else sum(r.get("amount", 0) for r in rs)}
|
| 259 |
-
for
|
| 260 |
|
| 261 |
def _compare_period(self, args):
|
| 262 |
for needed in ("period", "amount"):
|
|
@@ -264,6 +278,10 @@ class ToolRegistry:
|
|
| 264 |
raise ToolError(f"compare_period: this ledger has no "
|
| 265 |
f"'{needed}' field")
|
| 266 |
account = args.get("account")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
base = self._select({"account": account} if account is not None else {})
|
| 268 |
periods = sorted({str(r.get("period")) for r in
|
| 269 |
(self._row(e) for e in self._inst.entries)})
|
|
@@ -278,9 +296,10 @@ class ToolRegistry:
|
|
| 278 |
return {"period_a": a, "period_b": b, "delta": total(a) - total(b)}
|
| 279 |
|
| 280 |
def _request_info(self, args):
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
|
|
|
| 284 |
|
| 285 |
def _disposition(self, args):
|
| 286 |
entry_id, verdict = args.get("entry_id"), args.get("verdict")
|
|
|
|
| 236 |
|
| 237 |
def _aggregate(self, args):
|
| 238 |
group_by = args.get("group_by")
|
| 239 |
+
fields = [group_by] if isinstance(group_by, str) else list(group_by)
|
| 240 |
+
for f in fields:
|
| 241 |
+
if f not in self._fields:
|
| 242 |
+
raise self._unknown_field("group_by", str(f))
|
| 243 |
metric = args.get("metric", "count")
|
|
|
|
|
|
|
| 244 |
filters = args.get("filters") or {}
|
| 245 |
for k in ("order_by", "offset", "limit"):
|
| 246 |
if k in filters:
|
| 247 |
raise ToolError(f"aggregate: '{k}' is not a filter; aggregate "
|
| 248 |
"always runs over the full population")
|
| 249 |
+
if metric in ("sum", "first_digit") and "amount" not in self._fields:
|
| 250 |
+
raise ToolError("aggregate: this ledger has no 'amount' field")
|
|
|
|
| 251 |
rows = self._select(filters) # uncapped
|
| 252 |
+
groups: dict[tuple, list] = {}
|
| 253 |
for r in rows:
|
| 254 |
+
key = tuple(str(r.get(f, "all")) for f in fields)
|
| 255 |
+
groups.setdefault(key, []).append(r)
|
| 256 |
+
|
| 257 |
+
def label(key):
|
| 258 |
+
return key[0] if len(fields) == 1 else list(key)
|
| 259 |
+
if metric == "first_digit":
|
| 260 |
+
out = []
|
| 261 |
+
for key, rs in sorted(groups.items()):
|
| 262 |
+
counts = {str(d): 0 for d in range(1, 10)}
|
| 263 |
+
for r in rs:
|
| 264 |
+
cents = round(abs(float(r.get("amount") or 0)) * 100)
|
| 265 |
+
if cents:
|
| 266 |
+
counts[str(cents)[0]] += 1
|
| 267 |
+
out.extend({"group": label(key), "digit": d, "count": n}
|
| 268 |
+
for d, n in counts.items())
|
| 269 |
+
return out
|
| 270 |
+
return [{"group": label(key),
|
| 271 |
"value": len(rs) if metric == "count"
|
| 272 |
else sum(r.get("amount", 0) for r in rs)}
|
| 273 |
+
for key, rs in sorted(groups.items())]
|
| 274 |
|
| 275 |
def _compare_period(self, args):
|
| 276 |
for needed in ("period", "amount"):
|
|
|
|
| 278 |
raise ToolError(f"compare_period: this ledger has no "
|
| 279 |
f"'{needed}' field")
|
| 280 |
account = args.get("account")
|
| 281 |
+
if account is not None and "account" in self._fields:
|
| 282 |
+
known = {str(e.header.get("account")) for e in self._inst.entries}
|
| 283 |
+
if str(account) not in known:
|
| 284 |
+
raise ToolError(f"unknown account: {account}")
|
| 285 |
base = self._select({"account": account} if account is not None else {})
|
| 286 |
periods = sorted({str(r.get("period")) for r in
|
| 287 |
(self._row(e) for e in self._inst.entries)})
|
|
|
|
| 296 |
return {"period_a": a, "period_b": b, "delta": total(a) - total(b)}
|
| 297 |
|
| 298 |
def _request_info(self, args):
|
| 299 |
+
eid = args.get("entry_id")
|
| 300 |
+
if eid not in self._entries:
|
| 301 |
+
raise ToolError(f"unknown entry: {eid}")
|
| 302 |
+
return self._inst.info_responses.get(eid, "UNAVAILABLE")
|
| 303 |
|
| 304 |
def _disposition(self, args):
|
| 305 |
entry_id, verdict = args.get("entry_id"), args.get("verdict")
|
app/src/je_validation/envir/toolspecs.py
CHANGED
|
@@ -30,13 +30,14 @@ _DESCS: dict[str, str] = {
|
|
| 30 |
"get_master_data": "Master-data record (chart of accounts, vendor, etc). "
|
| 31 |
"An unknown type is rejected with the list of tables.",
|
| 32 |
"recompute": "Deterministic calculator over an arithmetic expression.",
|
| 33 |
-
"aggregate": "Population statistics
|
| 34 |
-
"
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
|
|
|
| 40 |
"disposition":
|
| 41 |
"Terminal verdict for one entry. verdict in approve|flag|reject|"
|
| 42 |
"insufficient_evidence. evidence_ids: ids of things you retrieved, "
|
|
|
|
| 30 |
"get_master_data": "Master-data record (chart of accounts, vendor, etc). "
|
| 31 |
"An unknown type is rejected with the list of tables.",
|
| 32 |
"recompute": "Deterministic calculator over an arithmetic expression.",
|
| 33 |
+
"aggregate": "Population statistics over the full ledger: counts, sums, "
|
| 34 |
+
"and first-digit profiles (metric='first_digit'), grouped "
|
| 35 |
+
"by one field or a list of fields. Never row-capped.",
|
| 36 |
+
"compare_period": "Prior-period comparison of summed amounts; "
|
| 37 |
+
"optionally narrowed to one account (unknown "
|
| 38 |
+
"accounts error).",
|
| 39 |
+
"request_info": "Ask the simulated preparer about an entry. Answers "
|
| 40 |
+
"may be UNAVAILABLE by design.",
|
| 41 |
"disposition":
|
| 42 |
"Terminal verdict for one entry. verdict in approve|flag|reject|"
|
| 43 |
"insufficient_evidence. evidence_ids: ids of things you retrieved, "
|
app/src/je_validation/generator/docgen/contracts.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Contract documents (JE-11). Fields render verbatim (core invariant)."""
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
from je_validation.envir.instance import Document
|
| 5 |
+
from je_validation.generator.docgen.core import build_doc, money
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def contract_doc(*, doc_id: str, entry_id: str, f: dict) -> Document:
|
| 9 |
+
body = [
|
| 10 |
+
"CONTRACT — PAYMENT SCHEDULE EXTRACT",
|
| 11 |
+
"",
|
| 12 |
+
f"Contract number : {f['contract_number']}",
|
| 13 |
+
f"Vendor : {f['vendor']}",
|
| 14 |
+
f"Effective : {f['start_date']}",
|
| 15 |
+
"",
|
| 16 |
+
f"Instalments : {f['n_instalments']}",
|
| 17 |
+
f"Instalment amt : {money(f['instalment_cents'])}",
|
| 18 |
+
"",
|
| 19 |
+
"AUTHORISATION CLAUSE",
|
| 20 |
+
f"{f['clause_text']}",
|
| 21 |
+
]
|
| 22 |
+
return build_doc(doc_id=doc_id, entry_id=entry_id, doc_type="contract",
|
| 23 |
+
filename=f"{f['contract_number']}.txt", body=body)
|
app/src/je_validation/generator/docgen/memos.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Procurement memo and fee/rate schedule documents (JE-11..15). Fields
|
| 2 |
+
render verbatim (core invariant)."""
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
from je_validation.envir.instance import Document
|
| 6 |
+
from je_validation.generator.docgen.core import build_doc, money
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
def procurement_memo_doc(*, doc_id: str, entry_id: str, f: dict) -> Document:
|
| 10 |
+
body = [
|
| 11 |
+
"PROCUREMENT MEMO",
|
| 12 |
+
"",
|
| 13 |
+
f"Round : {f['round_name']}",
|
| 14 |
+
f"Date : {f['date']}",
|
| 15 |
+
f"Approver : {f['approver']}",
|
| 16 |
+
"",
|
| 17 |
+
"VENDORS ONBOARDED",
|
| 18 |
+
*f["vendors"],
|
| 19 |
+
]
|
| 20 |
+
return build_doc(doc_id=doc_id, entry_id=entry_id, doc_type="procurement_memo",
|
| 21 |
+
filename=f"procurement_memo_{entry_id}.txt", body=body)
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def fee_schedule_doc(*, doc_id: str, entry_id: str, f: dict) -> Document:
|
| 25 |
+
body = [
|
| 26 |
+
"FEE SCHEDULE",
|
| 27 |
+
"",
|
| 28 |
+
f"Department : {f['department']}",
|
| 29 |
+
f"Effective : {f['effective']}",
|
| 30 |
+
f"Fixed fee per engagement : {money(f['fee_cents'])}",
|
| 31 |
+
"",
|
| 32 |
+
"BASIS",
|
| 33 |
+
f"{f['basis_text']}",
|
| 34 |
+
]
|
| 35 |
+
return build_doc(doc_id=doc_id, entry_id=entry_id, doc_type="fee_schedule",
|
| 36 |
+
filename=f"fee_schedule_{entry_id}.txt", body=body)
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def rate_schedule_doc(*, doc_id: str, entry_id: str, f: dict) -> Document:
|
| 40 |
+
body = [
|
| 41 |
+
"RATE SCHEDULE",
|
| 42 |
+
"",
|
| 43 |
+
f"Department : {f['department']}",
|
| 44 |
+
f"Effective : {f['effective']}",
|
| 45 |
+
f"Unit rate : {money(f['unit_rate_cents'])} per {f['unit_name']}",
|
| 46 |
+
"",
|
| 47 |
+
"BASIS",
|
| 48 |
+
f"{f['basis_text']}",
|
| 49 |
+
]
|
| 50 |
+
return build_doc(doc_id=doc_id, entry_id=entry_id, doc_type="rate_schedule",
|
| 51 |
+
filename=f"rate_schedule_{entry_id}.txt", body=body)
|
app/src/je_validation/generator/je11.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-11: threshold-hugging and split transactions (L3, control circumvention).
|
| 2 |
+
|
| 3 |
+
Defects and distractors are amount/vendor/date rewrites of real sliced
|
| 4 |
+
entries — ids stay native, entries still foot (with_amount). Seeded split
|
| 5 |
+
membership is recorded in HeldOut.claims (split_group), which the verifier
|
| 6 |
+
matches against the agent's [claim:split_group=N] labels."""
|
| 7 |
+
from __future__ import annotations
|
| 8 |
+
|
| 9 |
+
import dataclasses
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
|
| 12 |
+
from je_validation.envir.instance import DefectRecord, HeldOut, Instance, TaskInstance
|
| 13 |
+
from je_validation.generator.docgen.contracts import contract_doc
|
| 14 |
+
from je_validation.generator.l2common import augment, with_amount
|
| 15 |
+
from je_validation.generator.persist import spec_task_path, write_instance
|
| 16 |
+
from je_validation.generator.seeding import pick, rng_for
|
| 17 |
+
from je_validation.generator.slicing import slice_entries
|
| 18 |
+
|
| 19 |
+
TASK_ID = "JE-11"
|
| 20 |
+
DEFECT_COUNTS = {"split_transaction": 18, "threshold_hugging": 3}
|
| 21 |
+
SPLIT_SIZES = (2, 2, 3, 3, 4, 4)
|
| 22 |
+
INSTALMENT_SIZES = (2, 3, 4, 2, 3, 4, 3, 3)
|
| 23 |
+
N_NATURAL = 20
|
| 24 |
+
LIMITS_CENTS = {"unit_head": 500_000, "director": 2_500_000,
|
| 25 |
+
"commissioner": 10_000_000}
|
| 26 |
+
POLICIES = {"approval_limits": (
|
| 27 |
+
"Delegated approval limits, per transaction: unit head up to $5,000.00; "
|
| 28 |
+
"director up to $25,000.00; commissioner up to $100,000.00. A single "
|
| 29 |
+
"obligation may not be divided across multiple payments to bring each "
|
| 30 |
+
"under a delegated limit. Instalment and progress-payment arrangements "
|
| 31 |
+
"are permitted only when authorised by a contract clause.")}
|
| 32 |
+
_MONTH = "2024-01"
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def _limit(rng):
|
| 36 |
+
return LIMITS_CENTS[pick(rng, sorted(LIMITS_CENTS), 1)[0]]
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def generate(seed: int, snapshot_root: Path, *, n_entries: int = 260,
|
| 40 |
+
out_dir: Path | None = None) -> TaskInstance:
|
| 41 |
+
n_special = sum(SPLIT_SIZES) + 3 + sum(INSTALMENT_SIZES) + N_NATURAL
|
| 42 |
+
raw = slice_entries(snapshot_root, task_id=TASK_ID, seed=seed,
|
| 43 |
+
n_entries=n_entries)
|
| 44 |
+
entries = {e.entry_id: e for e in raw}
|
| 45 |
+
# eligible rewrite targets: unsigned entries (with_amount contract)
|
| 46 |
+
eligible = sorted(eid for eid, e in entries.items()
|
| 47 |
+
if "signed_amount_cents" not in e.header)
|
| 48 |
+
if len(eligible) < n_special:
|
| 49 |
+
raise ValueError(f"only {len(eligible)} unsigned entries; "
|
| 50 |
+
f"need {n_special}")
|
| 51 |
+
rng = rng_for(TASK_ID, seed, "defects")
|
| 52 |
+
order = iter(pick(rng, eligible, n_special))
|
| 53 |
+
defects, claims, docs = [], {}, []
|
| 54 |
+
|
| 55 |
+
for gi, size in enumerate(SPLIT_SIZES, 1):
|
| 56 |
+
members = [next(order) for _ in range(size)]
|
| 57 |
+
limit = _limit(rng)
|
| 58 |
+
vendor = entries[members[0]].header["vendor_id"]
|
| 59 |
+
base_day = rng.randint(2, 18)
|
| 60 |
+
for eid in members:
|
| 61 |
+
e = with_amount(entries[eid],
|
| 62 |
+
int(limit * (0.88 + 0.09 * rng.random())))
|
| 63 |
+
day = min(base_day + rng.randint(0, 7), 28)
|
| 64 |
+
entries[eid] = dataclasses.replace(
|
| 65 |
+
e, header={**e.header, "vendor_id": vendor,
|
| 66 |
+
"transaction_date": f"{_MONTH}-{day:02d}"})
|
| 67 |
+
defects.append(DefectRecord(eid, "split_transaction", None, "flag"))
|
| 68 |
+
claims[eid] = {"split_group": gi}
|
| 69 |
+
|
| 70 |
+
for _ in range(3):
|
| 71 |
+
eid = next(order)
|
| 72 |
+
entries[eid] = with_amount(entries[eid],
|
| 73 |
+
int(_limit(rng) * (0.990 + 0.009 * rng.random())))
|
| 74 |
+
defects.append(DefectRecord(eid, "threshold_hugging", None, "flag"))
|
| 75 |
+
|
| 76 |
+
for si, size in enumerate(INSTALMENT_SIZES, 1):
|
| 77 |
+
members = [next(order) for _ in range(size)]
|
| 78 |
+
limit = _limit(rng)
|
| 79 |
+
vendor = entries[members[0]].header["vendor_id"]
|
| 80 |
+
amount = int(limit * (0.85 + 0.10 * rng.random()))
|
| 81 |
+
for j, eid in enumerate(members, 1):
|
| 82 |
+
e = with_amount(entries[eid], amount)
|
| 83 |
+
entries[eid] = dataclasses.replace(
|
| 84 |
+
e, header={**e.header, "vendor_id": vendor})
|
| 85 |
+
docs.append(contract_doc(
|
| 86 |
+
doc_id=f"CTR-{si:02d}-{j}", entry_id=eid,
|
| 87 |
+
f={"vendor": str(vendor),
|
| 88 |
+
"contract_number": f"CT-2023-{1000 + si}",
|
| 89 |
+
"n_instalments": size, "instalment_cents": amount,
|
| 90 |
+
"start_date": "2023-11-01",
|
| 91 |
+
"clause_text": (
|
| 92 |
+
f"Payment shall be made in {size} equal instalments "
|
| 93 |
+
"upon milestone acceptance, as authorised under "
|
| 94 |
+
"section 4.2 of this contract.")}))
|
| 95 |
+
|
| 96 |
+
for _ in range(N_NATURAL):
|
| 97 |
+
eid = next(order)
|
| 98 |
+
# cap at 98.5%: the hug band [0.99, 1.0) stays seeded-only (panel)
|
| 99 |
+
entries[eid] = with_amount(entries[eid],
|
| 100 |
+
int(_limit(rng) * (0.90 + 0.085 * rng.random())))
|
| 101 |
+
|
| 102 |
+
# Band guard (panel 2026-08-11): the hug band [0.99, 1.0) of any limit is
|
| 103 |
+
# reserved for seeded hugs. Untouched filler entries carry real DS-A
|
| 104 |
+
# amounts and can land there by chance; nudge any such entry down to 97%
|
| 105 |
+
# of that limit (still deep in the "natural near-limit" range, so it
|
| 106 |
+
# never becomes a giveaway shape of its own).
|
| 107 |
+
hug_ids = {d.entry_id for d in defects if d.defect_type == "threshold_hugging"}
|
| 108 |
+
contract_ids = {d.entry_id for d in docs}
|
| 109 |
+
for eid, e in list(entries.items()):
|
| 110 |
+
if eid in hug_ids or eid in contract_ids or "signed_amount_cents" in e.header:
|
| 111 |
+
continue
|
| 112 |
+
amt = e.header["total_debit_cents"]
|
| 113 |
+
for limit in LIMITS_CENTS.values():
|
| 114 |
+
if 0.99 * limit <= amt < limit:
|
| 115 |
+
entries[eid] = with_amount(e, int(limit * 0.97))
|
| 116 |
+
break
|
| 117 |
+
|
| 118 |
+
final = augment([entries[k] for k in sorted(entries)], period=7)
|
| 119 |
+
inst = Instance(task_id=TASK_ID, seed=seed, entries=tuple(final),
|
| 120 |
+
documents=tuple(sorted(docs, key=lambda d: d.doc_id)),
|
| 121 |
+
policies=dict(POLICIES), master_data={})
|
| 122 |
+
ho = HeldOut(defects=tuple(sorted(defects, key=lambda d: d.entry_id)),
|
| 123 |
+
required_docs=frozenset(d.doc_id for d in docs),
|
| 124 |
+
evidence_map={d.entry_id: frozenset({d.doc_id}) for d in docs},
|
| 125 |
+
claims=claims)
|
| 126 |
+
ti = TaskInstance(inst, ho)
|
| 127 |
+
if out_dir is not None:
|
| 128 |
+
write_instance(ti, out_dir, task_spec_path=spec_task_path(TASK_ID),
|
| 129 |
+
snapshot_id=snapshot_root.name,
|
| 130 |
+
knobs={"n_entries": n_entries})
|
| 131 |
+
return ti
|
app/src/je_validation/generator/je12.py
ADDED
|
@@ -0,0 +1,541 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-12: posting-behaviour anomalies (timing, user, role). Real posting-time
|
| 2 |
+
distribution (preserve_posting_time) overlaid with synthesised preparer
|
| 3 |
+
identity/roles; anomalies are novel high-volume users in an account, material
|
| 4 |
+
after-hours postings on the period's last day, and role-permission
|
| 5 |
+
violations. Distractors: the automated-interface batch and a real seasonal
|
| 6 |
+
spike (density alone, no defect)."""
|
| 7 |
+
from __future__ import annotations
|
| 8 |
+
|
| 9 |
+
import dataclasses
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
|
| 12 |
+
from je_validation.envir.instance import (
|
| 13 |
+
DefectRecord,
|
| 14 |
+
HeldOut,
|
| 15 |
+
Instance,
|
| 16 |
+
TaskInstance,
|
| 17 |
+
)
|
| 18 |
+
from je_validation.generator.l2common import amount_of, augment, lift, with_amount
|
| 19 |
+
from je_validation.generator.persist import spec_task_path, write_instance
|
| 20 |
+
from je_validation.generator.seeding import pick, rng_for
|
| 21 |
+
from je_validation.generator.slicing import slice_entries
|
| 22 |
+
|
| 23 |
+
TASK_ID = "JE-12"
|
| 24 |
+
DEFECT_COUNTS = {"after_hours": 3, "novel_user": 4, "role_violation": 3}
|
| 25 |
+
N_BATCH, N_SPIKE = 40, 30
|
| 26 |
+
SYS_USER = "sys_interface_01"
|
| 27 |
+
_LAST_DAY = "2024-01-31"
|
| 28 |
+
HIGH_VOLUME = 8
|
| 29 |
+
ROLE_PREFIX_LEN = 2 # DS-A GL accounts all share one leading digit (class
|
| 30 |
+
# "5" = expenditure); a 1-char prefix gives every user
|
| 31 |
+
# the same single bucket. 2 chars separates the real
|
| 32 |
+
# account groups (50, 51, 52, ...) into role scopes.
|
| 33 |
+
MAX_SYNTH_PEERS = 10 # hard bound on synthetic same-department cleanup
|
| 34 |
+
# peers per instance (generate() raises past this).
|
| 35 |
+
# DS-A's real department sizes put several
|
| 36 |
+
# departments over HIGH_VOLUME with no same-dept
|
| 37 |
+
# reassignment target at all (single-preparer, or
|
| 38 |
+
# every preparer independently high-volume); measured
|
| 39 |
+
# 6-9 needed across seeds 1-5 even after the
|
| 40 |
+
# interface batch drains as much as its fixed
|
| 41 |
+
# 40-entry budget allows -- see
|
| 42 |
+
# docs/notes/2026-08-12-je12-mint-bound.md.
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def _prefix_of(acct) -> str:
|
| 46 |
+
return str(acct)[:ROLE_PREFIX_LEN]
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def _dept_of_user(u: str) -> str:
|
| 50 |
+
return u[len("user_"):u.rfind("_")]
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
def _batch_account_priority(entries: dict) -> list[str]:
|
| 54 |
+
"""Account order for the interface batch, cheapest-relief first.
|
| 55 |
+
|
| 56 |
+
Two tiers of relief, computed from the RAW natural (pre-seeding,
|
| 57 |
+
pre-batch) preparer assignment:
|
| 58 |
+
|
| 59 |
+
1. ELIMINATION: an organically high-volume preparer with NO
|
| 60 |
+
same-department peer under HIGH_VOLUME (so same-department cleanup
|
| 61 |
+
later has nothing to reassign to) can be pulled entirely below
|
| 62 |
+
HIGH_VOLUME by draining enough of its OWN >=2-count account groups
|
| 63 |
+
into the batch -- cheapest (closest to the HIGH_VOLUME line) such
|
| 64 |
+
preparers first, so the fixed 40-entry budget clears as many whole
|
| 65 |
+
departments as possible instead of chasing individual accounts.
|
| 66 |
+
2. PAIRING: for whatever's left over, an account where some such
|
| 67 |
+
preparer has exactly one entry, paired with >=1 more entries of the
|
| 68 |
+
same account held anywhere else in the population -- relieves that
|
| 69 |
+
one entry's singleton status for free.
|
| 70 |
+
|
| 71 |
+
Both tiers only ever select accounts whose POPULATION-WIDE count is
|
| 72 |
+
>=2, so the batch itself never ends up with a singleton contribution.
|
| 73 |
+
Falls back to largest-remaining-account for whatever's still unfilled."""
|
| 74 |
+
per_user: dict[str, int] = {}
|
| 75 |
+
by_account: dict[str, list[str]] = {}
|
| 76 |
+
by_user_acct: dict[tuple, list[str]] = {}
|
| 77 |
+
for eid in sorted(entries):
|
| 78 |
+
e = entries[eid]
|
| 79 |
+
pid = e.header["preparer_id"]
|
| 80 |
+
acct = e.header["account"]
|
| 81 |
+
per_user[pid] = per_user.get(pid, 0) + 1
|
| 82 |
+
by_account.setdefault(acct, []).append(eid)
|
| 83 |
+
by_user_acct.setdefault((pid, acct), []).append(eid)
|
| 84 |
+
|
| 85 |
+
def dept_peer_volumes(u: str) -> list[int]:
|
| 86 |
+
dept = _dept_of_user(u)
|
| 87 |
+
return [per_user.get(v, 0) for v in per_user
|
| 88 |
+
if v != u and v.startswith(f"user_{dept}_")]
|
| 89 |
+
|
| 90 |
+
needing_help = sorted(
|
| 91 |
+
(u for u, c in per_user.items()
|
| 92 |
+
if c >= HIGH_VOLUME and u != SYS_USER
|
| 93 |
+
and all(v >= HIGH_VOLUME - 1 for v in dept_peer_volumes(u))),
|
| 94 |
+
key=lambda u: (per_user[u] - (HIGH_VOLUME - 1), u)) # cheapest first
|
| 95 |
+
|
| 96 |
+
elimination: list[str] = []
|
| 97 |
+
seen: set[str] = set()
|
| 98 |
+
for u in needing_help:
|
| 99 |
+
needed = per_user[u] - (HIGH_VOLUME - 1)
|
| 100 |
+
groups = sorted(
|
| 101 |
+
((acct, ids) for (pid, acct), ids in by_user_acct.items()
|
| 102 |
+
if pid == u and len(by_account[acct]) >= 2),
|
| 103 |
+
key=lambda kv: (len(kv[1]), kv[0]))
|
| 104 |
+
got = 0
|
| 105 |
+
for acct, ids in groups:
|
| 106 |
+
if got >= needed:
|
| 107 |
+
break
|
| 108 |
+
if acct not in seen:
|
| 109 |
+
elimination.append(acct)
|
| 110 |
+
seen.add(acct)
|
| 111 |
+
got += len(ids)
|
| 112 |
+
|
| 113 |
+
pairing = sorted(
|
| 114 |
+
(acct for (pid, acct), ids in by_user_acct.items()
|
| 115 |
+
if len(ids) == 1 and per_user.get(pid, 0) >= HIGH_VOLUME
|
| 116 |
+
and len(by_account[acct]) >= 2 and acct not in seen),
|
| 117 |
+
key=lambda a: (len(by_account[a]), a))
|
| 118 |
+
seen.update(pairing)
|
| 119 |
+
|
| 120 |
+
rest = sorted((a for a in by_account if a not in seen),
|
| 121 |
+
key=lambda a: (-len(by_account[a]), a))
|
| 122 |
+
return elimination + pairing + rest
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
def _singleton_free_batch(entries: dict, n: int) -> list[str]:
|
| 126 |
+
"""N entries for the automated-interface user, concentrated on a small
|
| 127 |
+
set of accounts so no account gets exactly one of its entries -- the
|
| 128 |
+
novelty detector (high-volume user, singleton account) must never fire
|
| 129 |
+
on the interface user itself (its 40 entries comfortably clear
|
| 130 |
+
HIGH_VOLUME). A real batch interface repeats the same handful of GL
|
| 131 |
+
accounts each run, so this also matches the real-world shape.
|
| 132 |
+
|
| 133 |
+
Account order (_batch_account_priority) spends the fixed budget on
|
| 134 |
+
relieving organic high-volume/no-low-volume-peer preparers first --
|
| 135 |
+
free cleanup, since those entries never enter entries_by_user at all --
|
| 136 |
+
before falling back to the largest remaining accounts to fill the rest."""
|
| 137 |
+
by_account: dict[str, list[str]] = {}
|
| 138 |
+
for eid in sorted(entries):
|
| 139 |
+
by_account.setdefault(entries[eid].header["account"], []).append(eid)
|
| 140 |
+
order = _batch_account_priority(entries)
|
| 141 |
+
# Phase 1: take accounts WHOLE, in `order`, while they still fit --
|
| 142 |
+
# never a partial take here, so no account is ever truncated down to a
|
| 143 |
+
# singleton contribution by running low on budget.
|
| 144 |
+
taken: dict[str, list[str]] = {}
|
| 145 |
+
total = 0
|
| 146 |
+
for acct in order:
|
| 147 |
+
ids = sorted(by_account[acct])
|
| 148 |
+
if len(ids) >= 2 and total + len(ids) <= n:
|
| 149 |
+
taken[acct] = ids
|
| 150 |
+
total += len(ids)
|
| 151 |
+
# Phase 2: close the remainder r = n - total (0 <= r < any remaining
|
| 152 |
+
# account's full size, else phase 1 would have taken it). r == 0: done.
|
| 153 |
+
# r >= 2: one untaken account of size >= r supplies exactly r entries
|
| 154 |
+
# (still >= 2, safe). r == 1: no account can supply exactly one entry
|
| 155 |
+
# without becoming a singleton contribution, so first free up a single
|
| 156 |
+
# slot by trimming one entry off an already-taken account that has
|
| 157 |
+
# slack (size >= 3, so it stays >= 2), turning r == 1 into r == 2.
|
| 158 |
+
r = n - total
|
| 159 |
+
if r == 1:
|
| 160 |
+
shrink = next((a for a in sorted(taken) if len(taken[a]) >= 3), None)
|
| 161 |
+
if shrink is not None:
|
| 162 |
+
taken[shrink] = taken[shrink][:-1]
|
| 163 |
+
total -= 1
|
| 164 |
+
r = 2
|
| 165 |
+
if r >= 2:
|
| 166 |
+
fill = sorted((a for a in by_account
|
| 167 |
+
if a not in taken and len(by_account[a]) >= r),
|
| 168 |
+
key=lambda a: (len(by_account[a]), a))
|
| 169 |
+
if fill:
|
| 170 |
+
taken[fill[0]] = sorted(by_account[fill[0]])[:r]
|
| 171 |
+
total += r
|
| 172 |
+
if total != n:
|
| 173 |
+
raise ValueError(f"could not assemble a {n}-entry singleton-free "
|
| 174 |
+
"interface batch from this slice")
|
| 175 |
+
return sorted(x for ids in taken.values() for x in ids)
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
def generate(seed: int, snapshot_root: Path, *, n_entries: int = 320,
|
| 179 |
+
out_dir: Path | None = None) -> TaskInstance:
|
| 180 |
+
raw = slice_entries(snapshot_root, task_id=TASK_ID, seed=seed,
|
| 181 |
+
n_entries=n_entries, preserve_posting_time=True)
|
| 182 |
+
entries = {e.entry_id: lift(e, "account", "department") for e in raw}
|
| 183 |
+
rng = rng_for(TASK_ID, seed, "defects")
|
| 184 |
+
|
| 185 |
+
# --- interface batch: 40 entries, one system user, same-second cluster,
|
| 186 |
+
# concentrated on a few accounts (never a singleton contribution).
|
| 187 |
+
batch = _singleton_free_batch(entries, N_BATCH)
|
| 188 |
+
batch_set = set(batch)
|
| 189 |
+
t0 = f"{_LAST_DAY}T22:0{rng.randint(0, 4)}:1{rng.randint(0, 9)}"
|
| 190 |
+
for i, eid in enumerate(sorted(batch)):
|
| 191 |
+
e = entries[eid]
|
| 192 |
+
entries[eid] = dataclasses.replace(e, header={
|
| 193 |
+
**e.header, "preparer_id": SYS_USER, "entry_source": "interface",
|
| 194 |
+
"posting_ts": f"{t0}.{i:06d}"})
|
| 195 |
+
|
| 196 |
+
# --- bookkeeping: entries_by_user is the single source of truth for who
|
| 197 |
+
# prepared what; account-prefix permission sets are always DERIVED from
|
| 198 |
+
# it (never separately tracked), so a reassignment can never leave a
|
| 199 |
+
# stale permission behind.
|
| 200 |
+
def dept_of(e):
|
| 201 |
+
return e.header["department"]
|
| 202 |
+
|
| 203 |
+
entries_by_user: dict[str, list[str]] = {}
|
| 204 |
+
for eid, e in sorted(entries.items()):
|
| 205 |
+
if eid not in batch_set:
|
| 206 |
+
entries_by_user.setdefault(e.header["preparer_id"], []).append(eid)
|
| 207 |
+
|
| 208 |
+
def prefixes_of(u: str) -> set[str]:
|
| 209 |
+
return {_prefix_of(entries[x].header["account"]) for x in entries_by_user.get(u, ())}
|
| 210 |
+
|
| 211 |
+
def same_dept_users(dept):
|
| 212 |
+
return sorted(u for u in entries_by_user
|
| 213 |
+
if u.startswith(f"user_{dept}_"))
|
| 214 |
+
|
| 215 |
+
def _safe_volume(u: str) -> int:
|
| 216 |
+
"""u's entry count restricted to accounts where u ALREADY has >=2
|
| 217 |
+
entries. The singleton-cleanup pass (below) strips every OTHER
|
| 218 |
+
account down to nothing for a high-volume user (each of those
|
| 219 |
+
singletons would itself be a false novelty signal), so a donor is
|
| 220 |
+
only durably high-volume in the FINAL population if its non-novel
|
| 221 |
+
activity clears HIGH_VOLUME on safe (non-singleton) accounts alone."""
|
| 222 |
+
counts: dict[str, int] = {}
|
| 223 |
+
for x in entries_by_user.get(u, ()):
|
| 224 |
+
acct = entries[x].header["account"]
|
| 225 |
+
counts[acct] = counts.get(acct, 0) + 1
|
| 226 |
+
return sum(c for c in counts.values() if c >= 2)
|
| 227 |
+
|
| 228 |
+
def _ensure_dept_donor(dept: str) -> None:
|
| 229 |
+
"""If no EXISTING same-dept user already clears the safe-volume bar,
|
| 230 |
+
consolidate that department's own non-singleton activity onto its
|
| 231 |
+
highest-volume existing user -- never minting, never touching
|
| 232 |
+
another department. This is the department's real users trading
|
| 233 |
+
entries among themselves, same as the cleanup pass below; if the
|
| 234 |
+
department's total safe volume genuinely can't clear the bar, this
|
| 235 |
+
is a no-op and the caller skips the mark instead."""
|
| 236 |
+
peers = same_dept_users(dept)
|
| 237 |
+
if any(_safe_volume(v) >= HIGH_VOLUME - 1 for v in peers):
|
| 238 |
+
return
|
| 239 |
+
by_acct: dict[str, list[str]] = {}
|
| 240 |
+
for v in peers:
|
| 241 |
+
for eid in entries_by_user.get(v, ()):
|
| 242 |
+
by_acct.setdefault(entries[eid].header["account"], []).append(eid)
|
| 243 |
+
poolable = sorted(eid for acct, ids in sorted(by_acct.items())
|
| 244 |
+
if len(ids) >= 2 for eid in sorted(ids))
|
| 245 |
+
if len(poolable) < HIGH_VOLUME - 1:
|
| 246 |
+
return # structurally infeasible; caller skips
|
| 247 |
+
target = max(peers, key=lambda v: (len(entries_by_user.get(v, ())), v))
|
| 248 |
+
for eid in poolable:
|
| 249 |
+
if entries[eid].header["preparer_id"] != target:
|
| 250 |
+
reassign(eid, target)
|
| 251 |
+
|
| 252 |
+
def _drop(eid: str) -> None:
|
| 253 |
+
old_owner = entries[eid].header["preparer_id"]
|
| 254 |
+
if old_owner in entries_by_user and eid in entries_by_user[old_owner]:
|
| 255 |
+
entries_by_user[old_owner].remove(eid)
|
| 256 |
+
|
| 257 |
+
def reassign(eid: str, new_owner: str) -> None:
|
| 258 |
+
"""Legitimate posting activity: the new owner's permitted-prefix set
|
| 259 |
+
grows to include this entry's account (novel_user donors, cleanup
|
| 260 |
+
reassignment)."""
|
| 261 |
+
_drop(eid)
|
| 262 |
+
entries_by_user.setdefault(new_owner, []).append(eid)
|
| 263 |
+
entries[eid] = dataclasses.replace(
|
| 264 |
+
entries[eid], header={**entries[eid].header, "preparer_id": new_owner})
|
| 265 |
+
|
| 266 |
+
def reassign_violating(eid: str, new_owner: str) -> None:
|
| 267 |
+
"""Role violation: the entry's preparer changes but is deliberately
|
| 268 |
+
NOT added to the new owner's entries_by_user, so their permitted
|
| 269 |
+
list stays exactly what it was pre-seeding — the prefix must remain
|
| 270 |
+
absent, or this stops being a violation."""
|
| 271 |
+
_drop(eid)
|
| 272 |
+
entries[eid] = dataclasses.replace(
|
| 273 |
+
entries[eid], header={**entries[eid].header, "preparer_id": new_owner})
|
| 274 |
+
|
| 275 |
+
# --- seeded defects on non-batch entries. marks draws the ENTIRE
|
| 276 |
+
# remaining pool as one random permutation (not a fixed oversample) so
|
| 277 |
+
# the low hit-rate of the donor/villain existence checks below rarely
|
| 278 |
+
# exhausts the iterator; each category still skips draws that don't
|
| 279 |
+
# qualify and stops once it has placed enough.
|
| 280 |
+
pool = [eid for eid in sorted(entries) if eid not in batch_set]
|
| 281 |
+
marks = iter(pick(rng, pool, len(pool)))
|
| 282 |
+
|
| 283 |
+
def _draw(category: str) -> str:
|
| 284 |
+
"""next(marks), typed: a genuinely exhausted pool (this seed's
|
| 285 |
+
department layout can't supply enough eligible candidates for
|
| 286 |
+
`category`) is a loud, specific failure -- never a bare
|
| 287 |
+
StopIteration -- so it's diagnosable per (task, seed, category)."""
|
| 288 |
+
try:
|
| 289 |
+
return next(marks)
|
| 290 |
+
except StopIteration:
|
| 291 |
+
raise ValueError(
|
| 292 |
+
f"{TASK_ID} seed {seed}: exhausted the candidate pool while "
|
| 293 |
+
f"seeding '{category}' defects") from None
|
| 294 |
+
|
| 295 |
+
defects = []
|
| 296 |
+
placed = 0
|
| 297 |
+
while placed < DEFECT_COUNTS["novel_user"]:
|
| 298 |
+
eid = _draw("novel_user")
|
| 299 |
+
e = entries[eid]
|
| 300 |
+
acct = e.header["account"]
|
| 301 |
+
dept = dept_of(e)
|
| 302 |
+
_ensure_dept_donor(dept) # consolidate existing peers
|
| 303 |
+
donor = next(
|
| 304 |
+
(u for u in same_dept_users(dept)
|
| 305 |
+
if _safe_volume(u) >= HIGH_VOLUME - 1
|
| 306 |
+
and all(entries[x].header["account"] != acct
|
| 307 |
+
for x in entries_by_user[u])), None)
|
| 308 |
+
if donor is None:
|
| 309 |
+
continue # this dept can't host one; skip
|
| 310 |
+
reassign(eid, donor) # permit (novel != violating)
|
| 311 |
+
defects.append(DefectRecord(eid, "novel_user", None, "flag"))
|
| 312 |
+
placed += 1
|
| 313 |
+
|
| 314 |
+
amounts = sorted(amount_of(x) for x in entries.values())
|
| 315 |
+
p90 = amounts[int(0.9 * len(amounts))]
|
| 316 |
+
for _ in range(DEFECT_COUNTS["after_hours"]):
|
| 317 |
+
eid = _draw("after_hours")
|
| 318 |
+
e = with_amount(entries[eid], int(p90 * 1.5))
|
| 319 |
+
ts = (f"{_LAST_DAY}T2{rng.randint(1, 3)}:"
|
| 320 |
+
f"{rng.randint(0, 59):02d}:{rng.randint(0, 59):02d}.000000")
|
| 321 |
+
entries[eid] = dataclasses.replace(
|
| 322 |
+
e, header={**e.header, "posting_ts": ts, "entry_source": "manual"})
|
| 323 |
+
defects.append(DefectRecord(eid, "after_hours", None, "flag"))
|
| 324 |
+
|
| 325 |
+
placed = 0
|
| 326 |
+
while placed < DEFECT_COUNTS["role_violation"]:
|
| 327 |
+
eid = _draw("role_violation")
|
| 328 |
+
e = entries[eid]
|
| 329 |
+
pfx = _prefix_of(e.header["account"])
|
| 330 |
+
villain = next((u for u in same_dept_users(dept_of(e))
|
| 331 |
+
if pfx not in prefixes_of(u)), None)
|
| 332 |
+
if villain is None:
|
| 333 |
+
continue
|
| 334 |
+
reassign_violating(eid, villain)
|
| 335 |
+
defects.append(DefectRecord(eid, "role_violation", None, "flag"))
|
| 336 |
+
placed += 1
|
| 337 |
+
|
| 338 |
+
seeded_ids = {d.entry_id for d in defects}
|
| 339 |
+
|
| 340 |
+
# --- singleton-cleanup pass: every high-volume user's clean singleton
|
| 341 |
+
# (account, user) pair gets reassigned so the novelty detector isolates
|
| 342 |
+
# only seeded entries. Real DS-A departments are frequently
|
| 343 |
+
# single-preparer, so "another same-dept user with existing activity in
|
| 344 |
+
# the account" often doesn't exist; the tiers below exhaust every
|
| 345 |
+
# existing-user option before ever minting a new identity:
|
| 346 |
+
# 1. an existing same-dept peer who already has >=2 entries in this
|
| 347 |
+
# account (absorbing one more can never leave THEM at a singleton)
|
| 348 |
+
# 2. an existing same-dept peer who stays comfortably below
|
| 349 |
+
# HIGH_VOLUME even after gaining this entry (give-away)
|
| 350 |
+
# 3. a DIFFERENT existing entry of the SAME account, currently held
|
| 351 |
+
# by another same-dept user, pulled onto u instead (u ends up with
|
| 352 |
+
# 2 in that account) -- safe whenever its current holder isn't
|
| 353 |
+
# itself high-volume, so losing it can never create a fresh
|
| 354 |
+
# singleton that matters
|
| 355 |
+
# 4. only if 1-3 all fail (typically a genuinely single-preparer
|
| 356 |
+
# department, or a multi-preparer one where every member is
|
| 357 |
+
# independently high-volume): mint one new same-department id, in
|
| 358 |
+
# the SAME `user_<dept>_<k>` format the real preparer pool uses
|
| 359 |
+
# (continuing its numbering) -- indistinguishable from a real id,
|
| 360 |
+
# never a seeded defect's preparer (only clean singletons reach
|
| 361 |
+
# here), and hard-bounded per instance (see MAX_SYNTH_PEERS,
|
| 362 |
+
# _new_peer). The interface-batch construction above already
|
| 363 |
+
# drains as much of this pressure as its fixed 40-entry budget
|
| 364 |
+
# allows (_batch_account_priority); DS-A seed 5's own department
|
| 365 |
+
# layout has 3-4 single-preparer departments independently
|
| 366 |
+
# clearing HIGH_VOLUME (docs/notes/2026-08-12-je12-mint-bound.md),
|
| 367 |
+
# so a handful of mints past what the batch can absorb is a real
|
| 368 |
+
# floor of this dataset, not a tuning gap.
|
| 369 |
+
# Fixed-point: a fix can itself create a fresh singleton elsewhere
|
| 370 |
+
# (moving one of exactly two entries away), so this rescans until a
|
| 371 |
+
# full pass makes no change. Deterministic throughout; capped so a
|
| 372 |
+
# genuine non-convergence fails loud instead of looping forever.
|
| 373 |
+
def _acct_count(v: str, acct: str) -> int:
|
| 374 |
+
return sum(1 for x in entries_by_user.get(v, ())
|
| 375 |
+
if entries[x].header["account"] == acct)
|
| 376 |
+
|
| 377 |
+
# role_violation entries are deliberately kept OUT of entries_by_user (so
|
| 378 |
+
# the villain's derived permitted list never grows to cover them), but
|
| 379 |
+
# they DO count toward the villain's real final per_user total (the
|
| 380 |
+
# invariant/test below recomputes volume from entries.values()
|
| 381 |
+
# directly). A villain otherwise just under HIGH_VOLUME would be
|
| 382 |
+
# silently skipped here and its OTHER organic singletons would go
|
| 383 |
+
# unfixed, so the threshold check below adds this back in.
|
| 384 |
+
villain_extra: dict[str, int] = {}
|
| 385 |
+
for d in defects:
|
| 386 |
+
if d.defect_type == "role_violation":
|
| 387 |
+
villain = entries[d.entry_id].header["preparer_id"]
|
| 388 |
+
villain_extra[villain] = villain_extra.get(villain, 0) + 1
|
| 389 |
+
|
| 390 |
+
def _true_volume(u: str) -> int:
|
| 391 |
+
return len(entries_by_user.get(u, ())) + villain_extra.get(u, 0)
|
| 392 |
+
|
| 393 |
+
synth_ids: set[str] = set()
|
| 394 |
+
|
| 395 |
+
def _new_peer(dept: str) -> str:
|
| 396 |
+
prefix = f"user_{dept}_"
|
| 397 |
+
existing_k = [int(v[len(prefix):]) for v in same_dept_users(dept)
|
| 398 |
+
if v[len(prefix):].isdigit()]
|
| 399 |
+
peer = f"{prefix}{(max(existing_k) + 1) if existing_k else 1}"
|
| 400 |
+
synth_ids.add(peer)
|
| 401 |
+
if len(synth_ids) > MAX_SYNTH_PEERS:
|
| 402 |
+
raise ValueError(
|
| 403 |
+
f"{TASK_ID} seed {seed}: singleton-cleanup needed more than "
|
| 404 |
+
f"{MAX_SYNTH_PEERS} synthetic peers ({sorted(synth_ids)}) -- "
|
| 405 |
+
"this seed's department layout exceeds the bound")
|
| 406 |
+
return peer
|
| 407 |
+
|
| 408 |
+
for _pass in range(len(entries) + 1):
|
| 409 |
+
changed = False
|
| 410 |
+
for u in sorted(entries_by_user):
|
| 411 |
+
if _true_volume(u) < HIGH_VOLUME:
|
| 412 |
+
continue
|
| 413 |
+
by_acct: dict[str, list[str]] = {}
|
| 414 |
+
for eid in list(entries_by_user[u]):
|
| 415 |
+
by_acct.setdefault(entries[eid].header["account"], []).append(eid)
|
| 416 |
+
for acct, eids in sorted(by_acct.items()):
|
| 417 |
+
if len(eids) != 1:
|
| 418 |
+
continue
|
| 419 |
+
eid = eids[0]
|
| 420 |
+
if eid in seeded_ids:
|
| 421 |
+
continue
|
| 422 |
+
dept = dept_of(entries[eid])
|
| 423 |
+
# role_violation villains are never a recipient here: giving
|
| 424 |
+
# them ANY entry (any account) could grow their permitted
|
| 425 |
+
# 2-char prefix set into covering their own violated
|
| 426 |
+
# account's prefix, silently un-violating it.
|
| 427 |
+
same_dept = [v for v in same_dept_users(dept)
|
| 428 |
+
if v not in villain_extra]
|
| 429 |
+
other = next((v for v in same_dept
|
| 430 |
+
if v != u and _acct_count(v, acct) >= 2), None)
|
| 431 |
+
if other is None:
|
| 432 |
+
other = next((v for v in same_dept if v != u
|
| 433 |
+
and _true_volume(v) < HIGH_VOLUME - 1), None)
|
| 434 |
+
if other is not None:
|
| 435 |
+
reassign(eid, other)
|
| 436 |
+
changed = True
|
| 437 |
+
continue
|
| 438 |
+
pull = None
|
| 439 |
+
if u not in villain_extra: # same reason, u is the recipient
|
| 440 |
+
pull = next(
|
| 441 |
+
(x for x in sorted(entries)
|
| 442 |
+
if x not in batch_set and x != eid and x not in seeded_ids
|
| 443 |
+
and entries[x].header["account"] == acct
|
| 444 |
+
and dept_of(entries[x]) == dept
|
| 445 |
+
and entries[x].header["preparer_id"] != u
|
| 446 |
+
and _true_volume(entries[x].header["preparer_id"])
|
| 447 |
+
< HIGH_VOLUME), None)
|
| 448 |
+
if pull is not None:
|
| 449 |
+
reassign(pull, u)
|
| 450 |
+
changed = True
|
| 451 |
+
continue
|
| 452 |
+
reassign(eid, _new_peer(dept))
|
| 453 |
+
changed = True
|
| 454 |
+
if not changed:
|
| 455 |
+
break
|
| 456 |
+
else:
|
| 457 |
+
raise RuntimeError("singleton-cleanup pass did not converge")
|
| 458 |
+
|
| 459 |
+
# --- seasonal spike: 30 entries of the most common department, daytime
|
| 460 |
+
# manual times — pure density, no defect.
|
| 461 |
+
dept_counts: dict[str, int] = {}
|
| 462 |
+
for e in entries.values():
|
| 463 |
+
if e.header["preparer_id"] != SYS_USER:
|
| 464 |
+
dept_counts[e.header["department"]] = dept_counts.get(
|
| 465 |
+
e.header["department"], 0) + 1
|
| 466 |
+
spike_dept = sorted(dept_counts, key=lambda d: (-dept_counts[d], d))[0]
|
| 467 |
+
spike_pool = sorted(eid for eid, e in entries.items()
|
| 468 |
+
if eid not in batch_set and eid not in seeded_ids
|
| 469 |
+
and e.header["department"] == spike_dept)
|
| 470 |
+
spike = pick(rng, spike_pool, min(N_SPIKE, len(spike_pool)))
|
| 471 |
+
for eid in spike:
|
| 472 |
+
e = entries[eid]
|
| 473 |
+
ts = (f"{_LAST_DAY}T1{rng.randint(0, 8)}:"
|
| 474 |
+
f"{rng.randint(0, 59):02d}:{rng.randint(0, 59):02d}.000000")
|
| 475 |
+
entries[eid] = dataclasses.replace(
|
| 476 |
+
e, header={**e.header, "posting_ts": ts, "entry_source": "manual"})
|
| 477 |
+
|
| 478 |
+
# --- derive role NAMES from the FINAL entries_by_user assignment. A
|
| 479 |
+
# role_violation villain can end up with ZERO organic entries left --
|
| 480 |
+
# the cleanup pass (after seeding) may drain the rest of their volume
|
| 481 |
+
# elsewhere, since it only ever sees their real entries_by_user
|
| 482 |
+
# membership, not the deliberately-excluded violating entry (reassign_
|
| 483 |
+
# violating). villain_extra is exactly that set; include them here too
|
| 484 |
+
# (empty permitted-prefix list, which is the correct representation --
|
| 485 |
+
# a villain with no organic footprint permits nothing).
|
| 486 |
+
users = {u: {"role": f"clerk_{'-'.join(sorted(prefixes_of(u)))}",
|
| 487 |
+
"permitted_account_prefixes": sorted(prefixes_of(u)),
|
| 488 |
+
"system_account": False}
|
| 489 |
+
for u in set(entries_by_user) | set(villain_extra)
|
| 490 |
+
if entries_by_user.get(u) or u in villain_extra}
|
| 491 |
+
users[SYS_USER] = {"role": "system_interface",
|
| 492 |
+
"permitted_account_prefixes": [],
|
| 493 |
+
"system_account": True}
|
| 494 |
+
|
| 495 |
+
# --- invariants (assert, not hope)
|
| 496 |
+
assert len(synth_ids) <= MAX_SYNTH_PEERS, (
|
| 497 |
+
"too many synthetic cleanup peers", sorted(synth_ids))
|
| 498 |
+
for d in defects:
|
| 499 |
+
assert entries[d.entry_id].header["preparer_id"] not in synth_ids, (
|
| 500 |
+
"a synthetic peer ended up as a seeded defect's preparer", d.entry_id)
|
| 501 |
+
assert sum(1 for e in entries.values()
|
| 502 |
+
if e.header["preparer_id"] == SYS_USER) == N_BATCH
|
| 503 |
+
for eid, e in entries.items():
|
| 504 |
+
pid = e.header["preparer_id"]
|
| 505 |
+
if pid == SYS_USER or eid in seeded_ids:
|
| 506 |
+
continue
|
| 507 |
+
prefixes = users[pid]["permitted_account_prefixes"]
|
| 508 |
+
assert any(str(e.header["account"]).startswith(p) for p in prefixes), (
|
| 509 |
+
"cleanup pass left a clean entry that violates its preparer's role", eid)
|
| 510 |
+
for e in entries.values():
|
| 511 |
+
pid = e.header["preparer_id"]
|
| 512 |
+
if pid.startswith("user_"):
|
| 513 |
+
assert pid.startswith(f"user_{e.header['department']}_"), (
|
| 514 |
+
"preparer department mismatch", e.entry_id, pid)
|
| 515 |
+
|
| 516 |
+
per_user: dict[str, int] = {}
|
| 517 |
+
by_acct_user: dict[tuple, int] = {}
|
| 518 |
+
for e in entries.values():
|
| 519 |
+
pid = e.header["preparer_id"]
|
| 520 |
+
per_user[pid] = per_user.get(pid, 0) + 1
|
| 521 |
+
for e in entries.values():
|
| 522 |
+
key = (e.header["account"], e.header["preparer_id"])
|
| 523 |
+
by_acct_user[key] = by_acct_user.get(key, 0) + 1
|
| 524 |
+
detected = {eid for eid, e in entries.items()
|
| 525 |
+
if per_user[e.header["preparer_id"]] >= HIGH_VOLUME
|
| 526 |
+
and by_acct_user[(e.header["account"], e.header["preparer_id"])] == 1}
|
| 527 |
+
assert detected <= seeded_ids, (
|
| 528 |
+
"novelty detector picks up a clean entry", sorted(detected - seeded_ids))
|
| 529 |
+
|
| 530 |
+
out_entries = augment(list(entries.values()), period=7)
|
| 531 |
+
inst = Instance(task_id=TASK_ID, seed=seed, entries=tuple(sorted(
|
| 532 |
+
out_entries, key=lambda e: e.entry_id)), documents=(), policies={},
|
| 533 |
+
master_data={"user": users})
|
| 534 |
+
ho = HeldOut(defects=tuple(sorted(defects, key=lambda d: d.entry_id)),
|
| 535 |
+
required_docs=frozenset(), evidence_map={}, claims={})
|
| 536 |
+
ti = TaskInstance(inst, ho)
|
| 537 |
+
if out_dir is not None:
|
| 538 |
+
write_instance(ti, out_dir, task_spec_path=spec_task_path(TASK_ID),
|
| 539 |
+
snapshot_id=snapshot_root.name,
|
| 540 |
+
knobs={"n_entries": n_entries})
|
| 541 |
+
return ti
|
app/src/je_validation/generator/je13.py
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-13: rare attribute-combination detection (local + global anomalies,
|
| 2 |
+
program-launch distractor). Seeded against DS-A's own joint history
|
| 3 |
+
(account x department x vendor_type x expense_category, FY2020-FY2026).
|
| 4 |
+
|
| 5 |
+
Construction follows docs/spec/tasks/JE-13.json as amended three times against
|
| 6 |
+
real-data feasibility findings (task-7-amendment.md, task-7-amendment-v2.md,
|
| 7 |
+
the v3 addendum appended to the latter):
|
| 8 |
+
- seeded locals need ALL FOUR marginals >= T_HI (not just COMMON) -- a
|
| 9 |
+
fairness band, so any agent heuristic cutoff in [COMMON, T_HI] recovers
|
| 10 |
+
exactly the seeded set;
|
| 11 |
+
- the "clean lookalike" cleanup is a single-attribute DEMOTION pass (round
|
| 12 |
+
2), not a donor-merge -- provably cannot create new lookalikes;
|
| 13 |
+
- the demotion pass has NO historical-profile check (round 3): agents have
|
| 14 |
+
no tool over the 7-year history, so joint-combo novelty is agent-invisible
|
| 15 |
+
and doesn't need protecting. What DOES need protecting is (a) never
|
| 16 |
+
reproducing a seeded/cohort combo, (b) never touching a seeded global's
|
| 17 |
+
signature value.
|
| 18 |
+
- a protected (attr, value) pair -- one the 8 seeded locals rely on -- MAY
|
| 19 |
+
be decremented (round 4/v3) as long as its live count stays >= T_HI
|
| 20 |
+
afterward; unprotected attrs are still tried first (fixed order), then
|
| 21 |
+
protected-but-guarded ones in the same order. This unblocks lookalikes
|
| 22 |
+
whose four values all happen to coincide with protected values (the
|
| 23 |
+
round-3 per-seed residuals) while providing the same T_HI-floor proof
|
| 24 |
+
as before.
|
| 25 |
+
- real DS-A cardinalities can still leave a seed unconstructible in
|
| 26 |
+
principle; generate() raises InfeasibleSeed rather than silently emit an
|
| 27 |
+
instance that fails its own guards, but in practice seeds 1-5 all
|
| 28 |
+
construct cleanly under this rule (see test_je13.py).
|
| 29 |
+
"""
|
| 30 |
+
from __future__ import annotations
|
| 31 |
+
|
| 32 |
+
import dataclasses
|
| 33 |
+
import itertools
|
| 34 |
+
from collections import Counter
|
| 35 |
+
from functools import lru_cache
|
| 36 |
+
from pathlib import Path
|
| 37 |
+
|
| 38 |
+
import polars as pl
|
| 39 |
+
|
| 40 |
+
from je_validation.envir.instance import (
|
| 41 |
+
DefectRecord,
|
| 42 |
+
HeldOut,
|
| 43 |
+
Instance,
|
| 44 |
+
TaskInstance,
|
| 45 |
+
)
|
| 46 |
+
from je_validation.generator.l2common import augment, lift
|
| 47 |
+
from je_validation.generator.persist import spec_task_path, write_instance
|
| 48 |
+
from je_validation.generator.seeding import pick, rng_for
|
| 49 |
+
from je_validation.generator.slicing import slice_entries
|
| 50 |
+
from je_validation.ingest.ds_a.load import scan_ds_a
|
| 51 |
+
|
| 52 |
+
TASK_ID = "JE-13"
|
| 53 |
+
ATTRS = ("account", "department", "vendor_type", "expense_category")
|
| 54 |
+
# demotion attribute priority: highest-cardinality (least likely to collide
|
| 55 |
+
# with a seeded local's PROTECTED value) tried first -- account.py precedent
|
| 56 |
+
# (largest pool first) is the same intuition as slicing's biggest-first picks
|
| 57 |
+
_DEMOTE_ORDER = ("account", "expense_category", "department", "vendor_type")
|
| 58 |
+
DEFECT_COUNTS = {"local_anomaly": 8, "global_anomaly": 4}
|
| 59 |
+
N_PROGRAM = 15
|
| 60 |
+
_N_PROGRAM_COMBOS = 5
|
| 61 |
+
_PROGRAM_GROUP_SIZE = N_PROGRAM // _N_PROGRAM_COMBOS
|
| 62 |
+
PROGRAM_CODE = "PRG-2024-NEW"
|
| 63 |
+
|
| 64 |
+
COMMON = 5 # instance-marginal "common" threshold: demotion trigger + guard
|
| 65 |
+
T_HI = 8 # seeded-local marginal floor (fairness-band ceiling, amendment)
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
class InfeasibleSeed(ValueError):
|
| 69 |
+
"""A (task_id, seed) cannot satisfy JE-13's construction invariants
|
| 70 |
+
under real DS-A cardinalities (amendment v1/v2). Try a different seed."""
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
@lru_cache(maxsize=2)
|
| 74 |
+
def _profile(snapshot: str):
|
| 75 |
+
lf = scan_ds_a(Path(snapshot)).select(list(ATTRS))
|
| 76 |
+
joint = lf.group_by(list(ATTRS)).len().collect()
|
| 77 |
+
joint_keys = set(map(tuple, joint.select(list(ATTRS)).iter_rows()))
|
| 78 |
+
marginals = {a: dict(joint.group_by(a).agg(pl.col("len").sum()).iter_rows())
|
| 79 |
+
for a in ATTRS}
|
| 80 |
+
return joint_keys, marginals
|
| 81 |
+
|
| 82 |
+
|
| 83 |
+
def _inject_combo(entries: dict, eid: str, combo: tuple) -> None:
|
| 84 |
+
"""Rewrite an entry's ATTRS + the D lines' account/department (line/header
|
| 85 |
+
mismatch would be a tell; the C leg's coding is left as postingise set it,
|
| 86 |
+
same as any naturally-occurring multi-department entry -- amendment note)."""
|
| 87 |
+
e = entries[eid]
|
| 88 |
+
header = {**e.header, **dict(zip(ATTRS, combo, strict=True))}
|
| 89 |
+
lines = tuple({**ln, "account": combo[0], "department": combo[1]}
|
| 90 |
+
if ln["side"] == "D" else ln for ln in e.lines)
|
| 91 |
+
entries[eid] = dataclasses.replace(e, header=header, lines=lines)
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
def _inject_program(entries: dict, eid: str, combo: tuple) -> None:
|
| 95 |
+
_inject_combo(entries, eid, combo)
|
| 96 |
+
e = entries[eid]
|
| 97 |
+
header = {**e.header, "program": PROGRAM_CODE}
|
| 98 |
+
lines = tuple({**ln, "program": PROGRAM_CODE} if ln["side"] == "D" else ln
|
| 99 |
+
for ln in e.lines)
|
| 100 |
+
entries[eid] = dataclasses.replace(e, header=header, lines=lines)
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
def _shuffled_product(pools: dict, rng) -> list[tuple]:
|
| 104 |
+
combos = sorted(itertools.product(*(pools[a] for a in ATTRS)))
|
| 105 |
+
rng.shuffle(combos)
|
| 106 |
+
return combos
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
def _local_candidates(joint_keys, instance_entries, rng):
|
| 110 |
+
"""Instance-common (>= T_HI, amendment's fairness-band floor) values,
|
| 111 |
+
snapshot-absent joints (panel: snapshot-quartile values are routinely
|
| 112 |
+
rare in a 600-row slice, so the pool must be instance-derived)."""
|
| 113 |
+
inst_marg = {a: Counter(e.header[a] for e in instance_entries) for a in ATTRS}
|
| 114 |
+
common = {a: sorted(v for v, n in inst_marg[a].items() if n >= T_HI and v is not None)
|
| 115 |
+
for a in ATTRS}
|
| 116 |
+
combos = sorted(itertools.product(*(common[a] for a in ATTRS)))
|
| 117 |
+
rng.shuffle(combos)
|
| 118 |
+
return (c for c in combos if c not in joint_keys)
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
def generate(seed: int, snapshot_root: Path, *, n_entries: int = 600,
|
| 122 |
+
out_dir: Path | None = None) -> TaskInstance:
|
| 123 |
+
joint_keys, marginals = _profile(str(snapshot_root))
|
| 124 |
+
base = [lift(e, "account", "department", "program")
|
| 125 |
+
for e in augment(
|
| 126 |
+
slice_entries(snapshot_root, task_id=TASK_ID, seed=seed,
|
| 127 |
+
n_entries=n_entries,
|
| 128 |
+
extra_header_fields=("vendor_type", "expense_category")),
|
| 129 |
+
period=7)]
|
| 130 |
+
if len(base) != n_entries:
|
| 131 |
+
raise InfeasibleSeed(f"seed {seed}: sliced {len(base)} entries, need {n_entries}")
|
| 132 |
+
entries = {e.entry_id: e for e in base}
|
| 133 |
+
|
| 134 |
+
rng = rng_for(TASK_ID, seed, "defects")
|
| 135 |
+
pool = sorted(entries)
|
| 136 |
+
local_eids = sorted(pick(rng, pool, DEFECT_COUNTS["local_anomaly"]))
|
| 137 |
+
remaining = sorted(set(pool) - set(local_eids))
|
| 138 |
+
global_eids = sorted(pick(rng, remaining, DEFECT_COUNTS["global_anomaly"]))
|
| 139 |
+
remaining = sorted(set(remaining) - set(global_eids))
|
| 140 |
+
program_eids = sorted(pick(rng, remaining, N_PROGRAM))
|
| 141 |
+
|
| 142 |
+
# ---- 8 seeded local anomalies: T_HI-common marginals, snapshot+instance
|
| 143 |
+
# absent joint, instance-unique ----
|
| 144 |
+
combo_counts0 = Counter(tuple(e.header[a] for a in ATTRS) for e in base)
|
| 145 |
+
candidates = _local_candidates(joint_keys, base, rng)
|
| 146 |
+
local_combos: list[tuple] = []
|
| 147 |
+
for c in candidates:
|
| 148 |
+
if len(local_combos) >= DEFECT_COUNTS["local_anomaly"]:
|
| 149 |
+
break
|
| 150 |
+
if combo_counts0[c] == 0:
|
| 151 |
+
local_combos.append(c)
|
| 152 |
+
if len(local_combos) < DEFECT_COUNTS["local_anomaly"]:
|
| 153 |
+
raise InfeasibleSeed(f"seed {seed}: only {len(local_combos)} local-anomaly "
|
| 154 |
+
f"candidates at T_HI={T_HI} (need {DEFECT_COUNTS['local_anomaly']})")
|
| 155 |
+
for eid, combo in zip(local_eids, local_combos, strict=True):
|
| 156 |
+
_inject_combo(entries, eid, combo)
|
| 157 |
+
|
| 158 |
+
# ---- 4 global anomalies: bottom-decile snapshot expense_category value,
|
| 159 |
+
# absent from the instance, unique after injection ----
|
| 160 |
+
inst_marg0 = {a: Counter(e.header[a] for e in base) for a in ATTRS}
|
| 161 |
+
ec_vals = sorted(marginals["expense_category"].items(), key=lambda kv: (kv[1], str(kv[0])))
|
| 162 |
+
decile_n = max(1, len(ec_vals) // 10)
|
| 163 |
+
bottom_decile_ec = [v for v, _ in ec_vals[:decile_n] if v is not None]
|
| 164 |
+
rare_pool = sorted(v for v in bottom_decile_ec
|
| 165 |
+
if inst_marg0["expense_category"].get(v, 0) == 0)
|
| 166 |
+
if len(rare_pool) < DEFECT_COUNTS["global_anomaly"]:
|
| 167 |
+
raise InfeasibleSeed(f"seed {seed}: only {len(rare_pool)} global-anomaly "
|
| 168 |
+
f"candidates (need {DEFECT_COUNTS['global_anomaly']})")
|
| 169 |
+
global_values = sorted(pick(rng, rare_pool, DEFECT_COUNTS["global_anomaly"]))
|
| 170 |
+
for eid, v in zip(sorted(global_eids), global_values, strict=True):
|
| 171 |
+
e = entries[eid]
|
| 172 |
+
entries[eid] = dataclasses.replace(e, header={**e.header, "expense_category": v})
|
| 173 |
+
global_combo_set = {tuple(entries[eid].header[a] for a in ATTRS) for eid in global_eids}
|
| 174 |
+
global_expense_values = set(global_values)
|
| 175 |
+
|
| 176 |
+
# PROTECTED: (attr, value) pairs the 8 seeded locals rely on. A demotion
|
| 177 |
+
# may still decrement one (amendment v3) iff its live count stays >=
|
| 178 |
+
# T_HI afterward -- unprotected attrs are tried first, protected-but-
|
| 179 |
+
# guarded ones only as a fallback (see the demotion pass below).
|
| 180 |
+
protected_pairs = {(a, v) for combo in local_combos
|
| 181 |
+
for a, v in zip(ATTRS, combo, strict=True)}
|
| 182 |
+
seeded_values_by_attr = {a: set() for a in ATTRS}
|
| 183 |
+
for combo in local_combos:
|
| 184 |
+
for a, v in zip(ATTRS, combo, strict=True):
|
| 185 |
+
seeded_values_by_attr[a].add(v)
|
| 186 |
+
seeded_values_by_attr["expense_category"] |= global_expense_values
|
| 187 |
+
|
| 188 |
+
# ---- 5 program-cohort combos, P1 -> P2 fallback (amendment) ----
|
| 189 |
+
def _pool_p1():
|
| 190 |
+
return {a: sorted(v for v, n in inst_marg0[a].items()
|
| 191 |
+
if v is not None and 2 <= n < COMMON
|
| 192 |
+
and v not in seeded_values_by_attr[a])
|
| 193 |
+
for a in ATTRS}
|
| 194 |
+
|
| 195 |
+
def _pool_p2(p1):
|
| 196 |
+
# Amendment v1 also gated P2 on "has snapshot support for `program`"
|
| 197 |
+
# -- dropped (controller ruling, round 5): PROGRAM_CODE is novel by
|
| 198 |
+
# design (the brief's own discoverable signal is that these combos
|
| 199 |
+
# are first-occurrence), and _profile carries no `program` column to
|
| 200 |
+
# check support against, so the clause has no coherent referent.
|
| 201 |
+
# P2 relaxes only the frequency band (common values, not just
|
| 202 |
+
# mid-frequency); distinctness from every seeded/cohort combo is
|
| 203 |
+
# still enforced by _search_cohort_combos below.
|
| 204 |
+
common_pool = {a: sorted(v for v, n in inst_marg0[a].items()
|
| 205 |
+
if v is not None and n >= COMMON
|
| 206 |
+
and v not in seeded_values_by_attr[a])
|
| 207 |
+
for a in ATTRS}
|
| 208 |
+
return {a: sorted(set(p1[a]) | set(common_pool[a])) for a in ATTRS}
|
| 209 |
+
|
| 210 |
+
def _search_cohort_combos(pools):
|
| 211 |
+
found: list[tuple] = []
|
| 212 |
+
seen = set(local_combos)
|
| 213 |
+
for c in _shuffled_product(pools, rng):
|
| 214 |
+
if len(found) >= _N_PROGRAM_COMBOS:
|
| 215 |
+
break
|
| 216 |
+
if c in seen:
|
| 217 |
+
continue
|
| 218 |
+
found.append(c)
|
| 219 |
+
seen.add(c)
|
| 220 |
+
return found
|
| 221 |
+
|
| 222 |
+
p1 = _pool_p1()
|
| 223 |
+
program_combos = _search_cohort_combos(p1)
|
| 224 |
+
if len(program_combos) < _N_PROGRAM_COMBOS:
|
| 225 |
+
program_combos = _search_cohort_combos(_pool_p2(p1))
|
| 226 |
+
if len(program_combos) < _N_PROGRAM_COMBOS:
|
| 227 |
+
raise InfeasibleSeed(f"seed {seed}: only {len(program_combos)} program-cohort "
|
| 228 |
+
f"combos even with P2 fallback (need {_N_PROGRAM_COMBOS})")
|
| 229 |
+
|
| 230 |
+
program_eids_sorted = sorted(program_eids)
|
| 231 |
+
program_groups = [program_eids_sorted[i:i + _PROGRAM_GROUP_SIZE]
|
| 232 |
+
for i in range(0, N_PROGRAM, _PROGRAM_GROUP_SIZE)]
|
| 233 |
+
for group, combo in zip(program_groups, program_combos, strict=True):
|
| 234 |
+
for eid in group:
|
| 235 |
+
_inject_program(entries, eid, combo)
|
| 236 |
+
|
| 237 |
+
# ---- demotion pass: eliminate every remaining clean joint-singleton
|
| 238 |
+
# with min marginal >= COMMON, one attribute swap each, no historical
|
| 239 |
+
# check (amendment v2: agents have no tool over the 7-year history);
|
| 240 |
+
# a protected value may be decremented iff it stays >= T_HI (v3) ----
|
| 241 |
+
live_marg = {a: Counter(e.header[a] for e in entries.values()) for a in ATTRS}
|
| 242 |
+
live_combo = {eid: tuple(e.header[a] for a in ATTRS) for eid, e in entries.items()}
|
| 243 |
+
live_combo_counts = Counter(live_combo.values())
|
| 244 |
+
protected_eids = set(local_eids) | set(global_eids) | set(program_eids)
|
| 245 |
+
reject_combo_set = set(local_combos) | set(program_combos) | global_combo_set
|
| 246 |
+
|
| 247 |
+
rng_demote = rng_for(TASK_ID, seed, "demote")
|
| 248 |
+
for eid in sorted(entries):
|
| 249 |
+
if eid in protected_eids:
|
| 250 |
+
continue
|
| 251 |
+
combo = live_combo[eid]
|
| 252 |
+
if live_combo_counts[combo] != 1:
|
| 253 |
+
continue
|
| 254 |
+
if min(live_marg[a][v] for a, v in zip(ATTRS, combo, strict=True)) < COMMON:
|
| 255 |
+
continue
|
| 256 |
+
demoted = False
|
| 257 |
+
# unprotected attrs first (fixed order), then protected-but-guarded
|
| 258 |
+
# ones in the same order (amendment v3)
|
| 259 |
+
unprotected = [k for k in _DEMOTE_ORDER
|
| 260 |
+
if (k, combo[ATTRS.index(k)]) not in protected_pairs]
|
| 261 |
+
guarded = [k for k in _DEMOTE_ORDER
|
| 262 |
+
if (k, combo[ATTRS.index(k)]) in protected_pairs]
|
| 263 |
+
for k in unprotected + guarded:
|
| 264 |
+
old_v = combo[ATTRS.index(k)]
|
| 265 |
+
protected = (k, old_v) in protected_pairs
|
| 266 |
+
if protected and live_marg[k][old_v] - 1 < T_HI:
|
| 267 |
+
continue # decrement would drop a seeded local below T_HI
|
| 268 |
+
valid = []
|
| 269 |
+
for v, n in sorted(live_marg[k].items(),
|
| 270 |
+
key=lambda kv: (kv[0] is None, kv[0])):
|
| 271 |
+
if v is None or v == old_v or not (1 <= n <= 3):
|
| 272 |
+
continue
|
| 273 |
+
if k == "expense_category" and v in global_expense_values:
|
| 274 |
+
continue
|
| 275 |
+
new_combo = tuple(v if a == k else vv
|
| 276 |
+
for a, vv in zip(ATTRS, combo, strict=True))
|
| 277 |
+
if new_combo in reject_combo_set:
|
| 278 |
+
continue
|
| 279 |
+
valid.append(v)
|
| 280 |
+
if not valid:
|
| 281 |
+
continue
|
| 282 |
+
chosen_v = rng_demote.choice(valid)
|
| 283 |
+
new_combo = tuple(chosen_v if a == k else vv
|
| 284 |
+
for a, vv in zip(ATTRS, combo, strict=True))
|
| 285 |
+
live_marg[k][old_v] -= 1
|
| 286 |
+
live_marg[k][chosen_v] += 1
|
| 287 |
+
live_combo_counts[combo] -= 1
|
| 288 |
+
live_combo_counts[new_combo] += 1
|
| 289 |
+
live_combo[eid] = new_combo
|
| 290 |
+
_inject_combo(entries, eid, new_combo)
|
| 291 |
+
demoted = True
|
| 292 |
+
break
|
| 293 |
+
if not demoted:
|
| 294 |
+
raise InfeasibleSeed(f"seed {seed}: no legal demotion for entry {eid}")
|
| 295 |
+
|
| 296 |
+
# ---- post-pass verification (amendment v2 step 4): fail loudly, never
|
| 297 |
+
# degrade ----
|
| 298 |
+
final_marg = {a: Counter(e.header[a] for e in entries.values()) for a in ATTRS}
|
| 299 |
+
final_combo = Counter(tuple(e.header[a] for a in ATTRS) for e in entries.values())
|
| 300 |
+
|
| 301 |
+
for eid in local_eids:
|
| 302 |
+
c = tuple(entries[eid].header[a] for a in ATTRS)
|
| 303 |
+
if final_combo[c] != 1:
|
| 304 |
+
raise InfeasibleSeed(f"seed {seed}: local {eid} combo not unique post-pass")
|
| 305 |
+
if any(final_marg[a][v] < T_HI for a, v in zip(ATTRS, c, strict=True)):
|
| 306 |
+
raise InfeasibleSeed(f"seed {seed}: local {eid} marginal dropped below T_HI")
|
| 307 |
+
|
| 308 |
+
clean_lookalikes = [eid for eid, e in entries.items()
|
| 309 |
+
if eid not in protected_eids
|
| 310 |
+
and final_combo[tuple(e.header[a] for a in ATTRS)] == 1
|
| 311 |
+
and min(final_marg[a][e.header[a]] for a in ATTRS) >= COMMON]
|
| 312 |
+
if clean_lookalikes:
|
| 313 |
+
raise InfeasibleSeed(f"seed {seed}: clean lookalikes remain: {clean_lookalikes}")
|
| 314 |
+
|
| 315 |
+
for v in global_values:
|
| 316 |
+
if final_marg["expense_category"][v] != 1:
|
| 317 |
+
raise InfeasibleSeed(f"seed {seed}: global expense_category {v!r} "
|
| 318 |
+
"marginal != 1 post-pass")
|
| 319 |
+
|
| 320 |
+
prog_members = [e for e in entries.values() if e.header["program"] == PROGRAM_CODE]
|
| 321 |
+
prog_combo_counts = Counter(tuple(e.header[a] for a in ATTRS) for e in prog_members)
|
| 322 |
+
# amendment v2 step 4, literal wording: cohort combos distinct from ALL
|
| 323 |
+
# seeded combos -- locals AND globals, not just locals
|
| 324 |
+
seeded_combo_set = set(local_combos) | global_combo_set
|
| 325 |
+
if len(prog_members) != N_PROGRAM or any(n < 2 for n in prog_combo_counts.values()) \
|
| 326 |
+
or any(c in seeded_combo_set for c in prog_combo_counts):
|
| 327 |
+
raise InfeasibleSeed(f"seed {seed}: program-cohort invariant violated post-pass")
|
| 328 |
+
|
| 329 |
+
# ---- assemble ----
|
| 330 |
+
defects = tuple(sorted(
|
| 331 |
+
[DefectRecord(eid, "local_anomaly", None, "flag") for eid in local_eids]
|
| 332 |
+
+ [DefectRecord(eid, "global_anomaly", None, "flag") for eid in global_eids],
|
| 333 |
+
key=lambda d: d.entry_id))
|
| 334 |
+
ho = HeldOut(defects=defects, required_docs=frozenset(), evidence_map={}, claims={})
|
| 335 |
+
inst = Instance(task_id=TASK_ID, seed=seed,
|
| 336 |
+
entries=tuple(sorted(entries.values(), key=lambda e: e.entry_id)),
|
| 337 |
+
documents=(), policies={}, master_data={})
|
| 338 |
+
ti = TaskInstance(inst, ho)
|
| 339 |
+
if out_dir is not None:
|
| 340 |
+
write_instance(ti, out_dir, task_spec_path=spec_task_path(TASK_ID),
|
| 341 |
+
snapshot_id=snapshot_root.name,
|
| 342 |
+
knobs={"n_entries": n_entries})
|
| 343 |
+
return ti
|
app/src/je_validation/generator/je14.py
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-14: vendor master anomalies. Ten seeded vendors carry classic
|
| 2 |
+
fictitious-vendor / related-party indicators in the vendor master (creation
|
| 3 |
+
recency plus payment timing, shared banking, employee-address overlap,
|
| 4 |
+
near-duplicate naming, bid-threshold hugging); their payment entries are
|
| 5 |
+
real DS-A entries repurposed under a fresh synthetic vendor id (the entry
|
| 6 |
+
itself carries no tell - the anomaly lives entirely in master data an agent
|
| 7 |
+
must cross-reference). Twelve real, established-looking vendors from a
|
| 8 |
+
documented procurement round are the distractor cohort: legitimately new
|
| 9 |
+
(recency alone is not a signal - spec guard), memo-backed, never seeded.
|
| 10 |
+
Five more vendors exist only in the vendor master with zero payment entries,
|
| 11 |
+
exhibiting the same seeded patterns - enumerating the master alone
|
| 12 |
+
over-generates the flag list (lesson 7 / JE-02 decoy rule); the ledger
|
| 13 |
+
cross-reference (does this vendor id appear on any entry?) is required to
|
| 14 |
+
tell seeded from decoy."""
|
| 15 |
+
from __future__ import annotations
|
| 16 |
+
|
| 17 |
+
import dataclasses
|
| 18 |
+
from collections import Counter
|
| 19 |
+
from datetime import date, timedelta
|
| 20 |
+
from pathlib import Path
|
| 21 |
+
|
| 22 |
+
from je_validation.envir.instance import (
|
| 23 |
+
DefectRecord,
|
| 24 |
+
HeldOut,
|
| 25 |
+
Instance,
|
| 26 |
+
TaskInstance,
|
| 27 |
+
)
|
| 28 |
+
from je_validation.generator.docgen.memos import procurement_memo_doc
|
| 29 |
+
from je_validation.generator.l2common import amount_of, augment, with_amount
|
| 30 |
+
from je_validation.generator.persist import spec_task_path, write_instance
|
| 31 |
+
from je_validation.generator.seeding import pick, rng_for
|
| 32 |
+
from je_validation.generator.slicing import slice_entries
|
| 33 |
+
|
| 34 |
+
TASK_ID = "JE-14"
|
| 35 |
+
DEFECT_COUNTS = {"bid_threshold_avoidance": 4, "employee_address_match": 4,
|
| 36 |
+
"name_similarity": 6, "rapid_creation_payment": 4,
|
| 37 |
+
"shared_bank_details": 4}
|
| 38 |
+
BID_THRESHOLD_CENTS = 5_000_000
|
| 39 |
+
|
| 40 |
+
N_RAPID, N_SHARED_BANK, N_EMPLOYEE_ADDR, N_NAME_SIM, N_BID = 2, 2, 2, 3, 1
|
| 41 |
+
N_ROUND = 12
|
| 42 |
+
N_EMPLOYEES = 25
|
| 43 |
+
PERIOD_MONTH = "2024-01"
|
| 44 |
+
|
| 45 |
+
STREET_NAMES = (
|
| 46 |
+
"Birch Road", "Cedar Court", "Chestnut Street", "Elm Street",
|
| 47 |
+
"Maple Avenue", "Oak Lane", "Pine Street", "Spruce Avenue",
|
| 48 |
+
"Walnut Drive", "Willow Way",
|
| 49 |
+
)
|
| 50 |
+
VENDOR_TYPES = ("Goods", "Services", "Construction", "Professional Services")
|
| 51 |
+
NEW_VENDOR_NAMES = (
|
| 52 |
+
"BLUE HARBOR CONTRACTING INC", "CRESTVIEW PROCUREMENT LLC",
|
| 53 |
+
"FALCONWOOD CONTRACTING LLC", "GRAYSTONE TRADE PARTNERS",
|
| 54 |
+
"HARBORLIGHT PROCUREMENT LLC", "IRONGATE VENDORS LLC",
|
| 55 |
+
"MERIDIAN SUPPLY PARTNERS", "NORTHGATE FACILITIES GROUP",
|
| 56 |
+
"PINEHOLLOW SERVICES INC", "QUANTUM RIDGE SUPPLY LLC",
|
| 57 |
+
"REDSTONE OUTFITTERS INC", "SILVERLINE LOGISTICS CORP",
|
| 58 |
+
)
|
| 59 |
+
FIRST_NAMES = ("James", "Maria", "Robert", "Linda", "Michael")
|
| 60 |
+
LAST_NAMES = ("Nguyen", "Garcia", "Smith", "Johnson", "Patel")
|
| 61 |
+
EMPLOYEE_NAMES = tuple(f"{first} {last}" for first in FIRST_NAMES for last in LAST_NAMES) # 25
|
| 62 |
+
|
| 63 |
+
BENIGN_INFO_TEMPLATES = (
|
| 64 |
+
"standard PO cycle, matched to receiving",
|
| 65 |
+
"repeat vendor, annual maintenance contract",
|
| 66 |
+
"goods received in full, three-way match on file",
|
| 67 |
+
)
|
| 68 |
+
RAPID_ANSWER = ("onboarded urgently at the request of the department "
|
| 69 |
+
"director; no competitive process documented")
|
| 70 |
+
N_INFO_BENIGN = 30
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def _near_dup_name(rng, name: str) -> str:
|
| 74 |
+
"""Single-character deletion: guaranteed edit distance 1, guaranteed
|
| 75 |
+
different (length alone differs)."""
|
| 76 |
+
i = rng.randrange(len(name))
|
| 77 |
+
return name[:i] + name[i + 1:]
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def _synthetic_vendor_ids(rng, length: int, lo: int, hi: int, used: set[str],
|
| 81 |
+
n: int) -> list[str]:
|
| 82 |
+
"""Unused ids in the modal (all-digit, fixed-length) real vendor_id
|
| 83 |
+
format, drawn from the same numeric span real ids occupy - not the full
|
| 84 |
+
zero-padded space, so synthetic ids look like the real population."""
|
| 85 |
+
out: list[str] = []
|
| 86 |
+
seen = set(used)
|
| 87 |
+
while len(out) < n:
|
| 88 |
+
cand = f"{rng.randrange(lo, hi + 1):0{length}d}"
|
| 89 |
+
if cand not in seen:
|
| 90 |
+
out.append(cand)
|
| 91 |
+
seen.add(cand)
|
| 92 |
+
return out
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def generate(seed: int, snapshot_root: Path, *, n_entries: int = 240,
|
| 96 |
+
out_dir: Path | None = None) -> TaskInstance:
|
| 97 |
+
raw = slice_entries(snapshot_root, task_id=TASK_ID, seed=seed,
|
| 98 |
+
n_entries=n_entries, extra_header_fields=("vendor",))
|
| 99 |
+
entries = {e.entry_id: e for e in augment(raw, period=7)}
|
| 100 |
+
|
| 101 |
+
# canonical name per real vendor id: first sorted entry that carries it
|
| 102 |
+
vendor_name_real: dict[str, str] = {}
|
| 103 |
+
for eid in sorted(entries):
|
| 104 |
+
vid = str(entries[eid].header["vendor_id"])
|
| 105 |
+
vendor_name_real.setdefault(vid, entries[eid].header.get("vendor", vid))
|
| 106 |
+
real_vendor_ids_all = sorted(vendor_name_real)
|
| 107 |
+
|
| 108 |
+
amounts_sorted = sorted(amount_of(e) for e in entries.values())
|
| 109 |
+
p90_cents = amounts_sorted[int(0.9 * (len(amounts_sorted) - 1))]
|
| 110 |
+
|
| 111 |
+
digit_ids = [v for v in real_vendor_ids_all if v.isdigit()]
|
| 112 |
+
if not digit_ids:
|
| 113 |
+
raise ValueError(f"seed {seed}: no all-digit vendor ids to model synthetic format on")
|
| 114 |
+
length = Counter(len(v) for v in digit_ids).most_common(1)[0][0]
|
| 115 |
+
same_len = [v for v in digit_ids if len(v) == length]
|
| 116 |
+
lo, hi = min(int(v) for v in same_len), max(int(v) for v in same_len)
|
| 117 |
+
|
| 118 |
+
# --- disjoint real-vendor cohorts: round / name-sim targets / shared-bank target ---
|
| 119 |
+
rng_round = rng_for(TASK_ID, seed, "round")
|
| 120 |
+
round_vendor_ids = pick(rng_round, real_vendor_ids_all, N_ROUND)
|
| 121 |
+
round_set = set(round_vendor_ids)
|
| 122 |
+
|
| 123 |
+
pool2 = sorted(set(real_vendor_ids_all) - round_set)
|
| 124 |
+
namesim_pool = sorted(v for v in pool2 if len(vendor_name_real[v]) >= 3)
|
| 125 |
+
if len(namesim_pool) < N_NAME_SIM + 1:
|
| 126 |
+
raise ValueError(f"seed {seed}: only {len(namesim_pool)} eligible name-sim targets")
|
| 127 |
+
rng_namesim_target = rng_for(TASK_ID, seed, "namesim_target")
|
| 128 |
+
namesim_target_ids = pick(rng_namesim_target, namesim_pool, N_NAME_SIM + 1)
|
| 129 |
+
namesim_seeded_targets = namesim_target_ids[:N_NAME_SIM]
|
| 130 |
+
decoy_namesim_target = namesim_target_ids[N_NAME_SIM]
|
| 131 |
+
|
| 132 |
+
pool3 = sorted(set(pool2) - set(namesim_target_ids))
|
| 133 |
+
rng_sharedbank_target = rng_for(TASK_ID, seed, "sharedbank_target")
|
| 134 |
+
sharedbank_target_id = pick(rng_sharedbank_target, pool3, 1)[0]
|
| 135 |
+
|
| 136 |
+
# --- synthetic vendor ids: 10 seeded + 5 master-only decoys ---
|
| 137 |
+
rng_ids = rng_for(TASK_ID, seed, "vendor_ids")
|
| 138 |
+
synth_ids = _synthetic_vendor_ids(rng_ids, length, lo, hi,
|
| 139 |
+
set(real_vendor_ids_all), 15)
|
| 140 |
+
it = iter(synth_ids)
|
| 141 |
+
rapid_vids = [next(it) for _ in range(N_RAPID)]
|
| 142 |
+
shared_bank_vids = [next(it) for _ in range(N_SHARED_BANK)]
|
| 143 |
+
employee_addr_vids = [next(it) for _ in range(N_EMPLOYEE_ADDR)]
|
| 144 |
+
name_sim_vids = [next(it) for _ in range(N_NAME_SIM)]
|
| 145 |
+
bid_vids = [next(it) for _ in range(N_BID)]
|
| 146 |
+
decoy_shared_bank_vids = [next(it), next(it)]
|
| 147 |
+
decoy_employee_addr_vid = next(it)
|
| 148 |
+
decoy_name_sim_vid = next(it)
|
| 149 |
+
decoy_created_vid = next(it)
|
| 150 |
+
|
| 151 |
+
seeded_vids_all = (rapid_vids + shared_bank_vids + employee_addr_vids
|
| 152 |
+
+ name_sim_vids + bid_vids)
|
| 153 |
+
decoy_vids_all = (decoy_shared_bank_vids
|
| 154 |
+
+ [decoy_employee_addr_vid, decoy_name_sim_vid, decoy_created_vid])
|
| 155 |
+
|
| 156 |
+
# --- pick victim entries to repurpose: never touch round/target vendors' entries ---
|
| 157 |
+
excluded_real = round_set | set(namesim_target_ids) | {sharedbank_target_id}
|
| 158 |
+
victim_pool = sorted(eid for eid, e in entries.items()
|
| 159 |
+
if str(e.header["vendor_id"]) not in excluded_real)
|
| 160 |
+
n_needed = sum(DEFECT_COUNTS.values())
|
| 161 |
+
if len(victim_pool) < n_needed:
|
| 162 |
+
raise ValueError(f"seed {seed}: only {len(victim_pool)} entries eligible for rewrite")
|
| 163 |
+
rng_rewrite = rng_for(TASK_ID, seed, "rewrite_pick")
|
| 164 |
+
victims = pick(rng_rewrite, victim_pool, n_needed)
|
| 165 |
+
vi = iter(victims)
|
| 166 |
+
rapid_entries = {vid: [next(vi), next(vi)] for vid in rapid_vids}
|
| 167 |
+
shared_entries = {vid: [next(vi), next(vi)] for vid in shared_bank_vids}
|
| 168 |
+
employee_entries = {vid: [next(vi), next(vi)] for vid in employee_addr_vids}
|
| 169 |
+
namesim_entries = {vid: [next(vi), next(vi)] for vid in name_sim_vids}
|
| 170 |
+
bid_entries = {bid_vids[0]: [next(vi) for _ in range(4)]}
|
| 171 |
+
seeded_entries_of_vid = {**rapid_entries, **shared_entries, **employee_entries,
|
| 172 |
+
**namesim_entries, **bid_entries}
|
| 173 |
+
|
| 174 |
+
defect_type_of_vid = {}
|
| 175 |
+
for vid in rapid_vids:
|
| 176 |
+
defect_type_of_vid[vid] = "rapid_creation_payment"
|
| 177 |
+
for vid in shared_bank_vids:
|
| 178 |
+
defect_type_of_vid[vid] = "shared_bank_details"
|
| 179 |
+
for vid in employee_addr_vids:
|
| 180 |
+
defect_type_of_vid[vid] = "employee_address_match"
|
| 181 |
+
for vid in name_sim_vids:
|
| 182 |
+
defect_type_of_vid[vid] = "name_similarity"
|
| 183 |
+
for vid in bid_vids:
|
| 184 |
+
defect_type_of_vid[vid] = "bid_threshold_avoidance"
|
| 185 |
+
|
| 186 |
+
# --- names: generic pool for non-name-sim seeded/decoy vendors; near-dup for the rest ---
|
| 187 |
+
rng_names = rng_for(TASK_ID, seed, "vendor_names")
|
| 188 |
+
generic_pool = pick(rng_names, list(NEW_VENDOR_NAMES), 11)
|
| 189 |
+
gi = iter(generic_pool)
|
| 190 |
+
synth_name_of: dict[str, str] = {}
|
| 191 |
+
for vid in rapid_vids + shared_bank_vids + employee_addr_vids + bid_vids:
|
| 192 |
+
synth_name_of[vid] = next(gi)
|
| 193 |
+
for vid in decoy_shared_bank_vids:
|
| 194 |
+
synth_name_of[vid] = next(gi)
|
| 195 |
+
synth_name_of[decoy_employee_addr_vid] = next(gi)
|
| 196 |
+
synth_name_of[decoy_created_vid] = next(gi)
|
| 197 |
+
|
| 198 |
+
rng_namesim_perturb = rng_for(TASK_ID, seed, "namesim_perturb")
|
| 199 |
+
for vid, target in zip(name_sim_vids, namesim_seeded_targets, strict=True):
|
| 200 |
+
synth_name_of[vid] = _near_dup_name(rng_namesim_perturb, vendor_name_real[target])
|
| 201 |
+
synth_name_of[decoy_name_sim_vid] = _near_dup_name(
|
| 202 |
+
rng_namesim_perturb, vendor_name_real[decoy_namesim_target])
|
| 203 |
+
|
| 204 |
+
# --- rewrite victim entries: vendor id/name, plus amount for bid/rapid cohorts ---
|
| 205 |
+
def _rewrite_vendor(eid: str, vid: str, name: str) -> None:
|
| 206 |
+
e = entries[eid]
|
| 207 |
+
entries[eid] = dataclasses.replace(
|
| 208 |
+
e, header={**e.header, "vendor_id": vid, "vendor": name})
|
| 209 |
+
|
| 210 |
+
rng_amount = rng_for(TASK_ID, seed, "amount")
|
| 211 |
+
defects: list[DefectRecord] = []
|
| 212 |
+
for vid, eids in seeded_entries_of_vid.items():
|
| 213 |
+
name = synth_name_of[vid]
|
| 214 |
+
for eid in eids:
|
| 215 |
+
_rewrite_vendor(eid, vid, name)
|
| 216 |
+
if vid in bid_vids:
|
| 217 |
+
for eid in eids:
|
| 218 |
+
cents = int(BID_THRESHOLD_CENTS * (0.96 + rng_amount.random() * 0.03))
|
| 219 |
+
entries[eid] = with_amount(entries[eid], cents)
|
| 220 |
+
elif vid in rapid_vids:
|
| 221 |
+
for eid in eids:
|
| 222 |
+
cents = int(p90_cents * (1.0 + rng_amount.random() * 0.5))
|
| 223 |
+
entries[eid] = with_amount(entries[eid], cents)
|
| 224 |
+
dtype = defect_type_of_vid[vid]
|
| 225 |
+
for eid in eids:
|
| 226 |
+
defects.append(DefectRecord(eid, dtype, f"master:vendor:{vid}", "flag"))
|
| 227 |
+
|
| 228 |
+
if Counter(d.defect_type for d in defects) != DEFECT_COUNTS:
|
| 229 |
+
raise AssertionError(f"seed {seed}: injected {Counter(d.defect_type for d in defects)}, "
|
| 230 |
+
f"expected {DEFECT_COUNTS}")
|
| 231 |
+
|
| 232 |
+
# --- rapid vendors' created date: 2 days before their first payment ---
|
| 233 |
+
rapid_created: dict[str, str] = {}
|
| 234 |
+
for vid, eids in rapid_entries.items():
|
| 235 |
+
first_tx = min(entries[eid].header["transaction_date"] for eid in eids)
|
| 236 |
+
rapid_created[vid] = (date.fromisoformat(first_tx) - timedelta(days=2)).isoformat()
|
| 237 |
+
|
| 238 |
+
# --- procurement-round documents: every round vendor's entries carry the memo ---
|
| 239 |
+
round_names_sorted = sorted(vendor_name_real[v] for v in round_vendor_ids)
|
| 240 |
+
round_entry_ids = sorted(eid for eid, e in entries.items()
|
| 241 |
+
if str(e.header["vendor_id"]) in round_set)
|
| 242 |
+
documents = [
|
| 243 |
+
procurement_memo_doc(
|
| 244 |
+
doc_id=f"procurement-{eid}", entry_id=eid,
|
| 245 |
+
f={"round_name": "Q1 2024 Vendor Onboarding Round",
|
| 246 |
+
"date": "2024-01-15", "approver": "Procurement Director",
|
| 247 |
+
"vendors": round_names_sorted})
|
| 248 |
+
for eid in round_entry_ids
|
| 249 |
+
]
|
| 250 |
+
|
| 251 |
+
# --- vendor master: coverage = every vendor_id on an entry, plus the 5 decoys ---
|
| 252 |
+
instance_vendor_ids = sorted({str(e.header["vendor_id"]) for e in entries.values()})
|
| 253 |
+
decoy_vids_set = set(decoy_vids_all)
|
| 254 |
+
master_vendor_ids = sorted(set(instance_vendor_ids) | decoy_vids_set)
|
| 255 |
+
|
| 256 |
+
rng_bank = rng_for(TASK_ID, seed, "bank")
|
| 257 |
+
vendor_bank = {vid: f"BA-{rng_bank.randrange(10 ** 8):08d}" for vid in master_vendor_ids}
|
| 258 |
+
vendor_bank[shared_bank_vids[0]] = vendor_bank[sharedbank_target_id]
|
| 259 |
+
vendor_bank[shared_bank_vids[1]] = vendor_bank[sharedbank_target_id]
|
| 260 |
+
vendor_bank[decoy_shared_bank_vids[1]] = vendor_bank[decoy_shared_bank_vids[0]]
|
| 261 |
+
|
| 262 |
+
rng_addr = rng_for(TASK_ID, seed, "address")
|
| 263 |
+
vendor_address = {}
|
| 264 |
+
for vid in master_vendor_ids:
|
| 265 |
+
n = rng_addr.randint(100, 9999)
|
| 266 |
+
street = rng_addr.choice(STREET_NAMES)
|
| 267 |
+
vendor_address[vid] = f"{n} {street}"
|
| 268 |
+
|
| 269 |
+
rng_emp_addr = rng_for(TASK_ID, seed, "employee_addr")
|
| 270 |
+
employee_ids = [f"EMP-{i:03d}" for i in range(1, N_EMPLOYEES + 1)]
|
| 271 |
+
employees = {}
|
| 272 |
+
for i, eid in enumerate(employee_ids):
|
| 273 |
+
n = rng_emp_addr.randint(100, 9999)
|
| 274 |
+
street = rng_emp_addr.choice(STREET_NAMES)
|
| 275 |
+
employees[eid] = {"name": EMPLOYEE_NAMES[i], "address": f"{n} {street}"}
|
| 276 |
+
rng_emp_pick = rng_for(TASK_ID, seed, "employee_pick")
|
| 277 |
+
chosen_emps = pick(rng_emp_pick, employee_ids, 3)
|
| 278 |
+
vendor_address[employee_addr_vids[0]] = employees[chosen_emps[0]]["address"]
|
| 279 |
+
vendor_address[employee_addr_vids[1]] = employees[chosen_emps[1]]["address"]
|
| 280 |
+
vendor_address[decoy_employee_addr_vid] = employees[chosen_emps[2]]["address"]
|
| 281 |
+
|
| 282 |
+
rng_created = rng_for(TASK_ID, seed, "created")
|
| 283 |
+
in_period_ids = (round_set | set(shared_bank_vids) | set(employee_addr_vids)
|
| 284 |
+
| set(name_sim_vids) | set(bid_vids) | set(decoy_shared_bank_vids)
|
| 285 |
+
| {decoy_employee_addr_vid, decoy_name_sim_vid, decoy_created_vid})
|
| 286 |
+
vendor_created = {}
|
| 287 |
+
for vid in master_vendor_ids:
|
| 288 |
+
if vid in rapid_created:
|
| 289 |
+
vendor_created[vid] = rapid_created[vid]
|
| 290 |
+
elif vid in in_period_ids:
|
| 291 |
+
dd = rng_created.randint(1, 25)
|
| 292 |
+
vendor_created[vid] = f"{PERIOD_MONTH}-{dd:02d}"
|
| 293 |
+
else:
|
| 294 |
+
yr = rng_created.randint(2019, 2022)
|
| 295 |
+
mo = rng_created.randint(1, 12)
|
| 296 |
+
dd = rng_created.randint(1, 28)
|
| 297 |
+
vendor_created[vid] = f"{yr:04d}-{mo:02d}-{dd:02d}"
|
| 298 |
+
|
| 299 |
+
rng_vtype = rng_for(TASK_ID, seed, "vendor_type")
|
| 300 |
+
vendor_master = {}
|
| 301 |
+
for vid in master_vendor_ids:
|
| 302 |
+
name = synth_name_of.get(vid, vendor_name_real.get(vid, f"VENDOR {vid}"))
|
| 303 |
+
vendor_master[vid] = {
|
| 304 |
+
"name": name,
|
| 305 |
+
"vendor_type": rng_vtype.choice(VENDOR_TYPES),
|
| 306 |
+
"created": vendor_created[vid],
|
| 307 |
+
"bank_account": vendor_bank[vid],
|
| 308 |
+
"address": vendor_address[vid],
|
| 309 |
+
}
|
| 310 |
+
|
| 311 |
+
# --- request_info: answer presence must not be an oracle (spread benign
|
| 312 |
+
# templates across established AND round entries; only rapid vendors get
|
| 313 |
+
# the substantive answer, and those entries are already seeded defects
|
| 314 |
+
# regardless - "has an answer" alone stays a poor classifier) ---
|
| 315 |
+
established_pool_eids = sorted(
|
| 316 |
+
eid for eid, e in entries.items()
|
| 317 |
+
if str(e.header["vendor_id"]) not in round_set
|
| 318 |
+
and str(e.header["vendor_id"]) not in seeded_vids_all)
|
| 319 |
+
n_from_round = min(15, len(round_entry_ids))
|
| 320 |
+
n_from_established = N_INFO_BENIGN - n_from_round
|
| 321 |
+
if len(established_pool_eids) < n_from_established:
|
| 322 |
+
raise ValueError(f"seed {seed}: not enough established entries for info_responses")
|
| 323 |
+
rng_info_round = rng_for(TASK_ID, seed, "info_round")
|
| 324 |
+
rng_info_est = rng_for(TASK_ID, seed, "info_established")
|
| 325 |
+
benign_eids = (pick(rng_info_round, round_entry_ids, n_from_round)
|
| 326 |
+
+ pick(rng_info_est, established_pool_eids, n_from_established))
|
| 327 |
+
info_responses: dict[str, str] = {}
|
| 328 |
+
for i, eid in enumerate(sorted(benign_eids)):
|
| 329 |
+
info_responses[eid] = BENIGN_INFO_TEMPLATES[i % len(BENIGN_INFO_TEMPLATES)]
|
| 330 |
+
for eids in rapid_entries.values():
|
| 331 |
+
for eid in eids:
|
| 332 |
+
info_responses[eid] = RAPID_ANSWER
|
| 333 |
+
|
| 334 |
+
evidence_map = {d.entry_id: frozenset({d.revealing_evidence_id}) for d in defects}
|
| 335 |
+
inst = Instance(
|
| 336 |
+
task_id=TASK_ID, seed=seed,
|
| 337 |
+
entries=tuple(entries[k] for k in sorted(entries)),
|
| 338 |
+
documents=tuple(documents), policies={},
|
| 339 |
+
master_data={"vendor": vendor_master, "employee": employees},
|
| 340 |
+
info_responses=info_responses,
|
| 341 |
+
)
|
| 342 |
+
ho = HeldOut(defects=tuple(sorted(defects, key=lambda d: d.entry_id)),
|
| 343 |
+
required_docs=frozenset(), evidence_map=evidence_map)
|
| 344 |
+
ti = TaskInstance(inst, ho)
|
| 345 |
+
if out_dir is not None:
|
| 346 |
+
write_instance(ti, out_dir, task_spec_path=spec_task_path(TASK_ID),
|
| 347 |
+
snapshot_id=snapshot_root.name, knobs={"n_entries": n_entries})
|
| 348 |
+
return ti
|
app/src/je_validation/generator/je15.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-15: population profiling via digit distribution. The spec's defect is
|
| 2 |
+
DEPARTMENT-level: a whole department whose digit profile deviates. Within
|
| 3 |
+
it, 7 "driving" entries carry the flag-target defect (fabricated_amounts,
|
| 4 |
+
heavy {7,8,9}-leading-digit tail, 6-digit cent magnitudes) - but they are
|
| 5 |
+
not the entirety of the signal. Every OTHER entry in that department also
|
| 6 |
+
gets a mild seeded leading-digit reweighting (natural magnitude preserved,
|
| 7 |
+
no per-entry tell), so the department's aggregate profile is off even
|
| 8 |
+
though no individual entry beyond the 7 driving ones is itself defective
|
| 9 |
+
(controller amendment 2026-08-12: a 7-entry injection into a ~41-entry
|
| 10 |
+
department cannot reliably beat real per-department chi-square noise;
|
| 11 |
+
whole-department reweighting is both truer to the spec's story and
|
| 12 |
+
empirically reliable - see the module-level sweep note by
|
| 13 |
+
test_guard_deviation_only_visible_after_segmentation in test_je15.py).
|
| 14 |
+
|
| 15 |
+
Two other departments carry naturally skewed profiles for STRUCTURAL
|
| 16 |
+
reasons (fixed-fee contracts, per-unit reimbursement at a set rate), each
|
| 17 |
+
documented by a schedule doc attached to its summary row (JE-10
|
| 18 |
+
summary-row pattern). The deviation is invisible pooled across the whole
|
| 19 |
+
population and only isolable after segmenting by department (guard,
|
| 20 |
+
pinned by test_guard_deviation_only_visible_after_segmentation).
|
| 21 |
+
|
| 22 |
+
Construction: an OVERSIZED slice (n_entries * 4) is taken first so 9
|
| 23 |
+
departments can each supply 41+ entries - a plain n_entries slice cannot
|
| 24 |
+
(panel 2026-08-11, sol-pro/kimi convergent; same guidance as JE-11)."""
|
| 25 |
+
from __future__ import annotations
|
| 26 |
+
|
| 27 |
+
from pathlib import Path
|
| 28 |
+
|
| 29 |
+
from je_validation.envir.instance import (
|
| 30 |
+
DefectRecord,
|
| 31 |
+
Entry,
|
| 32 |
+
HeldOut,
|
| 33 |
+
Instance,
|
| 34 |
+
TaskInstance,
|
| 35 |
+
)
|
| 36 |
+
from je_validation.generator.docgen.memos import fee_schedule_doc, rate_schedule_doc
|
| 37 |
+
from je_validation.generator.l2common import augment, lift, with_amount
|
| 38 |
+
from je_validation.generator.persist import spec_task_path, write_instance
|
| 39 |
+
from je_validation.generator.seeding import pick, rng_for
|
| 40 |
+
from je_validation.generator.slicing import slice_entries
|
| 41 |
+
|
| 42 |
+
TASK_ID = "JE-15"
|
| 43 |
+
DEFECT_COUNTS = {"digit_profile_deviation": 1, "fabricated_amounts": 7}
|
| 44 |
+
SUMMARY_PREFIX = "JE15-DEPT-"
|
| 45 |
+
N_DEPTS = 9
|
| 46 |
+
N_DRIVING = 7
|
| 47 |
+
# Driving entries (the flag targets): spec text says {5..9}; narrowed to
|
| 48 |
+
# {7..9} (never the guard test) because real DS-A per-department chi-square
|
| 49 |
+
# noise at n~41 is high enough that {5..9} alone never clears the guard's 2x
|
| 50 |
+
# separation margin, empirically, across many seeds.
|
| 51 |
+
_DRIVING_DIGITS = (7, 8, 9)
|
| 52 |
+
# Mild whole-department reweighting (non-defective entries): a seeded
|
| 53 |
+
# per-entry leading-digit draw favoring {7,8,9} over {1,2} at roughly a 3-4:1
|
| 54 |
+
# weight ratio (digits 3-6 at an intermediate weight). Empirically (sweep of
|
| 55 |
+
# seeds 1-59) this weighting clears the guard's margins on ALL of seeds 1-5
|
| 56 |
+
# and 55/59 (93%) overall - see test_je15.py's ti fixture comment.
|
| 57 |
+
_MILD_SKEW_DIGITS = (1, 2, 3, 4, 5, 6, 7, 8, 9)
|
| 58 |
+
_MILD_SKEW_WEIGHTS = (1, 1, 2, 2, 2, 2, 4, 4, 4)
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
def _releading(cents: int, digit: int) -> int:
|
| 62 |
+
"""Replace only the leading digit of a positive cents value, keeping its
|
| 63 |
+
digit count (natural magnitude) and every other digit untouched - the
|
| 64 |
+
mild skew plants no per-entry tell beyond the shifted leading digit."""
|
| 65 |
+
s = str(cents)
|
| 66 |
+
return int(str(digit) + s[1:])
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def _summary_row(dept: str, template: Entry) -> Entry:
|
| 70 |
+
"""Same header key set as sibling entries (query_ledger's field-validation
|
| 71 |
+
surface stays uniform); non-applicable keys filled with type-appropriate
|
| 72 |
+
constants, then the applicable ones overridden. Zero rows (lines=())
|
| 73 |
+
foot trivially - a no-evidence baseline stays safe."""
|
| 74 |
+
header = {k: (0 if isinstance(v, (int, float)) and not isinstance(v, bool) else "SUMMARY")
|
| 75 |
+
for k, v in template.header.items()}
|
| 76 |
+
header.update({"department": dept, "account": "SUMMARY", "period": 7,
|
| 77 |
+
"amount": 0.0, "total_debit_cents": 0, "total_credit_cents": 0})
|
| 78 |
+
return Entry(entry_id=f"{SUMMARY_PREFIX}{dept}", header=header, lines=())
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def generate(seed: int, snapshot_root: Path, *, n_entries: int = 380,
|
| 82 |
+
out_dir: Path | None = None) -> TaskInstance:
|
| 83 |
+
dept_total = n_entries - N_DEPTS
|
| 84 |
+
per_dept, remainder = divmod(dept_total, N_DEPTS)
|
| 85 |
+
|
| 86 |
+
base = augment([lift(e, "account", "department")
|
| 87 |
+
for e in slice_entries(snapshot_root, task_id=TASK_ID, seed=seed,
|
| 88 |
+
n_entries=n_entries * 4)],
|
| 89 |
+
period=7)
|
| 90 |
+
by_id = {e.entry_id: e for e in base}
|
| 91 |
+
by_dept: dict[str, list[str]] = {}
|
| 92 |
+
for e in base:
|
| 93 |
+
by_dept.setdefault(e.header["department"], []).append(e.entry_id)
|
| 94 |
+
|
| 95 |
+
# 9 largest departments (count desc, name asc tiebreak - total order for
|
| 96 |
+
# determinism), each must reach the per-department floor.
|
| 97 |
+
ranked = sorted(by_dept, key=lambda d: (-len(by_dept[d]), d))
|
| 98 |
+
qualifying = [d for d in ranked if len(by_dept[d]) >= per_dept]
|
| 99 |
+
if len(qualifying) < N_DEPTS:
|
| 100 |
+
raise ValueError(
|
| 101 |
+
f"seed {seed}: only {len(qualifying)} department(s) reach "
|
| 102 |
+
f"{per_dept} entries in an oversized slice of {n_entries * 4}; "
|
| 103 |
+
f"need {N_DEPTS} (generator convention: fail, never degrade)")
|
| 104 |
+
selected = sorted(qualifying[:N_DEPTS])
|
| 105 |
+
extra = set(selected[:remainder])
|
| 106 |
+
target = {d: per_dept + (1 if d in extra else 0) for d in selected}
|
| 107 |
+
|
| 108 |
+
rng = rng_for(TASK_ID, seed, "defects")
|
| 109 |
+
fab_dept = pick(rng, selected, 1)[0]
|
| 110 |
+
remaining = sorted(set(selected) - {fab_dept})
|
| 111 |
+
fixed_dept, per_unit_dept = sorted(pick(rng, remaining, 2))
|
| 112 |
+
|
| 113 |
+
chosen: dict[str, list[str]] = {
|
| 114 |
+
d: sorted(pick(rng, sorted(by_dept[d]), target[d])) for d in selected
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
driving = set(pick(rng, chosen[fab_dept], N_DRIVING))
|
| 118 |
+
for eid in sorted(driving):
|
| 119 |
+
digit = rng.choice(_DRIVING_DIGITS)
|
| 120 |
+
cents = digit * 100_000 + rng.randint(0, 99_999)
|
| 121 |
+
by_id[eid] = with_amount(by_id[eid], cents)
|
| 122 |
+
|
| 123 |
+
# Mild reweighting of every OTHER entry in the fabricated department:
|
| 124 |
+
# own seeded stream (independent of "defects") so this addition never
|
| 125 |
+
# perturbs the driving/structural draws above or below. Sorted iteration
|
| 126 |
+
# for byte-identity.
|
| 127 |
+
rng_digits = rng_for(TASK_ID, seed, "digits")
|
| 128 |
+
for eid in sorted(set(chosen[fab_dept]) - driving):
|
| 129 |
+
natural = by_id[eid].header["total_debit_cents"]
|
| 130 |
+
digit = rng_digits.choices(_MILD_SKEW_DIGITS, weights=_MILD_SKEW_WEIGHTS, k=1)[0]
|
| 131 |
+
by_id[eid] = with_amount(by_id[eid], _releading(natural, digit))
|
| 132 |
+
|
| 133 |
+
for eid in chosen[fixed_dept]:
|
| 134 |
+
by_id[eid] = with_amount(by_id[eid], 250_000)
|
| 135 |
+
for eid in chosen[per_unit_dept]:
|
| 136 |
+
k = rng.randint(1, 40)
|
| 137 |
+
by_id[eid] = with_amount(by_id[eid], k * 12_500)
|
| 138 |
+
|
| 139 |
+
dept_entries = [by_id[eid] for d in selected for eid in chosen[d]]
|
| 140 |
+
dept_entries.sort(key=lambda e: e.entry_id)
|
| 141 |
+
template = dept_entries[0]
|
| 142 |
+
summaries = [_summary_row(d, template) for d in selected]
|
| 143 |
+
|
| 144 |
+
fab_summary = f"{SUMMARY_PREFIX}{fab_dept}"
|
| 145 |
+
defects = [DefectRecord(fab_summary, "digit_profile_deviation", None, "flag")]
|
| 146 |
+
defects += [DefectRecord(eid, "fabricated_amounts", None, "flag")
|
| 147 |
+
for eid in sorted(driving)]
|
| 148 |
+
defects.sort(key=lambda d: d.entry_id)
|
| 149 |
+
|
| 150 |
+
fee_doc_id, rate_doc_id = f"JE15-FEE-{fixed_dept}", f"JE15-RATE-{per_unit_dept}"
|
| 151 |
+
fixed_summary, per_unit_summary = (f"{SUMMARY_PREFIX}{fixed_dept}",
|
| 152 |
+
f"{SUMMARY_PREFIX}{per_unit_dept}")
|
| 153 |
+
docs = (
|
| 154 |
+
fee_schedule_doc(doc_id=fee_doc_id, entry_id=fixed_summary,
|
| 155 |
+
f={"department": fixed_dept, "effective": "2024-01-01",
|
| 156 |
+
"fee_cents": 250_000,
|
| 157 |
+
"basis_text": "Fixed engagement fee per posting, "
|
| 158 |
+
"independent of billed hours or units."}),
|
| 159 |
+
rate_schedule_doc(doc_id=rate_doc_id, entry_id=per_unit_summary,
|
| 160 |
+
f={"department": per_unit_dept, "effective": "2024-01-01",
|
| 161 |
+
"unit_rate_cents": 12_500, "unit_name": "unit",
|
| 162 |
+
"basis_text": "Reimbursed per unit at the posted "
|
| 163 |
+
"rate; unit counts vary by engagement."}),
|
| 164 |
+
)
|
| 165 |
+
evidence = {fixed_summary: frozenset({fee_doc_id}),
|
| 166 |
+
per_unit_summary: frozenset({rate_doc_id})}
|
| 167 |
+
|
| 168 |
+
entries = sorted(dept_entries + summaries, key=lambda e: e.entry_id)
|
| 169 |
+
inst = Instance(task_id=TASK_ID, seed=seed, entries=tuple(entries),
|
| 170 |
+
documents=docs, policies={}, master_data={})
|
| 171 |
+
ho = HeldOut(defects=tuple(defects), required_docs=frozenset({fee_doc_id, rate_doc_id}),
|
| 172 |
+
evidence_map=evidence, claims={})
|
| 173 |
+
ti = TaskInstance(inst, ho)
|
| 174 |
+
if out_dir is not None:
|
| 175 |
+
write_instance(ti, out_dir, task_spec_path=spec_task_path(TASK_ID),
|
| 176 |
+
snapshot_id=snapshot_root.name, knobs={"n_entries": n_entries})
|
| 177 |
+
return ti
|
app/src/je_validation/generator/l2common.py
CHANGED
|
@@ -28,3 +28,43 @@ def augment(entries: list[Entry], period: int) -> list[Entry]:
|
|
| 28 |
"amount": round(amount_of(e) / 100, 2)}
|
| 29 |
out.append(dataclasses.replace(e, header=header))
|
| 30 |
return out
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
"amount": round(amount_of(e) / 100, 2)}
|
| 29 |
out.append(dataclasses.replace(e, header=header))
|
| 30 |
return out
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
def lift(e: Entry, *fields: str, leg: str = "D") -> Entry:
|
| 34 |
+
"""Copy line-level coding fields (account, department, program) onto the
|
| 35 |
+
header so ledger-row tools can filter/group on them."""
|
| 36 |
+
line = next(ln for ln in e.lines if ln["side"] == leg)
|
| 37 |
+
return dataclasses.replace(
|
| 38 |
+
e, header={**e.header, **{f: line[f] for f in fields}})
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
def with_amount(e: Entry, total_cents: int) -> Entry:
|
| 42 |
+
"""Rewrite an entry to a new footing total. BOTH sides scale
|
| 43 |
+
proportionally, integer remainder on each side's last leg (postingise
|
| 44 |
+
emits a single credit leg today, but this helper must stay correct if
|
| 45 |
+
that ever changes - panel 2026-08-11). Callers rewrite amounts, never
|
| 46 |
+
structure - the entry still foots, so no surface tell exists."""
|
| 47 |
+
if total_cents <= 0:
|
| 48 |
+
raise ValueError(f"with_amount needs a positive total: {total_cents}")
|
| 49 |
+
if "signed_amount_cents" in e.header:
|
| 50 |
+
raise ValueError("with_amount does not handle signed entries")
|
| 51 |
+
|
| 52 |
+
def scaled(side):
|
| 53 |
+
legs = [ln for ln in e.lines if ln["side"] == side]
|
| 54 |
+
old = sum(ln["amount_cents"] for ln in legs)
|
| 55 |
+
out, running = {}, 0
|
| 56 |
+
for i, ln in enumerate(legs):
|
| 57 |
+
cents = (total_cents - running if i == len(legs) - 1
|
| 58 |
+
else total_cents * ln["amount_cents"] // old)
|
| 59 |
+
running += cents
|
| 60 |
+
out[id(ln)] = cents
|
| 61 |
+
return out
|
| 62 |
+
|
| 63 |
+
new_amount = {**scaled("D"), **scaled("C")}
|
| 64 |
+
new_lines = tuple({**ln, "amount_cents": new_amount[id(ln)]}
|
| 65 |
+
for ln in e.lines)
|
| 66 |
+
header = {**e.header, "total_debit_cents": total_cents,
|
| 67 |
+
"total_credit_cents": total_cents}
|
| 68 |
+
if "amount" in header:
|
| 69 |
+
header["amount"] = round(total_cents / 100, 2)
|
| 70 |
+
return dataclasses.replace(e, header=header, lines=new_lines)
|
app/src/je_validation/generator/persist.py
CHANGED
|
@@ -61,6 +61,8 @@ def write_instance(ti: TaskInstance, out_dir: Path, *, task_spec_path: Path,
|
|
| 61 |
(dataclasses.asdict(d) for d in inst.documents))
|
| 62 |
_dump(out_dir / "instance" / "master_data.json", inst.master_data)
|
| 63 |
_dump(out_dir / "instance" / "policies.json", inst.policies)
|
|
|
|
|
|
|
| 64 |
_dump(out_dir / "heldout" / "defect_ledger.json", {
|
| 65 |
"defects": [dataclasses.asdict(d) for d in ho.defects],
|
| 66 |
"required_docs": sorted(ho.required_docs),
|
|
@@ -100,6 +102,9 @@ def read_public_instance(bundle_dir: Path) -> Instance:
|
|
| 100 |
documents=documents,
|
| 101 |
policies=json.loads((bundle_dir / "policies.json").read_text(encoding="utf-8")),
|
| 102 |
master_data=json.loads((bundle_dir / "master_data.json").read_text(encoding="utf-8")),
|
|
|
|
|
|
|
|
|
|
| 103 |
)
|
| 104 |
|
| 105 |
|
|
|
|
| 61 |
(dataclasses.asdict(d) for d in inst.documents))
|
| 62 |
_dump(out_dir / "instance" / "master_data.json", inst.master_data)
|
| 63 |
_dump(out_dir / "instance" / "policies.json", inst.policies)
|
| 64 |
+
if inst.info_responses:
|
| 65 |
+
_dump(out_dir / "instance" / "info_responses.json", inst.info_responses)
|
| 66 |
_dump(out_dir / "heldout" / "defect_ledger.json", {
|
| 67 |
"defects": [dataclasses.asdict(d) for d in ho.defects],
|
| 68 |
"required_docs": sorted(ho.required_docs),
|
|
|
|
| 102 |
documents=documents,
|
| 103 |
policies=json.loads((bundle_dir / "policies.json").read_text(encoding="utf-8")),
|
| 104 |
master_data=json.loads((bundle_dir / "master_data.json").read_text(encoding="utf-8")),
|
| 105 |
+
info_responses=(json.loads((bundle_dir / "info_responses.json")
|
| 106 |
+
.read_text(encoding="utf-8"))
|
| 107 |
+
if (bundle_dir / "info_responses.json").exists() else {}),
|
| 108 |
)
|
| 109 |
|
| 110 |
|
app/src/je_validation/generator/slicing.py
CHANGED
|
@@ -15,7 +15,9 @@ from je_validation.postingiser.enrich import enrich_headers
|
|
| 15 |
|
| 16 |
def slice_entries(snapshot_root: Path, *, task_id: str, seed: int, n_entries: int,
|
| 17 |
fiscal_year: int = 2024, period: int = 7,
|
| 18 |
-
period_month: str = "2024-01", min_lines: int = 1
|
|
|
|
|
|
|
| 19 |
df = (
|
| 20 |
scan_ds_a(snapshot_root, fiscal_years=[fiscal_year])
|
| 21 |
.filter(pl.col("fiscal_year_period") == period)
|
|
@@ -40,6 +42,15 @@ def slice_entries(snapshot_root: Path, *, task_id: str, seed: int, n_entries: in
|
|
| 40 |
depts, task_id=task_id, seed=seed)
|
| 41 |
lines = lines.filter(pl.col("entry_id").is_in(sorted(chosen)))
|
| 42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
line_map: dict[str, list[dict]] = {}
|
| 44 |
for r in lines.sort("entry_id", "line_seq").iter_rows(named=True):
|
| 45 |
line_map.setdefault(r.pop("entry_id"), []).append(r)
|
|
@@ -60,10 +71,19 @@ def slice_entries(snapshot_root: Path, *, task_id: str, seed: int, n_entries: in
|
|
| 60 |
post_day = min(settle_day + rng_dates.randint(0, 3), 28)
|
| 61 |
header["transaction_date"] = f"{period_month}-{tx_day:02d}"
|
| 62 |
header["settlement_date"] = f"{period_month}-{settle_day:02d}"
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
entries.append(Entry(entry_id=eid, header=header, lines=tuple(line_map[eid])))
|
| 69 |
return entries
|
|
|
|
| 15 |
|
| 16 |
def slice_entries(snapshot_root: Path, *, task_id: str, seed: int, n_entries: int,
|
| 17 |
fiscal_year: int = 2024, period: int = 7,
|
| 18 |
+
period_month: str = "2024-01", min_lines: int = 1,
|
| 19 |
+
preserve_posting_time: bool = False,
|
| 20 |
+
extra_header_fields: tuple[str, ...] = ()) -> list[Entry]:
|
| 21 |
df = (
|
| 22 |
scan_ds_a(snapshot_root, fiscal_years=[fiscal_year])
|
| 23 |
.filter(pl.col("fiscal_year_period") == period)
|
|
|
|
| 42 |
depts, task_id=task_id, seed=seed)
|
| 43 |
lines = lines.filter(pl.col("entry_id").is_in(sorted(chosen)))
|
| 44 |
|
| 45 |
+
if extra_header_fields:
|
| 46 |
+
extra = (
|
| 47 |
+
df.with_columns((pl.col("fiscal_year").cast(pl.String) + "-"
|
| 48 |
+
+ pl.col("payment_id")).alias("entry_id"))
|
| 49 |
+
.group_by("entry_id")
|
| 50 |
+
.agg([pl.col(f).first() for f in extra_header_fields])
|
| 51 |
+
)
|
| 52 |
+
headers = headers.join(extra, on="entry_id", how="left")
|
| 53 |
+
|
| 54 |
line_map: dict[str, list[dict]] = {}
|
| 55 |
for r in lines.sort("entry_id", "line_seq").iter_rows(named=True):
|
| 56 |
line_map.setdefault(r.pop("entry_id"), []).append(r)
|
|
|
|
| 71 |
post_day = min(settle_day + rng_dates.randint(0, 3), 28)
|
| 72 |
header["transaction_date"] = f"{period_month}-{tx_day:02d}"
|
| 73 |
header["settlement_date"] = f"{period_month}-{settle_day:02d}"
|
| 74 |
+
# preserve_posting_time is a per-task constant (a task either always
|
| 75 |
+
# preserves or never does), so both branches draw the same 3
|
| 76 |
+
# tx/settle/post day values from rng_dates above; only the source of
|
| 77 |
+
# the time-of-day differs (3 extra draws in the non-preserve branch).
|
| 78 |
+
# Cross-seed byte-identity within a task holds either way.
|
| 79 |
+
if preserve_posting_time:
|
| 80 |
+
real_time = header["posting_ts"].split("T")[1]
|
| 81 |
+
header["posting_ts"] = f"{period_month}-{post_day:02d}T{real_time}"
|
| 82 |
+
else:
|
| 83 |
+
header["posting_ts"] = (
|
| 84 |
+
f"{period_month}-{post_day:02d}"
|
| 85 |
+
f"T{rng_dates.randint(7, 18):02d}:{rng_dates.randint(0, 59):02d}:00."
|
| 86 |
+
f"{rng_dates.randint(0, 999999):06d}"
|
| 87 |
+
)
|
| 88 |
entries.append(Entry(entry_id=eid, header=header, lines=tuple(line_map[eid])))
|
| 89 |
return entries
|
app/src/je_validation/scoring/gates.py
CHANGED
|
@@ -9,35 +9,22 @@ steps and agent-visible instance data; heldout never enters here.
|
|
| 9 |
from __future__ import annotations
|
| 10 |
|
| 11 |
import re
|
| 12 |
-
from dataclasses import dataclass, field
|
| 13 |
|
| 14 |
from je_validation.envir.instance import Instance
|
| 15 |
from je_validation.envir.trajectory import StepRecord
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
from je_validation.scoring.outcome import FLAGGING
|
| 17 |
|
| 18 |
_MONEY = re.compile(r"\$([\d,]+\.\d{2})")
|
| 19 |
|
| 20 |
|
| 21 |
-
@dataclass(frozen=True)
|
| 22 |
-
class GateResult:
|
| 23 |
-
rate: float
|
| 24 |
-
detail: dict = field(compare=False, default_factory=dict)
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
def _ok_steps(steps: list[StepRecord]):
|
| 28 |
-
return [s for s in steps if s.ok]
|
| 29 |
-
|
| 30 |
-
|
| 31 |
def _is_flag(s: StepRecord) -> bool:
|
| 32 |
return s.tool == "disposition" and s.args.get("verdict") in FLAGGING
|
| 33 |
|
| 34 |
|
| 35 |
-
def _dget(d, key):
|
| 36 |
-
"""Disposition field access: production passes state.Disposition objects,
|
| 37 |
-
tests pass plain dicts (same duality as verifiers._get)."""
|
| 38 |
-
return d[key] if isinstance(d, dict) else getattr(d, key)
|
| 39 |
-
|
| 40 |
-
|
| 41 |
def _token_in(token: str, expr: str) -> bool:
|
| 42 |
"""Whole-numeric-token match: plain substring would let entry amount 100
|
| 43 |
"match" expression "1000-900"."""
|
|
@@ -339,7 +326,8 @@ def je10_account_aggregate(steps: list[StepRecord], dispositions: dict,
|
|
| 339 |
b_flagged = b_supported = 0
|
| 340 |
for s in _ok_steps(steps):
|
| 341 |
if s.tool == "aggregate":
|
| 342 |
-
|
|
|
|
| 343 |
grouped = True
|
| 344 |
acct = (s.args.get("filters") or {}).get("account")
|
| 345 |
if acct is not None:
|
|
@@ -402,6 +390,20 @@ GATES = {
|
|
| 402 |
"JE-10": je10_account_aggregate,
|
| 403 |
}
|
| 404 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 405 |
|
| 406 |
def gate_for(task_id: str):
|
| 407 |
try:
|
|
|
|
| 9 |
from __future__ import annotations
|
| 10 |
|
| 11 |
import re
|
|
|
|
| 12 |
|
| 13 |
from je_validation.envir.instance import Instance
|
| 14 |
from je_validation.envir.trajectory import StepRecord
|
| 15 |
+
|
| 16 |
+
# GateResult/_dget/_ok_steps live in gates_common (shared with gates_l3,
|
| 17 |
+
# which this module imports below); re-exported here for existing callers.
|
| 18 |
+
from je_validation.scoring.gates_common import GateResult, _dget, _ok_steps
|
| 19 |
from je_validation.scoring.outcome import FLAGGING
|
| 20 |
|
| 21 |
_MONEY = re.compile(r"\$([\d,]+\.\d{2})")
|
| 22 |
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
def _is_flag(s: StepRecord) -> bool:
|
| 25 |
return s.tool == "disposition" and s.args.get("verdict") in FLAGGING
|
| 26 |
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
def _token_in(token: str, expr: str) -> bool:
|
| 29 |
"""Whole-numeric-token match: plain substring would let entry amount 100
|
| 30 |
"match" expression "1000-900"."""
|
|
|
|
| 326 |
b_flagged = b_supported = 0
|
| 327 |
for s in _ok_steps(steps):
|
| 328 |
if s.tool == "aggregate":
|
| 329 |
+
gb = s.args.get("group_by")
|
| 330 |
+
if gb == "account" or (isinstance(gb, list) and "account" in gb):
|
| 331 |
grouped = True
|
| 332 |
acct = (s.args.get("filters") or {}).get("account")
|
| 333 |
if acct is not None:
|
|
|
|
| 390 |
"JE-10": je10_account_aggregate,
|
| 391 |
}
|
| 392 |
|
| 393 |
+
from je_validation.scoring.gates_l3 import ( # noqa: E402
|
| 394 |
+
je11_policy_before_flag,
|
| 395 |
+
je12_baseline_and_roles,
|
| 396 |
+
je13_joint_aggregate,
|
| 397 |
+
je14_vendor_master,
|
| 398 |
+
je15_digit_profile,
|
| 399 |
+
)
|
| 400 |
+
|
| 401 |
+
GATES.update({
|
| 402 |
+
"JE-11": je11_policy_before_flag, "JE-12": je12_baseline_and_roles,
|
| 403 |
+
"JE-13": je13_joint_aggregate, "JE-14": je14_vendor_master,
|
| 404 |
+
"JE-15": je15_digit_profile,
|
| 405 |
+
})
|
| 406 |
+
|
| 407 |
|
| 408 |
def gate_for(task_id: str):
|
| 409 |
try:
|
app/src/je_validation/scoring/gates_common.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Shared gate primitives used by both gates.py (L1/L2) and gates_l3.py
|
| 2 |
+
(L3). Split out to avoid a circular import: gates_l3 needs these, and
|
| 3 |
+
gates.py needs gates_l3 (late import, to register JE-11..15 in GATES)."""
|
| 4 |
+
|
| 5 |
+
from __future__ import annotations
|
| 6 |
+
|
| 7 |
+
from dataclasses import dataclass, field
|
| 8 |
+
|
| 9 |
+
from je_validation.envir.trajectory import StepRecord
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
@dataclass(frozen=True)
|
| 13 |
+
class GateResult:
|
| 14 |
+
rate: float
|
| 15 |
+
detail: dict = field(compare=False, default_factory=dict)
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def _ok_steps(steps: list[StepRecord]):
|
| 19 |
+
return [s for s in steps if s.ok]
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _dget(d, key):
|
| 23 |
+
"""Disposition field access: production passes state.Disposition objects,
|
| 24 |
+
tests pass plain dicts (same duality as verifiers._get)."""
|
| 25 |
+
return d[key] if isinstance(d, dict) else getattr(d, key)
|
app/src/je_validation/scoring/gates_l3.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""L3 process gates (JE-11..15). Same contract as gates.py: a gate returns a
|
| 2 |
+
rate in [0,1] that multiplies the process component; it reads only ok steps
|
| 3 |
+
(master-data lookups count attempts — JE-02 precedent) and agent-visible
|
| 4 |
+
instance data. HeldOut never enters this module. Factors multiply.
|
| 5 |
+
Registered in gates.GATES by the Phase 5 registration wave."""
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
from je_validation.envir.instance import Instance
|
| 9 |
+
from je_validation.envir.trajectory import StepRecord
|
| 10 |
+
from je_validation.scoring.gates_common import GateResult, _dget, _ok_steps
|
| 11 |
+
from je_validation.scoring.outcome import FLAGGING
|
| 12 |
+
|
| 13 |
+
__all__ = ["GateResult", "Instance", "StepRecord", "_dget", "_ok_steps",
|
| 14 |
+
"FLAGGING"]
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def je11_policy_before_flag(steps: list[StepRecord], dispositions: dict,
|
| 18 |
+
instance: Instance) -> GateResult:
|
| 19 |
+
"""Per-flag, order-sensitive: a threshold claim (any flag/reject in this
|
| 20 |
+
task) needs the approval-limits policy read EARLIER in the episode."""
|
| 21 |
+
have = False
|
| 22 |
+
flags = supported = 0
|
| 23 |
+
for s in _ok_steps(steps):
|
| 24 |
+
if s.tool == "get_policy" and s.args.get("topic") == "approval_limits":
|
| 25 |
+
have = True
|
| 26 |
+
elif s.tool == "disposition" and s.args.get("verdict") in FLAGGING:
|
| 27 |
+
flags += 1
|
| 28 |
+
supported += have
|
| 29 |
+
return GateResult(supported / flags if flags else 1.0,
|
| 30 |
+
{"flags": flags, "with_policy": supported})
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
def je14_vendor_master(steps, dispositions, instance):
|
| 34 |
+
vendor_of = {e.entry_id: str(e.header.get("vendor_id"))
|
| 35 |
+
for e in instance.entries}
|
| 36 |
+
looked = {str(s.args.get("id")) for s in steps
|
| 37 |
+
if s.tool == "get_master_data" and s.args.get("type") == "vendor"}
|
| 38 |
+
flagged_vendors = sorted({vendor_of[eid] for eid, d in dispositions.items()
|
| 39 |
+
if _dget(d, "verdict") in FLAGGING
|
| 40 |
+
and eid in vendor_of})
|
| 41 |
+
if not flagged_vendors:
|
| 42 |
+
return GateResult(1.0, {"flagged_vendors": 0})
|
| 43 |
+
sup = sum(v in looked for v in flagged_vendors)
|
| 44 |
+
return GateResult(sup / len(flagged_vendors),
|
| 45 |
+
{"flagged_vendors": len(flagged_vendors),
|
| 46 |
+
"with_lookup": sup})
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def je15_digit_profile(steps, dispositions, instance):
|
| 50 |
+
"""Order-free (spec names no ordering; c4 rule): a first_digit
|
| 51 |
+
aggregate anywhere in the episode supports all summary-row flags."""
|
| 52 |
+
have = any(s.tool == "aggregate" and s.args.get("metric") == "first_digit"
|
| 53 |
+
for s in _ok_steps(steps))
|
| 54 |
+
flags = sum(1 for eid, d in dispositions.items()
|
| 55 |
+
if _dget(d, "verdict") in FLAGGING
|
| 56 |
+
and str(eid).startswith("JE15-DEPT-"))
|
| 57 |
+
if not flags:
|
| 58 |
+
return GateResult(1.0, {"summary_flags": 0})
|
| 59 |
+
return GateResult(1.0 if have else 0.0,
|
| 60 |
+
{"summary_flags": flags, "digit_profile_called": have})
|
| 61 |
+
|
| 62 |
+
|
| 63 |
+
_JOINT_ATTRS = frozenset(
|
| 64 |
+
{"account", "department", "vendor_type", "expense_category"})
|
| 65 |
+
|
| 66 |
+
|
| 67 |
+
def je13_joint_aggregate(steps: list[StepRecord], dispositions: dict,
|
| 68 |
+
instance: Instance) -> GateResult:
|
| 69 |
+
"""0/1, vacuous-safe -- indivisible core action (JE-07 precedent): at
|
| 70 |
+
least one aggregate call groups by >= 2 anomaly ATTRS in one call (a
|
| 71 |
+
["entry_id", "period"] call is not joint analysis -- panel, sol-pro)."""
|
| 72 |
+
if not dispositions:
|
| 73 |
+
return GateResult(1.0, {"vacuous": True})
|
| 74 |
+
multi = any(s.tool == "aggregate"
|
| 75 |
+
and isinstance(s.args.get("group_by"), list)
|
| 76 |
+
and len(set(s.args["group_by"]) & _JOINT_ATTRS) >= 2
|
| 77 |
+
for s in _ok_steps(steps))
|
| 78 |
+
return GateResult(1.0 if multi else 0.0,
|
| 79 |
+
{"multi_attribute_aggregate": multi})
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
def je12_baseline_and_roles(steps: list[StepRecord], dispositions: dict,
|
| 83 |
+
instance: Instance) -> GateResult:
|
| 84 |
+
"""baseline factor (order-sensitive per spec text, per flag: an earlier
|
| 85 |
+
ok aggregate grouped by a posting-behaviour field -- content-linked)
|
| 86 |
+
x role factor (order-free: role_violation flags need a get_master_data
|
| 87 |
+
attempt on that entry's preparer -- attempts count, JE-02 precedent)."""
|
| 88 |
+
prep_of = {e.entry_id: str(e.header.get("preparer_id"))
|
| 89 |
+
for e in instance.entries}
|
| 90 |
+
have = False
|
| 91 |
+
flags = b_sup = 0
|
| 92 |
+
for s in _ok_steps(steps):
|
| 93 |
+
if s.tool == "aggregate":
|
| 94 |
+
gb = s.args.get("group_by")
|
| 95 |
+
gbs = {gb} if isinstance(gb, str) else set(gb or ())
|
| 96 |
+
if gbs & {"preparer_id", "entry_source"}:
|
| 97 |
+
have = True
|
| 98 |
+
elif s.tool == "disposition" and s.args.get("verdict") in FLAGGING:
|
| 99 |
+
flags += 1
|
| 100 |
+
b_sup += have
|
| 101 |
+
b_rate = b_sup / flags if flags else 1.0
|
| 102 |
+
looked = {str(s.args.get("id")) for s in steps
|
| 103 |
+
if s.tool == "get_master_data" and s.args.get("type") == "user"}
|
| 104 |
+
rv = [eid for eid, d in dispositions.items()
|
| 105 |
+
if _dget(d, "verdict") in FLAGGING
|
| 106 |
+
and _dget(d, "issue_type") == "role_violation"]
|
| 107 |
+
r_rate = (sum(prep_of.get(e) in looked for e in rv) / len(rv)) if rv else 1.0
|
| 108 |
+
return GateResult(b_rate * r_rate,
|
| 109 |
+
{"flags": flags, "with_baseline": b_sup,
|
| 110 |
+
"role_flags": len(rv),
|
| 111 |
+
"with_user_lookup": sum(prep_of.get(e) in looked
|
| 112 |
+
for e in rv)})
|
app/src/je_validation/scoring/task_scoring.py
CHANGED
|
@@ -26,10 +26,15 @@ from je_validation.scoring.verifiers import je07 as v07
|
|
| 26 |
from je_validation.scoring.verifiers import je08 as v08
|
| 27 |
from je_validation.scoring.verifiers import je09 as v09
|
| 28 |
from je_validation.scoring.verifiers import je10 as v10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
_PLAIN = {"JE-01": v01.verify, "JE-02": v02.verify, "JE-05": v05.verify,
|
| 31 |
"JE-06": v06.verify, "JE-07": v07.verify, "JE-08": v08.verify,
|
| 32 |
-
"JE-09": v09.verify, "JE-10": v10.verify}
|
| 33 |
|
| 34 |
|
| 35 |
def episode_verdict(task_id: str, dispositions: dict, entry_ids: list[str],
|
|
@@ -44,6 +49,31 @@ def episode_verdict(task_id: str, dispositions: dict, entry_ids: list[str],
|
|
| 44 |
if d.doc_type == "void_reissue_memo")
|
| 45 |
return v04.verify(dispositions, entry_ids, ti.heldout,
|
| 46 |
reissue_ids=reissue, seen=seen)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
try:
|
| 48 |
verify = _PLAIN[task_id]
|
| 49 |
except KeyError:
|
|
@@ -76,6 +106,7 @@ def score_task_episode(trajectory_path: Path, ti: TaskInstance, config: RunConfi
|
|
| 76 |
return score_episode(trajectory_path, ti, config,
|
| 77 |
rationale=rationale, judge_pass=judge_pass,
|
| 78 |
hard_fail=verdict.hard_fail,
|
|
|
|
| 79 |
outcome_override=verdict.outcome,
|
| 80 |
process_gate=gate.rate,
|
| 81 |
citable=citable,
|
|
|
|
| 26 |
from je_validation.scoring.verifiers import je08 as v08
|
| 27 |
from je_validation.scoring.verifiers import je09 as v09
|
| 28 |
from je_validation.scoring.verifiers import je10 as v10
|
| 29 |
+
from je_validation.scoring.verifiers import je11 as v11
|
| 30 |
+
from je_validation.scoring.verifiers import je12 as v12
|
| 31 |
+
from je_validation.scoring.verifiers import je13 as v13
|
| 32 |
+
from je_validation.scoring.verifiers import je14 as v14
|
| 33 |
+
from je_validation.scoring.verifiers import je15 as v15
|
| 34 |
|
| 35 |
_PLAIN = {"JE-01": v01.verify, "JE-02": v02.verify, "JE-05": v05.verify,
|
| 36 |
"JE-06": v06.verify, "JE-07": v07.verify, "JE-08": v08.verify,
|
| 37 |
+
"JE-09": v09.verify, "JE-10": v10.verify, "JE-13": v13.verify}
|
| 38 |
|
| 39 |
|
| 40 |
def episode_verdict(task_id: str, dispositions: dict, entry_ids: list[str],
|
|
|
|
| 49 |
if d.doc_type == "void_reissue_memo")
|
| 50 |
return v04.verify(dispositions, entry_ids, ti.heldout,
|
| 51 |
reissue_ids=reissue, seen=seen)
|
| 52 |
+
if task_id == "JE-11":
|
| 53 |
+
instalment = frozenset(d.entry_id for d in ti.instance.documents
|
| 54 |
+
if d.doc_type == "contract")
|
| 55 |
+
return v11.verify(dispositions, entry_ids, ti.heldout,
|
| 56 |
+
instalment_ids=instalment)
|
| 57 |
+
if task_id == "JE-12":
|
| 58 |
+
users = ti.instance.master_data["user"]
|
| 59 |
+
sys_users = {u for u, r in users.items() if r.get("system_account")}
|
| 60 |
+
system_ids = frozenset(e.entry_id for e in ti.instance.entries
|
| 61 |
+
if e.header.get("preparer_id") in sys_users)
|
| 62 |
+
return v12.verify(dispositions, entry_ids, ti.heldout,
|
| 63 |
+
system_ids=system_ids)
|
| 64 |
+
if task_id == "JE-14":
|
| 65 |
+
vendor_of = {e.entry_id: str(e.header.get("vendor_id"))
|
| 66 |
+
for e in ti.instance.entries}
|
| 67 |
+
return v14.verify(dispositions, entry_ids, ti.heldout,
|
| 68 |
+
vendor_of=vendor_of)
|
| 69 |
+
if task_id == "JE-15":
|
| 70 |
+
sched = {}
|
| 71 |
+
for d in ti.instance.documents:
|
| 72 |
+
if d.doc_type in ("fee_schedule", "rate_schedule"):
|
| 73 |
+
sched.setdefault(d.entry_id, set()).add(d.doc_id)
|
| 74 |
+
return v15.verify(dispositions, entry_ids, ti.heldout,
|
| 75 |
+
schedule_docs={k: frozenset(v)
|
| 76 |
+
for k, v in sched.items()})
|
| 77 |
try:
|
| 78 |
verify = _PLAIN[task_id]
|
| 79 |
except KeyError:
|
|
|
|
| 106 |
return score_episode(trajectory_path, ti, config,
|
| 107 |
rationale=rationale, judge_pass=judge_pass,
|
| 108 |
hard_fail=verdict.hard_fail,
|
| 109 |
+
task_auto_fail=verdict.auto_fail,
|
| 110 |
outcome_override=verdict.outcome,
|
| 111 |
process_gate=gate.rate,
|
| 112 |
citable=citable,
|
app/src/je_validation/scoring/verifiers/__init__.py
CHANGED
|
@@ -15,6 +15,8 @@ from je_validation.scoring.outcome import FLAGGING
|
|
| 15 |
class OutcomeVerdict:
|
| 16 |
outcome: float
|
| 17 |
hard_fail: bool
|
|
|
|
|
|
|
| 18 |
detail: dict = field(compare=False, default_factory=dict)
|
| 19 |
|
| 20 |
|
|
|
|
| 15 |
class OutcomeVerdict:
|
| 16 |
outcome: float
|
| 17 |
hard_fail: bool
|
| 18 |
+
auto_fail: bool = False # precision floor missed etc.: passed=False,
|
| 19 |
+
# components preserved (fabrication shape)
|
| 20 |
detail: dict = field(compare=False, default_factory=dict)
|
| 21 |
|
| 22 |
|
app/src/je_validation/scoring/verifiers/je02.py
CHANGED
|
@@ -17,5 +17,5 @@ def verify(dispositions: dict, entry_ids: Iterable[str], heldout) -> OutcomeVerd
|
|
| 17 |
wrong = {e for e in flagged & set(seeded) if issue_of(dispositions, e) != seeded[e]}
|
| 18 |
exact = not fps and not misses and not wrong
|
| 19 |
return OutcomeVerdict(1.0 if exact else 0.0, False,
|
| 20 |
-
{"false_positives": len(fps), "missed": sorted(misses),
|
| 21 |
-
|
|
|
|
| 17 |
wrong = {e for e in flagged & set(seeded) if issue_of(dispositions, e) != seeded[e]}
|
| 18 |
exact = not fps and not misses and not wrong
|
| 19 |
return OutcomeVerdict(1.0 if exact else 0.0, False,
|
| 20 |
+
detail={"false_positives": len(fps), "missed": sorted(misses),
|
| 21 |
+
"wrong_issue_type": sorted(wrong)})
|
app/src/je_validation/scoring/verifiers/je03.py
CHANGED
|
@@ -18,6 +18,6 @@ def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
|
| 18 |
hard_fail = bool(flagged_exceptions)
|
| 19 |
exact = not fps and not misses and not wrong
|
| 20 |
return OutcomeVerdict(0.0 if hard_fail or not exact else 1.0, hard_fail,
|
| 21 |
-
{"flagged_exceptions": sorted(flagged_exceptions),
|
| 22 |
-
|
| 23 |
-
|
|
|
|
| 18 |
hard_fail = bool(flagged_exceptions)
|
| 19 |
exact = not fps and not misses and not wrong
|
| 20 |
return OutcomeVerdict(0.0 if hard_fail or not exact else 1.0, hard_fail,
|
| 21 |
+
detail={"flagged_exceptions": sorted(flagged_exceptions),
|
| 22 |
+
"false_positives": len(fps), "missed": sorted(misses),
|
| 23 |
+
"wrong_issue_type": sorted(wrong)})
|
app/src/je_validation/scoring/verifiers/je04.py
CHANGED
|
@@ -15,7 +15,8 @@ def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
|
| 15 |
seeded = {d.entry_id: d.revealing_evidence_id for d in heldout.defects}
|
| 16 |
flagged = flagged_ids(dispositions) & id_set
|
| 17 |
if flagged & reissue_ids:
|
| 18 |
-
return OutcomeVerdict(0.0, True,
|
|
|
|
| 19 |
|
| 20 |
def names_counterpart(eid: str) -> bool:
|
| 21 |
stated = _get(dispositions[eid], "counterpart_entry_id")
|
|
@@ -26,4 +27,4 @@ def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
|
| 26 |
precision = len(tps) / len(flagged) if flagged else 0.0
|
| 27 |
recall = len(tps) / len(seeded)
|
| 28 |
return OutcomeVerdict(precision * recall, False,
|
| 29 |
-
{"tp": len(tps), "fp": len(fps), "seeded": len(seeded)})
|
|
|
|
| 15 |
seeded = {d.entry_id: d.revealing_evidence_id for d in heldout.defects}
|
| 16 |
flagged = flagged_ids(dispositions) & id_set
|
| 17 |
if flagged & reissue_ids:
|
| 18 |
+
return OutcomeVerdict(0.0, True,
|
| 19 |
+
detail={"flagged_reissue": sorted(flagged & reissue_ids)})
|
| 20 |
|
| 21 |
def names_counterpart(eid: str) -> bool:
|
| 22 |
stated = _get(dispositions[eid], "counterpart_entry_id")
|
|
|
|
| 27 |
precision = len(tps) / len(flagged) if flagged else 0.0
|
| 28 |
recall = len(tps) / len(seeded)
|
| 29 |
return OutcomeVerdict(precision * recall, False,
|
| 30 |
+
detail={"tp": len(tps), "fp": len(fps), "seeded": len(seeded)})
|
app/src/je_validation/scoring/verifiers/je05.py
CHANGED
|
@@ -17,5 +17,5 @@ def verify(dispositions: dict, entry_ids: Iterable[str], heldout) -> OutcomeVerd
|
|
| 17 |
wrong = {e for e in flagged & set(seeded) if issue_of(dispositions, e) != seeded[e]}
|
| 18 |
exact = not fps and not misses and not wrong
|
| 19 |
return OutcomeVerdict(1.0 if exact else 0.0, False,
|
| 20 |
-
{"false_positives": len(fps), "missed": sorted(misses),
|
| 21 |
-
|
|
|
|
| 17 |
wrong = {e for e in flagged & set(seeded) if issue_of(dispositions, e) != seeded[e]}
|
| 18 |
exact = not fps and not misses and not wrong
|
| 19 |
return OutcomeVerdict(1.0 if exact else 0.0, False,
|
| 20 |
+
detail={"false_positives": len(fps), "missed": sorted(misses),
|
| 21 |
+
"wrong_issue_type": sorted(wrong)})
|
app/src/je_validation/scoring/verifiers/je11.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-11: split groups scored by per-member Jaccard against seeded groups
|
| 2 |
+
(HeldOut.claims split_group vs [claim:split_group=N] labels); instalment
|
| 3 |
+
false positives weighted double; precision floor 0.7 -> auto_fail (passed
|
| 4 |
+
False, components preserved)."""
|
| 5 |
+
from __future__ import annotations
|
| 6 |
+
|
| 7 |
+
from collections.abc import Iterable
|
| 8 |
+
|
| 9 |
+
from je_validation.scoring.claims import claims_of
|
| 10 |
+
from je_validation.scoring.verifiers import OutcomeVerdict, f1_stats, flagged_ids, issue_of
|
| 11 |
+
|
| 12 |
+
PRECISION_FLOOR = 0.7
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
| 16 |
+
instalment_ids: frozenset[str]) -> OutcomeVerdict:
|
| 17 |
+
ids = set(entry_ids)
|
| 18 |
+
seeded = {d.entry_id: d.defect_type for d in heldout.defects}
|
| 19 |
+
seeded_groups: dict[str, frozenset[str]] = {}
|
| 20 |
+
by_g: dict[int, set[str]] = {}
|
| 21 |
+
for eid, c in heldout.claims.items():
|
| 22 |
+
by_g.setdefault(c["split_group"], set()).add(eid)
|
| 23 |
+
for members in by_g.values():
|
| 24 |
+
for eid in members:
|
| 25 |
+
seeded_groups[eid] = frozenset(members)
|
| 26 |
+
|
| 27 |
+
flagged = flagged_ids(dispositions) & ids
|
| 28 |
+
claimed: dict[int, set[str]] = {}
|
| 29 |
+
for eid in flagged:
|
| 30 |
+
g = claims_of(dispositions, eid).get("split_group")
|
| 31 |
+
if g is not None:
|
| 32 |
+
claimed.setdefault(g, set()).add(eid)
|
| 33 |
+
claimed_of = {eid: frozenset(m) for m in claimed.values() for eid in m}
|
| 34 |
+
|
| 35 |
+
tp = fp = 0
|
| 36 |
+
credit = 0.0
|
| 37 |
+
for eid in sorted(flagged):
|
| 38 |
+
if eid not in seeded:
|
| 39 |
+
fp += 1
|
| 40 |
+
continue
|
| 41 |
+
tp += 1
|
| 42 |
+
want = seeded[eid]
|
| 43 |
+
if issue_of(dispositions, eid) != want:
|
| 44 |
+
continue
|
| 45 |
+
if want == "threshold_hugging":
|
| 46 |
+
credit += 1.0
|
| 47 |
+
else:
|
| 48 |
+
mine = claimed_of.get(eid, frozenset({eid}))
|
| 49 |
+
ref = seeded_groups[eid]
|
| 50 |
+
credit += len(mine & ref) / len(mine | ref)
|
| 51 |
+
fn = len(set(seeded) & ids) - tp
|
| 52 |
+
instalment_fp = len(flagged & instalment_ids)
|
| 53 |
+
denom = tp + fp + instalment_fp
|
| 54 |
+
p_w = tp / denom if denom else 0.0
|
| 55 |
+
_, recall, _ = f1_stats(tp, fp, fn)
|
| 56 |
+
f1_w = (2 * p_w * recall / (p_w + recall)) if p_w + recall else 0.0
|
| 57 |
+
acc = credit / tp if tp else 0.0
|
| 58 |
+
return OutcomeVerdict(
|
| 59 |
+
outcome=f1_w * acc, hard_fail=False,
|
| 60 |
+
auto_fail=bool(tp + fp) and p_w < PRECISION_FLOOR,
|
| 61 |
+
detail={"precision": p_w, "recall": recall, "tp": tp, "fp": fp,
|
| 62 |
+
"instalment_fp": instalment_fp, "group_credit": acc})
|
app/src/je_validation/scoring/verifiers/je12.py
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-12: F1 x issue-type accuracy; flagging any automated-interface entry
|
| 2 |
+
(system_account user) is a hard fail -- the id is in the agent-visible user
|
| 3 |
+
master, so the check is one lookup away (spec verifier line 2)."""
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
from collections.abc import Iterable
|
| 7 |
+
|
| 8 |
+
from je_validation.scoring.outcome import build_confusion, outcome_score
|
| 9 |
+
from je_validation.scoring.verifiers import OutcomeVerdict, flagged_ids
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
| 13 |
+
system_ids: frozenset[str]) -> OutcomeVerdict:
|
| 14 |
+
ids = set(entry_ids)
|
| 15 |
+
hit = flagged_ids(dispositions) & system_ids & ids
|
| 16 |
+
if hit:
|
| 17 |
+
return OutcomeVerdict(0.0, hard_fail=True,
|
| 18 |
+
detail={"system_flagged": sorted(hit)})
|
| 19 |
+
cm = build_confusion(dispositions, entry_ids, heldout)
|
| 20 |
+
return OutcomeVerdict(outcome_score(cm), hard_fail=False,
|
| 21 |
+
detail={"tp": cm.tp, "fp": cm.fp, "fn": cm.fn,
|
| 22 |
+
"issue_type_accuracy": cm.issue_type_accuracy})
|
app/src/je_validation/scoring/verifiers/je13.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-13: ranked anomaly detection. precision@10 over the agent's
|
| 2 |
+
[claim:anomaly_rank=N] ordering (unranked flags sort last, then entry_id),
|
| 3 |
+
recall of the 12 seeded anomalies, local/global distinction via issue_type."""
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
from collections.abc import Iterable
|
| 7 |
+
|
| 8 |
+
from je_validation.scoring.claims import claims_of
|
| 9 |
+
from je_validation.scoring.verifiers import OutcomeVerdict, flagged_ids, issue_of
|
| 10 |
+
|
| 11 |
+
_UNRANKED = 10 ** 9
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def verify(dispositions: dict, entry_ids: Iterable[str], heldout) -> OutcomeVerdict:
|
| 15 |
+
ids = set(entry_ids)
|
| 16 |
+
seeded = {d.entry_id: d.defect_type for d in heldout.defects}
|
| 17 |
+
flagged = flagged_ids(dispositions) & ids
|
| 18 |
+
ranked = sorted(flagged, key=lambda e: (
|
| 19 |
+
claims_of(dispositions, e).get("anomaly_rank", _UNRANKED), e))
|
| 20 |
+
# ALWAYS /10: unfilled top-10 slots are misses (panel 2026-08-11)
|
| 21 |
+
p10 = sum(e in seeded for e in ranked[:10]) / 10
|
| 22 |
+
tp_ids = flagged & set(seeded)
|
| 23 |
+
recall = len(tp_ids) / len(seeded)
|
| 24 |
+
acc = (sum(issue_of(dispositions, e) == seeded[e] for e in tp_ids)
|
| 25 |
+
/ len(tp_ids)) if tp_ids else 0.0
|
| 26 |
+
return OutcomeVerdict(
|
| 27 |
+
outcome=(0.5 * p10 + 0.5 * recall) * acc, hard_fail=False,
|
| 28 |
+
detail={"p_at_10": p10, "recall": recall, "tp": len(tp_ids),
|
| 29 |
+
"fp": len(flagged) - len(tp_ids)})
|
app/src/je_validation/scoring/verifiers/je14.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-14: vendor-level scoring. Entry flags roll up to vendors via the
|
| 2 |
+
agent-visible vendor_id header; indicator = the vendor's defect type; the
|
| 3 |
+
0.6 precision floor auto-fails the pass verdict without zeroing components."""
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
from collections.abc import Iterable
|
| 7 |
+
|
| 8 |
+
from je_validation.scoring.verifiers import OutcomeVerdict, f1_stats, flagged_ids, issue_of
|
| 9 |
+
|
| 10 |
+
PRECISION_FLOOR = 0.6
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
| 14 |
+
vendor_of: dict[str, str]) -> OutcomeVerdict:
|
| 15 |
+
ids = set(entry_ids)
|
| 16 |
+
seeded_vendor: dict[str, str] = {}
|
| 17 |
+
for d in heldout.defects:
|
| 18 |
+
seeded_vendor[vendor_of[d.entry_id]] = d.defect_type
|
| 19 |
+
flagged_entries = flagged_ids(dispositions) & ids
|
| 20 |
+
flagged_vendors = {vendor_of[e] for e in flagged_entries if e in vendor_of}
|
| 21 |
+
tp_v = flagged_vendors & set(seeded_vendor)
|
| 22 |
+
fp = len(flagged_vendors) - len(tp_v)
|
| 23 |
+
fn = len(seeded_vendor) - len(tp_v)
|
| 24 |
+
precision, recall, f1 = f1_stats(len(tp_v), fp, fn)
|
| 25 |
+
correct = 0
|
| 26 |
+
for v in tp_v:
|
| 27 |
+
want = seeded_vendor[v]
|
| 28 |
+
if any(issue_of(dispositions, e) == want
|
| 29 |
+
for e in flagged_entries if vendor_of.get(e) == v):
|
| 30 |
+
correct += 1
|
| 31 |
+
acc = correct / len(tp_v) if tp_v else 0.0
|
| 32 |
+
return OutcomeVerdict(
|
| 33 |
+
outcome=f1 * acc, hard_fail=False,
|
| 34 |
+
auto_fail=bool(flagged_vendors) and precision < PRECISION_FLOOR,
|
| 35 |
+
detail={"precision": precision, "recall": recall,
|
| 36 |
+
"tp_vendors": len(tp_v), "fp_vendors": fp,
|
| 37 |
+
"indicator_accuracy": acc})
|
app/src/je_validation/scoring/verifiers/je15.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""JE-15: population profiling. The deliverable is the fabricated department
|
| 2 |
+
(summary row) AND the driving entries; structural departments must be
|
| 3 |
+
explained (approved citing their schedule doc), not flagged. Statistic-only
|
| 4 |
+
runs cap at 1/3 of outcome (spec)."""
|
| 5 |
+
from __future__ import annotations
|
| 6 |
+
|
| 7 |
+
from collections.abc import Iterable
|
| 8 |
+
|
| 9 |
+
from je_validation.scoring.verifiers import OutcomeVerdict, _get, flagged_ids, issue_of
|
| 10 |
+
|
| 11 |
+
SUMMARY_PREFIX = "JE15-DEPT-"
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def verify(dispositions: dict, entry_ids: Iterable[str], heldout, *,
|
| 15 |
+
schedule_docs: dict[str, frozenset[str]]) -> OutcomeVerdict:
|
| 16 |
+
ids = set(entry_ids)
|
| 17 |
+
fab_summary = next(d.entry_id for d in heldout.defects
|
| 18 |
+
if d.defect_type == "digit_profile_deviation")
|
| 19 |
+
driving = {d.entry_id for d in heldout.defects
|
| 20 |
+
if d.defect_type == "fabricated_amounts"}
|
| 21 |
+
flagged = flagged_ids(dispositions) & ids
|
| 22 |
+
found = int(fab_summary in flagged
|
| 23 |
+
and issue_of(dispositions, fab_summary)
|
| 24 |
+
== "digit_profile_deviation")
|
| 25 |
+
driving_hits = {e for e in flagged & driving
|
| 26 |
+
if issue_of(dispositions, e) == "fabricated_amounts"}
|
| 27 |
+
entry_credit = min(1.0, len(driving_hits) / 5)
|
| 28 |
+
structural_ok = 0
|
| 29 |
+
for sid, docs in sorted(schedule_docs.items()):
|
| 30 |
+
d = dispositions.get(sid)
|
| 31 |
+
if d is None or sid in flagged:
|
| 32 |
+
continue
|
| 33 |
+
if _get(d, "verdict") == "approve" and set(_get(d, "evidence_ids")) & docs:
|
| 34 |
+
structural_ok += 1
|
| 35 |
+
outcome = found * (1 / 3 + 2 / 3 * entry_credit) \
|
| 36 |
+
* (0.7 + 0.15 * structural_ok)
|
| 37 |
+
return OutcomeVerdict(
|
| 38 |
+
outcome=outcome, hard_fail=False,
|
| 39 |
+
detail={"found_department": bool(found),
|
| 40 |
+
"driving_flagged": len(driving_hits),
|
| 41 |
+
"structural_ok": structural_ok})
|
data/runs/console/c5-grid-je01/deepseek_deepseek-v4-flash/seed3/score.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"outcome": 0.0,
|
| 3 |
-
"process": 0.3333333333333333,
|
| 4 |
-
"rationale": null,
|
| 5 |
-
"combined": 0.037037037037037035,
|
| 6 |
-
"fp_rate": 0.0,
|
| 7 |
-
"fp_penalty": 0.0,
|
| 8 |
-
"final": 0.037037037037037035,
|
| 9 |
-
"fabrications": [],
|
| 10 |
-
"auto_fail": false,
|
| 11 |
-
"hard_fail": false,
|
| 12 |
-
"judge_pass": null,
|
| 13 |
-
"passed": null,
|
| 14 |
-
"judge": "absent",
|
| 15 |
-
"cost_usd": 0.39998567448000016
|
| 16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_flag_everything/seed1/JE-02_seed1.jsonl
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
{"step_idx": 1, "tool": "query_ledger", "args": {"order_by": "entry_id"}, "ok": true, "observation": [{"entry_id": "2024-0000218953", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100352678", "payment_id": "0000218953", "posting_ts": "2024-01-10T09:01:00.464828", "preparer_id": "user_Dept of Emrg Svc & Public Prot_2", "settlement_date": "2024-01-08", "total_credit_cents": 12378860, "total_debit_cents": 12378860, "transaction_date": "2024-01-06", "vendor_id": "BORWU"}, {"entry_id": "2024-0000219222", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162226", "payment_id": "0000219222", "posting_ts": "2024-01-14T16:12:00.681565", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-12", "total_credit_cents": 2890, "total_debit_cents": 2890, "transaction_date": "2024-01-07", "vendor_id": "9999910002"}, {"entry_id": "2024-0000219330", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOLM100147148", "payment_id": "0000219330", "posting_ts": "2024-01-22T13:26:00.326172", "preparer_id": "user_Dept. of Labor_1", "settlement_date": "2024-01-21", "total_credit_cents": 122721, "total_debit_cents": 122721, "transaction_date": "2024-01-21", "vendor_id": "DOTM1"}, {"entry_id": "2024-0000219379", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100312082", "payment_id": "0000219379", "posting_ts": "2024-01-21T17:07:00.477346", "preparer_id": "user_Public Defender Services_2", "settlement_date": "2024-01-18", "total_credit_cents": 92559, "total_debit_cents": 92559, "transaction_date": "2024-01-13", "vendor_id": "DASS1"}, {"entry_id": "2024-0018936570", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100301433", "payment_id": "0018936570", "posting_ts": "2024-01-26T15:38:00.797729", "preparer_id": "user_Dept of Energy & Environ Prot._1", "settlement_date": "2024-01-24", "total_credit_cents": 2752000, "total_debit_cents": 2752000, "transaction_date": "2024-01-19", "vendor_id": "0000029617"}, {"entry_id": "2024-0018936603", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100872640", "payment_id": "0018936603", "posting_ts": "2024-01-15T09:18:00.580591", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-15", "total_credit_cents": 6100, "total_debit_cents": 6100, "transaction_date": "2024-01-10", "vendor_id": "0000064731"}, {"entry_id": "2024-0018936801", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100428085", "payment_id": "0018936801", "posting_ts": "2024-01-06T17:52:00.642032", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-06", "total_credit_cents": 34220, "total_debit_cents": 34220, "transaction_date": "2024-01-05", "vendor_id": "0000183894"}, {"entry_id": "2024-0018937074", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101331528", "payment_id": "0018937074", "posting_ts": "2024-01-24T14:15:00.150500", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-21", "total_credit_cents": 3109725, "total_debit_cents": 3109725, "transaction_date": "2024-01-15", "vendor_id": "0000010003"}, {"entry_id": "2024-0018937570", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600085", "payment_id": "0018937570", "posting_ts": "2024-01-15T16:15:00.366635", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-13", "total_credit_cents": 30901995, "total_debit_cents": 30901995, "transaction_date": "2024-01-07", "vendor_id": "0000012272"}, {"entry_id": "2024-0018942293", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100140765", "payment_id": "0018942293", "posting_ts": "2024-01-27T07:36:00.041375", "preparer_id": "user_Dept of Administrative Svcs_2", "settlement_date": "2024-01-25", "total_credit_cents": 20400, "total_debit_cents": 20400, "transaction_date": "2024-01-19", "vendor_id": "0000010011"}, {"entry_id": "2024-0018942867", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101333117", "payment_id": "0018942867", "posting_ts": "2024-01-14T12:30:00.211456", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-14", "total_credit_cents": 516500, "total_debit_cents": 516500, "transaction_date": "2024-01-13", "vendor_id": "0000189186"}, {"entry_id": "2024-0018943645", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101124829", "payment_id": "0018943645", "posting_ts": "2024-01-07T07:16:00.604375", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-05", "total_credit_cents": 9010, "total_debit_cents": 9010, "transaction_date": "2024-01-03", "vendor_id": "0000223028"}, {"entry_id": "2024-0018944404", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100428531", "payment_id": "0018944404", "posting_ts": "2024-01-27T13:41:00.586449", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-25", "total_credit_cents": 42920, "total_debit_cents": 42920, "transaction_date": "2024-01-23", "vendor_id": "0000082140"}, {"entry_id": "2024-0018945443", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600283", "payment_id": "0018945443", "posting_ts": "2024-01-18T18:03:00.717354", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-18", "total_credit_cents": 495286, "total_debit_cents": 495286, "transaction_date": "2024-01-17", "vendor_id": "0000011966"}, {"entry_id": "2024-0018945698", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600431", "payment_id": "0018945698", "posting_ts": "2024-01-15T14:03:00.872479", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-14", "total_credit_cents": 246500, "total_debit_cents": 246500, "transaction_date": "2024-01-14", "vendor_id": "0000180439"}, {"entry_id": "2024-0018945755", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600467", "payment_id": "0018945755", "posting_ts": "2024-01-13T15:48:00.941387", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-12", "total_credit_cents": 178475, "total_debit_cents": 178475, "transaction_date": "2024-01-06", "vendor_id": "0000203604"}, {"entry_id": "2024-0018946496", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993187", "payment_id": "0018946496", "posting_ts": "2024-01-28T16:49:00.858746", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-28", "total_credit_cents": 2651040, "total_debit_cents": 2651040, "transaction_date": "2024-01-23", "vendor_id": "0000000056"}, {"entry_id": "2024-0018946726", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OTTM100056485", "payment_id": "0018946726", "posting_ts": "2024-01-07T14:21:00.050259", "preparer_id": "user_Office of the State Treasurer_1", "settlement_date": "2024-01-07", "total_credit_cents": 81312, "total_debit_cents": 81312, "transaction_date": "2024-01-07", "vendor_id": "0000010399"}, {"entry_id": "2024-0018947900", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873595", "payment_id": "0018947900", "posting_ts": "2024-01-06T13:57:00.821023", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-04", "total_credit_cents": 852500, "total_debit_cents": 852500, "transaction_date": "2024-01-01", "vendor_id": "0000157016"}, {"entry_id": "2024-0018948209", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOLM100146916", "payment_id": "0018948209", "posting_ts": "2024-01-23T09:21:00.947678", "preparer_id": "user_Dept. of Labor_1", "settlement_date": "2024-01-22", "total_credit_cents": 79200, "total_debit_cents": 79200, "transaction_date": "2024-01-22", "vendor_id": "0000010360"}, {"entry_id": "2024-0018948329", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311326", "payment_id": "0018948329", "posting_ts": "2024-01-05T07:17:00.913838", "preparer_id": "user_Public Defender Services_2", "settlement_date": "2024-01-04", "total_credit_cents": 3525120, "total_debit_cents": 3525120, "transaction_date": "2024-01-04", "vendor_id": "0000014891"}, {"entry_id": "2024-0018949660", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SOSM100018786", "payment_id": "0018949660", "posting_ts": "2024-01-02T17:41:00.636945", "preparer_id": "user_Secretary of the State_1", "settlement_date": "2024-01-02", "total_credit_cents": 1050000, "total_debit_cents": 1050000, "transaction_date": "2024-01-01", "vendor_id": "0000000044"}, {"entry_id": "2024-0018949733", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993833", "payment_id": "0018949733", "posting_ts": "2024-01-28T07:32:00.427894", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-27", "total_credit_cents": 7400492, "total_debit_cents": 7400492, "transaction_date": "2024-01-23", "vendor_id": "0000000285"}, {"entry_id": "2024-0018950154", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101334835", "payment_id": "0018950154", "posting_ts": "2024-01-17T09:10:00.126656", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-17", "total_credit_cents": 13517000, "total_debit_cents": 13517000, "transaction_date": "2024-01-12", "vendor_id": "0000095072"}, {"entry_id": "2024-0018952457", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601090", "payment_id": "0018952457", "posting_ts": "2024-01-09T12:27:00.364584", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-09", "total_credit_cents": 95000, "total_debit_cents": 95000, "transaction_date": "2024-01-05", "vendor_id": "0000079238"}, {"entry_id": "2024-0018952467", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100874095", "payment_id": "0018952467", "posting_ts": "2024-01-28T14:07:00.771152", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-28", "total_credit_cents": 250200, "total_debit_cents": 250200, "transaction_date": "2024-01-25", "vendor_id": "0000100592"}, {"entry_id": "2024-0018952619", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141119", "payment_id": "0018952619", "posting_ts": "2024-01-22T10:10:00.634484", "preparer_id": "user_Dept of Administrative Svcs_2", "settlement_date": "2024-01-21", "total_credit_cents": 2357428, "total_debit_cents": 2357428, "transaction_date": "2024-01-16", "vendor_id": "0000064684"}, {"entry_id": "2024-0018952660", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OAGM100022195", "payment_id": "0018952660", "posting_ts": "2024-01-04T18:40:00.345532", "preparer_id": "user_Attorney General's Office_1", "settlement_date": "2024-01-04", "total_credit_cents": 31500, "total_debit_cents": 31500, "transaction_date": "2024-01-03", "vendor_id": "0000010863"}, {"entry_id": "2024-0018952787", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101335400", "payment_id": "0018952787", "posting_ts": "2024-01-15T18:31:00.081300", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-14", "total_credit_cents": 86400, "total_debit_cents": 86400, "transaction_date": "2024-01-14", "vendor_id": "0000010054"}, {"entry_id": "2024-0018952799", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101335100", "payment_id": "0018952799", "posting_ts": "2024-01-14T17:03:00.871036", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-14", "total_credit_cents": 163297, "total_debit_cents": 163297, "transaction_date": "2024-01-12", "vendor_id": "0000010101"}, {"entry_id": "2024-0018953010", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311600", "payment_id": "0018953010", "posting_ts": "2024-01-28T13:00:00.045765", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-28", "total_credit_cents": 67500, "total_debit_cents": 67500, "transaction_date": "2024-01-23", "vendor_id": "0000060197"}, {"entry_id": "2024-0018953136", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101126219", "payment_id": "0018953136", "posting_ts": "2024-01-19T18:34:00.677214", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-17", "total_credit_cents": 6016, "total_debit_cents": 6016, "transaction_date": "2024-01-14", "vendor_id": "0000173192"}, {"entry_id": "2024-0018953531", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCPM100032067", "payment_id": "0018953531", "posting_ts": "2024-01-25T15:31:00.297116", "preparer_id": "user_Dept. of Consumer Protection_3", "settlement_date": "2024-01-24", "total_credit_cents": 34320, "total_debit_cents": 34320, "transaction_date": "2024-01-18", "vendor_id": "0000224996"}, {"entry_id": "2024-0018953654", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601277", "payment_id": "0018953654", "posting_ts": "2024-01-25T17:10:00.094705", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-25", "total_credit_cents": 199, "total_debit_cents": 199, "transaction_date": "2024-01-24", "vendor_id": "0000150870"}, {"entry_id": "2024-0018953851", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100874415", "payment_id": "0018953851", "posting_ts": "2024-01-13T11:48:00.666764", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-10", "total_credit_cents": 2491900, "total_debit_cents": 2491900, "transaction_date": "2024-01-05", "vendor_id": "0000010627"}, {"entry_id": "2024-0018954047", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302442", "payment_id": "0018954047", "posting_ts": "2024-01-14T09:00:00.229842", "preparer_id": "user_Dept of Energy & Environ Prot._1", "settlement_date": "2024-01-12", "total_credit_cents": 431800, "total_debit_cents": 431800, "transaction_date": "2024-01-11", "vendor_id": "0000133792"}, {"entry_id": "2024-0018955828", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612119", "payment_id": "0018955828", "posting_ts": "2024-01-12T08:51:00.103570", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-10", "total_credit_cents": 4658948, "total_debit_cents": 4658948, "transaction_date": "2024-01-09", "vendor_id": "0000010054"}, {"entry_id": "2024-0018955913", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100874580", "payment_id": "0018955913", "posting_ts": "2024-01-21T11:15:00.999425", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-21", "total_credit_cents": 100000, "total_debit_cents": 100000, "transaction_date": "2024-01-17", "vendor_id": "0000011468"}, {"entry_id": "2024-0018956604", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOHM100024235", "payment_id": "0018956604", "posting_ts": "2024-01-12T15:08:00.393949", "preparer_id": "user_Department of Housing_1", "settlement_date": "2024-01-09", "total_credit_cents": 9797600, "total_debit_cents": 9797600, "transaction_date": "2024-01-04", "vendor_id": "0000019519"}, {"entry_id": "2024-0018956915", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100378143", "payment_id": "0018956915", "posting_ts": "2024-01-28T16:20:00.856853", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-28", "total_credit_cents": 62733, "total_debit_cents": 62733, "transaction_date": "2024-01-24", "vendor_id": "0000082402"}, {"entry_id": "2024-0018957058", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994153", "payment_id": "0018957058", "posting_ts": "2024-01-12T12:42:00.027508", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-12", "total_credit_cents": 354947, "total_debit_cents": 354947, "transaction_date": "2024-01-08", "vendor_id": "0000000207"}, {"entry_id": "2024-0018957185", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DSSM100328915", "payment_id": "0018957185", "posting_ts": "2024-01-27T08:46:00.138414", "preparer_id": "user_Dept. of Social Services_2", "settlement_date": "2024-01-24", "total_credit_cents": 17466, "total_debit_cents": 17466, "transaction_date": "2024-01-22", "vendor_id": "0000010455"}, {"entry_id": "2024-0018958740", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601478", "payment_id": "0018958740", "posting_ts": "2024-01-06T11:37:00.671005", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-03", "total_credit_cents": 790770, "total_debit_cents": 790770, "transaction_date": "2024-01-02", "vendor_id": "0000010775"}, {"entry_id": "2024-0018960882", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353169", "payment_id": "0018960882", "posting_ts": "2024-01-24T13:02:00.433328", "preparer_id": "user_Dept of Emrg Svc & Public Prot_2", "settlement_date": "2024-01-22", "total_credit_cents": 3707, "total_debit_cents": 3707, "transaction_date": "2024-01-16", "vendor_id": "0000010009"}, {"entry_id": "2024-0018962534", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353524", "payment_id": "0018962534", "posting_ts": "2024-01-19T09:36:00.526681", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-18", "total_credit_cents": 200057, "total_debit_cents": 200057, "transaction_date": "2024-01-18", "vendor_id": "0000010249"}, {"entry_id": "2024-0018962860", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601779", "payment_id": "0018962860", "posting_ts": "2024-01-23T16:37:00.787420", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-21", "total_credit_cents": 1561295, "total_debit_cents": 1561295, "transaction_date": "2024-01-18", "vendor_id": "0000090402"}, {"entry_id": "2024-0018964196", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "BORWU00003939", "payment_id": "0018964196", "posting_ts": "2024-01-12T13:30:00.475464", "preparer_id": "user_CSU - Western_1", "settlement_date": "2024-01-11", "total_credit_cents": 16397643, "total_debit_cents": 16397643, "transaction_date": "2024-01-10", "vendor_id": "0000013461"}, {"entry_id": "2024-0018965073", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCPM100032088", "payment_id": "0018965073", "posting_ts": "2024-01-14T07:42:00.780582", "preparer_id": "user_Dept. of Consumer Protection_3", "settlement_date": "2024-01-13", "total_credit_cents": 5895, "total_debit_cents": 5895, "transaction_date": "2024-01-07", "vendor_id": "0000013257"}, {"entry_id": "2024-0018965450", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612923", "payment_id": "0018965450", "posting_ts": "2024-01-13T12:53:00.190626", "preparer_id": "user_Dept. of Correction_3", "settlement_date": "2024-01-13", "total_credit_cents": 46177, "total_debit_cents": 46177, "transaction_date": "2024-01-09", "vendor_id": "0000010119"}, {"entry_id": "2024-0018965693", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602291", "payment_id": "0018965693", "posting_ts": "2024-01-09T18:29:00.867811", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-09", "total_credit_cents": 58100, "total_debit_cents": 58100, "transaction_date": "2024-01-04", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018966339", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877085", "payment_id": "0018966339", "posting_ts": "2024-01-17T15:42:00.201394", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-14", "total_credit_cents": 79200, "total_debit_cents": 79200, "transaction_date": "2024-01-12", "vendor_id": "0000205898"}, {"entry_id": "2024-0018967318", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877183", "payment_id": "0018967318", "posting_ts": "2024-01-23T09:16:00.479372", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-22", "total_credit_cents": 106400, "total_debit_cents": 106400, "transaction_date": "2024-01-16", "vendor_id": "0000207781"}, {"entry_id": "2024-0018967455", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994493", "payment_id": "0018967455", "posting_ts": "2024-01-16T18:11:00.359895", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-13", "total_credit_cents": 730285000, "total_debit_cents": 730285000, "transaction_date": "2024-01-07", "vendor_id": "0000000088"}, {"entry_id": "2024-0018969734", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SOSM100018883", "payment_id": "0018969734", "posting_ts": "2024-01-19T12:42:00.260364", "preparer_id": "user_Secretary of the State_1", "settlement_date": "2024-01-18", "total_credit_cents": 1050000, "total_debit_cents": 1050000, "transaction_date": "2024-01-15", "vendor_id": "0000000133"}, {"entry_id": "2024-0018970505", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DSSM100329216", "payment_id": "0018970505", "posting_ts": "2024-01-11T12:00:00.759170", "preparer_id": "user_Dept. of Social Services_2", "settlement_date": "2024-01-09", "total_credit_cents": 5472500, "total_debit_cents": 5472500, "transaction_date": "2024-01-05", "vendor_id": "0000010043"}, {"entry_id": "2024-0018970798", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100378765", "payment_id": "0018970798", "posting_ts": "2024-01-12T17:03:00.346898", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-11", "total_credit_cents": 265800, "total_debit_cents": 265800, "transaction_date": "2024-01-06", "vendor_id": "0000026919"}, {"entry_id": "2024-0018970825", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCJM100082804", "payment_id": "0018970825", "posting_ts": "2024-01-21T12:43:00.721092", "preparer_id": "user_Division of Criminal Justice_1", "settlement_date": "2024-01-20", "total_credit_cents": 175000, "total_debit_cents": 175000, "transaction_date": "2024-01-18", "vendor_id": "0000058198"}, {"entry_id": "2024-0018971171", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100613331", "payment_id": "0018971171", "posting_ts": "2024-01-07T15:21:00.709014", "preparer_id": "user_Dept. of Correction_3", "settlement_date": "2024-01-04", "total_credit_cents": 60000, "total_debit_cents": 60000, "transaction_date": "2024-01-01", "vendor_id": "0000171356"}, {"entry_id": "2024-0018972003", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100430733", "payment_id": "0018972003", "posting_ts": "2024-01-10T13:59:00.559187", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-10", "total_credit_cents": 120060, "total_debit_cents": 120060, "transaction_date": "2024-01-04", "vendor_id": "0000129450"}, {"entry_id": "2024-0018972250", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101340074", "payment_id": "0018972250", "posting_ts": "2024-01-06T07:02:00.414161", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-04", "total_credit_cents": 14399, "total_debit_cents": 14399, "transaction_date": "2024-01-01", "vendor_id": "0000010201"}], "observation_hash": "473481ac2e860c3168471e92dfb7674bd0c25f394d491754a3e90dbdf368add9", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.11188999997102655, "reasoning_trace": ""}
|
| 2 |
-
{"step_idx": 2, "tool": "disposition", "args": {"entry_id": "2024-0000218953", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.06781399861210957, "reasoning_trace": ""}
|
| 3 |
-
{"step_idx": 3, "tool": "disposition", "args": {"entry_id": "2024-0000219222", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.056771999879856594, "reasoning_trace": ""}
|
| 4 |
-
{"step_idx": 4, "tool": "disposition", "args": {"entry_id": "2024-0000219330", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.044411000999389216, "reasoning_trace": ""}
|
| 5 |
-
{"step_idx": 5, "tool": "disposition", "args": {"entry_id": "2024-0000219379", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03163499968650285, "reasoning_trace": ""}
|
| 6 |
-
{"step_idx": 6, "tool": "disposition", "args": {"entry_id": "2024-0018936570", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04395300129544921, "reasoning_trace": ""}
|
| 7 |
-
{"step_idx": 7, "tool": "disposition", "args": {"entry_id": "2024-0018936603", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04050699863000773, "reasoning_trace": ""}
|
| 8 |
-
{"step_idx": 8, "tool": "disposition", "args": {"entry_id": "2024-0018936801", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0318729998980416, "reasoning_trace": ""}
|
| 9 |
-
{"step_idx": 9, "tool": "disposition", "args": {"entry_id": "2024-0018937074", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.059496998801478185, "reasoning_trace": ""}
|
| 10 |
-
{"step_idx": 10, "tool": "disposition", "args": {"entry_id": "2024-0018937570", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.027333999241818674, "reasoning_trace": ""}
|
| 11 |
-
{"step_idx": 11, "tool": "disposition", "args": {"entry_id": "2024-0018942293", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0652069993520854, "reasoning_trace": ""}
|
| 12 |
-
{"step_idx": 12, "tool": "disposition", "args": {"entry_id": "2024-0018942867", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03424199894652702, "reasoning_trace": ""}
|
| 13 |
-
{"step_idx": 13, "tool": "disposition", "args": {"entry_id": "2024-0018943645", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.021223000658210367, "reasoning_trace": ""}
|
| 14 |
-
{"step_idx": 14, "tool": "disposition", "args": {"entry_id": "2024-0018944404", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01602300108061172, "reasoning_trace": ""}
|
| 15 |
-
{"step_idx": 15, "tool": "disposition", "args": {"entry_id": "2024-0018945443", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011628000720520504, "reasoning_trace": ""}
|
| 16 |
-
{"step_idx": 16, "tool": "disposition", "args": {"entry_id": "2024-0018945698", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.013808999938191846, "reasoning_trace": ""}
|
| 17 |
-
{"step_idx": 17, "tool": "disposition", "args": {"entry_id": "2024-0018945755", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012635000530281104, "reasoning_trace": ""}
|
| 18 |
-
{"step_idx": 18, "tool": "disposition", "args": {"entry_id": "2024-0018946496", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01178700040327385, "reasoning_trace": ""}
|
| 19 |
-
{"step_idx": 19, "tool": "disposition", "args": {"entry_id": "2024-0018946726", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00973599890130572, "reasoning_trace": ""}
|
| 20 |
-
{"step_idx": 20, "tool": "disposition", "args": {"entry_id": "2024-0018947900", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0070019996201153845, "reasoning_trace": ""}
|
| 21 |
-
{"step_idx": 21, "tool": "disposition", "args": {"entry_id": "2024-0018948209", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006538000889122486, "reasoning_trace": ""}
|
| 22 |
-
{"step_idx": 22, "tool": "disposition", "args": {"entry_id": "2024-0018948329", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006106000000727363, "reasoning_trace": ""}
|
| 23 |
-
{"step_idx": 23, "tool": "disposition", "args": {"entry_id": "2024-0018949660", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0059940011851722375, "reasoning_trace": ""}
|
| 24 |
-
{"step_idx": 24, "tool": "disposition", "args": {"entry_id": "2024-0018949733", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006064999979571439, "reasoning_trace": ""}
|
| 25 |
-
{"step_idx": 25, "tool": "disposition", "args": {"entry_id": "2024-0018950154", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004980000085197389, "reasoning_trace": ""}
|
| 26 |
-
{"step_idx": 26, "tool": "disposition", "args": {"entry_id": "2024-0018952457", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005596000846708193, "reasoning_trace": ""}
|
| 27 |
-
{"step_idx": 27, "tool": "disposition", "args": {"entry_id": "2024-0018952467", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005500000042957254, "reasoning_trace": ""}
|
| 28 |
-
{"step_idx": 28, "tool": "disposition", "args": {"entry_id": "2024-0018952619", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005890000466024503, "reasoning_trace": ""}
|
| 29 |
-
{"step_idx": 29, "tool": "disposition", "args": {"entry_id": "2024-0018952660", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0054250012908596545, "reasoning_trace": ""}
|
| 30 |
-
{"step_idx": 30, "tool": "disposition", "args": {"entry_id": "2024-0018952787", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005185000190977007, "reasoning_trace": ""}
|
| 31 |
-
{"step_idx": 31, "tool": "disposition", "args": {"entry_id": "2024-0018952799", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00545900002180133, "reasoning_trace": ""}
|
| 32 |
-
{"step_idx": 32, "tool": "disposition", "args": {"entry_id": "2024-0018953010", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006503998520202003, "reasoning_trace": ""}
|
| 33 |
-
{"step_idx": 33, "tool": "disposition", "args": {"entry_id": "2024-0018953136", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006250000296859071, "reasoning_trace": ""}
|
| 34 |
-
{"step_idx": 34, "tool": "disposition", "args": {"entry_id": "2024-0018953531", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01001499913400039, "reasoning_trace": ""}
|
| 35 |
-
{"step_idx": 35, "tool": "disposition", "args": {"entry_id": "2024-0018953654", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007411001206492074, "reasoning_trace": ""}
|
| 36 |
-
{"step_idx": 36, "tool": "disposition", "args": {"entry_id": "2024-0018953851", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007659000402782112, "reasoning_trace": ""}
|
| 37 |
-
{"step_idx": 37, "tool": "disposition", "args": {"entry_id": "2024-0018954047", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006995998774073087, "reasoning_trace": ""}
|
| 38 |
-
{"step_idx": 38, "tool": "disposition", "args": {"entry_id": "2024-0018955828", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0638269993942231, "reasoning_trace": ""}
|
| 39 |
-
{"step_idx": 39, "tool": "disposition", "args": {"entry_id": "2024-0018955913", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.059758998759207316, "reasoning_trace": ""}
|
| 40 |
-
{"step_idx": 40, "tool": "disposition", "args": {"entry_id": "2024-0018956604", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.030717001209268346, "reasoning_trace": ""}
|
| 41 |
-
{"step_idx": 41, "tool": "disposition", "args": {"entry_id": "2024-0018956915", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.032076999559649266, "reasoning_trace": ""}
|
| 42 |
-
{"step_idx": 42, "tool": "disposition", "args": {"entry_id": "2024-0018957058", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.027731999580282718, "reasoning_trace": ""}
|
| 43 |
-
{"step_idx": 43, "tool": "disposition", "args": {"entry_id": "2024-0018957185", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03611499960243236, "reasoning_trace": ""}
|
| 44 |
-
{"step_idx": 44, "tool": "disposition", "args": {"entry_id": "2024-0018958740", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.05853999937244225, "reasoning_trace": ""}
|
| 45 |
-
{"step_idx": 45, "tool": "disposition", "args": {"entry_id": "2024-0018960882", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.023314998543355614, "reasoning_trace": ""}
|
| 46 |
-
{"step_idx": 46, "tool": "disposition", "args": {"entry_id": "2024-0018962534", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.013722999938181601, "reasoning_trace": ""}
|
| 47 |
-
{"step_idx": 47, "tool": "disposition", "args": {"entry_id": "2024-0018962860", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.015485999028896913, "reasoning_trace": ""}
|
| 48 |
-
{"step_idx": 48, "tool": "disposition", "args": {"entry_id": "2024-0018964196", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010331999874324538, "reasoning_trace": ""}
|
| 49 |
-
{"step_idx": 49, "tool": "disposition", "args": {"entry_id": "2024-0018965073", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.018730999727267772, "reasoning_trace": ""}
|
| 50 |
-
{"step_idx": 50, "tool": "disposition", "args": {"entry_id": "2024-0018965450", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011497999366838485, "reasoning_trace": ""}
|
| 51 |
-
{"step_idx": 51, "tool": "disposition", "args": {"entry_id": "2024-0018965693", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.014324999938253313, "reasoning_trace": ""}
|
| 52 |
-
{"step_idx": 52, "tool": "disposition", "args": {"entry_id": "2024-0018966339", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010374000339652412, "reasoning_trace": ""}
|
| 53 |
-
{"step_idx": 53, "tool": "disposition", "args": {"entry_id": "2024-0018967318", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00949600143940188, "reasoning_trace": ""}
|
| 54 |
-
{"step_idx": 54, "tool": "disposition", "args": {"entry_id": "2024-0018967455", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00902399915503338, "reasoning_trace": ""}
|
| 55 |
-
{"step_idx": 55, "tool": "disposition", "args": {"entry_id": "2024-0018969734", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00904400076251477, "reasoning_trace": ""}
|
| 56 |
-
{"step_idx": 56, "tool": "disposition", "args": {"entry_id": "2024-0018970505", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008959999831859022, "reasoning_trace": ""}
|
| 57 |
-
{"step_idx": 57, "tool": "disposition", "args": {"entry_id": "2024-0018970798", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0137979986902792, "reasoning_trace": ""}
|
| 58 |
-
{"step_idx": 58, "tool": "disposition", "args": {"entry_id": "2024-0018970825", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010020001354860142, "reasoning_trace": ""}
|
| 59 |
-
{"step_idx": 59, "tool": "disposition", "args": {"entry_id": "2024-0018971171", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.024016000679694116, "reasoning_trace": ""}
|
| 60 |
-
{"step_idx": 60, "tool": "disposition", "args": {"entry_id": "2024-0018972003", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00891199852048885, "reasoning_trace": ""}
|
| 61 |
-
{"step_idx": 61, "tool": "disposition", "args": {"entry_id": "2024-0018972250", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00890199953573756, "reasoning_trace": ""}
|
| 62 |
-
{"step_idx": 62, "tool": "submit", "args": {}, "ok": true, "observation": "episode ends", "observation_hash": "e6111d1c5d214c01e92725bf69762fcf2ef6c8eec182f00fd2a8c2e71fea77e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008361999789485708, "reasoning_trace": ""}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_flag_everything/seed2/JE-02_seed2.jsonl
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
{"step_idx": 1, "tool": "query_ledger", "args": {"order_by": "entry_id"}, "ok": true, "observation": [{"entry_id": "2024-0018936613", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101123506", "payment_id": "0018936613", "posting_ts": "2024-01-17T15:36:00.721882", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-14", "total_credit_cents": 11658, "total_debit_cents": 11658, "transaction_date": "2024-01-14", "vendor_id": "0000070384"}, {"entry_id": "2024-0018937533", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600017", "payment_id": "0018937533", "posting_ts": "2024-01-10T07:50:00.248462", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-08", "total_credit_cents": 142084149, "total_debit_cents": 142084149, "transaction_date": "2024-01-04", "vendor_id": "0000011244"}, {"entry_id": "2024-0018940679", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600170", "payment_id": "0018940679", "posting_ts": "2024-01-28T14:11:00.485217", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-26", "total_credit_cents": 7500, "total_debit_cents": 7500, "transaction_date": "2024-01-21", "vendor_id": "0000212996"}, {"entry_id": "2024-0018940688", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101331705", "payment_id": "0018940688", "posting_ts": "2024-01-13T08:33:00.958018", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-10", "total_credit_cents": 103920, "total_debit_cents": 103920, "transaction_date": "2024-01-09", "vendor_id": "0000012014"}, {"entry_id": "2024-0018941219", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100872980", "payment_id": "0018941219", "posting_ts": "2024-01-13T12:42:00.024469", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-13", "total_credit_cents": 8602300, "total_debit_cents": 8602300, "transaction_date": "2024-01-12", "vendor_id": "0000011761"}, {"entry_id": "2024-0018942128", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OTTM100056431", "payment_id": "0018942128", "posting_ts": "2024-01-22T12:29:00.145860", "preparer_id": "user_Office of the State Treasurer_1", "settlement_date": "2024-01-22", "total_credit_cents": 217757, "total_debit_cents": 217757, "transaction_date": "2024-01-21", "vendor_id": "0000023394"}, {"entry_id": "2024-0018942155", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "CMEM100016647", "payment_id": "0018942155", "posting_ts": "2024-01-14T07:00:00.951451", "preparer_id": "user_Chief Medical Examiner's Offc_1", "settlement_date": "2024-01-13", "total_credit_cents": 13130, "total_debit_cents": 13130, "transaction_date": "2024-01-11", "vendor_id": "0000091680"}, {"entry_id": "2024-0018942566", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873190", "payment_id": "0018942566", "posting_ts": "2024-01-22T16:53:00.446284", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-22", "total_credit_cents": 1750000, "total_debit_cents": 1750000, "transaction_date": "2024-01-17", "vendor_id": "0000010442"}, {"entry_id": "2024-0018942601", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873142", "payment_id": "0018942601", "posting_ts": "2024-01-05T14:02:00.403129", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-03", "total_credit_cents": 33387, "total_debit_cents": 33387, "transaction_date": "2024-01-03", "vendor_id": "0000010792"}, {"entry_id": "2024-0018943681", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASIT00018142", "payment_id": "0018943681", "posting_ts": "2024-01-10T12:30:00.905945", "preparer_id": "user_DAS - Information Technology_2", "settlement_date": "2024-01-09", "total_credit_cents": 24276819, "total_debit_cents": 24276819, "transaction_date": "2024-01-07", "vendor_id": "0000014271"}, {"entry_id": "2024-0018943901", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377151", "payment_id": "0018943901", "posting_ts": "2024-01-12T18:10:00.523903", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-12", "total_credit_cents": 2000, "total_debit_cents": 2000, "transaction_date": "2024-01-12", "vendor_id": "0000166098"}, {"entry_id": "2024-0018943997", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377462", "payment_id": "0018943997", "posting_ts": "2024-01-20T14:31:00.240367", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-18", "total_credit_cents": 4000, "total_debit_cents": 4000, "transaction_date": "2024-01-18", "vendor_id": "0000134388"}, {"entry_id": "2024-0018945660", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377407", "payment_id": "0018945660", "posting_ts": "2024-01-14T14:55:00.374725", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-14", "total_credit_cents": 4000, "total_debit_cents": 4000, "transaction_date": "2024-01-14", "vendor_id": "0000142726"}, {"entry_id": "2024-0018946632", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101333630", "payment_id": "0018946632", "posting_ts": "2024-01-18T17:01:00.318076", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-15", "total_credit_cents": 1253145, "total_debit_cents": 1253145, "transaction_date": "2024-01-15", "vendor_id": "0000010008"}, {"entry_id": "2024-0018946720", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993175", "payment_id": "0018946720", "posting_ts": "2024-01-17T16:46:00.732983", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-15", "total_credit_cents": 2259, "total_debit_cents": 2259, "transaction_date": "2024-01-09", "vendor_id": "0000010334"}, {"entry_id": "2024-0018947936", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100037701", "payment_id": "0018947936", "posting_ts": "2024-01-27T17:56:00.904931", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-24", "total_credit_cents": 22500, "total_debit_cents": 22500, "transaction_date": "2024-01-18", "vendor_id": "0000222952"}, {"entry_id": "2024-0018948033", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600949", "payment_id": "0018948033", "posting_ts": "2024-01-16T17:35:00.226041", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-14", "total_credit_cents": 2050, "total_debit_cents": 2050, "transaction_date": "2024-01-10", "vendor_id": "0000010027"}, {"entry_id": "2024-0018948583", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MILM100116203", "payment_id": "0018948583", "posting_ts": "2024-01-10T11:18:00.756248", "preparer_id": "user_Military Dept._1", "settlement_date": "2024-01-07", "total_credit_cents": 49000, "total_debit_cents": 49000, "transaction_date": "2024-01-02", "vendor_id": "0000189592"}, {"entry_id": "2024-0018949600", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601037", "payment_id": "0018949600", "posting_ts": "2024-01-25T14:13:00.841984", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-24", "total_credit_cents": 43690, "total_debit_cents": 43690, "transaction_date": "2024-01-19", "vendor_id": "0000010021"}, {"entry_id": "2024-0018949681", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993800", "payment_id": "0018949681", "posting_ts": "2024-01-16T16:34:00.616452", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-13", "total_credit_cents": 1635060, "total_debit_cents": 1635060, "transaction_date": "2024-01-10", "vendor_id": "0000000067"}, {"entry_id": "2024-0018949690", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993806", "payment_id": "0018949690", "posting_ts": "2024-01-26T15:13:00.487118", "preparer_id": "user_State Dept of Education_3", "settlement_date": "2024-01-25", "total_credit_cents": 6161813, "total_debit_cents": 6161813, "transaction_date": "2024-01-24", "vendor_id": "0000000092"}, {"entry_id": "2024-0018950892", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101125714", "payment_id": "0018950892", "posting_ts": "2024-01-14T13:04:00.819081", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-11", "total_credit_cents": 184000, "total_debit_cents": 184000, "transaction_date": "2024-01-10", "vendor_id": "0000091680"}, {"entry_id": "2024-0018950915", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601034", "payment_id": "0018950915", "posting_ts": "2024-01-11T15:09:00.090811", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-10", "total_credit_cents": 40000, "total_debit_cents": 40000, "transaction_date": "2024-01-09", "vendor_id": "0000187478"}, {"entry_id": "2024-0018951452", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141021", "payment_id": "0018951452", "posting_ts": "2024-01-20T07:00:00.125358", "preparer_id": "user_Dept of Administrative Svcs_2", "settlement_date": "2024-01-17", "total_credit_cents": 10112348, "total_debit_cents": 10112348, "transaction_date": "2024-01-13", "vendor_id": "0000052330"}, {"entry_id": "2024-0018952422", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101125968", "payment_id": "0018952422", "posting_ts": "2024-01-28T08:03:00.811295", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-26", "total_credit_cents": 6961800, "total_debit_cents": 6961800, "transaction_date": "2024-01-23", "vendor_id": "0000011224"}, {"entry_id": "2024-0018952792", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100352891", "payment_id": "0018952792", "posting_ts": "2024-01-27T09:31:00.186602", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-24", "total_credit_cents": 106093, "total_debit_cents": 106093, "transaction_date": "2024-01-20", "vendor_id": "0000010072"}, {"entry_id": "2024-0018953166", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059330", "payment_id": "0018953166", "posting_ts": "2024-01-09T10:31:00.466416", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-07", "total_credit_cents": 369700, "total_debit_cents": 369700, "transaction_date": "2024-01-07", "vendor_id": "0000185131"}, {"entry_id": "2024-0018953769", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101126008", "payment_id": "0018953769", "posting_ts": "2024-01-23T11:06:00.295138", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-20", "total_credit_cents": 988803, "total_debit_cents": 988803, "transaction_date": "2024-01-17", "vendor_id": "0000010037"}, {"entry_id": "2024-0018953813", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302280", "payment_id": "0018953813", "posting_ts": "2024-01-25T10:12:00.219897", "preparer_id": "user_Dept of Energy & Environ Prot._1", "settlement_date": "2024-01-22", "total_credit_cents": 78, "total_debit_cents": 78, "transaction_date": "2024-01-16", "vendor_id": "0000010334"}, {"entry_id": "2024-0018954014", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101126242", "payment_id": "0018954014", "posting_ts": "2024-01-18T12:31:00.291203", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-15", "total_credit_cents": 33355, "total_debit_cents": 33355, "transaction_date": "2024-01-10", "vendor_id": "0000097507"}, {"entry_id": "2024-0018954120", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429372", "payment_id": "0018954120", "posting_ts": "2024-01-10T15:34:00.122735", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-10", "total_credit_cents": 138620, "total_debit_cents": 138620, "transaction_date": "2024-01-09", "vendor_id": "0000178480"}, {"entry_id": "2024-0018955942", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101335500", "payment_id": "0018955942", "posting_ts": "2024-01-14T12:21:00.144067", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-14", "total_credit_cents": 786500, "total_debit_cents": 786500, "transaction_date": "2024-01-09", "vendor_id": "0000013702"}, {"entry_id": "2024-0018956723", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASS100044250", "payment_id": "0018956723", "posting_ts": "2024-01-18T14:22:00.914045", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-15", "total_credit_cents": 5965340, "total_debit_cents": 5965340, "transaction_date": "2024-01-10", "vendor_id": "0000045146"}, {"entry_id": "2024-0018956846", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OPMM100090578", "payment_id": "0018956846", "posting_ts": "2024-01-12T18:42:00.672870", "preparer_id": "user_Office of Policy & Management_1", "settlement_date": "2024-01-10", "total_credit_cents": 45463347, "total_debit_cents": 45463347, "transaction_date": "2024-01-07", "vendor_id": "0000000156"}, {"entry_id": "2024-0018956898", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100378108", "payment_id": "0018956898", "posting_ts": "2024-01-14T12:25:00.598619", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-11", "total_credit_cents": 2000, "total_debit_cents": 2000, "transaction_date": "2024-01-06", "vendor_id": "0000131256"}, {"entry_id": "2024-0018957235", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOLM100147034", "payment_id": "0018957235", "posting_ts": "2024-01-22T11:57:00.412168", "preparer_id": "user_Dept. of Labor_1", "settlement_date": "2024-01-19", "total_credit_cents": 1692048, "total_debit_cents": 1692048, "transaction_date": "2024-01-14", "vendor_id": "0000011870"}, {"entry_id": "2024-0018958712", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OECM100081308", "payment_id": "0018958712", "posting_ts": "2024-01-06T18:56:00.120625", "preparer_id": "user_Office of Early Childhood_2", "settlement_date": "2024-01-06", "total_credit_cents": 4837500, "total_debit_cents": 4837500, "transaction_date": "2024-01-06", "vendor_id": "0000010527"}, {"entry_id": "2024-0018958911", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302568", "payment_id": "0018958911", "posting_ts": "2024-01-03T08:49:00.616898", "preparer_id": "user_Dept of Energy & Environ Prot._1", "settlement_date": "2024-01-01", "total_credit_cents": 156515, "total_debit_cents": 156515, "transaction_date": "2024-01-01", "vendor_id": "0000043384"}, {"entry_id": "2024-0018960360", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353614", "payment_id": "0018960360", "posting_ts": "2024-01-23T10:00:00.341342", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-21", "total_credit_cents": 220000, "total_debit_cents": 220000, "transaction_date": "2024-01-18", "vendor_id": "0000044419"}, {"entry_id": "2024-0018960814", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601717", "payment_id": "0018960814", "posting_ts": "2024-01-11T16:14:00.550813", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-11", "total_credit_cents": 9600, "total_debit_cents": 9600, "transaction_date": "2024-01-08", "vendor_id": "0000010024"}, {"entry_id": "2024-0018960895", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302744", "payment_id": "0018960895", "posting_ts": "2024-01-27T09:51:00.177149", "preparer_id": "user_Dept of Energy & Environ Prot._2", "settlement_date": "2024-01-27", "total_credit_cents": 125001, "total_debit_cents": 125001, "transaction_date": "2024-01-25", "vendor_id": "0000010021"}, {"entry_id": "2024-0018961346", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038894", "payment_id": "0018961346", "posting_ts": "2024-01-27T12:28:00.560062", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-26", "total_credit_cents": 12000, "total_debit_cents": 12000, "transaction_date": "2024-01-25", "vendor_id": "0000223530"}, {"entry_id": "2024-0018962221", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601511", "payment_id": "0018962221", "posting_ts": "2024-01-28T13:41:00.628552", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-28", "total_credit_cents": 90000, "total_debit_cents": 90000, "transaction_date": "2024-01-22", "vendor_id": "0000115105"}, {"entry_id": "2024-0018962414", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101336021", "payment_id": "0018962414", "posting_ts": "2024-01-24T07:23:00.086411", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-23", "total_credit_cents": 1330756, "total_debit_cents": 1330756, "transaction_date": "2024-01-22", "vendor_id": "0000000152"}, {"entry_id": "2024-0018962623", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101337527", "payment_id": "0018962623", "posting_ts": "2024-01-14T10:51:00.522540", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-13", "total_credit_cents": 148395, "total_debit_cents": 148395, "transaction_date": "2024-01-11", "vendor_id": "0000010831"}, {"entry_id": "2024-0018962768", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612503", "payment_id": "0018962768", "posting_ts": "2024-01-18T11:49:00.234755", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-15", "total_credit_cents": 26247690, "total_debit_cents": 26247690, "transaction_date": "2024-01-10", "vendor_id": "0000020981"}, {"entry_id": "2024-0018962868", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101127354", "payment_id": "0018962868", "posting_ts": "2024-01-08T10:31:00.058427", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-08", "total_credit_cents": 16929, "total_debit_cents": 16929, "transaction_date": "2024-01-08", "vendor_id": "0000101478"}, {"entry_id": "2024-0018962938", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311856", "payment_id": "0018962938", "posting_ts": "2024-01-19T15:49:00.690350", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-18", "total_credit_cents": 375000, "total_debit_cents": 375000, "transaction_date": "2024-01-17", "vendor_id": "0000154669"}, {"entry_id": "2024-0018962978", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429665", "payment_id": "0018962978", "posting_ts": "2024-01-21T13:36:00.552103", "preparer_id": "user_Probate Court Administration_2", "settlement_date": "2024-01-21", "total_credit_cents": 493410, "total_debit_cents": 493410, "transaction_date": "2024-01-18", "vendor_id": "0000177843"}, {"entry_id": "2024-0018964093", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612824", "payment_id": "0018964093", "posting_ts": "2024-01-25T17:36:00.778591", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-23", "total_credit_cents": 319469, "total_debit_cents": 319469, "transaction_date": "2024-01-23", "vendor_id": "0000010232"}, {"entry_id": "2024-0018965387", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MILM100116448", "payment_id": "0018965387", "posting_ts": "2024-01-19T12:34:00.179510", "preparer_id": "user_Military Dept._1", "settlement_date": "2024-01-19", "total_credit_cents": 437915, "total_debit_cents": 437915, "transaction_date": "2024-01-17", "vendor_id": "0000010003"}, {"entry_id": "2024-0018965391", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994894", "payment_id": "0018965391", "posting_ts": "2024-01-12T10:08:00.278479", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-09", "total_credit_cents": 331, "total_debit_cents": 331, "transaction_date": "2024-01-07", "vendor_id": "0000010007"}, {"entry_id": "2024-0018966541", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100876534", "payment_id": "0018966541", "posting_ts": "2024-01-14T08:39:00.653120", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-12", "total_credit_cents": 120000, "total_debit_cents": 120000, "transaction_date": "2024-01-09", "vendor_id": "0000223317"}, {"entry_id": "2024-0018967302", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059468", "payment_id": "0018967302", "posting_ts": "2024-01-23T10:56:00.053193", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-22", "total_credit_cents": 32595, "total_debit_cents": 32595, "transaction_date": "2024-01-21", "vendor_id": "0000203554"}, {"entry_id": "2024-0018967495", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TRBM100007164", "payment_id": "0018967495", "posting_ts": "2024-01-07T18:42:00.519101", "preparer_id": "user_Teachers' Retirement Board_3", "settlement_date": "2024-01-07", "total_credit_cents": 19884158809, "total_debit_cents": 19884158809, "transaction_date": "2024-01-05", "vendor_id": "TRBM1"}, {"entry_id": "2024-0018968425", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101338522", "payment_id": "0018968425", "posting_ts": "2024-01-21T11:05:00.937509", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-20", "total_credit_cents": 14000, "total_debit_cents": 14000, "transaction_date": "2024-01-18", "vendor_id": "0000189592"}, {"entry_id": "2024-0018969355", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602497", "payment_id": "0018969355", "posting_ts": "2024-01-18T10:19:00.499100", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-16", "total_credit_cents": 105400, "total_debit_cents": 105400, "transaction_date": "2024-01-14", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018969843", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101339024", "payment_id": "0018969843", "posting_ts": "2024-01-14T11:48:00.731605", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-12", "total_credit_cents": 946852, "total_debit_cents": 946852, "transaction_date": "2024-01-07", "vendor_id": "0000010382"}, {"entry_id": "2024-0018970662", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100613549", "payment_id": "0018970662", "posting_ts": "2024-01-12T09:33:00.451558", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-10", "total_credit_cents": 186420, "total_debit_cents": 186420, "transaction_date": "2024-01-06", "vendor_id": "0000010298"}, {"entry_id": "2024-0018971104", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OSCM100083309", "payment_id": "0018971104", "posting_ts": "2024-01-28T14:24:00.850844", "preparer_id": "user_State Comptroller's Office_2", "settlement_date": "2024-01-26", "total_credit_cents": 181604, "total_debit_cents": 181604, "transaction_date": "2024-01-24", "vendor_id": "0000019187"}], "observation_hash": "b4a7775167c08870c9b978b280614cced8edacc67e1ca1af685e31ca8d337ada", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.1460089988540858, "reasoning_trace": ""}
|
| 2 |
-
{"step_idx": 2, "tool": "disposition", "args": {"entry_id": "2024-0018936613", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.053932999435346574, "reasoning_trace": ""}
|
| 3 |
-
{"step_idx": 3, "tool": "disposition", "args": {"entry_id": "2024-0018937533", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.06615900019824039, "reasoning_trace": ""}
|
| 4 |
-
{"step_idx": 4, "tool": "disposition", "args": {"entry_id": "2024-0018940679", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02495199987606611, "reasoning_trace": ""}
|
| 5 |
-
{"step_idx": 5, "tool": "disposition", "args": {"entry_id": "2024-0018940688", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011242000255151652, "reasoning_trace": ""}
|
| 6 |
-
{"step_idx": 6, "tool": "disposition", "args": {"entry_id": "2024-0018941219", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009650999345467426, "reasoning_trace": ""}
|
| 7 |
-
{"step_idx": 7, "tool": "disposition", "args": {"entry_id": "2024-0018942128", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00941700091061648, "reasoning_trace": ""}
|
| 8 |
-
{"step_idx": 8, "tool": "disposition", "args": {"entry_id": "2024-0018942155", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008768000043346547, "reasoning_trace": ""}
|
| 9 |
-
{"step_idx": 9, "tool": "disposition", "args": {"entry_id": "2024-0018942566", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008986000466393307, "reasoning_trace": ""}
|
| 10 |
-
{"step_idx": 10, "tool": "disposition", "args": {"entry_id": "2024-0018942601", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008703998901182786, "reasoning_trace": ""}
|
| 11 |
-
{"step_idx": 11, "tool": "disposition", "args": {"entry_id": "2024-0018943681", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.016325000615324825, "reasoning_trace": ""}
|
| 12 |
-
{"step_idx": 12, "tool": "disposition", "args": {"entry_id": "2024-0018943901", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010009000106947497, "reasoning_trace": ""}
|
| 13 |
-
{"step_idx": 13, "tool": "disposition", "args": {"entry_id": "2024-0018943997", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.030302000595838763, "reasoning_trace": ""}
|
| 14 |
-
{"step_idx": 14, "tool": "disposition", "args": {"entry_id": "2024-0018945660", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.016662999769323505, "reasoning_trace": ""}
|
| 15 |
-
{"step_idx": 15, "tool": "disposition", "args": {"entry_id": "2024-0018946632", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009747998774400912, "reasoning_trace": ""}
|
| 16 |
-
{"step_idx": 16, "tool": "disposition", "args": {"entry_id": "2024-0018946720", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.017832000594353303, "reasoning_trace": ""}
|
| 17 |
-
{"step_idx": 17, "tool": "disposition", "args": {"entry_id": "2024-0018947936", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010279998605255969, "reasoning_trace": ""}
|
| 18 |
-
{"step_idx": 18, "tool": "disposition", "args": {"entry_id": "2024-0018948033", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03509399903123267, "reasoning_trace": ""}
|
| 19 |
-
{"step_idx": 19, "tool": "disposition", "args": {"entry_id": "2024-0018948583", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02703199970710557, "reasoning_trace": ""}
|
| 20 |
-
{"step_idx": 20, "tool": "disposition", "args": {"entry_id": "2024-0018949600", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.062058999901637435, "reasoning_trace": ""}
|
| 21 |
-
{"step_idx": 21, "tool": "disposition", "args": {"entry_id": "2024-0018949681", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.044305001210886985, "reasoning_trace": ""}
|
| 22 |
-
{"step_idx": 22, "tool": "disposition", "args": {"entry_id": "2024-0018949690", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0588509992667241, "reasoning_trace": ""}
|
| 23 |
-
{"step_idx": 23, "tool": "disposition", "args": {"entry_id": "2024-0018950892", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0749099999666214, "reasoning_trace": ""}
|
| 24 |
-
{"step_idx": 24, "tool": "disposition", "args": {"entry_id": "2024-0018950915", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04829300087294541, "reasoning_trace": ""}
|
| 25 |
-
{"step_idx": 25, "tool": "disposition", "args": {"entry_id": "2024-0018951452", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04370399983599782, "reasoning_trace": ""}
|
| 26 |
-
{"step_idx": 26, "tool": "disposition", "args": {"entry_id": "2024-0018952422", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04029500087199267, "reasoning_trace": ""}
|
| 27 |
-
{"step_idx": 27, "tool": "disposition", "args": {"entry_id": "2024-0018952792", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.07069399907777552, "reasoning_trace": ""}
|
| 28 |
-
{"step_idx": 28, "tool": "disposition", "args": {"entry_id": "2024-0018953166", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.060200000007171184, "reasoning_trace": ""}
|
| 29 |
-
{"step_idx": 29, "tool": "disposition", "args": {"entry_id": "2024-0018953769", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03235599979234394, "reasoning_trace": ""}
|
| 30 |
-
{"step_idx": 30, "tool": "disposition", "args": {"entry_id": "2024-0018953813", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02837000101862941, "reasoning_trace": ""}
|
| 31 |
-
{"step_idx": 31, "tool": "disposition", "args": {"entry_id": "2024-0018954014", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.019442999473540112, "reasoning_trace": ""}
|
| 32 |
-
{"step_idx": 32, "tool": "disposition", "args": {"entry_id": "2024-0018954120", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.07124500007194001, "reasoning_trace": ""}
|
| 33 |
-
{"step_idx": 33, "tool": "disposition", "args": {"entry_id": "2024-0018955942", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.026375000743428245, "reasoning_trace": ""}
|
| 34 |
-
{"step_idx": 34, "tool": "disposition", "args": {"entry_id": "2024-0018956723", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01905899989651516, "reasoning_trace": ""}
|
| 35 |
-
{"step_idx": 35, "tool": "disposition", "args": {"entry_id": "2024-0018956846", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.032964000638457946, "reasoning_trace": ""}
|
| 36 |
-
{"step_idx": 36, "tool": "disposition", "args": {"entry_id": "2024-0018956898", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02385399966442492, "reasoning_trace": ""}
|
| 37 |
-
{"step_idx": 37, "tool": "disposition", "args": {"entry_id": "2024-0018957235", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.019813000108115375, "reasoning_trace": ""}
|
| 38 |
-
{"step_idx": 38, "tool": "disposition", "args": {"entry_id": "2024-0018958712", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03045699850190431, "reasoning_trace": ""}
|
| 39 |
-
{"step_idx": 39, "tool": "disposition", "args": {"entry_id": "2024-0018958911", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.013360000593820587, "reasoning_trace": ""}
|
| 40 |
-
{"step_idx": 40, "tool": "disposition", "args": {"entry_id": "2024-0018960360", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008085999070317484, "reasoning_trace": ""}
|
| 41 |
-
{"step_idx": 41, "tool": "disposition", "args": {"entry_id": "2024-0018960814", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006745000064256601, "reasoning_trace": ""}
|
| 42 |
-
{"step_idx": 42, "tool": "disposition", "args": {"entry_id": "2024-0018960895", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00925799940887373, "reasoning_trace": ""}
|
| 43 |
-
{"step_idx": 43, "tool": "disposition", "args": {"entry_id": "2024-0018961346", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010563999239820987, "reasoning_trace": ""}
|
| 44 |
-
{"step_idx": 44, "tool": "disposition", "args": {"entry_id": "2024-0018962221", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02275299993925728, "reasoning_trace": ""}
|
| 45 |
-
{"step_idx": 45, "tool": "disposition", "args": {"entry_id": "2024-0018962414", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.020337000023573637, "reasoning_trace": ""}
|
| 46 |
-
{"step_idx": 46, "tool": "disposition", "args": {"entry_id": "2024-0018962623", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01639299989619758, "reasoning_trace": ""}
|
| 47 |
-
{"step_idx": 47, "tool": "disposition", "args": {"entry_id": "2024-0018962768", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010182999176322483, "reasoning_trace": ""}
|
| 48 |
-
{"step_idx": 48, "tool": "disposition", "args": {"entry_id": "2024-0018962868", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00772299972595647, "reasoning_trace": ""}
|
| 49 |
-
{"step_idx": 49, "tool": "disposition", "args": {"entry_id": "2024-0018962938", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006218000635271892, "reasoning_trace": ""}
|
| 50 |
-
{"step_idx": 50, "tool": "disposition", "args": {"entry_id": "2024-0018962978", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010592999387881719, "reasoning_trace": ""}
|
| 51 |
-
{"step_idx": 51, "tool": "disposition", "args": {"entry_id": "2024-0018964093", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012379001418594271, "reasoning_trace": ""}
|
| 52 |
-
{"step_idx": 52, "tool": "disposition", "args": {"entry_id": "2024-0018965387", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011086000085924752, "reasoning_trace": ""}
|
| 53 |
-
{"step_idx": 53, "tool": "disposition", "args": {"entry_id": "2024-0018965391", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0067759992816718295, "reasoning_trace": ""}
|
| 54 |
-
{"step_idx": 54, "tool": "disposition", "args": {"entry_id": "2024-0018966541", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005738000254496001, "reasoning_trace": ""}
|
| 55 |
-
{"step_idx": 55, "tool": "disposition", "args": {"entry_id": "2024-0018967302", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00587299837206956, "reasoning_trace": ""}
|
| 56 |
-
{"step_idx": 56, "tool": "disposition", "args": {"entry_id": "2024-0018967495", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005473999408422969, "reasoning_trace": ""}
|
| 57 |
-
{"step_idx": 57, "tool": "disposition", "args": {"entry_id": "2024-0018968425", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0054109987104311585, "reasoning_trace": ""}
|
| 58 |
-
{"step_idx": 58, "tool": "disposition", "args": {"entry_id": "2024-0018969355", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005579000571742654, "reasoning_trace": ""}
|
| 59 |
-
{"step_idx": 59, "tool": "disposition", "args": {"entry_id": "2024-0018969843", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0053010007832199335, "reasoning_trace": ""}
|
| 60 |
-
{"step_idx": 60, "tool": "disposition", "args": {"entry_id": "2024-0018970662", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0098510008683661, "reasoning_trace": ""}
|
| 61 |
-
{"step_idx": 61, "tool": "disposition", "args": {"entry_id": "2024-0018971104", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010146999557036906, "reasoning_trace": ""}
|
| 62 |
-
{"step_idx": 62, "tool": "submit", "args": {}, "ok": true, "observation": "episode ends", "observation_hash": "e6111d1c5d214c01e92725bf69762fcf2ef6c8eec182f00fd2a8c2e71fea77e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012385000445647165, "reasoning_trace": ""}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_flag_everything/seed3/JE-02_seed3.jsonl
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
{"step_idx": 1, "tool": "query_ledger", "args": {"order_by": "entry_id"}, "ok": true, "observation": [{"entry_id": "2024-0018936306", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100610837", "payment_id": "0018936306", "posting_ts": "2024-01-24T14:04:00.704852", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-23", "total_credit_cents": 2198419, "total_debit_cents": 2198419, "transaction_date": "2024-01-23", "vendor_id": "0000010008"}, {"entry_id": "2024-0018936592", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101123522", "payment_id": "0018936592", "posting_ts": "2024-01-18T07:07:00.440667", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-16", "total_credit_cents": 15256, "total_debit_cents": 15256, "transaction_date": "2024-01-12", "vendor_id": "0000055299"}, {"entry_id": "2024-0018937674", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100037135", "payment_id": "0018937674", "posting_ts": "2024-01-19T12:05:00.372838", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-18", "total_credit_cents": 730271, "total_debit_cents": 730271, "transaction_date": "2024-01-14", "vendor_id": "0000035579"}, {"entry_id": "2024-0018937743", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DVAM100104673", "payment_id": "0018937743", "posting_ts": "2024-01-23T16:07:00.676389", "preparer_id": "user_Dept. of Veterans' Affairs_1", "settlement_date": "2024-01-22", "total_credit_cents": 210000, "total_debit_cents": 210000, "transaction_date": "2024-01-18", "vendor_id": "0000139425"}, {"entry_id": "2024-0018941318", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100037340", "payment_id": "0018941318", "posting_ts": "2024-01-26T08:13:00.792442", "preparer_id": "user_CT Tech Educ and Career Sys_3", "settlement_date": "2024-01-25", "total_credit_cents": 99724, "total_debit_cents": 99724, "transaction_date": "2024-01-25", "vendor_id": "0000036731"}, {"entry_id": "2024-0018942288", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100140754", "payment_id": "0018942288", "posting_ts": "2024-01-20T13:10:00.573034", "preparer_id": "user_Dept of Administrative Svcs_2", "settlement_date": "2024-01-17", "total_credit_cents": 42502640, "total_debit_cents": 42502640, "transaction_date": "2024-01-16", "vendor_id": "0000013207"}, {"entry_id": "2024-0018942776", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311178", "payment_id": "0018942776", "posting_ts": "2024-01-22T13:11:00.265562", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-19", "total_credit_cents": 3244200, "total_debit_cents": 3244200, "transaction_date": "2024-01-16", "vendor_id": "0000104754"}, {"entry_id": "2024-0018942788", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "WCCM100024045", "payment_id": "0018942788", "posting_ts": "2024-01-14T08:47:00.645344", "preparer_id": "user_Worker's Compensation Commiss._1", "settlement_date": "2024-01-14", "total_credit_cents": 8468, "total_debit_cents": 8468, "transaction_date": "2024-01-13", "vendor_id": "0000135582"}, {"entry_id": "2024-0018943641", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100140731", "payment_id": "0018943641", "posting_ts": "2024-01-28T16:21:00.083038", "preparer_id": "user_Dept of Administrative Svcs_3", "settlement_date": "2024-01-28", "total_credit_cents": 80000, "total_debit_cents": 80000, "transaction_date": "2024-01-22", "vendor_id": "0000219695"}, {"entry_id": "2024-0018944402", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600310", "payment_id": "0018944402", "posting_ts": "2024-01-25T11:55:00.882523", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-24", "total_credit_cents": 815986, "total_debit_cents": 815986, "transaction_date": "2024-01-19", "vendor_id": "0000081547"}, {"entry_id": "2024-0018945466", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377326", "payment_id": "0018945466", "posting_ts": "2024-01-18T17:29:00.087641", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-16", "total_credit_cents": 245497, "total_debit_cents": 245497, "transaction_date": "2024-01-12", "vendor_id": "0000014223"}, {"entry_id": "2024-0018945516", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600296", "payment_id": "0018945516", "posting_ts": "2024-01-05T08:37:00.872730", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-05", "total_credit_cents": 226422, "total_debit_cents": 226422, "transaction_date": "2024-01-03", "vendor_id": "0000030418"}, {"entry_id": "2024-0018945638", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600383", "payment_id": "0018945638", "posting_ts": "2024-01-11T17:18:00.064001", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-09", "total_credit_cents": 314300, "total_debit_cents": 314300, "transaction_date": "2024-01-05", "vendor_id": "0000135633"}, {"entry_id": "2024-0018945873", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377368", "payment_id": "0018945873", "posting_ts": "2024-01-22T07:28:00.434045", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-21", "total_credit_cents": 897, "total_debit_cents": 897, "transaction_date": "2024-01-18", "vendor_id": "0000224423"}, {"entry_id": "2024-0018946623", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993296", "payment_id": "0018946623", "posting_ts": "2024-01-26T11:56:00.154325", "preparer_id": "user_State Dept of Education_2", "settlement_date": "2024-01-23", "total_credit_cents": 2121424, "total_debit_cents": 2121424, "transaction_date": "2024-01-17", "vendor_id": "0000000902"}, {"entry_id": "2024-0018947858", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100037706", "payment_id": "0018947858", "posting_ts": "2024-01-20T17:12:00.179506", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-17", "total_credit_cents": 10535, "total_debit_cents": 10535, "transaction_date": "2024-01-13", "vendor_id": "0000032375"}, {"entry_id": "2024-0018948446", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100428943", "payment_id": "0018948446", "posting_ts": "2024-01-21T11:54:00.467875", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-19", "total_credit_cents": 32962, "total_debit_cents": 32962, "transaction_date": "2024-01-14", "vendor_id": "0000098004"}, {"entry_id": "2024-0018949539", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600729", "payment_id": "0018949539", "posting_ts": "2024-01-19T16:41:00.713929", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-19", "total_credit_cents": 7800, "total_debit_cents": 7800, "transaction_date": "2024-01-13", "vendor_id": "0000163887"}, {"entry_id": "2024-0018949648", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993790", "payment_id": "0018949648", "posting_ts": "2024-01-15T08:36:00.724870", "preparer_id": "user_State Dept of Education_2", "settlement_date": "2024-01-14", "total_credit_cents": 11343712, "total_debit_cents": 11343712, "transaction_date": "2024-01-09", "vendor_id": "0000000027"}, {"entry_id": "2024-0018949935", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600918", "payment_id": "0018949935", "posting_ts": "2024-01-16T10:38:00.962732", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-14", "total_credit_cents": 4257479, "total_debit_cents": 4257479, "transaction_date": "2024-01-09", "vendor_id": "0000011264"}, {"entry_id": "2024-0018950105", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASS100044232", "payment_id": "0018950105", "posting_ts": "2024-01-12T13:54:00.358570", "preparer_id": "user_Dept of Administrative Svcs_3", "settlement_date": "2024-01-11", "total_credit_cents": 10974, "total_debit_cents": 10974, "transaction_date": "2024-01-09", "vendor_id": "0000059169"}, {"entry_id": "2024-0018950977", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141065", "payment_id": "0018950977", "posting_ts": "2024-01-09T12:36:00.500838", "preparer_id": "user_Dept of Administrative Svcs_3", "settlement_date": "2024-01-09", "total_credit_cents": 4463713, "total_debit_cents": 4463713, "transaction_date": "2024-01-07", "vendor_id": "0000175164"}, {"entry_id": "2024-0018951127", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994035", "payment_id": "0018951127", "posting_ts": "2024-01-20T12:09:00.776368", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-17", "total_credit_cents": 824550, "total_debit_cents": 824550, "transaction_date": "2024-01-11", "vendor_id": "0000000217"}, {"entry_id": "2024-0018951356", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873937", "payment_id": "0018951356", "posting_ts": "2024-01-17T15:04:00.808676", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-17", "total_credit_cents": 6375000, "total_debit_cents": 6375000, "transaction_date": "2024-01-14", "vendor_id": "0000011401"}, {"entry_id": "2024-0018951615", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101126400", "payment_id": "0018951615", "posting_ts": "2024-01-06T18:49:00.584069", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-05", "total_credit_cents": 4159872, "total_debit_cents": 4159872, "transaction_date": "2024-01-01", "vendor_id": "0000192465"}, {"entry_id": "2024-0018952576", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASIT00018179", "payment_id": "0018952576", "posting_ts": "2024-01-15T10:44:00.405669", "preparer_id": "user_DAS - Information Technology_1", "settlement_date": "2024-01-12", "total_credit_cents": 92432, "total_debit_cents": 92432, "transaction_date": "2024-01-06", "vendor_id": "0000010142"}, {"entry_id": "2024-0018952903", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100611895", "payment_id": "0018952903", "posting_ts": "2024-01-24T14:19:00.308037", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-23", "total_credit_cents": 1899377, "total_debit_cents": 1899377, "transaction_date": "2024-01-23", "vendor_id": "0000011905"}, {"entry_id": "2024-0018953070", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302433", "payment_id": "0018953070", "posting_ts": "2024-01-12T07:03:00.565169", "preparer_id": "user_Dept of Energy & Environ Prot._2", "settlement_date": "2024-01-11", "total_credit_cents": 450250, "total_debit_cents": 450250, "transaction_date": "2024-01-09", "vendor_id": "0000120632"}, {"entry_id": "2024-0018953097", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101125616", "payment_id": "0018953097", "posting_ts": "2024-01-21T15:33:00.405561", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-18", "total_credit_cents": 12218, "total_debit_cents": 12218, "transaction_date": "2024-01-15", "vendor_id": "0000149353"}, {"entry_id": "2024-0018953192", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311567", "payment_id": "0018953192", "posting_ts": "2024-01-10T13:29:00.781137", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-08", "total_credit_cents": 135000, "total_debit_cents": 135000, "transaction_date": "2024-01-05", "vendor_id": "0000210426"}, {"entry_id": "2024-0018953470", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DAGM100055129", "payment_id": "0018953470", "posting_ts": "2024-01-16T11:18:00.619533", "preparer_id": "user_Dept. of Agriculture_2", "settlement_date": "2024-01-15", "total_credit_cents": 20000, "total_debit_cents": 20000, "transaction_date": "2024-01-09", "vendor_id": "0000164919"}, {"entry_id": "2024-0018953790", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101333892", "payment_id": "0018953790", "posting_ts": "2024-01-21T11:25:00.881719", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-20", "total_credit_cents": 507480, "total_debit_cents": 507480, "transaction_date": "2024-01-15", "vendor_id": "0000010170"}, {"entry_id": "2024-0018954051", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429435", "payment_id": "0018954051", "posting_ts": "2024-01-16T16:32:00.673643", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-13", "total_credit_cents": 124120, "total_debit_cents": 124120, "transaction_date": "2024-01-10", "vendor_id": "0000135850"}, {"entry_id": "2024-0018955609", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038379", "payment_id": "0018955609", "posting_ts": "2024-01-21T16:30:00.665721", "preparer_id": "user_CT Tech Educ and Career Sys_2", "settlement_date": "2024-01-21", "total_credit_cents": 7375, "total_debit_cents": 7375, "transaction_date": "2024-01-17", "vendor_id": "0000206575"}, {"entry_id": "2024-0018957144", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311721", "payment_id": "0018957144", "posting_ts": "2024-01-19T13:57:00.137350", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-17", "total_credit_cents": 716010, "total_debit_cents": 716010, "transaction_date": "2024-01-13", "vendor_id": "0000010142"}, {"entry_id": "2024-0018957218", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCS100082747", "payment_id": "0018957218", "posting_ts": "2024-01-04T13:56:00.831338", "preparer_id": "user_DOC - Correctional Industries_2", "settlement_date": "2024-01-04", "total_credit_cents": 91236, "total_debit_cents": 91236, "transaction_date": "2024-01-01", "vendor_id": "0000010945"}, {"entry_id": "2024-0018958503", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162267", "payment_id": "0018958503", "posting_ts": "2024-01-22T08:36:00.693961", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-21", "total_credit_cents": 1570600, "total_debit_cents": 1570600, "transaction_date": "2024-01-15", "vendor_id": "0000000090"}, {"entry_id": "2024-0018958505", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162268", "payment_id": "0018958505", "posting_ts": "2024-01-21T08:50:00.493156", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-18", "total_credit_cents": 7873750, "total_debit_cents": 7873750, "transaction_date": "2024-01-16", "vendor_id": "0000000093"}, {"entry_id": "2024-0018962528", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101127386", "payment_id": "0018962528", "posting_ts": "2024-01-17T11:11:00.068011", "preparer_id": "user_Judicial Branch_3", "settlement_date": "2024-01-15", "total_credit_cents": 11063100, "total_debit_cents": 11063100, "transaction_date": "2024-01-10", "vendor_id": "0000010217"}, {"entry_id": "2024-0018962579", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302439", "payment_id": "0018962579", "posting_ts": "2024-01-17T10:47:00.947356", "preparer_id": "user_Dept of Energy & Environ Prot._2", "settlement_date": "2024-01-15", "total_credit_cents": 8698, "total_debit_cents": 8698, "transaction_date": "2024-01-15", "vendor_id": "0000010455"}, {"entry_id": "2024-0018962743", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601860", "payment_id": "0018962743", "posting_ts": "2024-01-25T09:59:00.715451", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-25", "total_credit_cents": 224989, "total_debit_cents": 224989, "transaction_date": "2024-01-21", "vendor_id": "0000014409"}, {"entry_id": "2024-0018963076", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059461", "payment_id": "0018963076", "posting_ts": "2024-01-26T08:35:00.047547", "preparer_id": "user_Econ. & Community Development_2", "settlement_date": "2024-01-24", "total_credit_cents": 1500000, "total_debit_cents": 1500000, "transaction_date": "2024-01-19", "vendor_id": "0000225093"}, {"entry_id": "2024-0018963837", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100039121", "payment_id": "0018963837", "posting_ts": "2024-01-28T15:11:00.560385", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-28", "total_credit_cents": 26000, "total_debit_cents": 26000, "transaction_date": "2024-01-22", "vendor_id": "0000217452"}, {"entry_id": "2024-0018964181", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311901", "payment_id": "0018964181", "posting_ts": "2024-01-14T10:55:00.023342", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-11", "total_credit_cents": 196860, "total_debit_cents": 196860, "transaction_date": "2024-01-08", "vendor_id": "0000012104"}, {"entry_id": "2024-0018964296", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100430144", "payment_id": "0018964296", "posting_ts": "2024-01-15T09:46:00.283579", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-13", "total_credit_cents": 36400, "total_debit_cents": 36400, "transaction_date": "2024-01-11", "vendor_id": "0000096387"}, {"entry_id": "2024-0018965890", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101128052", "payment_id": "0018965890", "posting_ts": "2024-01-16T10:16:00.079893", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-16", "total_credit_cents": 1317500, "total_debit_cents": 1317500, "transaction_date": "2024-01-12", "vendor_id": "0000108870"}, {"entry_id": "2024-0018966141", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100039274", "payment_id": "0018966141", "posting_ts": "2024-01-16T12:16:00.911042", "preparer_id": "user_CT Tech Educ and Career Sys_2", "settlement_date": "2024-01-14", "total_credit_cents": 1026950, "total_debit_cents": 1026950, "transaction_date": "2024-01-10", "vendor_id": "0000180143"}, {"entry_id": "2024-0018966255", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100876544", "payment_id": "0018966255", "posting_ts": "2024-01-09T13:03:00.255867", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-08", "total_credit_cents": 341500, "total_debit_cents": 341500, "transaction_date": "2024-01-05", "vendor_id": "0000193650"}, {"entry_id": "2024-0018967060", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612904", "payment_id": "0018967060", "posting_ts": "2024-01-28T12:50:00.746975", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-28", "total_credit_cents": 21142, "total_debit_cents": 21142, "transaction_date": "2024-01-25", "vendor_id": "0000010916"}, {"entry_id": "2024-0018967607", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353894", "payment_id": "0018967607", "posting_ts": "2024-01-17T17:50:00.887135", "preparer_id": "user_Dept of Emrg Svc & Public Prot_2", "settlement_date": "2024-01-14", "total_credit_cents": 2513054, "total_debit_cents": 2513054, "transaction_date": "2024-01-14", "vendor_id": "0000000143"}, {"entry_id": "2024-0018967609", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OECM100081397", "payment_id": "0018967609", "posting_ts": "2024-01-25T14:17:00.129198", "preparer_id": "user_Office of Early Childhood_2", "settlement_date": "2024-01-24", "total_credit_cents": 882359, "total_debit_cents": 882359, "transaction_date": "2024-01-23", "vendor_id": "0000000147"}, {"entry_id": "2024-0018967830", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877624", "payment_id": "0018967830", "posting_ts": "2024-01-14T13:18:00.976196", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-13", "total_credit_cents": 13199707, "total_debit_cents": 13199707, "transaction_date": "2024-01-13", "vendor_id": "0000013205"}, {"entry_id": "2024-0018968430", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602378", "payment_id": "0018968430", "posting_ts": "2024-01-05T07:20:00.797773", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-02", "total_credit_cents": 159800, "total_debit_cents": 159800, "transaction_date": "2024-01-01", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018969556", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994408", "payment_id": "0018969556", "posting_ts": "2024-01-21T13:09:00.300249", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-19", "total_credit_cents": 245053000, "total_debit_cents": 245053000, "transaction_date": "2024-01-14", "vendor_id": "0000000111"}, {"entry_id": "2024-0018969951", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPHM100195410", "payment_id": "0018969951", "posting_ts": "2024-01-12T18:02:00.568256", "preparer_id": "user_Dept. of Public Health_1", "settlement_date": "2024-01-10", "total_credit_cents": 621798, "total_debit_cents": 621798, "transaction_date": "2024-01-07", "vendor_id": "0000025547"}, {"entry_id": "2024-0018970104", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DSSM100329122", "payment_id": "0018970104", "posting_ts": "2024-01-28T16:28:00.345249", "preparer_id": "user_Dept. of Social Services_2", "settlement_date": "2024-01-28", "total_credit_cents": 2306250, "total_debit_cents": 2306250, "transaction_date": "2024-01-23", "vendor_id": "0000180585"}, {"entry_id": "2024-0018970155", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353675", "payment_id": "0018970155", "posting_ts": "2024-01-20T14:23:00.959990", "preparer_id": "user_Dept of Emrg Svc & Public Prot_3", "settlement_date": "2024-01-20", "total_credit_cents": 20620, "total_debit_cents": 20620, "transaction_date": "2024-01-17", "vendor_id": "0000214633"}, {"entry_id": "2024-0018970770", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101339644", "payment_id": "0018970770", "posting_ts": "2024-01-18T10:32:00.050360", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-17", "total_credit_cents": 2134503, "total_debit_cents": 2134503, "transaction_date": "2024-01-13", "vendor_id": "0000014038"}, {"entry_id": "2024-0018972239", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100613443", "payment_id": "0018972239", "posting_ts": "2024-01-16T13:38:00.197423", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-16", "total_credit_cents": 2870287, "total_debit_cents": 2870287, "transaction_date": "2024-01-12", "vendor_id": "0000010087"}, {"entry_id": "2024-0018990966", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141494", "payment_id": "0018990966", "posting_ts": "2024-01-08T09:56:00.785049", "preparer_id": "user_Dept of Administrative Svcs_2", "settlement_date": "2024-01-08", "total_credit_cents": 6471560, "total_debit_cents": 6471560, "transaction_date": "2024-01-02", "vendor_id": "0000010075"}], "observation_hash": "79e00721fa37d71e93e77a6b9af82ab9e0db27f30cd2623f27382931a055a23c", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.15570899995509535, "reasoning_trace": ""}
|
| 2 |
-
{"step_idx": 2, "tool": "disposition", "args": {"entry_id": "2024-0018936306", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.06707599823130295, "reasoning_trace": ""}
|
| 3 |
-
{"step_idx": 3, "tool": "disposition", "args": {"entry_id": "2024-0018936592", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.07095600085449405, "reasoning_trace": ""}
|
| 4 |
-
{"step_idx": 4, "tool": "disposition", "args": {"entry_id": "2024-0018937674", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.09404100092069712, "reasoning_trace": ""}
|
| 5 |
-
{"step_idx": 5, "tool": "disposition", "args": {"entry_id": "2024-0018937743", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.7634980011061998, "reasoning_trace": ""}
|
| 6 |
-
{"step_idx": 6, "tool": "disposition", "args": {"entry_id": "2024-0018941318", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03523499981383793, "reasoning_trace": ""}
|
| 7 |
-
{"step_idx": 7, "tool": "disposition", "args": {"entry_id": "2024-0018942288", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.015695000911364332, "reasoning_trace": ""}
|
| 8 |
-
{"step_idx": 8, "tool": "disposition", "args": {"entry_id": "2024-0018942776", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04178100061835721, "reasoning_trace": ""}
|
| 9 |
-
{"step_idx": 9, "tool": "disposition", "args": {"entry_id": "2024-0018942788", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.028528998882393353, "reasoning_trace": ""}
|
| 10 |
-
{"step_idx": 10, "tool": "disposition", "args": {"entry_id": "2024-0018943641", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.034238000807818025, "reasoning_trace": ""}
|
| 11 |
-
{"step_idx": 11, "tool": "disposition", "args": {"entry_id": "2024-0018944402", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.026992000130121596, "reasoning_trace": ""}
|
| 12 |
-
{"step_idx": 12, "tool": "disposition", "args": {"entry_id": "2024-0018945466", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02425399907224346, "reasoning_trace": ""}
|
| 13 |
-
{"step_idx": 13, "tool": "disposition", "args": {"entry_id": "2024-0018945516", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01597700065758545, "reasoning_trace": ""}
|
| 14 |
-
{"step_idx": 14, "tool": "disposition", "args": {"entry_id": "2024-0018945638", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01367799995932728, "reasoning_trace": ""}
|
| 15 |
-
{"step_idx": 15, "tool": "disposition", "args": {"entry_id": "2024-0018945873", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010746000043582171, "reasoning_trace": ""}
|
| 16 |
-
{"step_idx": 16, "tool": "disposition", "args": {"entry_id": "2024-0018946623", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012988999515073374, "reasoning_trace": ""}
|
| 17 |
-
{"step_idx": 17, "tool": "disposition", "args": {"entry_id": "2024-0018947858", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010375999409006909, "reasoning_trace": ""}
|
| 18 |
-
{"step_idx": 18, "tool": "disposition", "args": {"entry_id": "2024-0018948446", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012579999747686088, "reasoning_trace": ""}
|
| 19 |
-
{"step_idx": 19, "tool": "disposition", "args": {"entry_id": "2024-0018949539", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009346000297227874, "reasoning_trace": ""}
|
| 20 |
-
{"step_idx": 20, "tool": "disposition", "args": {"entry_id": "2024-0018949648", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03942399962397758, "reasoning_trace": ""}
|
| 21 |
-
{"step_idx": 21, "tool": "disposition", "args": {"entry_id": "2024-0018949935", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.05015099850425031, "reasoning_trace": ""}
|
| 22 |
-
{"step_idx": 22, "tool": "disposition", "args": {"entry_id": "2024-0018950105", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02278300053148996, "reasoning_trace": ""}
|
| 23 |
-
{"step_idx": 23, "tool": "disposition", "args": {"entry_id": "2024-0018950977", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.013072000001557171, "reasoning_trace": ""}
|
| 24 |
-
{"step_idx": 24, "tool": "disposition", "args": {"entry_id": "2024-0018951127", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010187000953010283, "reasoning_trace": ""}
|
| 25 |
-
{"step_idx": 25, "tool": "disposition", "args": {"entry_id": "2024-0018951356", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01028299993777182, "reasoning_trace": ""}
|
| 26 |
-
{"step_idx": 26, "tool": "disposition", "args": {"entry_id": "2024-0018951615", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.05467799928737804, "reasoning_trace": ""}
|
| 27 |
-
{"step_idx": 27, "tool": "disposition", "args": {"entry_id": "2024-0018952576", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.017192000086652115, "reasoning_trace": ""}
|
| 28 |
-
{"step_idx": 28, "tool": "disposition", "args": {"entry_id": "2024-0018952903", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.014977000319049694, "reasoning_trace": ""}
|
| 29 |
-
{"step_idx": 29, "tool": "disposition", "args": {"entry_id": "2024-0018953070", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.027239999326411635, "reasoning_trace": ""}
|
| 30 |
-
{"step_idx": 30, "tool": "disposition", "args": {"entry_id": "2024-0018953097", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012996999430470169, "reasoning_trace": ""}
|
| 31 |
-
{"step_idx": 31, "tool": "disposition", "args": {"entry_id": "2024-0018953192", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012291000530240126, "reasoning_trace": ""}
|
| 32 |
-
{"step_idx": 32, "tool": "disposition", "args": {"entry_id": "2024-0018953470", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04197999987809453, "reasoning_trace": ""}
|
| 33 |
-
{"step_idx": 33, "tool": "disposition", "args": {"entry_id": "2024-0018953790", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.014466000720858574, "reasoning_trace": ""}
|
| 34 |
-
{"step_idx": 34, "tool": "disposition", "args": {"entry_id": "2024-0018954051", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.014454999472945929, "reasoning_trace": ""}
|
| 35 |
-
{"step_idx": 35, "tool": "disposition", "args": {"entry_id": "2024-0018955609", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.028720000045723282, "reasoning_trace": ""}
|
| 36 |
-
{"step_idx": 36, "tool": "disposition", "args": {"entry_id": "2024-0018957144", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.1170129999081837, "reasoning_trace": ""}
|
| 37 |
-
{"step_idx": 37, "tool": "disposition", "args": {"entry_id": "2024-0018957218", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03367200042703189, "reasoning_trace": ""}
|
| 38 |
-
{"step_idx": 38, "tool": "disposition", "args": {"entry_id": "2024-0018958503", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.027404001230024733, "reasoning_trace": ""}
|
| 39 |
-
{"step_idx": 39, "tool": "disposition", "args": {"entry_id": "2024-0018958505", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.12939400039613247, "reasoning_trace": ""}
|
| 40 |
-
{"step_idx": 40, "tool": "disposition", "args": {"entry_id": "2024-0018962528", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.05137699918122962, "reasoning_trace": ""}
|
| 41 |
-
{"step_idx": 41, "tool": "disposition", "args": {"entry_id": "2024-0018962579", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.016441999832750298, "reasoning_trace": ""}
|
| 42 |
-
{"step_idx": 42, "tool": "disposition", "args": {"entry_id": "2024-0018962743", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0411749988415977, "reasoning_trace": ""}
|
| 43 |
-
{"step_idx": 43, "tool": "disposition", "args": {"entry_id": "2024-0018963076", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012026999684167095, "reasoning_trace": ""}
|
| 44 |
-
{"step_idx": 44, "tool": "disposition", "args": {"entry_id": "2024-0018963837", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.05155399958312046, "reasoning_trace": ""}
|
| 45 |
-
{"step_idx": 45, "tool": "disposition", "args": {"entry_id": "2024-0018964181", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01357200017082505, "reasoning_trace": ""}
|
| 46 |
-
{"step_idx": 46, "tool": "disposition", "args": {"entry_id": "2024-0018964296", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010853000276256353, "reasoning_trace": ""}
|
| 47 |
-
{"step_idx": 47, "tool": "disposition", "args": {"entry_id": "2024-0018965890", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011927999366889708, "reasoning_trace": ""}
|
| 48 |
-
{"step_idx": 48, "tool": "disposition", "args": {"entry_id": "2024-0018966141", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010230000043520704, "reasoning_trace": ""}
|
| 49 |
-
{"step_idx": 49, "tool": "disposition", "args": {"entry_id": "2024-0018966255", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.035088000004179776, "reasoning_trace": ""}
|
| 50 |
-
{"step_idx": 50, "tool": "disposition", "args": {"entry_id": "2024-0018967060", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.027088999559055082, "reasoning_trace": ""}
|
| 51 |
-
{"step_idx": 51, "tool": "disposition", "args": {"entry_id": "2024-0018967607", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.019754999811993912, "reasoning_trace": ""}
|
| 52 |
-
{"step_idx": 52, "tool": "disposition", "args": {"entry_id": "2024-0018967609", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04422100028023124, "reasoning_trace": ""}
|
| 53 |
-
{"step_idx": 53, "tool": "disposition", "args": {"entry_id": "2024-0018967830", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03425200156925712, "reasoning_trace": ""}
|
| 54 |
-
{"step_idx": 54, "tool": "disposition", "args": {"entry_id": "2024-0018968430", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03867799932777416, "reasoning_trace": ""}
|
| 55 |
-
{"step_idx": 55, "tool": "disposition", "args": {"entry_id": "2024-0018969556", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.028115000532125123, "reasoning_trace": ""}
|
| 56 |
-
{"step_idx": 56, "tool": "disposition", "args": {"entry_id": "2024-0018969951", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.035213999581173994, "reasoning_trace": ""}
|
| 57 |
-
{"step_idx": 57, "tool": "disposition", "args": {"entry_id": "2024-0018970104", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04317399907449726, "reasoning_trace": ""}
|
| 58 |
-
{"step_idx": 58, "tool": "disposition", "args": {"entry_id": "2024-0018970155", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03868400017381646, "reasoning_trace": ""}
|
| 59 |
-
{"step_idx": 59, "tool": "disposition", "args": {"entry_id": "2024-0018970770", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.04367300061858259, "reasoning_trace": ""}
|
| 60 |
-
{"step_idx": 60, "tool": "disposition", "args": {"entry_id": "2024-0018972239", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.049515001592226326, "reasoning_trace": ""}
|
| 61 |
-
{"step_idx": 61, "tool": "disposition", "args": {"entry_id": "2024-0018990966", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.023914000848890282, "reasoning_trace": ""}
|
| 62 |
-
{"step_idx": 62, "tool": "submit", "args": {}, "ok": true, "observation": "episode ends", "observation_hash": "e6111d1c5d214c01e92725bf69762fcf2ef6c8eec182f00fd2a8c2e71fea77e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.015408999388455413, "reasoning_trace": ""}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_flag_everything/seed4/JE-02_seed4.jsonl
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
{"step_idx": 1, "tool": "query_ledger", "args": {"order_by": "entry_id"}, "ok": true, "observation": [{"entry_id": "2024-0018936631", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100428173", "payment_id": "0018936631", "posting_ts": "2024-01-16T10:56:00.494232", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-14", "total_credit_cents": 39440, "total_debit_cents": 39440, "transaction_date": "2024-01-10", "vendor_id": "0000080926"}, {"entry_id": "2024-0018936923", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101123938", "payment_id": "0018936923", "posting_ts": "2024-01-25T09:22:00.589775", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-24", "total_credit_cents": 6500, "total_debit_cents": 6500, "transaction_date": "2024-01-22", "vendor_id": "0000218432"}, {"entry_id": "2024-0018937659", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100872797", "payment_id": "0018937659", "posting_ts": "2024-01-06T08:10:00.845195", "preparer_id": "user_Mental Health & Addiction Serv_3", "settlement_date": "2024-01-05", "total_credit_cents": 15360, "total_debit_cents": 15360, "transaction_date": "2024-01-05", "vendor_id": "0000029502"}, {"entry_id": "2024-0018940763", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101332657", "payment_id": "0018940763", "posting_ts": "2024-01-28T09:02:00.959408", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-28", "total_credit_cents": 16314153, "total_debit_cents": 16314153, "transaction_date": "2024-01-24", "vendor_id": "0000000007"}, {"entry_id": "2024-0018941478", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101332577", "payment_id": "0018941478", "posting_ts": "2024-01-22T08:52:00.783058", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-22", "total_credit_cents": 22924, "total_debit_cents": 22924, "transaction_date": "2024-01-17", "vendor_id": "0000205998"}, {"entry_id": "2024-0018944195", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100301637", "payment_id": "0018944195", "posting_ts": "2024-01-17T08:37:00.141274", "preparer_id": "user_Dept of Energy & Environ Prot._3", "settlement_date": "2024-01-16", "total_credit_cents": 256797, "total_debit_cents": 256797, "transaction_date": "2024-01-13", "vendor_id": "0000010593"}, {"entry_id": "2024-0018944210", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377113", "payment_id": "0018944210", "posting_ts": "2024-01-25T08:02:00.106116", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-25", "total_credit_cents": 19459100, "total_debit_cents": 19459100, "transaction_date": "2024-01-24", "vendor_id": "0000010804"}, {"entry_id": "2024-0018944452", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600368", "payment_id": "0018944452", "posting_ts": "2024-01-24T11:22:00.995162", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-24", "total_credit_cents": 887250, "total_debit_cents": 887250, "transaction_date": "2024-01-20", "vendor_id": "0000125302"}, {"entry_id": "2024-0018944572", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873358", "payment_id": "0018944572", "posting_ts": "2024-01-07T15:22:00.803122", "preparer_id": "user_Mental Health & Addiction Serv_3", "settlement_date": "2024-01-05", "total_credit_cents": 50000, "total_debit_cents": 50000, "transaction_date": "2024-01-02", "vendor_id": "0000177093"}, {"entry_id": "2024-0018945756", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600513", "payment_id": "0018945756", "posting_ts": "2024-01-11T11:00:00.078896", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-11", "total_credit_cents": 144800, "total_debit_cents": 144800, "transaction_date": "2024-01-11", "vendor_id": "0000204877"}, {"entry_id": "2024-0018947857", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100428837", "payment_id": "0018947857", "posting_ts": "2024-01-18T12:54:00.819105", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-18", "total_credit_cents": 22500, "total_debit_cents": 22500, "transaction_date": "2024-01-17", "vendor_id": "0000031539"}, {"entry_id": "2024-0018948107", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "AESM100022654", "payment_id": "0018948107", "posting_ts": "2024-01-11T15:29:00.326568", "preparer_id": "user_Agricultural Experiment Sta_1", "settlement_date": "2024-01-08", "total_credit_cents": 105529, "total_debit_cents": 105529, "transaction_date": "2024-01-08", "vendor_id": "0000010003"}, {"entry_id": "2024-0018948416", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311396", "payment_id": "0018948416", "posting_ts": "2024-01-14T09:32:00.415754", "preparer_id": "user_Public Defender Services_1", "settlement_date": "2024-01-12", "total_credit_cents": 67500, "total_debit_cents": 67500, "transaction_date": "2024-01-11", "vendor_id": "0000076624"}, {"entry_id": "2024-0018948602", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429052", "payment_id": "0018948602", "posting_ts": "2024-01-07T18:34:00.306353", "preparer_id": "user_Probate Court Administration_1", "settlement_date": "2024-01-05", "total_credit_cents": 36400, "total_debit_cents": 36400, "transaction_date": "2024-01-01", "vendor_id": "0000202116"}, {"entry_id": "2024-0018949700", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993813", "payment_id": "0018949700", "posting_ts": "2024-01-17T11:04:00.084389", "preparer_id": "user_State Dept of Education_3", "settlement_date": "2024-01-15", "total_credit_cents": 49111601, "total_debit_cents": 49111601, "transaction_date": "2024-01-11", "vendor_id": "0000000111"}, {"entry_id": "2024-0018949975", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100873854", "payment_id": "0018949975", "posting_ts": "2024-01-21T11:58:00.053937", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-18", "total_credit_cents": 30500, "total_debit_cents": 30500, "transaction_date": "2024-01-17", "vendor_id": "0000012476"}, {"entry_id": "2024-0018950057", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059262", "payment_id": "0018950057", "posting_ts": "2024-01-28T13:18:00.666343", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-26", "total_credit_cents": 3753300, "total_debit_cents": 3753300, "transaction_date": "2024-01-20", "vendor_id": "0000021349"}, {"entry_id": "2024-0018950155", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429192", "payment_id": "0018950155", "posting_ts": "2024-01-17T13:25:00.980612", "preparer_id": "user_Probate Court Administration_2", "settlement_date": "2024-01-16", "total_credit_cents": 5800, "total_debit_cents": 5800, "transaction_date": "2024-01-10", "vendor_id": "0000096387"}, {"entry_id": "2024-0018950982", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601071", "payment_id": "0018950982", "posting_ts": "2024-01-20T16:46:00.128667", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-17", "total_credit_cents": 31000, "total_debit_cents": 31000, "transaction_date": "2024-01-15", "vendor_id": "0000212579"}, {"entry_id": "2024-0018951107", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994015", "payment_id": "0018951107", "posting_ts": "2024-01-17T11:08:00.129983", "preparer_id": "user_State Dept of Education_2", "settlement_date": "2024-01-17", "total_credit_cents": 1876525, "total_debit_cents": 1876525, "transaction_date": "2024-01-11", "vendor_id": "0000000153"}, {"entry_id": "2024-0018952809", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100611872", "payment_id": "0018952809", "posting_ts": "2024-01-10T09:17:00.625198", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-09", "total_credit_cents": 18645, "total_debit_cents": 18645, "transaction_date": "2024-01-05", "vendor_id": "0000010232"}, {"entry_id": "2024-0018953036", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101335391", "payment_id": "0018953036", "posting_ts": "2024-01-28T13:48:00.048006", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-28", "total_credit_cents": 35000, "total_debit_cents": 35000, "transaction_date": "2024-01-25", "vendor_id": "0000080041"}, {"entry_id": "2024-0018954175", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059197", "payment_id": "0018954175", "posting_ts": "2024-01-17T17:11:00.705553", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-16", "total_credit_cents": 15000, "total_debit_cents": 15000, "transaction_date": "2024-01-12", "vendor_id": "ECD9999999"}, {"entry_id": "2024-0018955707", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601250", "payment_id": "0018955707", "posting_ts": "2024-01-10T08:29:00.520507", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-10", "total_credit_cents": 7000, "total_debit_cents": 7000, "transaction_date": "2024-01-08", "vendor_id": "0000052154"}, {"entry_id": "2024-0018955769", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377981", "payment_id": "0018955769", "posting_ts": "2024-01-09T10:00:00.196470", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-08", "total_credit_cents": 5021500, "total_debit_cents": 5021500, "transaction_date": "2024-01-02", "vendor_id": "0000000143"}, {"entry_id": "2024-0018956209", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OPMIA00994894", "payment_id": "0018956209", "posting_ts": "2024-01-20T09:23:00.741598", "preparer_id": "user_Renters Rebate_3", "settlement_date": "2024-01-17", "total_credit_cents": 68600, "total_debit_cents": 68600, "transaction_date": "2024-01-11", "vendor_id": "OPM9999999"}, {"entry_id": "2024-0018957012", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DRSM100053407", "payment_id": "0018957012", "posting_ts": "2024-01-20T18:05:00.944814", "preparer_id": "user_Dept. of Revenue Services_1", "settlement_date": "2024-01-20", "total_credit_cents": 1000, "total_debit_cents": 1000, "transaction_date": "2024-01-14", "vendor_id": "0000000064"}, {"entry_id": "2024-0018957182", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100612428", "payment_id": "0018957182", "posting_ts": "2024-01-27T09:08:00.482032", "preparer_id": "user_Dept. of Correction_2", "settlement_date": "2024-01-27", "total_credit_cents": 53178, "total_debit_cents": 53178, "transaction_date": "2024-01-24", "vendor_id": "0000010449"}, {"entry_id": "2024-0018957417", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OLMM100060063", "payment_id": "0018957417", "posting_ts": "2024-01-28T18:53:00.085127", "preparer_id": "user_Legislative Management_1", "settlement_date": "2024-01-28", "total_credit_cents": 327590, "total_debit_cents": 327590, "transaction_date": "2024-01-22", "vendor_id": "0000128801"}, {"entry_id": "2024-0018957433", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100353109", "payment_id": "0018957433", "posting_ts": "2024-01-26T11:50:00.867676", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-26", "total_credit_cents": 676504, "total_debit_cents": 676504, "transaction_date": "2024-01-22", "vendor_id": "0000144653"}, {"entry_id": "2024-0018957441", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101336599", "payment_id": "0018957441", "posting_ts": "2024-01-24T15:21:00.555103", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-24", "total_credit_cents": 1715000, "total_debit_cents": 1715000, "transaction_date": "2024-01-24", "vendor_id": "0000149610"}, {"entry_id": "2024-0018958598", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038833", "payment_id": "0018958598", "posting_ts": "2024-01-28T09:44:00.917196", "preparer_id": "user_CT Tech Educ and Career Sys_2", "settlement_date": "2024-01-27", "total_credit_cents": 1446438, "total_debit_cents": 1446438, "transaction_date": "2024-01-23", "vendor_id": "0000010043"}, {"entry_id": "2024-0018958711", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100352966", "payment_id": "0018958711", "posting_ts": "2024-01-15T12:27:00.452675", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-14", "total_credit_cents": 605390, "total_debit_cents": 605390, "transaction_date": "2024-01-14", "vendor_id": "0000010525"}, {"entry_id": "2024-0018958886", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302660", "payment_id": "0018958886", "posting_ts": "2024-01-10T15:12:00.919042", "preparer_id": "user_Dept of Energy & Environ Prot._3", "settlement_date": "2024-01-09", "total_credit_cents": 2900, "total_debit_cents": 2900, "transaction_date": "2024-01-07", "vendor_id": "0000024729"}, {"entry_id": "2024-0018962416", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162298", "payment_id": "0018962416", "posting_ts": "2024-01-25T18:34:00.438524", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-22", "total_credit_cents": 1609950, "total_debit_cents": 1609950, "transaction_date": "2024-01-20", "vendor_id": "0000000160"}, {"entry_id": "2024-0018962499", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DSSM100329045", "payment_id": "0018962499", "posting_ts": "2024-01-23T08:24:00.624995", "preparer_id": "user_Dept. of Social Services_3", "settlement_date": "2024-01-22", "total_credit_cents": 109521000, "total_debit_cents": 109521000, "transaction_date": "2024-01-21", "vendor_id": "0000010109"}, {"entry_id": "2024-0018962601", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OPMM100090598", "payment_id": "0018962601", "posting_ts": "2024-01-05T14:15:00.354777", "preparer_id": "user_Office of Policy & Management_2", "settlement_date": "2024-01-05", "total_credit_cents": 6258284, "total_debit_cents": 6258284, "transaction_date": "2024-01-05", "vendor_id": "0000010614"}, {"entry_id": "2024-0018962794", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101127632", "payment_id": "0018962794", "posting_ts": "2024-01-08T07:35:00.528158", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-06", "total_credit_cents": 50000, "total_debit_cents": 50000, "transaction_date": "2024-01-06", "vendor_id": "0000037461"}, {"entry_id": "2024-0018963695", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCJM100082712", "payment_id": "0018963695", "posting_ts": "2024-01-10T09:21:00.795987", "preparer_id": "user_Division of Criminal Justice_1", "settlement_date": "2024-01-08", "total_credit_cents": 108711, "total_debit_cents": 108711, "transaction_date": "2024-01-07", "vendor_id": "0000010201"}, {"entry_id": "2024-0018964148", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101337745", "payment_id": "0018964148", "posting_ts": "2024-01-21T12:08:00.677679", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-21", "total_credit_cents": 395600, "total_debit_cents": 395600, "transaction_date": "2024-01-16", "vendor_id": "0000010795"}, {"entry_id": "2024-0018965285", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602891", "payment_id": "0018965285", "posting_ts": "2024-01-16T11:08:00.739144", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-15", "total_credit_cents": 67420, "total_debit_cents": 67420, "transaction_date": "2024-01-13", "vendor_id": "0000012476"}, {"entry_id": "2024-0018965497", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100039295", "payment_id": "0018965497", "posting_ts": "2024-01-16T15:31:00.413943", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-13", "total_credit_cents": 824913, "total_debit_cents": 824913, "transaction_date": "2024-01-10", "vendor_id": "0000010334"}, {"entry_id": "2024-0018965897", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100876961", "payment_id": "0018965897", "posting_ts": "2024-01-08T07:24:00.399768", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-07", "total_credit_cents": 75500, "total_debit_cents": 75500, "transaction_date": "2024-01-07", "vendor_id": "0000115606"}, {"entry_id": "2024-0018966071", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OECM100081355", "payment_id": "0018966071", "posting_ts": "2024-01-28T17:09:00.087606", "preparer_id": "user_Office of Early Childhood_1", "settlement_date": "2024-01-27", "total_credit_cents": 14000000, "total_debit_cents": 14000000, "transaction_date": "2024-01-22", "vendor_id": "0000170909"}, {"entry_id": "2024-0018966505", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877256", "payment_id": "0018966505", "posting_ts": "2024-01-06T11:27:00.372802", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-04", "total_credit_cents": 116800, "total_debit_cents": 116800, "transaction_date": "2024-01-02", "vendor_id": "0000220943"}, {"entry_id": "2024-0018967415", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100994453", "payment_id": "0018967415", "posting_ts": "2024-01-24T16:47:00.293837", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-24", "total_credit_cents": 174242300, "total_debit_cents": 174242300, "transaction_date": "2024-01-22", "vendor_id": "0000000019"}, {"entry_id": "2024-0018967528", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141483", "payment_id": "0018967528", "posting_ts": "2024-01-08T13:50:00.660540", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-06", "total_credit_cents": 7598, "total_debit_cents": 7598, "transaction_date": "2024-01-06", "vendor_id": "0000010003"}, {"entry_id": "2024-0018967547", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602973", "payment_id": "0018967547", "posting_ts": "2024-01-23T15:54:00.477365", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-22", "total_credit_cents": 50000, "total_debit_cents": 50000, "transaction_date": "2024-01-21", "vendor_id": "0000192420"}, {"entry_id": "2024-0018967648", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DMVM100118372", "payment_id": "0018967648", "posting_ts": "2024-01-12T13:47:00.801890", "preparer_id": "user_Dept. of Motor Vehicles_3", "settlement_date": "2024-01-10", "total_credit_cents": 29900, "total_debit_cents": 29900, "transaction_date": "2024-01-06", "vendor_id": "0000010013"}, {"entry_id": "2024-0018967746", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFR000025167", "payment_id": "0018967746", "posting_ts": "2024-01-06T18:48:00.624914", "preparer_id": "user_DCF-Solnit Children Cntr North_2", "settlement_date": "2024-01-03", "total_credit_cents": 53000, "total_debit_cents": 53000, "transaction_date": "2024-01-01", "vendor_id": "0000010517"}, {"entry_id": "2024-0018968528", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101128322", "payment_id": "0018968528", "posting_ts": "2024-01-28T08:21:00.457526", "preparer_id": "user_Judicial Branch_1", "settlement_date": "2024-01-25", "total_credit_cents": 86400, "total_debit_cents": 86400, "transaction_date": "2024-01-24", "vendor_id": "0000211564"}, {"entry_id": "2024-0018969681", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OECM100081494", "payment_id": "0018969681", "posting_ts": "2024-01-12T13:29:00.124155", "preparer_id": "user_Office of Early Childhood_1", "settlement_date": "2024-01-09", "total_credit_cents": 100000, "total_debit_cents": 100000, "transaction_date": "2024-01-03", "vendor_id": "0000000039"}, {"entry_id": "2024-0018970527", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101339397", "payment_id": "0018970527", "posting_ts": "2024-01-20T17:35:00.755069", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-20", "total_credit_cents": 1272027, "total_debit_cents": 1272027, "transaction_date": "2024-01-14", "vendor_id": "0000000077"}, {"entry_id": "2024-0018970657", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPHM100196334", "payment_id": "0018970657", "posting_ts": "2024-01-19T09:15:00.265766", "preparer_id": "user_Dept. of Public Health_2", "settlement_date": "2024-01-17", "total_credit_cents": 34376105, "total_debit_cents": 34376105, "transaction_date": "2024-01-17", "vendor_id": "0000010235"}, {"entry_id": "2024-0018970796", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OLMM100060122", "payment_id": "0018970796", "posting_ts": "2024-01-05T07:40:00.973832", "preparer_id": "user_Legislative Management_1", "settlement_date": "2024-01-02", "total_credit_cents": 111400, "total_debit_cents": 111400, "transaction_date": "2024-01-01", "vendor_id": "0000025061"}, {"entry_id": "2024-0018970912", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100430565", "payment_id": "0018970912", "posting_ts": "2024-01-12T18:03:00.286739", "preparer_id": "user_Probate Court Administration_2", "settlement_date": "2024-01-10", "total_credit_cents": 4416, "total_debit_cents": 4416, "transaction_date": "2024-01-06", "vendor_id": "0000167030"}, {"entry_id": "2024-0018971197", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100039836", "payment_id": "0018971197", "posting_ts": "2024-01-14T15:31:00.613566", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-14", "total_credit_cents": 10535, "total_debit_cents": 10535, "transaction_date": "2024-01-14", "vendor_id": "0000204422"}, {"entry_id": "2024-0018971626", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DRSM100053537", "payment_id": "0018971626", "posting_ts": "2024-01-20T12:53:00.391874", "preparer_id": "user_Dept. of Revenue Services_1", "settlement_date": "2024-01-19", "total_credit_cents": 2000, "total_debit_cents": 2000, "transaction_date": "2024-01-16", "vendor_id": "0000000158"}, {"entry_id": "2024-0018972394", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059516", "payment_id": "0018972394", "posting_ts": "2024-01-17T18:39:00.257828", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-14", "total_credit_cents": 1500000, "total_debit_cents": 1500000, "transaction_date": "2024-01-10", "vendor_id": "0000225230"}, {"entry_id": "2024-0018977630", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "GOVM100004629", "payment_id": "0018977630", "posting_ts": "2024-01-27T10:47:00.194386", "preparer_id": "user_Governor's Office_2", "settlement_date": "2024-01-27", "total_credit_cents": 34200, "total_debit_cents": 34200, "transaction_date": "2024-01-22", "vendor_id": "0000010011"}], "observation_hash": "b6f5b5af52e7d434c25185e103779c522f5c64fe58f572951a8dddc0777276f8", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.07500099854951259, "reasoning_trace": ""}
|
| 2 |
-
{"step_idx": 2, "tool": "disposition", "args": {"entry_id": "2024-0018936631", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.029006998374825343, "reasoning_trace": ""}
|
| 3 |
-
{"step_idx": 3, "tool": "disposition", "args": {"entry_id": "2024-0018936923", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010105000910698436, "reasoning_trace": ""}
|
| 4 |
-
{"step_idx": 4, "tool": "disposition", "args": {"entry_id": "2024-0018937659", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006584999937331304, "reasoning_trace": ""}
|
| 5 |
-
{"step_idx": 5, "tool": "disposition", "args": {"entry_id": "2024-0018940763", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005564001185121015, "reasoning_trace": ""}
|
| 6 |
-
{"step_idx": 6, "tool": "disposition", "args": {"entry_id": "2024-0018941478", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005213998520048335, "reasoning_trace": ""}
|
| 7 |
-
{"step_idx": 7, "tool": "disposition", "args": {"entry_id": "2024-0018944195", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00524099959875457, "reasoning_trace": ""}
|
| 8 |
-
{"step_idx": 8, "tool": "disposition", "args": {"entry_id": "2024-0018944210", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005171999873709865, "reasoning_trace": ""}
|
| 9 |
-
{"step_idx": 9, "tool": "disposition", "args": {"entry_id": "2024-0018944452", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004923000233247876, "reasoning_trace": ""}
|
| 10 |
-
{"step_idx": 10, "tool": "disposition", "args": {"entry_id": "2024-0018944572", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005386000339058228, "reasoning_trace": ""}
|
| 11 |
-
{"step_idx": 11, "tool": "disposition", "args": {"entry_id": "2024-0018945756", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004862000423599966, "reasoning_trace": ""}
|
| 12 |
-
{"step_idx": 12, "tool": "disposition", "args": {"entry_id": "2024-0018947857", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0045769993448629975, "reasoning_trace": ""}
|
| 13 |
-
{"step_idx": 13, "tool": "disposition", "args": {"entry_id": "2024-0018948107", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004932000592816621, "reasoning_trace": ""}
|
| 14 |
-
{"step_idx": 14, "tool": "disposition", "args": {"entry_id": "2024-0018948416", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007378999725915492, "reasoning_trace": ""}
|
| 15 |
-
{"step_idx": 15, "tool": "disposition", "args": {"entry_id": "2024-0018948602", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00545900002180133, "reasoning_trace": ""}
|
| 16 |
-
{"step_idx": 16, "tool": "disposition", "args": {"entry_id": "2024-0018949700", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005246998625807464, "reasoning_trace": ""}
|
| 17 |
-
{"step_idx": 17, "tool": "disposition", "args": {"entry_id": "2024-0018949975", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004863000867771916, "reasoning_trace": ""}
|
| 18 |
-
{"step_idx": 18, "tool": "disposition", "args": {"entry_id": "2024-0018950057", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004561999958241358, "reasoning_trace": ""}
|
| 19 |
-
{"step_idx": 19, "tool": "disposition", "args": {"entry_id": "2024-0018950155", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004763998731505126, "reasoning_trace": ""}
|
| 20 |
-
{"step_idx": 20, "tool": "disposition", "args": {"entry_id": "2024-0018950982", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004744999387185089, "reasoning_trace": ""}
|
| 21 |
-
{"step_idx": 21, "tool": "disposition", "args": {"entry_id": "2024-0018951107", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004581001121550798, "reasoning_trace": ""}
|
| 22 |
-
{"step_idx": 22, "tool": "disposition", "args": {"entry_id": "2024-0018952809", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007622998964507133, "reasoning_trace": ""}
|
| 23 |
-
{"step_idx": 23, "tool": "disposition", "args": {"entry_id": "2024-0018953036", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00545699913345743, "reasoning_trace": ""}
|
| 24 |
-
{"step_idx": 24, "tool": "disposition", "args": {"entry_id": "2024-0018954175", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004901001375401393, "reasoning_trace": ""}
|
| 25 |
-
{"step_idx": 25, "tool": "disposition", "args": {"entry_id": "2024-0018955707", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004579000233206898, "reasoning_trace": ""}
|
| 26 |
-
{"step_idx": 26, "tool": "disposition", "args": {"entry_id": "2024-0018955769", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004642000931198709, "reasoning_trace": ""}
|
| 27 |
-
{"step_idx": 27, "tool": "disposition", "args": {"entry_id": "2024-0018956209", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004118001015740447, "reasoning_trace": ""}
|
| 28 |
-
{"step_idx": 28, "tool": "disposition", "args": {"entry_id": "2024-0018957012", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0045120013965060934, "reasoning_trace": ""}
|
| 29 |
-
{"step_idx": 29, "tool": "disposition", "args": {"entry_id": "2024-0018957182", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004670999260270037, "reasoning_trace": ""}
|
| 30 |
-
{"step_idx": 30, "tool": "disposition", "args": {"entry_id": "2024-0018957417", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004894998710369691, "reasoning_trace": ""}
|
| 31 |
-
{"step_idx": 31, "tool": "disposition", "args": {"entry_id": "2024-0018957433", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004581999746733345, "reasoning_trace": ""}
|
| 32 |
-
{"step_idx": 32, "tool": "disposition", "args": {"entry_id": "2024-0018957441", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0045240012696012855, "reasoning_trace": ""}
|
| 33 |
-
{"step_idx": 33, "tool": "disposition", "args": {"entry_id": "2024-0018958598", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0041429993871133775, "reasoning_trace": ""}
|
| 34 |
-
{"step_idx": 34, "tool": "disposition", "args": {"entry_id": "2024-0018958711", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004224999429425225, "reasoning_trace": ""}
|
| 35 |
-
{"step_idx": 35, "tool": "disposition", "args": {"entry_id": "2024-0018958886", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00417500086768996, "reasoning_trace": ""}
|
| 36 |
-
{"step_idx": 36, "tool": "disposition", "args": {"entry_id": "2024-0018962416", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0041860002966132015, "reasoning_trace": ""}
|
| 37 |
-
{"step_idx": 37, "tool": "disposition", "args": {"entry_id": "2024-0018962499", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.004834999344893731, "reasoning_trace": ""}
|
| 38 |
-
{"step_idx": 38, "tool": "disposition", "args": {"entry_id": "2024-0018962601", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0044959997467231005, "reasoning_trace": ""}
|
| 39 |
-
{"step_idx": 39, "tool": "disposition", "args": {"entry_id": "2024-0018962794", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007253000148921274, "reasoning_trace": ""}
|
| 40 |
-
{"step_idx": 40, "tool": "disposition", "args": {"entry_id": "2024-0018963695", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005431000317912549, "reasoning_trace": ""}
|
| 41 |
-
{"step_idx": 41, "tool": "disposition", "args": {"entry_id": "2024-0018964148", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00780200025474187, "reasoning_trace": ""}
|
| 42 |
-
{"step_idx": 42, "tool": "disposition", "args": {"entry_id": "2024-0018965285", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00784700023359619, "reasoning_trace": ""}
|
| 43 |
-
{"step_idx": 43, "tool": "disposition", "args": {"entry_id": "2024-0018965497", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00764499964134302, "reasoning_trace": ""}
|
| 44 |
-
{"step_idx": 44, "tool": "disposition", "args": {"entry_id": "2024-0018965897", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010911999197560363, "reasoning_trace": ""}
|
| 45 |
-
{"step_idx": 45, "tool": "disposition", "args": {"entry_id": "2024-0018966071", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008293000064441003, "reasoning_trace": ""}
|
| 46 |
-
{"step_idx": 46, "tool": "disposition", "args": {"entry_id": "2024-0018966505", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007636999725946225, "reasoning_trace": ""}
|
| 47 |
-
{"step_idx": 47, "tool": "disposition", "args": {"entry_id": "2024-0018967415", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0076380001701181754, "reasoning_trace": ""}
|
| 48 |
-
{"step_idx": 48, "tool": "disposition", "args": {"entry_id": "2024-0018967528", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0077429995144484565, "reasoning_trace": ""}
|
| 49 |
-
{"step_idx": 49, "tool": "disposition", "args": {"entry_id": "2024-0018967547", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012743999832309783, "reasoning_trace": ""}
|
| 50 |
-
{"step_idx": 50, "tool": "disposition", "args": {"entry_id": "2024-0018967648", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.02152900015062187, "reasoning_trace": ""}
|
| 51 |
-
{"step_idx": 51, "tool": "disposition", "args": {"entry_id": "2024-0018967746", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.014193999959388748, "reasoning_trace": ""}
|
| 52 |
-
{"step_idx": 52, "tool": "disposition", "args": {"entry_id": "2024-0018968528", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011468999218777753, "reasoning_trace": ""}
|
| 53 |
-
{"step_idx": 53, "tool": "disposition", "args": {"entry_id": "2024-0018969681", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009538998710922897, "reasoning_trace": ""}
|
| 54 |
-
{"step_idx": 54, "tool": "disposition", "args": {"entry_id": "2024-0018970527", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009035999028128572, "reasoning_trace": ""}
|
| 55 |
-
{"step_idx": 55, "tool": "disposition", "args": {"entry_id": "2024-0018970657", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008830000297166407, "reasoning_trace": ""}
|
| 56 |
-
{"step_idx": 56, "tool": "disposition", "args": {"entry_id": "2024-0018970796", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008233000698965043, "reasoning_trace": ""}
|
| 57 |
-
{"step_idx": 57, "tool": "disposition", "args": {"entry_id": "2024-0018970912", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008327000614372082, "reasoning_trace": ""}
|
| 58 |
-
{"step_idx": 58, "tool": "disposition", "args": {"entry_id": "2024-0018971197", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0077860004239482805, "reasoning_trace": ""}
|
| 59 |
-
{"step_idx": 59, "tool": "disposition", "args": {"entry_id": "2024-0018971626", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007973001629579812, "reasoning_trace": ""}
|
| 60 |
-
{"step_idx": 60, "tool": "disposition", "args": {"entry_id": "2024-0018972394", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008135999451042153, "reasoning_trace": ""}
|
| 61 |
-
{"step_idx": 61, "tool": "disposition", "args": {"entry_id": "2024-0018977630", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008082999556791037, "reasoning_trace": ""}
|
| 62 |
-
{"step_idx": 62, "tool": "submit", "args": {}, "ok": true, "observation": "episode ends", "observation_hash": "e6111d1c5d214c01e92725bf69762fcf2ef6c8eec182f00fd2a8c2e71fea77e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00642300074105151, "reasoning_trace": ""}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_flag_everything/seed5/JE-02_seed5.jsonl
DELETED
|
@@ -1,62 +0,0 @@
|
|
| 1 |
-
{"step_idx": 1, "tool": "query_ledger", "args": {"order_by": "entry_id"}, "ok": true, "observation": [{"entry_id": "2024-0000219128", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100161844", "payment_id": "0000219128", "posting_ts": "2024-01-22T16:17:00.099506", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-21", "total_credit_cents": 332455, "total_debit_cents": 332455, "transaction_date": "2024-01-16", "vendor_id": "UOCM1"}, {"entry_id": "2024-0018937350", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101332368", "payment_id": "0018937350", "posting_ts": "2024-01-13T07:48:00.808063", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-13", "total_credit_cents": 466000, "total_debit_cents": 466000, "transaction_date": "2024-01-08", "vendor_id": "0000000074"}, {"entry_id": "2024-0018937371", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DVAM100104745", "payment_id": "0018937371", "posting_ts": "2024-01-08T07:33:00.404691", "preparer_id": "user_Dept. of Veterans' Affairs_2", "settlement_date": "2024-01-06", "total_credit_cents": 64172, "total_debit_cents": 64172, "transaction_date": "2024-01-05", "vendor_id": "0000010003"}, {"entry_id": "2024-0018937379", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100037192", "payment_id": "0018937379", "posting_ts": "2024-01-21T08:27:00.431705", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-18", "total_credit_cents": 209305, "total_debit_cents": 209305, "transaction_date": "2024-01-12", "vendor_id": "0000010011"}, {"entry_id": "2024-0018937555", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600051", "payment_id": "0018937555", "posting_ts": "2024-01-13T10:17:00.442995", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-10", "total_credit_cents": 144887079, "total_debit_cents": 144887079, "transaction_date": "2024-01-07", "vendor_id": "0000011844"}, {"entry_id": "2024-0018937606", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600038", "payment_id": "0018937606", "posting_ts": "2024-01-20T17:50:00.681358", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-18", "total_credit_cents": 44441806, "total_debit_cents": 44441806, "transaction_date": "2024-01-18", "vendor_id": "0000013783"}, {"entry_id": "2024-0018941463", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PDSM100311166", "payment_id": "0018941463", "posting_ts": "2024-01-24T11:15:00.532195", "preparer_id": "user_Public Defender Services_2", "settlement_date": "2024-01-21", "total_credit_cents": 67500, "total_debit_cents": 67500, "transaction_date": "2024-01-15", "vendor_id": "0000190699"}, {"entry_id": "2024-0018943644", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101124830", "payment_id": "0018943644", "posting_ts": "2024-01-09T16:43:00.235876", "preparer_id": "user_Judicial Branch_3", "settlement_date": "2024-01-08", "total_credit_cents": 6822, "total_debit_cents": 6822, "transaction_date": "2024-01-04", "vendor_id": "0000223003"}, {"entry_id": "2024-0018943935", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377232", "payment_id": "0018943935", "posting_ts": "2024-01-21T14:30:00.149110", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-21", "total_credit_cents": 131831, "total_debit_cents": 131831, "transaction_date": "2024-01-19", "vendor_id": "0000145296"}, {"entry_id": "2024-0018943954", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377286", "payment_id": "0018943954", "posting_ts": "2024-01-26T14:02:00.648224", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-24", "total_credit_cents": 4000, "total_debit_cents": 4000, "transaction_date": "2024-01-23", "vendor_id": "0000010317"}, {"entry_id": "2024-0018944606", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600449", "payment_id": "0018944606", "posting_ts": "2024-01-16T09:45:00.892929", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-14", "total_credit_cents": 375966, "total_debit_cents": 375966, "transaction_date": "2024-01-10", "vendor_id": "0000185509"}, {"entry_id": "2024-0018944630", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600443", "payment_id": "0018944630", "posting_ts": "2024-01-16T12:05:00.994530", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-15", "total_credit_cents": 519096, "total_debit_cents": 519096, "transaction_date": "2024-01-14", "vendor_id": "0000189983"}, {"entry_id": "2024-0018945402", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600269", "payment_id": "0018945402", "posting_ts": "2024-01-24T10:26:00.422093", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-23", "total_credit_cents": 42879, "total_debit_cents": 42879, "transaction_date": "2024-01-17", "vendor_id": "0000010179"}, {"entry_id": "2024-0018945462", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600338", "payment_id": "0018945462", "posting_ts": "2024-01-09T14:09:00.748541", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-08", "total_credit_cents": 621936, "total_debit_cents": 621936, "transaction_date": "2024-01-06", "vendor_id": "0000014056"}, {"entry_id": "2024-0018945546", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377197", "payment_id": "0018945546", "posting_ts": "2024-01-22T18:02:00.986699", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-21", "total_credit_cents": 2000, "total_debit_cents": 2000, "transaction_date": "2024-01-16", "vendor_id": "0000068768"}, {"entry_id": "2024-0018945644", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100352260", "payment_id": "0018945644", "posting_ts": "2024-01-24T15:13:00.699082", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-23", "total_credit_cents": 275000, "total_debit_cents": 275000, "transaction_date": "2024-01-20", "vendor_id": "0000136259"}, {"entry_id": "2024-0018946567", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDEM100993245", "payment_id": "0018946567", "posting_ts": "2024-01-21T15:58:00.114132", "preparer_id": "user_State Dept of Education_1", "settlement_date": "2024-01-21", "total_credit_cents": 2211047, "total_debit_cents": 2211047, "transaction_date": "2024-01-17", "vendor_id": "0000000140"}, {"entry_id": "2024-0018946688", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100611287", "payment_id": "0018946688", "posting_ts": "2024-01-07T16:14:00.583647", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-05", "total_credit_cents": 301983, "total_debit_cents": 301983, "transaction_date": "2024-01-02", "vendor_id": "0000010136"}, {"entry_id": "2024-0018946851", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101125177", "payment_id": "0018946851", "posting_ts": "2024-01-18T17:04:00.624577", "preparer_id": "user_Judicial Branch_3", "settlement_date": "2024-01-18", "total_credit_cents": 40000, "total_debit_cents": 40000, "transaction_date": "2024-01-17", "vendor_id": "0000031688"}, {"entry_id": "2024-0018947872", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100140821", "payment_id": "0018947872", "posting_ts": "2024-01-08T13:49:00.038551", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-08", "total_credit_cents": 1525000, "total_debit_cents": 1525000, "transaction_date": "2024-01-03", "vendor_id": "0000084389"}, {"entry_id": "2024-0018948653", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101124071", "payment_id": "0018948653", "posting_ts": "2024-01-27T16:03:00.491558", "preparer_id": "user_Judicial Branch_2", "settlement_date": "2024-01-25", "total_credit_cents": 67500, "total_debit_cents": 67500, "transaction_date": "2024-01-23", "vendor_id": "0000223794"}, {"entry_id": "2024-0018949442", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OSCM100082955", "payment_id": "0018949442", "posting_ts": "2024-01-11T16:12:00.145189", "preparer_id": "user_State Comptroller's Office_2", "settlement_date": "2024-01-09", "total_credit_cents": 251400, "total_debit_cents": 251400, "transaction_date": "2024-01-05", "vendor_id": "OSC9999999"}, {"entry_id": "2024-0018949613", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601058", "payment_id": "0018949613", "posting_ts": "2024-01-27T14:27:00.462818", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-26", "total_credit_cents": 47795, "total_debit_cents": 47795, "transaction_date": "2024-01-21", "vendor_id": "0000010057"}, {"entry_id": "2024-0018949918", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100600728", "payment_id": "0018949918", "posting_ts": "2024-01-28T17:55:00.898130", "preparer_id": "user_Department of Development Serv_2", "settlement_date": "2024-01-27", "total_credit_cents": 5319762, "total_debit_cents": 5319762, "transaction_date": "2024-01-23", "vendor_id": "0000010932"}, {"entry_id": "2024-0018950310", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "PCAM100429142", "payment_id": "0018950310", "posting_ts": "2024-01-14T18:05:00.574008", "preparer_id": "user_Probate Court Administration_2", "settlement_date": "2024-01-11", "total_credit_cents": 27000, "total_debit_cents": 27000, "transaction_date": "2024-01-08", "vendor_id": "0000193961"}, {"entry_id": "2024-0018951289", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101333520", "payment_id": "0018951289", "posting_ts": "2024-01-11T09:08:00.029144", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-08", "total_credit_cents": 390880155, "total_debit_cents": 390880155, "transaction_date": "2024-01-07", "vendor_id": "0000010473"}, {"entry_id": "2024-0018951383", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038091", "payment_id": "0018951383", "posting_ts": "2024-01-08T09:38:00.438571", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-05", "total_credit_cents": 283482, "total_debit_cents": 283482, "transaction_date": "2024-01-01", "vendor_id": "0000012971"}, {"entry_id": "2024-0018952421", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPHM100195872", "payment_id": "0018952421", "posting_ts": "2024-01-03T16:24:00.479636", "preparer_id": "user_Dept. of Public Health_2", "settlement_date": "2024-01-01", "total_credit_cents": 596285, "total_debit_cents": 596285, "transaction_date": "2024-01-01", "vendor_id": "0000011222"}, {"entry_id": "2024-0018953464", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100874208", "payment_id": "0018953464", "posting_ts": "2024-01-27T08:25:00.148132", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-26", "total_credit_cents": 30400, "total_debit_cents": 30400, "transaction_date": "2024-01-23", "vendor_id": "0000135519"}, {"entry_id": "2024-0018953968", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100611997", "payment_id": "0018953968", "posting_ts": "2024-01-07T16:22:00.065082", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-05", "total_credit_cents": 392000, "total_debit_cents": 392000, "transaction_date": "2024-01-04", "vendor_id": "0000052874"}, {"entry_id": "2024-0018955745", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101332039", "payment_id": "0018955745", "posting_ts": "2024-01-25T17:51:00.478345", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-25", "total_credit_cents": 304911, "total_debit_cents": 304911, "transaction_date": "2024-01-20", "vendor_id": "0000010055"}, {"entry_id": "2024-0018955762", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101335754", "payment_id": "0018955762", "posting_ts": "2024-01-27T15:29:00.147567", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-24", "total_credit_cents": 379363, "total_debit_cents": 379363, "transaction_date": "2024-01-24", "vendor_id": "0000000111"}, {"entry_id": "2024-0018956707", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141225", "payment_id": "0018956707", "posting_ts": "2024-01-16T11:23:00.617189", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-14", "total_credit_cents": 2200, "total_debit_cents": 2200, "transaction_date": "2024-01-13", "vendor_id": "0000010145"}, {"entry_id": "2024-0018956853", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377952", "payment_id": "0018956853", "posting_ts": "2024-01-28T11:00:00.603774", "preparer_id": "user_Aging and Disability Services_1", "settlement_date": "2024-01-25", "total_credit_cents": 784875, "total_debit_cents": 784875, "transaction_date": "2024-01-21", "vendor_id": "0000094957"}, {"entry_id": "2024-0018957169", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038686", "payment_id": "0018957169", "posting_ts": "2024-01-15T08:09:00.616411", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-13", "total_credit_cents": 40575, "total_debit_cents": 40575, "transaction_date": "2024-01-09", "vendor_id": "0000010334"}, {"entry_id": "2024-0018958082", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100874720", "payment_id": "0018958082", "posting_ts": "2024-01-28T08:05:00.341710", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-27", "total_credit_cents": 107500, "total_debit_cents": 107500, "transaction_date": "2024-01-22", "vendor_id": "0000048167"}, {"entry_id": "2024-0018958211", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "SDRM100377990", "payment_id": "0018958211", "posting_ts": "2024-01-19T12:39:00.128472", "preparer_id": "user_Aging and Disability Services_2", "settlement_date": "2024-01-19", "total_credit_cents": 2000, "total_debit_cents": 2000, "transaction_date": "2024-01-17", "vendor_id": "0000190968"}, {"entry_id": "2024-0018958374", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100601441", "payment_id": "0018958374", "posting_ts": "2024-01-17T12:39:00.055524", "preparer_id": "user_Department of Development Serv_3", "settlement_date": "2024-01-17", "total_credit_cents": 126000, "total_debit_cents": 126000, "transaction_date": "2024-01-13", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018958482", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162245", "payment_id": "0018958482", "posting_ts": "2024-01-28T16:13:00.191568", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-28", "total_credit_cents": 2862950, "total_debit_cents": 2862950, "transaction_date": "2024-01-25", "vendor_id": "0000000051"}, {"entry_id": "2024-0018958920", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCFM100162272", "payment_id": "0018958920", "posting_ts": "2024-01-10T11:45:00.294633", "preparer_id": "user_Dept. of Children and Families_1", "settlement_date": "2024-01-09", "total_credit_cents": 2069400, "total_debit_cents": 2069400, "transaction_date": "2024-01-04", "vendor_id": "0000052002"}, {"entry_id": "2024-0018961080", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100038789", "payment_id": "0018961080", "posting_ts": "2024-01-06T07:38:00.330532", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-05", "total_credit_cents": 20000, "total_debit_cents": 20000, "transaction_date": "2024-01-05", "vendor_id": "0000014728"}, {"entry_id": "2024-0018962127", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DEPM100302776", "payment_id": "0018962127", "posting_ts": "2024-01-26T16:11:00.661910", "preparer_id": "user_Dept of Energy & Environ Prot._2", "settlement_date": "2024-01-23", "total_credit_cents": 22949, "total_debit_cents": 22949, "transaction_date": "2024-01-19", "vendor_id": "0000010087"}, {"entry_id": "2024-0018962186", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "OSCM100083167", "payment_id": "0018962186", "posting_ts": "2024-01-24T16:59:00.296241", "preparer_id": "user_State Comptroller's Office_2", "settlement_date": "2024-01-22", "total_credit_cents": 43640, "total_debit_cents": 43640, "transaction_date": "2024-01-20", "vendor_id": "0000027703"}, {"entry_id": "2024-0018963847", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "JUDM101127441", "payment_id": "0018963847", "posting_ts": "2024-01-28T17:14:00.358097", "preparer_id": "user_Judicial Branch_3", "settlement_date": "2024-01-27", "total_credit_cents": 16000, "total_debit_cents": 16000, "transaction_date": "2024-01-21", "vendor_id": "0000224305"}, {"entry_id": "2024-0018963885", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASM100141434", "payment_id": "0018963885", "posting_ts": "2024-01-24T11:44:00.781715", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-21", "total_credit_cents": 3996439, "total_debit_cents": 3996439, "transaction_date": "2024-01-17", "vendor_id": "0000010192"}, {"entry_id": "2024-0018965453", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101338215", "payment_id": "0018965453", "posting_ts": "2024-01-21T10:56:00.239215", "preparer_id": "user_Dept. of Transportation_2", "settlement_date": "2024-01-18", "total_credit_cents": 55735, "total_debit_cents": 55735, "transaction_date": "2024-01-13", "vendor_id": "0000010129"}, {"entry_id": "2024-0018965746", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOTM101337687", "payment_id": "0018965746", "posting_ts": "2024-01-20T15:52:00.369646", "preparer_id": "user_Dept. of Transportation_1", "settlement_date": "2024-01-20", "total_credit_cents": 102000, "total_debit_cents": 102000, "transaction_date": "2024-01-19", "vendor_id": "0000034165"}, {"entry_id": "2024-0018965791", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877395", "payment_id": "0018965791", "posting_ts": "2024-01-28T07:34:00.722323", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-28", "total_credit_cents": 131100, "total_debit_cents": 131100, "transaction_date": "2024-01-23", "vendor_id": "0000064678"}, {"entry_id": "2024-0018966111", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100876571", "payment_id": "0018966111", "posting_ts": "2024-01-26T09:16:00.243610", "preparer_id": "user_Mental Health & Addiction Serv_2", "settlement_date": "2024-01-26", "total_credit_cents": 86300, "total_debit_cents": 86300, "transaction_date": "2024-01-23", "vendor_id": "0000176261"}, {"entry_id": "2024-0018966141", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "TECM100039274", "payment_id": "0018966141", "posting_ts": "2024-01-07T09:07:00.665437", "preparer_id": "user_CT Tech Educ and Career Sys_1", "settlement_date": "2024-01-07", "total_credit_cents": 1026950, "total_debit_cents": 1026950, "transaction_date": "2024-01-02", "vendor_id": "0000180143"}, {"entry_id": "2024-0018966311", "entry_source": "manual", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100876897", "payment_id": "0018966311", "posting_ts": "2024-01-23T10:59:00.572963", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-21", "total_credit_cents": 105200, "total_debit_cents": 105200, "transaction_date": "2024-01-21", "vendor_id": "0000202815"}, {"entry_id": "2024-0018967140", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "ECDM100059472", "payment_id": "0018967140", "posting_ts": "2024-01-14T10:04:00.345350", "preparer_id": "user_Econ. & Community Development_1", "settlement_date": "2024-01-12", "total_credit_cents": 381300, "total_debit_cents": 381300, "transaction_date": "2024-01-07", "vendor_id": "0000097723"}, {"entry_id": "2024-0018967665", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DCJM100082779", "payment_id": "0018967665", "posting_ts": "2024-01-05T15:30:00.814729", "preparer_id": "user_Division of Criminal Justice_1", "settlement_date": "2024-01-02", "total_credit_cents": 999844, "total_debit_cents": 999844, "transaction_date": "2024-01-02", "vendor_id": "0000010037"}, {"entry_id": "2024-0018968209", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602368", "payment_id": "0018968209", "posting_ts": "2024-01-22T14:54:00.064711", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-22", "total_credit_cents": 89900, "total_debit_cents": 89900, "transaction_date": "2024-01-19", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018968419", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DOCM100613262", "payment_id": "0018968419", "posting_ts": "2024-01-28T14:31:00.108030", "preparer_id": "user_Dept. of Correction_1", "settlement_date": "2024-01-28", "total_credit_cents": 39000, "total_debit_cents": 39000, "transaction_date": "2024-01-25", "vendor_id": "0000189016"}, {"entry_id": "2024-0018969393", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DDSM100602814", "payment_id": "0018969393", "posting_ts": "2024-01-09T16:55:00.905611", "preparer_id": "user_Department of Development Serv_1", "settlement_date": "2024-01-06", "total_credit_cents": 28600, "total_debit_cents": 28600, "transaction_date": "2024-01-02", "vendor_id": "DDS9999999"}, {"entry_id": "2024-0018969623", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DASS100044297", "payment_id": "0018969623", "posting_ts": "2024-01-13T16:41:00.735273", "preparer_id": "user_Dept of Administrative Svcs_1", "settlement_date": "2024-01-11", "total_credit_cents": 13757, "total_debit_cents": 13757, "transaction_date": "2024-01-05", "vendor_id": "0000010011"}, {"entry_id": "2024-0018970723", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DPSM100354189", "payment_id": "0018970723", "posting_ts": "2024-01-13T09:42:00.076175", "preparer_id": "user_Dept of Emrg Svc & Public Prot_1", "settlement_date": "2024-01-10", "total_credit_cents": 94399, "total_debit_cents": 94399, "transaction_date": "2024-01-06", "vendor_id": "0000011075"}, {"entry_id": "2024-0018971007", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "MHAM100877887", "payment_id": "0018971007", "posting_ts": "2024-01-17T15:22:00.996519", "preparer_id": "user_Mental Health & Addiction Serv_1", "settlement_date": "2024-01-15", "total_credit_cents": 18668, "total_debit_cents": 18668, "transaction_date": "2024-01-10", "vendor_id": "0000224453"}, {"entry_id": "2024-0018971781", "entry_source": "interface", "fiscal_year": 2024, "fiscal_year_period": 7, "invoice_id": "DSSM100329286", "payment_id": "0018971781", "posting_ts": "2024-01-09T10:07:00.292684", "preparer_id": "user_Dept. of Social Services_2", "settlement_date": "2024-01-06", "total_credit_cents": 41146100, "total_debit_cents": 41146100, "transaction_date": "2024-01-01", "vendor_id": "0000010552"}], "observation_hash": "f1893690f7b84c2eef8f13f1ff2417d67baa890e7ea42d36430126adf4bc4384", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.13302800107339863, "reasoning_trace": ""}
|
| 2 |
-
{"step_idx": 2, "tool": "disposition", "args": {"entry_id": "2024-0000219128", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03969200042774901, "reasoning_trace": ""}
|
| 3 |
-
{"step_idx": 3, "tool": "disposition", "args": {"entry_id": "2024-0018937350", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008680999599164352, "reasoning_trace": ""}
|
| 4 |
-
{"step_idx": 4, "tool": "disposition", "args": {"entry_id": "2024-0018937371", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006276000931393355, "reasoning_trace": ""}
|
| 5 |
-
{"step_idx": 5, "tool": "disposition", "args": {"entry_id": "2024-0018937379", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006061000021873042, "reasoning_trace": ""}
|
| 6 |
-
{"step_idx": 6, "tool": "disposition", "args": {"entry_id": "2024-0018937555", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005222000254434533, "reasoning_trace": ""}
|
| 7 |
-
{"step_idx": 7, "tool": "disposition", "args": {"entry_id": "2024-0018937606", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005287000021780841, "reasoning_trace": ""}
|
| 8 |
-
{"step_idx": 8, "tool": "disposition", "args": {"entry_id": "2024-0018941463", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005080000846646726, "reasoning_trace": ""}
|
| 9 |
-
{"step_idx": 9, "tool": "disposition", "args": {"entry_id": "2024-0018943644", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005191999662201852, "reasoning_trace": ""}
|
| 10 |
-
{"step_idx": 10, "tool": "disposition", "args": {"entry_id": "2024-0018943935", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005343999873730354, "reasoning_trace": ""}
|
| 11 |
-
{"step_idx": 11, "tool": "disposition", "args": {"entry_id": "2024-0018943954", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00902600004337728, "reasoning_trace": ""}
|
| 12 |
-
{"step_idx": 12, "tool": "disposition", "args": {"entry_id": "2024-0018944606", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010870000551221892, "reasoning_trace": ""}
|
| 13 |
-
{"step_idx": 13, "tool": "disposition", "args": {"entry_id": "2024-0018944630", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009844001397141255, "reasoning_trace": ""}
|
| 14 |
-
{"step_idx": 14, "tool": "disposition", "args": {"entry_id": "2024-0018945402", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.015972000255715102, "reasoning_trace": ""}
|
| 15 |
-
{"step_idx": 15, "tool": "disposition", "args": {"entry_id": "2024-0018945462", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.022062000425648876, "reasoning_trace": ""}
|
| 16 |
-
{"step_idx": 16, "tool": "disposition", "args": {"entry_id": "2024-0018945546", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.022035001165932044, "reasoning_trace": ""}
|
| 17 |
-
{"step_idx": 17, "tool": "disposition", "args": {"entry_id": "2024-0018945644", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.031023000701679848, "reasoning_trace": ""}
|
| 18 |
-
{"step_idx": 18, "tool": "disposition", "args": {"entry_id": "2024-0018946567", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01121500099543482, "reasoning_trace": ""}
|
| 19 |
-
{"step_idx": 19, "tool": "disposition", "args": {"entry_id": "2024-0018946688", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.017308999304077588, "reasoning_trace": ""}
|
| 20 |
-
{"step_idx": 20, "tool": "disposition", "args": {"entry_id": "2024-0018946851", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.016264000805676915, "reasoning_trace": ""}
|
| 21 |
-
{"step_idx": 21, "tool": "disposition", "args": {"entry_id": "2024-0018947872", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.03445999936957378, "reasoning_trace": ""}
|
| 22 |
-
{"step_idx": 22, "tool": "disposition", "args": {"entry_id": "2024-0018948653", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.017841000953922048, "reasoning_trace": ""}
|
| 23 |
-
{"step_idx": 23, "tool": "disposition", "args": {"entry_id": "2024-0018949442", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.016543999663554132, "reasoning_trace": ""}
|
| 24 |
-
{"step_idx": 24, "tool": "disposition", "args": {"entry_id": "2024-0018949613", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010558000212768093, "reasoning_trace": ""}
|
| 25 |
-
{"step_idx": 25, "tool": "disposition", "args": {"entry_id": "2024-0018949918", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010589001249172725, "reasoning_trace": ""}
|
| 26 |
-
{"step_idx": 26, "tool": "disposition", "args": {"entry_id": "2024-0018950310", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.017919001038535498, "reasoning_trace": ""}
|
| 27 |
-
{"step_idx": 27, "tool": "disposition", "args": {"entry_id": "2024-0018951289", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01076099943020381, "reasoning_trace": ""}
|
| 28 |
-
{"step_idx": 28, "tool": "disposition", "args": {"entry_id": "2024-0018951383", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006622998625971377, "reasoning_trace": ""}
|
| 29 |
-
{"step_idx": 29, "tool": "disposition", "args": {"entry_id": "2024-0018952421", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006263000614126213, "reasoning_trace": ""}
|
| 30 |
-
{"step_idx": 30, "tool": "disposition", "args": {"entry_id": "2024-0018953464", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00778499997977633, "reasoning_trace": ""}
|
| 31 |
-
{"step_idx": 31, "tool": "disposition", "args": {"entry_id": "2024-0018953968", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005992000296828337, "reasoning_trace": ""}
|
| 32 |
-
{"step_idx": 32, "tool": "disposition", "args": {"entry_id": "2024-0018955745", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005357998816180043, "reasoning_trace": ""}
|
| 33 |
-
{"step_idx": 33, "tool": "disposition", "args": {"entry_id": "2024-0018955762", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005187001079320908, "reasoning_trace": ""}
|
| 34 |
-
{"step_idx": 34, "tool": "disposition", "args": {"entry_id": "2024-0018956707", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010961999578285031, "reasoning_trace": ""}
|
| 35 |
-
{"step_idx": 35, "tool": "disposition", "args": {"entry_id": "2024-0018956853", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009590999979991466, "reasoning_trace": ""}
|
| 36 |
-
{"step_idx": 36, "tool": "disposition", "args": {"entry_id": "2024-0018957169", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009680999937700108, "reasoning_trace": ""}
|
| 37 |
-
{"step_idx": 37, "tool": "disposition", "args": {"entry_id": "2024-0018958082", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008328001058544032, "reasoning_trace": ""}
|
| 38 |
-
{"step_idx": 38, "tool": "disposition", "args": {"entry_id": "2024-0018958211", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007824000931577757, "reasoning_trace": ""}
|
| 39 |
-
{"step_idx": 39, "tool": "disposition", "args": {"entry_id": "2024-0018958374", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.007713000741205178, "reasoning_trace": ""}
|
| 40 |
-
{"step_idx": 40, "tool": "disposition", "args": {"entry_id": "2024-0018958482", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008604998583905399, "reasoning_trace": ""}
|
| 41 |
-
{"step_idx": 41, "tool": "disposition", "args": {"entry_id": "2024-0018958920", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005722000423702411, "reasoning_trace": ""}
|
| 42 |
-
{"step_idx": 42, "tool": "disposition", "args": {"entry_id": "2024-0018961080", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005470999894896522, "reasoning_trace": ""}
|
| 43 |
-
{"step_idx": 43, "tool": "disposition", "args": {"entry_id": "2024-0018962127", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.0073710016295081005, "reasoning_trace": ""}
|
| 44 |
-
{"step_idx": 44, "tool": "disposition", "args": {"entry_id": "2024-0018962186", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011161000657011755, "reasoning_trace": ""}
|
| 45 |
-
{"step_idx": 45, "tool": "disposition", "args": {"entry_id": "2024-0018963847", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005627000064123422, "reasoning_trace": ""}
|
| 46 |
-
{"step_idx": 46, "tool": "disposition", "args": {"entry_id": "2024-0018963885", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006074998964322731, "reasoning_trace": ""}
|
| 47 |
-
{"step_idx": 47, "tool": "disposition", "args": {"entry_id": "2024-0018965453", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009097999281948432, "reasoning_trace": ""}
|
| 48 |
-
{"step_idx": 48, "tool": "disposition", "args": {"entry_id": "2024-0018965746", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.006472000677604228, "reasoning_trace": ""}
|
| 49 |
-
{"step_idx": 49, "tool": "disposition", "args": {"entry_id": "2024-0018965791", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005893998604733497, "reasoning_trace": ""}
|
| 50 |
-
{"step_idx": 50, "tool": "disposition", "args": {"entry_id": "2024-0018966111", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009065999620361254, "reasoning_trace": ""}
|
| 51 |
-
{"step_idx": 51, "tool": "disposition", "args": {"entry_id": "2024-0018966141", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.008906999937607907, "reasoning_trace": ""}
|
| 52 |
-
{"step_idx": 52, "tool": "disposition", "args": {"entry_id": "2024-0018966311", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01273099951504264, "reasoning_trace": ""}
|
| 53 |
-
{"step_idx": 53, "tool": "disposition", "args": {"entry_id": "2024-0018967140", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009293999028159305, "reasoning_trace": ""}
|
| 54 |
-
{"step_idx": 54, "tool": "disposition", "args": {"entry_id": "2024-0018967665", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009131001206696965, "reasoning_trace": ""}
|
| 55 |
-
{"step_idx": 55, "tool": "disposition", "args": {"entry_id": "2024-0018968209", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.00677800017001573, "reasoning_trace": ""}
|
| 56 |
-
{"step_idx": 56, "tool": "disposition", "args": {"entry_id": "2024-0018968419", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.005787998816231266, "reasoning_trace": ""}
|
| 57 |
-
{"step_idx": 57, "tool": "disposition", "args": {"entry_id": "2024-0018969393", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.012287000572541729, "reasoning_trace": ""}
|
| 58 |
-
{"step_idx": 58, "tool": "disposition", "args": {"entry_id": "2024-0018969623", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.01230000088980887, "reasoning_trace": ""}
|
| 59 |
-
{"step_idx": 59, "tool": "disposition", "args": {"entry_id": "2024-0018970723", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.011834999895654619, "reasoning_trace": ""}
|
| 60 |
-
{"step_idx": 60, "tool": "disposition", "args": {"entry_id": "2024-0018971007", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.010600000678095967, "reasoning_trace": ""}
|
| 61 |
-
{"step_idx": 61, "tool": "disposition", "args": {"entry_id": "2024-0018971781", "verdict": "flag", "issue_type": "account_blocked", "rationale": "flagged by baseline", "evidence_ids": []}, "ok": true, "observation": "ack", "observation_hash": "81744fc1e95f3b4f2a49b26c557eb1f61bbbdc12f976c382750a7b1612a102e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009888999557006173, "reasoning_trace": ""}
|
| 62 |
-
{"step_idx": 62, "tool": "submit", "args": {}, "ok": true, "observation": "episode ends", "observation_hash": "e6111d1c5d214c01e92725bf69762fcf2ef6c8eec182f00fd2a8c2e71fea77e4", "tokens_in": 0, "tokens_out": 0, "latency_ms": 0.009364999641547911, "reasoning_trace": ""}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed1/JE-02_seed1.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed1/score.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"outcome": 0.0,
|
| 3 |
-
"process": 1.0,
|
| 4 |
-
"rationale": null,
|
| 5 |
-
"combined": 0.22222222222222227,
|
| 6 |
-
"fp_rate": 0.0,
|
| 7 |
-
"fp_penalty": 0.0,
|
| 8 |
-
"final": 0.22222222222222227,
|
| 9 |
-
"fabrications": [],
|
| 10 |
-
"auto_fail": false,
|
| 11 |
-
"hard_fail": false,
|
| 12 |
-
"judge_pass": null,
|
| 13 |
-
"passed": null,
|
| 14 |
-
"judge": "absent",
|
| 15 |
-
"cost_usd": 0.0
|
| 16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed2/JE-02_seed2.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed3/JE-02_seed3.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed4/JE-02_seed4.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed5/JE-02_seed5.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/baseline_no_evidence/seed5/score.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"outcome": 0.0,
|
| 3 |
-
"process": 1.0,
|
| 4 |
-
"rationale": null,
|
| 5 |
-
"combined": 0.22222222222222227,
|
| 6 |
-
"fp_rate": 0.0,
|
| 7 |
-
"fp_penalty": 0.0,
|
| 8 |
-
"final": 0.22222222222222227,
|
| 9 |
-
"fabrications": [],
|
| 10 |
-
"auto_fail": false,
|
| 11 |
-
"hard_fail": false,
|
| 12 |
-
"judge_pass": null,
|
| 13 |
-
"passed": null,
|
| 14 |
-
"judge": "absent",
|
| 15 |
-
"cost_usd": 0.0
|
| 16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data/runs/console/c5-grid-je02/deepseek_deepseek-v4-flash/seed1/JE-02_seed1.jsonl
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
data/runs/console/c5-grid-je02/deepseek_deepseek-v4-flash/seed1/score.json
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"outcome": 1.0,
|
| 3 |
-
"process": 1.0,
|
| 4 |
-
"rationale": null,
|
| 5 |
-
"combined": 1.0,
|
| 6 |
-
"fp_rate": 0.0,
|
| 7 |
-
"fp_penalty": 0.0,
|
| 8 |
-
"final": 1.0,
|
| 9 |
-
"fabrications": [],
|
| 10 |
-
"auto_fail": false,
|
| 11 |
-
"hard_fail": false,
|
| 12 |
-
"judge_pass": null,
|
| 13 |
-
"passed": null,
|
| 14 |
-
"judge": "absent",
|
| 15 |
-
"cost_usd": 0.1607760823004001
|
| 16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|