The SEBD Grand Tour πŸΎ

The SEBD grand tour, 1993–2026 β€” with provenance and a certificate.
From Bertram LudΓ€scher & two AI toolchains, the morning of the SEBD'26 closing talk.

AI prose Thirty-four editions ago, SEBD β€” founded by Domenico SaccΓ  β€” began in Gizzeria Lido; this year it reached Senigallia, where the closing talk was about trustworthy AI results: answers that arrive with evidence, not just confidence. The morning of the talk, as a small self-referential demo, we asked: what is the shortest grand tour visiting every SEBD edition, from the first to the thirty-fourth? This page is the keepsake version of that demo β€” and, in the spirit of the talk, it does not ask you to believe it. Every number below carries the means to check it. Let it make you smile β€” and let you verify.

primary source The 34 editions and their host cities come from the DBLP index of SEBD proceedings (2026 Senigallia supplied by hand β€” DBLP doesn't have the future yet). Their coordinates come from OpenStreetMap/Nominatim, checked place by place on 2026-08-01 β€” see the coordinate audit for why that sentence used to read differently, and what it cost.

The page has two parts. Part I is the provenance: how the answer came about, from DBLP through two AI toolchains to a post-talk audit that found four wrong coordinates. Part II is the evidence: a tree of what the final claim actually rests on, and how to check each piece yourself. The two are related but not the same, and the difference is the point of the page.

The question (Q)

Visit all 34 SEBD editions exactly once, starting at edition 1 (Gizzeria Lido, 1993) and ending at edition 34 (Senigallia, 2026), minimizing total distance. Cities that hosted twice β€” Rimini, Venice, Villasimius β€” count once per edition, which is why everything downstream is keyed by edition number, not city name. modeling choice

Map of Italy with the optimized SEBD tour drawn over all 34 edition locations
The optimized grand tour. AI-generated, verified β€” rendered from the certified route file route_optimized.pl, not a fresh solve.

The answer (A)

AI-generated, verified The optimal tour is 3,527 km β€” versus 15,209 km in chronological order (76.8% shorter; time travel is inefficient travel). The visiting order, by edition number:

1 29 21 25 24 15 26 19 11 16 12 32 28 33 22 3 23 8
27 10 4 30 17 7 13 5 31 9 20 2 18 6 14 34

modeling choice Honesty about the metric: distances are straight lines on an equirectangular km-plane (reference parallel 42Β°N, R = 6371 km), rounded to whole kilometres β€” not roads, not rail, and pointedly not ferries, though the Sicily and Sardinia editions cross open water. Because that projection is a genuine plane embedding, the underlying real-valued metric satisfies the triangle inequality exactly. The rounded matrix we actually ship inherits it only to within the rounding: 22 of the 35,904 ordered triples violate it, every one of them by a single kilometre. Nothing downstream cares β€” the certificate below is a claim about the shipped integer matrix, whatever its geometry β€” but a page about checkable claims should not round a number and keep the adjective. Should you actually take the trip, budget extra for the sea legs.

Part I How it came about β€” provenance

Who computed what, from which sources, and what went wrong along the way.

Two toolchains, three numbers

On the morning of the talk, "the" tour length was reported three ways:

Who said itLengthStatus
Bertram, on stageβ‰ˆ 3,000 kmA round number for the audience. unverified
GPT toolchain3,546.9 kmDeterministic heuristic (seed 20260618); its own bundle says: not an optimality certificate. verified
Claude toolchain3,541 km
(3,527 km after the coordinate audit)
Proven optimal by branch-and-cut (lower bound = upper bound), for the coordinates it had. verified

The two AI toolchains found essentially the same tour β€” the orders differ only by swapping the twin editions held at identical coordinates (Venice 9↔20, Rimini 2↔18), which sit at distance zero from each other. Better still, and neither toolchain claimed it at the time: we later proved that GPT's tour is also optimal, for GPT's own coordinates under GPT's own formula. Both narrators were right about their own world. verified

So why two numbers? The honest decomposition is more interesting than the one this page carried until 2026-08-01, which blamed "pure arithmetic" β€” floating point versus integer rounding, and earth radius 6371.0088 versus 6371. Measured on the identical visiting order, that story was simply false: the radius accounts for 5 metres. Here is the real ledger:

Source of differenceContribution
Projection: GPT scales longitude by the cosine of each pair's mean latitude; we use one fixed reference parallel (42Β°N)+20.51 km
Our rounding of each leg to whole kilometresβˆ’2.01 km
Coordinates the two bundles still disagree on+1.44 km
Earth radius 6371.0088 vs 6371 km+0.005 km
total+19.9 km (3,546.9 βˆ’ 3,527)

Almost all of it is one documented modeling choice, which is the outcome you want. But note what the old page reported: a gap of only 5.9 km (3,546.9 βˆ’ 3,541), and it was smaller for a bad reason. Our coordinates were then wrong in a way that made the tour 14 km longer (3,541 instead of 3,527 on the same visiting order), which happened to cancel most of the 20 km projection difference. The two narrators looked like they nearly agreed; in truth two errors were quietly offsetting. Correcting the data made the disagreement larger and, for the first time, fully explained. verified (the arithmetic; see the coordinate audit). Corrected 2026-10-16: until then this paragraph said the wrong coordinates made the tour β€œ12.3 km shorter” β€” the wrong direction, caught by the second review.

What turned "almost" into "provably" was neither narrator β€” it was the certificate (Part II): an exact solver whose lower bound climbs 2881 β†’ 3273 β†’ 3439 β†’ 3475 β†’ 3477 β†’ 3527, meeting a feasible tour exactly there. Lower = upper = optimum.

The model didn't make this trustworthy. The workflow did β€” and the workflow only caught the data error because a second, disagreeing witness was kept in the room.

The lineage graph β€” where every artifact came from

Lineage graph of every artifact in the experiment, from DBLP and coordinate estimates through distances and routes to maps and certificates
The lineage graph β€” every node is clickable and opens the actual artifact it names (code, data, or the derivation log). Everything on this page derives from dblp:conf/sebd/index + coordinate estimates, through distances and routes, to certificates and maps. Machine-queryable versions: provenance.pl (Prolog) and provenance.json (JSON). Diagram source: the .gv file.

And how do you know this graph reflects what actually happened? Mostly, you don't β€” and it would be against the spirit of this page to pretend otherwise. The graph is self-reported: drawn by the same agent that did the work, from its own derivation log (meta-provenance.org). It is a record, not a tamper-evident trace β€” nothing cryptographic binds the arrows to the events. Three things still separate it from a just-so story: every node names an artifact that exists and is consistent with its claimed inputs (click and compare); an independent toolchain reached the same visiting order from the same edition list (the GPT bundle, with its own provenance.json and file hashes) β€” though emphatically not from the same coordinates, which each toolchain estimated for itself and which disagreed on 17 of 34 rows, the disagreement that eventually exposed our data error; and the whole pipeline is re-runnable from DBLP forward, so the graph's claims are reproducible even if its history is unprovable. What would upgrade it: append-only signed logs. (Hashes over the Claude-side artifacts used to be listed here as missing; they now ship as SHA256SUMS.) honest limitation

primary source One trust moment deserves telling straight: the first attempt to gather the editions used an AI web-summarizer, which quietly dropped the older editions. It was distrusted and discarded; the list was re-derived from the raw DBLP HTML instead. The data on this page was never "just known" by an AI β€” it was fetched, checked (34 editions = 2026βˆ’1993+1), and its lineage recorded. The blow-by-blow derivation log is meta-provenance.org.

The coordinate audit β€” where this page was wrong

Until 2026-08-01 this page claimed its coordinates were "town centroids, accurate to a couple of km," and invited you to spot-check them against any map. Nobody had. When someone finally did β€” geocoding all 34 stops against OpenStreetMap/Nominatim β€” four were wrong, one of them badly:

EditionWasShould beError
15 Β· Torre Canne40.84, 17.7340.84, 17.4722.3 km
26 Β· Castellaneta Marina40.55, 16.9440.47, 16.948.9 km
1 Β· Gizzeria Lido38.97, 16.1738.93, 16.226.1 km
25 Β· Squillace Lido38.78, 16.5338.78, 16.573.6 km

The errors are not random, which is the interesting part. All four stops are coastal frazioni β€” a Lido, a Marina, a beach hamlet β€” and in every case the coordinate had drifted inland toward the parent comune that shares the name. That is exactly the failure mode you would predict of a language model recalling a place from its name rather than looking it up, and exactly what a gazetteer catches in one pass. The other 30 stops came back within 1.5 km. primary source

What it cost: the certified optimum was 3,541 km and is now 3,527 km; the chronological comparison moved 15,245 β†’ 15,209 km. What it did not cost: the visiting order is unchanged, and every structural claim on this page β€” the sandwich argument, the six cuts, the 16 co-optima β€” survived verbatim. A certificate proves the tour is shortest for the numbers it was given. It has nothing whatever to say about whether those numbers describe Italy. That is not a flaw in the method; it is the precise boundary of what the method claims, and this page spent two weeks demonstrating it by accident.

The GPT bundle, for its part, had Torre Canne and Squillace Lido right all along, and Castellaneta Marina wrong by 10.0 km and Gizzeria Lido by 3.5 km β€” so neither toolchain was trustworthy on coordinates, and neither was checkable without a third source. verified

Provenance tells you where a number came from, not whether it is true. The lineage graph is the history of this page, mistakes included. Part II sets that history aside and asks only what the final claim rests on β€” and what you would have to check in order to believe it.

Part II Why you can believe it β€” evidence

What the claim rests on, which parts are checked, and which you must simply trust.

The evidence (E) β€” what you actually have to believe

Part I traced how each artifact came about. The tree below asks a different question: which of those artifacts does the claim depend on? Read it bottom-up. The yellow leaves are what you must take on trust; above them sit data files you can open and checks you can re-run; the pink root is the claim. Nodes with a thick border are clickable and open the file they name.

evidence root Tour T : Gizzeria Lido (1993) β†’ … β†’ Senigallia (2026), all 34 editions | T | = 3,527 km, and no tour is shorter (lower bound = upper bound β‡’ optimal; 16 co-optimal tours reported, not certified) c_valid T is a valid tour Β (1 … 34, each edition once) of length 3,527 km c_valid->root c_lower Every tour is β‰₯ 3,527 km lower bound c_lower->root verify verify.pl Β (Prolog, 38 lines) recomputes the length from the visits and d(i,j); checks the permutation, endpoints, and legs verify->c_valid checkcert check_certificate.pl Β (Prolog, 232 lines) integer arithmetic, no solver; hardened 2026-10-16; PASS (0)–(6) in < 1 s checkcert->c_valid PASS (6) checkcert->c_lower PASS (0)–(5) indep independent_check.py Β (Python, 53 lines) second checker, other author (OpenAI Codex); lower bound only indep->c_lower re-check route route_optimized.pl the tour T, 33 legs route->verify route->checkcert cert certificate.pl Β (99 KB) 226-leaf branch-and-bound tree: node potentials + subtour cuts cert->checkcert cert->indep dist distance.pl 561 distances d(i,j), whole km dist->verify dist->checkcert dist->indep coords sebd(No, Year, City, Lat, Long) 34 facts (sebd.pl; same table in trip.py) project trip.py : project + round equirectangular at 42Β°N, R = 6371 km, Euclidean, rounded to km coords->project project->dist search trip.py : 2-opt / Or-opt search proposed T; not trusted search->route found mkcert make_certificate.py + HiGHS found the proof; not trusted mkcert->cert found exact exact_tsp.py + HiGHS first optimality proof (2026-06-18); also finds a co-optimal tour; superseded by the certificate exact->c_lower superseded gpt ChatGPT bundle independent run: same visiting order (own metric: 3,546.9 km) gpt->root corroborates airecall AI-recalled coordinates 2026-06-18; 4 of 34 wrong (up to 22 km) osm OpenStreetMap 34 coordinates (checked 2026-08-01) airecall->osm corrected by dblp DBLP SEBD index editions, years, cities dblp->coords osm->coords lat/long model Distance model straight lines, not roads or ferries; whole-km rounding model->project pyarith Python arithmetic floats in the projection; integers in the second checker pyarith->indep pyarith->project formulation Problem formulation Hamiltonian path, fixed start 1993, fixed end 2026 formulation->verify formulation->checkcert swipl SWI-Prolog integer arithmetic, list ops swipl->verify swipl->checkcert checkers Checker rules are correct Prolog 270 lines, same author as the generators; Python 53 lines, another AI agent checkers->verify checkers->checkcert checkers->indep
The evidence tree for the tour. Solid arrows mean supports; dashed arrows record how something was found, corroborated, or corrected. Diagram source: the .gv file.

The tree's central distinction is between found and trusted. The 2-opt search found the tour; HiGHS found the proofs, first the cutting-plane run and then the 226-leaf certificate. All of them appear only as grey, dashed helpers. Nothing above them depends on their being correct, because two short Prolog checkers re-verify what they produced, and since 2026-10-16 a second checker, written in Python by another AI agent, re-verifies the lower bound on its own. That is why the trust base is small: seven leaves, most of them about arithmetic and checker code.

Some things are deliberately not in the support structure. The ChatGPT bundle corroborates the result but supports nothing; remove it and the claim still stands. The AI-recalled coordinates appear only as what OpenStreetMap corrected: the one leaf that failed, and the reason for the coordinate audit. And most of Part I is absent altogether. The lineage graph records how things happened; the tree records what the claim depends on. The evidence would stand even if the history were misreported.

The sections below take the tree apart: the two green claims (the sandwich), the blue checks (the trust table), the certificate branch (a proof with no solver in it), and the yellow leaves (known gaps).

Why believe "optimal" without trying every tour?

A fair objection: nobody enumerated the alternatives. With endpoints fixed, the 32 intermediate editions can be ordered in 32! β‰ˆ 2.6 Γ— 1035 ways. At a billion tours checked per second, exhaustive search would take about 8 Γ— 1018 years β€” some 600 million times the age of the universe. Exhaustion is not merely slow; it is not a thing that happens. verified (arithmetic you can redo on a napkin)

The proof works differently β€” it is a sandwich, not a search. Two independent facts are produced:

The lower bound comes from relaxation: drop the requirement "the edges form one connected tour" and demand only "every stop touches exactly 2 edges." (A path has two endpoints of degree 1, so exact_tsp.py first closes ours into a cycle with a zero-cost dummy stop joined to editions 1 and 34 β€” degree 2 then forces both free edges in, and the cheapest cycle is exactly the cheapest path.) Every real tour satisfies these weaker constraints, so the minimum over this larger set can only be ≀ the best tour β€” a valid bound. The first relaxation yields 2,881 km, but its "solution" is six disconnected mini-loops. So a subtour-elimination cut is added β€” a linear inequality saying "at least 2 edges must cross this mini-loop's boundary," which is self-evidently true of every genuine tour, so the bound stays valid β€” and the relaxation is re-solved. Six iterations (2881 β†’ 3273 β†’ 3439 β†’ 3475 β†’ 3477 β†’ 3527) replace 1035 evaluations; at 3,527 the relaxation's own solution is a single tour, so lower = upper = optimum. This is the Dantzig–Fulkerson–Johnson method (1954), the engine inside the record-holding Concorde TSP solver. verified

And a footnote the proof itself supplies: the optimal value is unique, the optimal tour is not. Rimini (editions 2, 18), Venice (9, 20), and Villasimius (28, 32) each repeat at identical coordinates, so swapping any twin pair changes nothing β€” 2Β³ = 8 relabellings of any optimal tour. This page used to stop there and admit it had not checked for others. It has now been enumerated, which took about a minute: re-solve with a no-good cut forbidding each optimum already found, until the solver's best answer exceeds 3,527. It does so at 3,529, and the complete list is 16 optimal tours β€” two genuinely different routes, each in 8 twin-relabellings. Note the status of that count: it was reported by the enumeration run on 2026-08-01, but the enumeration script is not in the published bundle and nothing here certifies the count; the certificate proves the optimal value, not the number of tours that attain it. The second route differs only at the very end, arriving Rimini β†’ Portonovo β†’ Ancona β†’ Senigallia instead of Rimini β†’ Ancona β†’ Portonovo β†’ Senigallia; Ancona and Portonovo are 9 km apart and the detour cancels exactly. verified

Which is why, if you run exact_tsp.py yourself, its last line prints a visiting order that is not the one published above. Both are in the 16. The solver reports whichever optimum it reaches first; the route file records the one the heuristic found. Nothing is wrong β€” but it is exactly the kind of discrepancy that should be stated in advance rather than discovered by a suspicious reader.

"But how do I trust the code?"

The right question β€” and the answer is that the workflow is arranged so you have to trust remarkably little of it β€” the blue nodes of the tree. Sorted from easiest to hardest:

To believe…You need to trust…How to shrink that trust
the tour is valid and 3,527 kmverify.pl β€” 38 lines of PrologRead it (it walks the visiting order, sums distance/3 facts, and checks the permutation and the stored legs), or ignore it and sum the 33 legs yourself from distance.pl, one fact per line. (Not from the GPT bundle's 561-row CSV: that is the other toolchain's distance table, and the same tour sums to 3,546.9 km there.)
the distance table itselfthe equirectangular formula + coordinatesRecompute any entry from the published lat/longs with any tool; spot-check coordinates against any map β€” which is precisely the check that caught four wrong ones. See the coordinate audit.
the tour is optimalNOT the search in exact_tsp.py β€” but you do need (a) the ~25 lines that build the model (edge list, cost vector, degree matrix, dummy node), (b) that each subtour cut is a valid inequality, and (c) that HiGHS correctly solves each of the six integer programs(a) and (b) are checkable by eye, and (a) is the part this page previously β€” and wrongly β€” claimed you could skip. (c) was the genuine residual until 2026-08-04, when it was removed: the lower bound now ships as a solver-free certificate that Prolog checks in under a second, using integer arithmetic and nothing else (161 lines then; 232 since the checker was hardened on 2026-10-16).

That is the asymmetry the talk turns on: the solver may be a thousand lines of heuristics and floating point β€” irrelevant, because what it emits is a witness whose checking burden is tiny. How the tour was found (2-opt? simulated annealing? divine inspiration?) never enters the argument. Trust the certificate, not the solver.

A proof with no solver in it

"Trust the certificate, not the solver" was, until 2026-08-04, an aspiration on this page: the tour was checkable by hand, but optimality still went through HiGHS. That residual is now closed. In evidence/certificate/ there is a proof object that needs no solver, no linear algebra, no floating point β€” only integer arithmetic:

cd evidence/certificate
swipl -q -g run -t halt check_certificate.pl

Actual output on 2026-08-04 (macOS, SWI-Prolog 9.0.4, 0.6 s):

PASS (1) 563 edges = 561 published distances + 2 dummy edges
PASS (2) node 35 joins only stops 1 and 34, at zero cost
PASS (3) all 34 cuts are proper subsets (2 =< |S| =< 33)
PASS (4) the 226 leaves form a complete binary tree -- exhaustive
PASS (5) all 226 leaves bound every tour above 3526 km, so >= 3527 km
PASS (6) the published route is a valid 1..34 tour of 3527 km

VERIFIED: no tour of the 34 SEBD editions is shorter than 3527 km,
and a tour of exactly 3527 km exists.  3527 km is optimal.

The whole thing rests on one inequality. Give every stop a number yv (any numbers) and every subtour cut a weight zS β‰₯ 0 (any weights), and give each edge a reduced cost

d_e  =  c_e - y_u - y_v - (sum of z_S over the cuts that edge e crosses)

Then every tour costs at least

2*(sum of all y_v)  +  2*(sum of all z_S)  +  (sum of min(0, d_e) over all edges)

Why: every stop has exactly two tour edges, every tour crosses every cut at least twice, and a 0/1 variable can only hurt you where de is negative. Three lines of algebra β€” and, crucially, no assumption about where the numbers came from. A certificate that would break if its numbers came from a liar is not a certificate. verified (the inequality) β€” but see a second opinion: the checker did not enforce the inequality's preconditions until 2026-10-16.

One such inequality is not enough, and the shortfall is worth knowing: the best bound any single page of potentials can give β€” 35 numbers and 7 cuts, the full Held–Karp relaxation β€” is 3,447 km, some 80 km short. So the proof becomes a case analysis: a binary tree splitting on "this edge is used / is not used," where each branch is closed by its own inequality. Ours has 226 leaves, maximum depth 16, a pool of 34 cuts, about 16,000 integers, 99 KB. verified

That size is the finding, and it sharpens the talk's thesis rather than softening it: a napkin proves the tour exists; a small book proves that nothing beats it; and checking the small book still takes 0.6 seconds against 8 Γ— 1018 years of exhaustive search. Note what check (4) does β€” it verifies the case analysis has no hole. A missing leaf is not an error in a proof; it is an unexamined case, which is exactly the failure a plausible-looking certificate would hide.

And to answer the obvious suspicion β€” does the checker actually bite, or does it pass everything? Six tampered copies were run against it:

TamperingResponse
delete one leafFAIL (4) the case analysis has a hole
zero out one leaf's potentialsFAIL (5) a leaf does not close
make a cut multiplier negativeFAIL (5) a leaf does not close
claim 3,528 km insteadFAIL (5) a leaf does not close
falsify one edge cost (645 β†’ 545 km)FAIL (1) an edge disagrees with distance.pl
enlarge a cut to the whole node setFAIL (3) a cut set is not a proper subset

One tampering is accepted, and should be: nudge a potential by a few units and you still have a valid proof, just a different one. A checker that rejected that would be policing provenance, not validity. verified (all seven runs; see README.org)

What is still trusted, stated plainly: SWI-Prolog's integer arithmetic; the checker itself (short enough to read, but written by the same agent that wrote the generator β€” and, as the next section shows, short enough to read is not the same as correct); and, as ever, the 561 distances, which are a claim about a model, not about Italy.

A second opinion β€” the checker had a hole

On 2026-10-16 another AI agent, OpenAI Codex, reviewed the abstract and this page without being told what we already knew. It read the checker, found what it does not check, and built a forgery that exploits it: give every leaf of the certificate a 36th β€œpotential” for a node that does not exist, and claim the chronological route of 15,209 km. The bound counts the extra number; no edge ever subtracts it. The 2026-08-04 checker printed: verified (reproduced here)

VERIFIED: no tour of the 34 SEBD editions is shorter than 15209 km,
and a tour of exactly 15209 km exists.  15209 km is optimal.

The inequality was never wrong; the checker failed to enforce its preconditions (exactly 35 potentials, a model fixed in advance) and loaded the certificate as program code rather than data. verify.pl had a smaller gap of the same kind: it summed the stored legs without checking that they follow the visiting order. Six well-chosen tamperings, all rejected, had not been enough to show that the checker bites β€” a familiar lesson about tests written by the author of the code.

What survived, and why we know: the 3,527 km result stands. The unchanged certificate passes the hardened checker, and also a second checker Codex wrote for the review β€” Python, standard library, integer arithmetic, a different author in a different language, now shipped as independent_check.py. That is exactly the step the gaps ledger had listed as β€œthe next honest step” since August. verified

What changed (2026-10-16): the checker now reads the certificate as data, fixes the model's size itself, and runs a new check (0) on the shape of every fact before anything else; verify.pl computes the length from the visiting order and checks each stored leg against it. The forgery and four related ones are now regression tests that must fail (tests/run_tests.py; run with --original to watch the August checker accept three of them). Every changed file, with hashes before and after, is logged in certificate/CORRECTIONS.org and Claude-artifacts/CORRECTIONS.org; the originals are kept beside them.

The same review also caught four errors in this page's prose: a table that gave the post-audit length as if it had been reported on the morning of the talk, a sentence that had the direction of the coordinate error backwards, a spreadsheet cross-check pointing at the other toolchain's distance table, and an overstated rounding bound. All four are corrected above and marked where they were. And it qualified one claim rather than correcting it: the count of 16 co-optimal tours is reported, not certified.

So the second opinion did what the page says second witnesses are for. The first time (the coordinates, 2026-08-01) a disagreeing source caught bad data; this time a disagreeing reader caught a bad checker. In both cases the certified claim survived, and in both cases only because someone other than its author looked.

How to distrust this page

Please do. Both artifact bundles are included under evidence/, byte-for-byte as hashed in August, with documented exceptions: the map script and its renderings (2026-10-12), and the two checkers after the second review (2026-10-16). Each bundle's CORRECTIONS.org (Claude-artifacts, certificate) says which files, why, and with which hashes before and after; the originals are kept beside them. Re-run the checkers; don't take our word:

# 1. Check the tour certificate (SWI-Prolog) β€” recomputes the length
#    from the distance table and validates the permutation:
cd evidence/Claude-artifacts
swipl -q -g run -t halt verify.pl

Actual output on 2026-08-01 (macOS, SWI-Prolog):

PASS: valid 1..34 permutation; recomputed = published = 3527 km
# 2. Prove optimality yourself (Python + scipy/HiGHS, <1 s):
python3 exact_tsp.py

Actual output on 2026-08-01 (tail):

  iter  6: cost   3527.0  subtours 1

=== EXACT RESULT ===
proven optimum (lower = upper bound): 3527 km
recovered optimal path length check : 3527 km   (start 1, end 34)
heuristic tour (route_optimized.pl) : 3527 km
==> heuristic is OPTIMAL: True
optimal order: 1 29 21 25 24 15 26 19 11 16 12 28 32 33 22 3 23 8 27
10 4 30 17 7 13 5 31 9 20 2 18 14 6 34

That last line is one of the other 15 optimal tours, not the one published above β€” see the co-optimality footnote. Both are 3,527 km.

# 3. Check optimality WITHOUT trusting any solver (SWI-Prolog, 0.6 s):
cd ../certificate
swipl -q -g run -t halt check_certificate.pl

Actual output on 2026-08-04 β€” six checks, quoted in full above, ending:

VERIFIED: no tour of the 34 SEBD editions is shorter than 3527 km,
and a tour of exactly 3527 km exists.  3527 km is optimal.

Since 2026-10-16 the hardened checker prints one more line first, and its timing on that day was 0.36 s:

PASS (0) well-formed: 35 nodes, 563 edges, 34 cuts, 226 leaves, 35 potentials each

This is the one to run if you believe only arithmetic. Try breaking it, too β€” and then run the breaking we already tried:

# 3b. Tampering tests, and a second checker by another author (Python 3, no packages):
python3 tests/run_tests.py
python3 independent_check.py

Actual output on 2026-10-16: 13 of 13 tests behave as expected. (eleven forgeries rejected, the original files and one harmless nudge accepted), then:

Independent Python check: 563 edges, 34 proper cuts, 226 leaves, 35 potentials per leaf; complete tree; all exact integer bounds > 3526.
Minimum scaled bound: 3526500 scale: 1000 maximum tree depth: 16
# 4. Reproduce the independent GPT bundle (fixed seed 20260618),
#    and check its file hashes:
cd ../GPT-artifacts
shasum -a 256 -c SHA256SUMS
./run.sh

Actual output on 2026-08-01: all 11 files OK, then:

Chronological total: 15263.9 km
Optimized total:     3546.9 km

β€” and the freshly reproduced route tables matched the shipped ones exactly. (The GPT bundle is untouched by the coordinate correction: it was always keyed to its own coordinate estimates, and its numbers stand exactly as first published.)

# 4. Check the Claude bundle's own hashes (added 2026-08-01):
cd ../Claude-artifacts
shasum -a 256 -c SHA256SUMS

Actual output on 2026-08-01: all 23 files OK. On 2026-10-12 the map script and its two renderings were corrected and their three entries re-stamped (see CORRECTIONS.org); re-run that day, all 23 files OK again. Note what that does and does not show. A hash list proves the files match the list, not that the list is original: whoever edits a file can re-stamp its hash. So the original three files and the original SHA256SUMS are kept in original-2026-08-01/, where they still check.

Still suspicious? Good β€” that's the right instinct. The distance tables are plain text (561 Prolog facts for the certified tour; 561 CSV rows for the GPT toolchain's own, different distances); sum any tour by hand. If this page and its evidence ever disagree, believe the evidence.

Known gaps β€” and whether they matter

A trust artifact should list what it doesn't establish. Most gaps are leaves of the evidence tree; the one that isn't is worth noticing. Our ledger:

GapIn the treeDoes it matter?
No machine-checked proof of the lower bound. The optimality certificate rests on HiGHS's arithmetic β€” no dual certificates extracted, no Lean/Coq check. Closed 2026-08-04: the lower bound is now a solver-free certificate β€” 226 leaves of node potentials, checked by 161 lines of Prolog in integer arithmetic. HiGHS β€” now a grey helper It mattered: this was the one link where "trust the certificate" quietly included "trust a solver." Closing it cost 99 KB of proof for a 4-digit answer β€” which is the honest exchange rate, and worth knowing before you promise anyone a one-page proof.
The Claude bundle was edited after it was hashed. Three files (the map script and its two renderings) changed on 2026-10-12, and their hashes were re-stamped. β€” (packaging; the map supports nothing in the tree) Not for any number: the change is one title string, and every plotted point is identical. It matters on principle. A re-stamped hash is exactly what a quiet edit looks like, so the change is logged in CORRECTIONS.org with both hashes, and the originals are kept. Signed or externally timestamped hashes (a DOI-archived snapshot, say) would close this properly.
The checker was written by the same agent as the generator, and SWI-Prolog's integer arithmetic is the trusted base. Partly closed 2026-10-16: an independent review found that this checker accepted a forged certificate (a second opinion); it was hardened, and a second checker by another author now re-checks the lower bound. leaves: Prolog validator rules, SWI-Prolog Smaller than what it replaced β€” bignum addition and comparison, versus a MILP solver β€” but it is the residual that remains. A second checker, in another language, by another author, would close it; the certificate format is public and 161 lines is not a large ask. Since 2026-10-16: it bit. The second checker exists (Python, by OpenAI Codex), and the hole it exposed is now a regression test. Both checkers were still written by AI agents; one written by a person would be the next step.
The optimum is of the model, not of Italy. Distances are straight lines β€” ferries, roads, and the Apennines are ignored. leaf: Distance model Matters if you book tickets; not for the demonstration. The certificate proves "shortest given these 561 numbers." Change the numbers and the proof machinery re-runs unchanged β€” that portability is the point, and on 2026-08-01 we got to prove it the hard way. See the coordinate audit.
Coordinates are now gazetteer-checked, but only once, and only against one gazetteer. All 34 were geocoded against OpenStreetMap; four were corrected. The remaining 30 agree to within 1.5 km, but "OSM says so" is a second opinion, not ground truth, and no coordinate here has been checked against a national cadastral source. leaf: OpenStreetMap Probably small, but not bounded by the rounding. Moving one stop by 1 km can change its two legs by up to 2 km in total, several errors add up, and rounding 33 legs to whole kilometres can shift a total by up to 16.5 km in the worst case (the measured effect on this tour is about 2 km). The four errors the audit found moved the optimum by 14 km. This was the gap that actually bit, so it is the gap most worth watching. (Corrected 2026-10-16: this cell used to say a 1 km error moves the total β€œwell under the 2 km rounding”, which is not a bound.)
Provenance is self-reported (see Part I): no cryptographic or append-only trail binds the lineage graph to the actual session. not in the tree: history, not support Matters for the strong claim "this is what happened"; mitigated by artifact consistency, an independent second witness, and reproducibility.
The remaining leaves: DBLP's edition list, the problem formulation, Python's floating point. leaves: DBLP, Problem formulation, Python float arithmetic Small. The edition list is checked by count (34 = 2026βˆ’1993+1) and was reproduced by the independent GPT bundle; the fixed endpoints are stated in the question; floating point touches only the projection, where its error is many orders of magnitude below the whole-kilometre rounding.
The LP arithmetic is unaudited β€” the six solves are integer programs, so the trusted component is HiGHS's branch-and-bound, not just its simplex. Superseded 2026-08-04: HiGHS is no longer on the critical path. It still found the numbers; nothing now depends on it having found them correctly. HiGHS β€” now a grey helper The distinction is the whole thesis in one row: a solver that produces a checkable witness needs no audit, and one that produces only an answer needs a complete one.
Integrity hashes cover only the GPT bundle. Closed 2026-08-01: the Claude bundle now ships SHA256SUMS too (23 files). β€” (packaging) It was a three-second fix listed as a known gap for two weeks, which is its own small lesson about ledgers.
The set of optimal tours is not enumerated. Closed 2026-08-01: the enumeration reported 16. Qualified 2026-10-16: reported, not certified β€” the enumeration script is not in the bundle. root note: β€œ16 reported, not certified” Didn't matter β€” the certified value is unique β€” but it was cheap to settle, and settling it turned up the discrepancy between the published route and the one exact_tsp.py prints.
The prose is unverified β€” dedication, jokes, this very sentence. β€” (not evidence) That's why the badges exist. Charm is not evidence; here they are kept visibly distinct.

Legend β€” what kind of claim is this?

primary source β€” fact from an external primary source (DBLP), checkable there.

modeling choice β€” a documented approximation (centroid coordinates, straight-line metric); not wrong, but a choice you should know about.

AI-generated, verified β€” produced by an AI, then independently checked by a program whose output is quoted verbatim above.

AI prose, unverified β€” narrative flavor. Charming, we hope; evidence, it is not.

These badges label the epistemic status of a sentence. The colours in the evidence tree label something else: a node's role in the argument β€” assumption, data, check, claim, or helper.

Appendix: a side experiment from the ASP world

One cross-check deserves a footnote: a generic clingo (answer-set programming) encoding of the tour problem (tsp.lp) reached only 6,709 km after 90 seconds β€” corroborating, never competing. That feebleness is a known encoding issue, not an ASP one: Bertagnon & Gavanelli (Univ. Ferrara) give new TSP encodings in clingo[DL] β€” constraint ASP over difference logic β€” that are orders of magnitude faster, with a further geometric speedup for exactly our case, Euclidean instances with known coordinates (J. Logic and Computation 36(2), 2026, open access). primary source (the paper's claim).

In this page's spirit, we ran the experiment rather than just citing it (2026-07-18, same laptop; files in evidence/DL-experiment/) β€” and report an honest negative: our adaptation of the paper's SDLT and DLEB encodings (sdlt.lp, dleb.lp, transcribed from Listings 1+5+6 and 1+7+8) returned UNKNOWN in every 90-second run β€” unable even to confirm a tour of 3,541 km exists, where naive clingo at least reached 7,592 km. (Those two runs used the pre-correction distance table; the corrected instance re-runs naive clingo to 6,709 km, but clingo-dl is no longer installed on this machine, so the SDLT/DLEB runs have not been repeated and their numbers are quoted as of 2026-07-18. stale) This does not refute the paper; it measures the gap between citing a method and reproducing one. Known differences: our clingo-dl 1.5 build lacks the --minimize-variable option their tooling uses (we substituted an outer binary search on the bound); our instance is a path-TSP closed by a zero-cost dummy node; and we implemented none of their geometric (convex-hull) enhancements. Any of these may be decisive β€” finding out is a conversation to have with the authors, which seems fitting for a memento. AI-generated, verified (the runs happened as described) unverified (any explanation of why)

From the SEBD'26 closing talk, "Towards Explainable & Trustworthy AI: Database Provenance meets Computational Argumentation" (Bertram LudΓ€scher, UIUC). The tour is the talk's first trust regime β€” formal certificates β€” in miniature; the talk's second half pairs it with defeasible argumentation. The demo drinks its own champagne: the provenance system's provenance is itself on this page.

Provenance of this page β€” reported precisely, since it preaches precision: drafted by Claude Code under Opus 4.8 (claude-opus-4-8) on 2026-07-17 (the session had been asked to run Fable 5 but fell back for billing reasons β€” even bylines need provenance); revised β€” optimality argument, trust-boundary table, clickable lineage graph, gaps ledger β€” by Fable 5 (claude-fable-5) on 2026-07-18; audited and corrected by Opus 5 (claude-opus-5[1m]) on 2026-08-01, which re-derived every number on the page, geocoded all 34 stops against OpenStreetMap, found four bad coordinates and a false explanation of the GPT/Claude gap, enumerated the 16 co-optima, and rewrote the affected passages; extended on 2026-08-04 by the same model, which built the solver-free certificate and its Prolog checker after Bertram asked what, exactly, would convince a skeptic. Built from the artifact bundles in evidence/; reviewed by Bertram LudΓ€scher before publication. All verification outputs above were produced by actually running the commands on the dates given, not copied from documentation. This public edition (2026-10-12, Claude Code under Opus 5.5, claude-opus-5-5) drops a personal dedication, splits the page into provenance (Part I) and evidence (Part II), and adds the evidence tree. It also fixed one leftover of the audit: the map's title still said 3,541 km, hard-coded in make_map_italy.py although the plotted coordinates were already corrected. The map was re-rendered, its three SHA256SUMS entries were updated, and the change is logged in CORRECTIONS.org with the originals kept beside it; no other number changed. Two stale mentions of 3,541 km inside the bundle (tsp.lp, provenance.pl) were deliberately left untouched and are explained in the same file.

Revised 2026-10-16 (Claude Code, Opus 5.5) after an independent review of the page and of the SEBD abstract by OpenAI Codex, which was given the files and the goal but not our own list of known issues. Its findings were reproduced before anything was changed. The two checkers were hardened and the review's forgeries became regression tests; Codex's own lower-bound check was added as a second checker; four prose errors were corrected where they stood, each marked; the count of co-optimal tours was qualified; the evidence tree gained the second checker. Every changed evidence file is logged, with hashes before and after, and the originals are kept. Since the public edition, this page's own history is the commit log.

Six drafts in, the page has been wrong about a coordinate, wrong about why two toolchains disagreed, wrong about how many optimal tours it could vouch for, and wrong about its own checker β€” while the one thing it staked its argument on, the certificate, was right every time, and has now been put beyond the reach of both the solver that found it and the checker that first vouched for it. Make of that what you will; we think it is the whole point.