Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
224 commits
Select commit Hold shift + click to select a range
08aa62d
chore: 0.4.0 progress 1/222
DevAnimecx Oct 22, 2026
e8120b4
chore: 0.4.0 progress 2/222
DevAnimecx Oct 22, 2026
84a6283
chore: 0.4.0 progress 3/222
DevAnimecx Oct 22, 2026
ad40152
chore: 0.4.0 progress 4/222
DevAnimecx Oct 22, 2026
1cb6dab
chore: 0.4.0 progress 5/222
DevAnimecx Oct 22, 2026
560ec5b
chore: 0.4.0 progress 6/222
DevAnimecx Oct 22, 2026
134f8ee
chore: 0.4.0 progress 7/222
DevAnimecx Oct 22, 2026
4b152f0
chore: 0.4.0 progress 8/222
DevAnimecx Oct 22, 2026
1867db0
chore: 0.4.0 progress 9/222
DevAnimecx Oct 22, 2026
fd46651
chore: 0.4.0 progress 10/222
DevAnimecx Oct 22, 2026
4630664
chore: 0.4.0 progress 11/222
DevAnimecx Oct 22, 2026
84d8ee5
chore: 0.4.0 progress 12/222
DevAnimecx Oct 22, 2026
f0b56ac
chore: 0.4.0 progress 13/222
DevAnimecx Oct 22, 2026
340f757
chore: 0.4.0 progress 14/222
DevAnimecx Oct 22, 2026
7ebcd52
chore: 0.4.0 progress 15/222
DevAnimecx Oct 22, 2026
2d727fb
chore: 0.4.0 progress 16/222
DevAnimecx Oct 22, 2026
190299c
chore: 0.4.0 progress 17/222
DevAnimecx Oct 22, 2026
1b245fb
chore: 0.4.0 progress 18/222
DevAnimecx Oct 22, 2026
cc99d28
chore: 0.4.0 progress 19/222
DevAnimecx Oct 22, 2026
30810b3
chore: 0.4.0 progress 20/222
DevAnimecx Oct 22, 2026
e56d81c
chore: 0.4.0 progress 21/222
DevAnimecx Oct 22, 2026
248bb23
chore: 0.4.0 progress 22/222
DevAnimecx Oct 22, 2026
618195c
chore: 0.4.0 progress 23/222
DevAnimecx Oct 22, 2026
0688536
chore: 0.4.0 progress 24/222
DevAnimecx Oct 22, 2026
6ba8237
chore: 0.4.0 progress 25/222
DevAnimecx Oct 22, 2026
9fa9288
chore: 0.4.0 progress 26/222
DevAnimecx Oct 22, 2026
c62fbb2
chore: 0.4.0 progress 27/222
DevAnimecx Oct 22, 2026
9c48362
chore: 0.4.0 progress 28/222
DevAnimecx Oct 22, 2026
3c0dee2
chore: 0.4.0 progress 29/222
DevAnimecx Oct 22, 2026
64ff20f
chore: 0.4.0 progress 30/222
DevAnimecx Oct 22, 2026
09411d0
chore: 0.4.0 progress 31/222
DevAnimecx Oct 22, 2026
c3def4e
chore: 0.4.0 progress 32/222
DevAnimecx Oct 22, 2026
f53e553
chore: 0.4.0 progress 33/222
DevAnimecx Oct 22, 2026
d6e2e1d
chore: 0.4.0 progress 34/222
DevAnimecx Oct 22, 2026
1a67b1e
chore: 0.4.0 progress 35/222
DevAnimecx Oct 22, 2026
e8f4654
chore: 0.4.0 progress 36/222
DevAnimecx Oct 22, 2026
4c2da4d
chore: 0.4.0 progress 37/222
DevAnimecx Oct 22, 2026
758035a
chore: 0.4.0 progress 38/222
DevAnimecx Oct 22, 2026
29e0466
chore: 0.4.0 progress 39/222
DevAnimecx Oct 22, 2026
e15374a
chore: 0.4.0 progress 40/222
DevAnimecx Oct 22, 2026
3da515f
chore: 0.4.0 progress 41/222
DevAnimecx Oct 22, 2026
1f64a3c
chore: 0.4.0 progress 42/222
DevAnimecx Oct 22, 2026
d056337
chore: 0.4.0 progress 43/222
DevAnimecx Oct 22, 2026
55d891c
chore: 0.4.0 progress 44/222
DevAnimecx Oct 22, 2026
6e4fbe0
chore: 0.4.0 progress 45/222
DevAnimecx Oct 22, 2026
ce13545
chore: 0.4.0 progress 46/222
DevAnimecx Oct 22, 2026
9d5db8f
chore: 0.4.0 progress 47/222
DevAnimecx Oct 22, 2026
12cf95d
chore: 0.4.0 progress 48/222
DevAnimecx Oct 22, 2026
31be706
chore: 0.4.0 progress 49/222
DevAnimecx Oct 22, 2026
973cdca
chore: 0.4.0 progress 50/222
DevAnimecx Oct 22, 2026
3117541
chore: 0.4.0 progress 51/222
DevAnimecx Oct 22, 2026
cea561a
chore: 0.4.0 progress 52/222
DevAnimecx Oct 22, 2026
70b87ec
chore: 0.4.0 progress 53/222
DevAnimecx Oct 22, 2026
9c8f4a3
chore: 0.4.0 progress 54/222
DevAnimecx Oct 22, 2026
07a6126
chore: 0.4.0 progress 55/222
DevAnimecx Oct 22, 2026
19be881
chore: 0.4.0 progress 56/222
DevAnimecx Oct 22, 2026
058f5a7
chore: 0.4.0 progress 57/222
DevAnimecx Oct 22, 2026
26c3bcf
chore: 0.4.0 progress 58/222
DevAnimecx Oct 22, 2026
094add2
chore: 0.4.0 progress 59/222
DevAnimecx Oct 22, 2026
34fb31d
chore: 0.4.0 progress 60/222
DevAnimecx Oct 22, 2026
6a3a79f
chore: 0.4.0 progress 61/222
DevAnimecx Oct 22, 2026
4333544
chore: 0.4.0 progress 62/222
DevAnimecx Oct 22, 2026
0be90fc
chore: 0.4.0 progress 63/222
DevAnimecx Oct 22, 2026
2164274
chore: 0.4.0 progress 64/222
DevAnimecx Oct 22, 2026
1620c1c
chore: 0.4.0 progress 65/222
DevAnimecx Oct 22, 2026
371ca37
chore: 0.4.0 progress 66/222
DevAnimecx Oct 22, 2026
9582852
chore: 0.4.0 progress 67/222
DevAnimecx Oct 22, 2026
2c815a4
chore: 0.4.0 progress 68/222
DevAnimecx Oct 22, 2026
004c4fd
chore: 0.4.0 progress 69/222
DevAnimecx Oct 22, 2026
2563fdb
chore: 0.4.0 progress 70/222
DevAnimecx Oct 22, 2026
7a5e4c6
chore: 0.4.0 progress 71/222
DevAnimecx Oct 22, 2026
f9440c3
chore: 0.4.0 progress 72/222
DevAnimecx Oct 22, 2026
33c8fb6
chore: 0.4.0 progress 73/222
DevAnimecx Oct 22, 2026
e85564f
chore: 0.4.0 progress 74/222
DevAnimecx Oct 22, 2026
72e4007
chore: 0.4.0 progress 75/222
DevAnimecx Oct 22, 2026
edf87e9
chore: 0.4.0 progress 76/222
DevAnimecx Oct 22, 2026
e8114aa
chore: 0.4.0 progress 77/222
DevAnimecx Oct 22, 2026
29c6dbd
chore: 0.4.0 progress 78/222
DevAnimecx Oct 22, 2026
c1f5a9e
chore: 0.4.0 progress 79/222
DevAnimecx Oct 22, 2026
61a1cb0
chore: 0.4.0 progress 80/222
DevAnimecx Oct 22, 2026
93393a1
chore: 0.4.0 progress 81/222
DevAnimecx Oct 22, 2026
7980bfe
chore: 0.4.0 progress 82/222
DevAnimecx Oct 22, 2026
d71368a
chore: 0.4.0 progress 83/222
DevAnimecx Oct 22, 2026
3380c3a
chore: 0.4.0 progress 84/222
DevAnimecx Oct 22, 2026
86b1ff1
chore: 0.4.0 progress 85/222
DevAnimecx Oct 22, 2026
055a255
chore: 0.4.0 progress 86/222
DevAnimecx Oct 22, 2026
eee0009
chore: 0.4.0 progress 87/222
DevAnimecx Oct 22, 2026
8f92ce3
chore: 0.4.0 progress 88/222
DevAnimecx Oct 22, 2026
30c118b
chore: 0.4.0 progress 89/222
DevAnimecx Oct 22, 2026
0eefd9a
chore: 0.4.0 progress 90/222
DevAnimecx Oct 22, 2026
ff479ac
chore: 0.4.0 progress 91/222
DevAnimecx Oct 22, 2026
033cf66
chore: 0.4.0 progress 92/222
DevAnimecx Oct 22, 2026
4a076d8
chore: 0.4.0 progress 93/222
DevAnimecx Oct 22, 2026
0a7989c
chore: 0.4.0 progress 94/222
DevAnimecx Oct 22, 2026
b0a9bb3
chore: 0.4.0 progress 95/222
DevAnimecx Oct 22, 2026
c9f492a
chore: 0.4.0 progress 96/222
DevAnimecx Oct 22, 2026
b13bcf7
chore: 0.4.0 progress 97/222
DevAnimecx Oct 22, 2026
3be93a1
chore: 0.4.0 progress 98/222
DevAnimecx Oct 22, 2026
664283c
chore: 0.4.0 progress 99/222
DevAnimecx Oct 22, 2026
111931f
chore: 0.4.0 progress 100/222
DevAnimecx Oct 22, 2026
70df7c3
chore: 0.4.0 progress 101/222
DevAnimecx Oct 22, 2026
aecb9d9
chore: 0.4.0 progress 102/222
DevAnimecx Oct 22, 2026
c0d8f61
chore: 0.4.0 progress 103/222
DevAnimecx Oct 22, 2026
c47e976
chore: 0.4.0 progress 104/222
DevAnimecx Oct 22, 2026
4909bc8
chore: 0.4.0 progress 105/222
DevAnimecx Oct 22, 2026
cedeafe
chore: 0.4.0 progress 106/222
DevAnimecx Oct 22, 2026
67705fd
chore: 0.4.0 progress 107/222
DevAnimecx Oct 22, 2026
79bf6d4
chore: 0.4.0 progress 108/222
DevAnimecx Oct 22, 2026
3c8a211
chore: 0.4.0 progress 109/222
DevAnimecx Oct 22, 2026
3dba50a
chore: 0.4.0 progress 110/222
DevAnimecx Oct 22, 2026
d8407d0
chore: 0.4.0 progress 111/222
DevAnimecx Oct 22, 2026
e318994
chore: 0.4.0 progress 112/222
DevAnimecx Oct 22, 2026
2aceeec
chore: 0.4.0 progress 113/222
DevAnimecx Oct 22, 2026
3e22911
chore: 0.4.0 progress 114/222
DevAnimecx Oct 22, 2026
6434b43
chore: 0.4.0 progress 115/222
DevAnimecx Oct 22, 2026
f261761
chore: 0.4.0 progress 116/222
DevAnimecx Oct 22, 2026
7015ed2
chore: 0.4.0 progress 117/222
DevAnimecx Oct 22, 2026
f295262
chore: 0.4.0 progress 118/222
DevAnimecx Oct 22, 2026
bfcc48d
chore: 0.4.0 progress 119/222
DevAnimecx Oct 22, 2026
74326c3
chore: 0.4.0 progress 120/222
DevAnimecx Oct 22, 2026
71f116b
chore: 0.4.0 progress 121/222
DevAnimecx Oct 22, 2026
f3da84b
chore: 0.4.0 progress 122/222
DevAnimecx Oct 22, 2026
25e5033
chore: 0.4.0 progress 123/222
DevAnimecx Oct 22, 2026
9076107
chore: 0.4.0 progress 124/222
DevAnimecx Oct 22, 2026
2c7f73f
chore: 0.4.0 progress 125/222
DevAnimecx Oct 22, 2026
ea3eb7c
chore: 0.4.0 progress 126/222
DevAnimecx Oct 22, 2026
05c69ca
chore: 0.4.0 progress 127/222
DevAnimecx Oct 22, 2026
8c5d357
chore: 0.4.0 progress 128/222
DevAnimecx Oct 22, 2026
a75e0e3
chore: 0.4.0 progress 129/222
DevAnimecx Oct 22, 2026
41ceb7b
chore: 0.4.0 progress 130/222
DevAnimecx Oct 22, 2026
30d5334
chore: 0.4.0 progress 131/222
DevAnimecx Oct 22, 2026
0ed0340
chore: 0.4.0 progress 132/222
DevAnimecx Oct 22, 2026
b7cdc6e
chore: 0.4.0 progress 133/222
DevAnimecx Oct 22, 2026
cef4860
chore: 0.4.0 progress 134/222
DevAnimecx Oct 22, 2026
29d5c06
chore: 0.4.0 progress 135/222
DevAnimecx Oct 22, 2026
8f2a1c6
chore: 0.4.0 progress 136/222
DevAnimecx Oct 22, 2026
70579ba
chore: 0.4.0 progress 137/222
DevAnimecx Oct 22, 2026
873ed55
chore: 0.4.0 progress 138/222
DevAnimecx Oct 22, 2026
ee4b95d
chore: 0.4.0 progress 139/222
DevAnimecx Oct 22, 2026
dfecfb0
chore: 0.4.0 progress 140/222
DevAnimecx Oct 22, 2026
503dd06
chore: 0.4.0 progress 141/222
DevAnimecx Oct 22, 2026
8c2752c
chore: 0.4.0 progress 142/222
DevAnimecx Oct 22, 2026
a4bebe0
chore: 0.4.0 progress 143/222
DevAnimecx Oct 22, 2026
0063a3c
chore: 0.4.0 progress 144/222
DevAnimecx Oct 22, 2026
28feef3
chore: 0.4.0 progress 145/222
DevAnimecx Oct 22, 2026
4880c51
chore: 0.4.0 progress 146/222
DevAnimecx Oct 22, 2026
819cfbf
chore: 0.4.0 progress 147/222
DevAnimecx Oct 22, 2026
dca0c55
chore: 0.4.0 progress 148/222
DevAnimecx Oct 22, 2026
eec3518
chore: 0.4.0 progress 149/222
DevAnimecx Oct 22, 2026
f1e6db2
chore: 0.4.0 progress 150/222
DevAnimecx Oct 22, 2026
3dfef9d
chore: 0.4.0 progress 151/222
DevAnimecx Oct 22, 2026
2734170
chore: 0.4.0 progress 152/222
DevAnimecx Oct 22, 2026
0175511
chore: 0.4.0 progress 153/222
DevAnimecx Oct 22, 2026
dc50582
chore: 0.4.0 progress 154/222
DevAnimecx Oct 22, 2026
05e7f54
chore: 0.4.0 progress 155/222
DevAnimecx Oct 22, 2026
d32bc8c
chore: 0.4.0 progress 156/222
DevAnimecx Oct 22, 2026
33fe8fa
chore: 0.4.0 progress 157/222
DevAnimecx Oct 22, 2026
0bbcbd9
chore: 0.4.0 progress 158/222
DevAnimecx Oct 22, 2026
9c33924
chore: 0.4.0 progress 159/222
DevAnimecx Oct 22, 2026
8605e9a
chore: 0.4.0 progress 160/222
DevAnimecx Oct 22, 2026
305eb96
chore: 0.4.0 progress 161/222
DevAnimecx Oct 22, 2026
4b0364c
chore: 0.4.0 progress 162/222
DevAnimecx Oct 22, 2026
902daa6
chore: 0.4.0 progress 163/222
DevAnimecx Oct 22, 2026
8b7c15d
chore: 0.4.0 progress 164/222
DevAnimecx Oct 22, 2026
236d4e4
chore: 0.4.0 progress 165/222
DevAnimecx Oct 22, 2026
48277b8
chore: 0.4.0 progress 166/222
DevAnimecx Oct 22, 2026
1329984
chore: 0.4.0 progress 167/222
DevAnimecx Oct 22, 2026
ebbaa35
chore: 0.4.0 progress 168/222
DevAnimecx Oct 22, 2026
674f407
chore: 0.4.0 progress 169/222
DevAnimecx Oct 22, 2026
bc7f2f9
chore: 0.4.0 progress 170/222
DevAnimecx Oct 22, 2026
4963c6b
chore: 0.4.0 progress 171/222
DevAnimecx Oct 22, 2026
54494fe
chore: 0.4.0 progress 172/222
DevAnimecx Oct 22, 2026
2fbfcb9
chore: 0.4.0 progress 173/222
DevAnimecx Oct 22, 2026
5f4c2d8
chore: 0.4.0 progress 174/222
DevAnimecx Oct 22, 2026
ba031ec
chore: 0.4.0 progress 175/222
DevAnimecx Oct 22, 2026
fe41bba
chore: 0.4.0 progress 176/222
DevAnimecx Oct 22, 2026
733d723
chore: 0.4.0 progress 177/222
DevAnimecx Oct 22, 2026
9bb095b
chore: 0.4.0 progress 178/222
DevAnimecx Oct 22, 2026
783bd65
chore: 0.4.0 progress 179/222
DevAnimecx Oct 22, 2026
b64b65c
chore: 0.4.0 progress 180/222
DevAnimecx Oct 22, 2026
36efac7
chore: 0.4.0 progress 181/222
DevAnimecx Oct 22, 2026
2d11402
chore: 0.4.0 progress 182/222
DevAnimecx Oct 22, 2026
759f3d9
chore: 0.4.0 progress 183/222
DevAnimecx Oct 22, 2026
b91f9d4
chore: 0.4.0 progress 184/222
DevAnimecx Oct 22, 2026
fcb908b
chore: 0.4.0 progress 185/222
DevAnimecx Oct 22, 2026
08de070
chore: 0.4.0 progress 186/222
DevAnimecx Oct 22, 2026
a2adc2a
chore: 0.4.0 progress 187/222
DevAnimecx Oct 22, 2026
1a21af0
chore: 0.4.0 progress 188/222
DevAnimecx Oct 22, 2026
bc9d9b9
chore: 0.4.0 progress 189/222
DevAnimecx Oct 22, 2026
a408a0a
chore: 0.4.0 progress 190/222
DevAnimecx Oct 22, 2026
1373fa3
chore: 0.4.0 progress 191/222
DevAnimecx Oct 22, 2026
72b9f0d
chore: 0.4.0 progress 192/222
DevAnimecx Oct 22, 2026
affaa6a
chore: 0.4.0 progress 193/222
DevAnimecx Oct 22, 2026
aa1a128
chore: 0.4.0 progress 194/222
DevAnimecx Oct 22, 2026
5e2dece
chore: 0.4.0 progress 195/222
DevAnimecx Oct 22, 2026
de646d3
chore: 0.4.0 progress 196/222
DevAnimecx Oct 22, 2026
6fe8136
chore: 0.4.0 progress 197/222
DevAnimecx Oct 22, 2026
66a5b1d
chore: 0.4.0 progress 198/222
DevAnimecx Oct 22, 2026
bc9c437
chore: 0.4.0 progress 199/222
DevAnimecx Oct 22, 2026
b641e54
chore: 0.4.0 progress 200/222
DevAnimecx Oct 22, 2026
a739f14
chore: 0.4.0 progress 201/222
DevAnimecx Oct 22, 2026
dce723b
chore: 0.4.0 progress 202/222
DevAnimecx Oct 22, 2026
095fe82
chore: 0.4.0 progress 203/222
DevAnimecx Oct 22, 2026
7f54aae
chore: 0.4.0 progress 204/222
DevAnimecx Oct 22, 2026
473f9d2
chore: 0.4.0 progress 205/222
DevAnimecx Oct 22, 2026
97980f2
chore: 0.4.0 progress 206/222
DevAnimecx Oct 22, 2026
e7dce73
chore: 0.4.0 progress 207/222
DevAnimecx Oct 22, 2026
ab6db92
chore: 0.4.0 progress 208/222
DevAnimecx Oct 22, 2026
0dc9885
chore: 0.4.0 progress 209/222
DevAnimecx Oct 22, 2026
4efaa2d
chore: 0.4.0 progress 210/222
DevAnimecx Oct 22, 2026
faf449b
chore: 0.4.0 progress 211/222
DevAnimecx Oct 22, 2026
cca2f6a
chore: 0.4.0 progress 212/222
DevAnimecx Oct 22, 2026
dd46f71
chore: 0.4.0 progress 213/222
DevAnimecx Oct 22, 2026
8dda69e
chore: 0.4.0 progress 214/222
DevAnimecx Oct 22, 2026
9e80b78
chore: 0.4.0 progress 215/222
DevAnimecx Oct 22, 2026
998e427
chore: 0.4.0 progress 216/222
DevAnimecx Oct 22, 2026
47da196
chore: 0.4.0 progress 217/222
DevAnimecx Oct 22, 2026
18add4a
chore: 0.4.0 progress 218/222
DevAnimecx Oct 22, 2026
bd08127
chore: 0.4.0 progress 219/222
DevAnimecx Oct 22, 2026
3d721fb
chore: 0.4.0 progress 220/222
DevAnimecx Oct 22, 2026
46a6dd3
chore: 0.4.0 progress 221/222
DevAnimecx Oct 22, 2026
9c4bc0e
chore: 0.4.0 progress 222/222
DevAnimecx Oct 22, 2026
7e24ec5
feat(sdk): query graph support for Python, JS and Go; rewrite README
DevAnimecx Oct 22, 2026
b664f31
fix: selectolax 1.0 removed the modest backend; unblock CI
DevAnimecx Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions .github/workflows/sync-data.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,17 @@ jobs:

- name: Copy data files
run: |
rm -rf jiro-web/public/data
cp -r jiro-search/data jiro-web/public/data
# Overwrite in place, never wipe. jiro-web owns docs/, faq/,
# testimonials/, use-cases/ and its own changelog/blog entries that
# do not exist here, and its loader reads an explicit allowlist of
# slugs. A `rm -rf` would delete those and silently degrade those
# pages to placeholder entries.
cp -r jiro-search/data/. jiro-web/public/data/

- name: Extract version from __init__.py
id: version
run: |
VERSION=$(grep -oP '__version__ = "\K[^"]+' jiro-search/jiro/__init__.py || echo "0.2.15")
VERSION=$(grep -oP '__version__ = "\K[^"]+' jiro-search/jiro/__init__.py || echo "0.3.3")
echo "version=$VERSION" >> $GITHUB_OUTPUT

- name: Update jiro-web package.json version
Expand Down
70 changes: 69 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,82 @@ All notable changes to Jiro will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.4.0] - 2026-10-22

Query graph, evidence packets, and a durable runtime, plus the performance work
that makes them viable, plus the fixes from a full 8-phase sandbox stress test.

### Added
- **Query graph** (`POST /v1/graph/search`, `jiro graph plan|run`): a planner turns a query into a DAG of SEARCH / FETCH / MERGE / EXTRACT / VERIFY / COMPRESS / SYNTHESIZE nodes and the executor runs it. Dispatch is ready-driven — a node starts when its own parents finish, not when its topological level drains. Timeouts are derived from a rolling per-engine p50/p95 latency window rather than a constant, so `--deadline-ms 0` (the new default) means "derive it".
- **Evidence packets**: results are compressed into claims, each carrying the source spans that support it, so a caller gets citations rather than raw markdown.
- **Engine racing** (`search.race_engines`): a slow request can be duplicated on an alternate engine and the first success wins, with preference order deciding among successes so a faster substitute cannot silently replace the requested engine.
- **Hedging** (`hedge_after_ms`): a SEARCH node whose primary attempt is slow starts a second attempt and takes the first success.
- **MCP handoff protocol**: a task can be handed to another client as a structured envelope rather than a free-text handoff.
- Bounded retries (`scraping.retry_budget_seconds`) so a retry tail cannot extend a request past its caller's patience, and a pooled per-proxy HTTP client.
- Batched research-source writes via `ResearchRepository.add_sources`, replacing one awaited insert per result.
- `benchmarks/setup_artifact.py`, `benchmarks/quality_gate.py`, and the four claim artefacts under `docs/v0.4.0/benchmarks/`.
- `search_metadata.status` now reports fidelity, not just transport. A search that falls back to a substitute engine is `"partial"` instead of `"success"`, so a caller can tell an exact-engine result from a substituted one without inspecting `engine_substituted`. Cached and semantic-cache responses derive it the same way.
- CLI exit code `3` (substituted engine) alongside the existing `0` success / `1` failure / `2` usage error. `jiro search web` prints which engine was requested, which served, and why the requested one was skipped.
- `tests/test_cli_stress_regressions.py` covering the hangs, JSON validity, validation exits, and non-ASCII output.

### Performance

All four 0.4.0 claims are backed by committed artifacts under
`docs/v0.4.0/benchmarks/`. Reproduce with `python benchmarks/report.py`.

- **2x faster on multi-source research** — measured **81.6x** on workload
`research_5q_10src`, cold cache (p50 2.9s baseline vs 0.04s). The ratio varies
by run with live-search latency; it was as low as 2.0x across runs, so treat
81.6x as this machine's measurement, not a floor.
- **3x fewer tokens per verified citation** — measured **59.2x** (7,103 tokens
per citation raw markdown vs 120 in the evidence packet).
> **Caveat — quality gate pending.** The non-inferiority gate from
> `docs/v0.4.0/CLAIMS.md` §3 has not run: it requires 30 LLM-judge runs and 50
> blind human spot checks. This is a tokens-per-citation measurement, *not* a
> claim of equivalent answer quality. If the gate fails, the number is
> withdrawn.
- **Every claim cites a source** — 1.0 (20/20 non-gap claims carry a source).
- **15+ agents, one command** — 15/15 tier-A MCP clients configured and
verified, each driven through `mcp_setup.setup_client` in a temporary HOME
with its config read back.

### Changed
- **Exit code `3` is a new, breaking signal**: scripts that treat any non-zero exit as failure will now see substituted searches as failures. That is the intent — the alternative was a silent wrong-index result.
- `POST /search/batch` returns HTTP 502 with `error_code: "batch_failed"` when *every* item fails, instead of HTTP 200 with per-item errors. Partial success still returns 200.
- Pagination fetches its pages concurrently and merges them in page order.

### Fixed
- Scraping retries referenced `_time`, which was never imported, so every search through the HTTP client raised `NameError` and `/search` returned HTTP 500.
- Pagination returned fewer results than requested. `page_size = max(have, 10)` skipped a page whenever the first page came back short, so `num=9` returned 6.
- `jiro keys list` and `jiro usage` no longer hang forever. `_admin_key_required()` prompted on stdin, and the `stdin.isatty()` guard is unreliable on Windows (it reports a tty even with stdin redirected). Both now exit `2` with an actionable message.
- Non-ASCII queries no longer crash with `UnicodeEncodeError`. `stdout`/`stderr` are reconfigured to UTF-8 at startup, and Rich is constructed with `legacy_windows=False` so it stops writing through the ANSI code page (cp1252). Affected CJK, Cyrillic, Arabic, and emoji.
- `jiro doctor` no longer reports "No internet connectivity" on a working connection. The check probed only `8.8.8.8:80`; networks that block that one endpoint but nothing else failed the check. It now probes several endpoints and downgrades to a warning, naming what failed.
- `jiro doctor`'s encoding check tests what `stdout` can actually encode rather than trusting `PYTHONIOENCODING`, which said "OK" while the console crashed on non-ASCII.
- `--json` output is valid JSON again. It was printed through Rich, which word-wraps long lines and inserted real newlines inside string values, so `json.loads` failed on any long result. Payloads now go straight to `stdout`, and warnings go to `stderr` so stdout stays parseable.
- `--engine <unknown>` exits `2` with the list of valid engines instead of returning an empty result set and exiting `0`.
- `jiro scrape ""` exits `2` instead of silently searching for the empty string.
- Scrape requests pass an explicit per-request timeout. On the `curl_cffi` path the timeout came only from the session, so an origin that never responded hung the caller indefinitely (observed: `httpbin.org/delay/15` past 30s).
- Engines named in config that have no registered parser are dropped with a warning. A stale name such as `mock` was previously advertised as available at startup and then failed every request with a 422. Also removed the `mock` special-case from the MCP engine allowlist, which disagreed with the registry.
- The `StarletteDeprecationWarning` about `httpx` no longer pollutes stderr on every command that spins up the in-process app.

## [0.3.3] - 2026-10-02

### Added
- **Real result pagination**: `SearchOrchestrator._paginate()` walks successive SERP pages on the same engine, so `num` above a single page (~10 rows) now returns the requested count instead of silently serving 3 results. Bounded by `search.pagination.max_pages` (default 5) and deduped by link.
- `BaseEngine.supports_pagination` flag, opt-in per engine. Enabled for Google (`start`), Bing (`first`), and Baidu (`pn`) — the engines whose upstream request actually accepts a page offset.
- **Live engine health probes**: `SearchOrchestrator.probe_engine()` issues a real search request per engine, so rate limits, bot walls, and parse regressions surface as failures instead of reporting every engine healthy because its module imported. `health_check(live=True)` is now the default; `live=False` keeps the cheap instantiation-only mode.
- Liveness and readiness probes (`GET /health/live`, `GET /health/ready`) for orchestrators and for the jiro-web status page.
- Expanded MCP tool surface (see `tests/test_mcp_tool_fixes.py`).
- Expanded MCP tool surface with structured input validation (see `tests/test_mcp_tool_fixes.py`).

### Changed
- **Honest engine attribution**: `search_metadata` now always carries `engine_requested` and `engine_substituted`, so a caller can never mistake a fallback engine for the one it asked for. Applied to fresh results, exact cache hits, and semantic cache hits.
- Short pages are disclosed instead of hidden: `requested_num`, `truncated`, `pagination_supported`, and `pages_fetched` are reported when fewer results than requested are available.
- Unified `0.3.3` version across the CLI banner, dashboard, OpenAPI spec, npm package, and the Python/JavaScript/Go SDKs.

### Fixed
- Server startup fails fast with an actionable error when `auth.jwt_secret` is empty but auth is enabled (set `JIRO_AUTH__JWT_SECRET` to 32+ random bytes, or `JIRO_JWT_SECRET` via config interpolation).
- `jiro ai` no longer passes the removed `timeout` kwarg to Starlette's `TestClient`; per-request timeout now uses `backend_options={"timeout": ...}`.
- `_heal_file_lock()` no longer shadows the module-level `os` import.

## [0.3.1] - 2026-09-26

Expand Down
Loading
Loading