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
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.
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 it | Length | Status |
|---|---|---|
| Bertram, on stage | β 3,000 km | A round number for the audience. unverified |
| GPT toolchain | 3,546.9 km | Deterministic heuristic (seed 20260618); its own bundle says: not an optimality certificate. verified |
| Claude toolchain | 3,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 difference | Contribution |
|---|---|
| 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
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:
| Edition | Was | Should be | Error |
|---|---|---|---|
| 15 Β· Torre Canne | 40.84, 17.73 | 40.84, 17.47 | 22.3 km |
| 26 Β· Castellaneta Marina | 40.55, 16.94 | 40.47, 16.94 | 8.9 km |
| 1 Β· Gizzeria Lido | 38.97, 16.17 | 38.93, 16.22 | 6.1 km |
| 25 Β· Squillace Lido | 38.78, 16.53 | 38.78, 16.57 | 3.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.
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.
- assumption (leaf)
- artifact (data)
- trusted check / computation
- derived claim
- result (root)
- untrusted helper: found something a check re-verifies
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:
- An upper bound: a concrete valid tour of length 3,527 km exists
(check it: sum its legs β
verify.pldoes exactly this). - A lower bound: no tour β seen or unseen β can be shorter than 3,527 km.
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 km | verify.pl β 38 lines of Prolog | Read 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 itself | the equirectangular formula + coordinates | Recompute 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 optimal | NOT 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:
| Tampering | Response |
|---|---|
| delete one leaf | FAIL (4) the case analysis has a hole |
| zero out one leaf's potentials | FAIL (5) a leaf does not close |
| make a cut multiplier negative | FAIL (5) a leaf does not close |
| claim 3,528 km instead | FAIL (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 set | FAIL (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:
| Gap | In the tree | Does it matter? |
|---|---|---|
| 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. |
| 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. | |
| β (packaging) | It was a three-second fix listed as a known gap for two weeks, which is its own small lesson about ledgers. | |
| 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.