Post #5 · Evidence & capability

We let users define the workload

An independent study exposed what TGMS could answer, what it could not, and what to build next.

In one sentence: we asked people who had never seen our operator list to write the questions they actually wanted answered, and only 10 of 110 could be expressed at all — a number that is 83 today, and that taught us more by missing its own forecast than by hitting it.

Status: Current. TGMS 0.4.0 · study July 2026, pre-registered as D-026 · re-audits 2-4 August 2026 · ~8 min.

Why this matters

A benchmark written by the people who built the system will, without anyone intending it, tend to reflect the capabilities that system already has: you reach for examples you know are answerable, and the tasks that never occur to you are precisely the ones your design cannot express. The cheapest correction is to let somebody else write the questions, then publish the coverage number that comes back, whatever it is.

What we measured

Evidence box

What we found

All 110, disposed of completely — "10 expressible and 98 blocked" leaves two unaccounted for, and a reader is right to notice:

Disposition (original study, July 2026)Questions
Expressible — a chain of verified operations10
Blocked — needs a capability we had not built98
Ambiguous as written — conflates the two clocks, so it has no single answer1
Not a computation over the log — presupposes a correction the data never contained1

Nine percent, and every one of the ten was a multi-step chain rather than a single operation — the honest starting coverage of a thirteen-operation algebra against questions nobody steered.

Which capabilities were missing

Tagging each blocked question produces two very different counts, and running them together is the easiest mistake here. A capability can be one of several blockers, or the only thing in the way — and only the second tells you what shipping it would buy.

questions blocked, of 98 · light bar = blocked by this somewhere · solid = sole blocker grouped aggregation arithmetic (ratios, %) property filters calendar semantics global scan-select set operations absence / negation 76 30 272 202 182 106 71 30 sole tags overlap — 55 of the 98 need two or more at once, so neither column sums to 98
Takeaway. Grouped aggregation is not merely the most common blocker but the one most often the sole blocker, which made it the right thing to build first. Global scan-select is the quiet second — few questions, but the only obstacle on 6. Boundary. The two bars measure different things and neither sums to 98, because 55 questions need two or more capabilities at once. These are hand-assigned tags from a single audit, not measurements — and what follows is the finding that they were systematically optimistic.

Three questions, in plain language

Expressible. "List the IDs of all accounts that sent a message to account n5 on June 15, 2004." — fetch that account's history, keep inbound messages, filter to one day. Three verified operations, and one of the 5 crisp enough to score verbatim.
Blocked, and instructive. "How many distinct pairs of accounts (A, B) exist where A rated B and B also rated A?" — tagged "needs grouped aggregation". Grouping shipped, and it is still blocked: after grouping by pair you must match the set of pairs against its own transpose, which is a join, not an aggregate.
Blocked on order. "What is the longest gap in days between two consecutive ratings by the same account?" — minimum and maximum give a group's endpoints, never its interior.

We built the top-ranked capability, and missed our own forecast

The histogram said grouped aggregation alone would unlock 30 questions — the whole argument for building it rather than something else. So the finished operator owed us a re-audit of all 110 against the new algebra, without touching the pre-registered table.

Predicted, July
30
questions the histogram said grouping would unlock on its own.
Measured, August
14
that actually became expressible — coverage 24 of 110, up from 10.

Fourteen moved but seventeen stayed blocked, which does not obviously add up to thirty, so here is the full accounting:

ReconciliationQuestions
Predicted: blocked by grouped aggregation alone30
… of those, became expressible13
… of those, still blocked by something the tag concealed17
Plus one question tagged for a different capability that the new operation happened to unlock1
Delivered14
Coverage: 10 originally expressible + 1424 of 110

With grouping in hand, what the seventeen had been waiting for became legible: 11 want a set or pair join, 10 want ordered sequences inside a group, and 4 want both — 11 + 10 − 4 = 17, with no third group. Three also touch rating properties or division, but sit inside those counts rather than beside them.

A capability tag assigned before the capability exists records the first blocker a reader hits — and the first blocker is the shallowest one.

None of this was concealed; it was folded into one tag by people who could see what was missing but not what sat underneath it. The histogram still ranked the work correctly — nothing else would have moved fourteen questions. But a number attached to a tag is an upper bound, not a forecast, and the fix is cheap: make every tag name the operation that would satisfy it, and the tags that cannot name one are the ones hiding a second capability.

That prediction has since been tested a second time, on the tag the histogram ranked next: arithmetic beyond counting — averages, medians, ratios, differences, percentages — was going to unlock 7 questions on its own. It unlocked 4, taking coverage to 28 of 110, and the shortfall has the same shape: of the questions that stayed blocked, most do not want a number computed from a result — they want a number computed per row of one, like the span between an account's first and last rating before those spans are averaged. Three more want a rank the operator cannot express, such as the top 1% of accounts. One tag, three capabilities, found the same way as the first: by building one of them and re-classifying everything it touched.

A third test has now run, on reading values out of the untyped property bag — the ratings themselves. It was going to unlock 13 questions; it unlocked 10, taking coverage to 38 of 110. Same shape a third time — what the tag was also carrying is the ability to hand a property's value back into a row, so that two rows can be compared with each other; an average reduces it and a filter tests it, but neither returns it. The forecasts are getting better as the tags get more specific, 47%, then 57%, then 77%, then 88% of what each predicted, and that is worth exactly as much as it sounds: the method of guessing from a tag has not improved, only the tags have. Whatever the next one predicts, discount it the same way.

What this result does not show

Coverage is not usefulness. Expressible means statable, not answered correctly; only 5 of the original ten could be scored verbatim, and how many a model gets right is a separate experiment.

It does not generalise past two datasets and one round. Both are public interaction logs. A different domain would produce a different histogram, and 110 questions from an unrecorded number of writers is a small, unstratified sample with no measure of annotation reliability.

The tags are judgments, not measurements — which is the finding rather than a caveat. The one tag we tested against reality overstated its delivery by more than two to one, and the roadmap inherits that uncertainty.

What this means in practice: the roadmap

CapabilityQuestions waiting on itDifficultyComposesStatus
Grouped / distinct aggregation30 predicted, Julymediumhighshipped — delivered 14
Set / pair join (reciprocity, transpose)11 of the 17 re-auditedhighhighshipped — delivered 14
Ordered sequences in a group (gaps, sliding windows)10 of the 17 re-auditedhighhighshipped — delivered 4
Global scan-select6 sole blocker, Julylowmediumshipped — delivered 4
Calendar semantics (weekday, hour-of-day)2 sole blocker, Julylowlowshipped — delivered 5
Arithmetic beyond count / sum / min / max2 sole blocker, Julylowmediumshipped — delivered 4, then 15 once it split
Property-filtered patterns2 sole blocker, Julymediummediumshipped — delivered 10

Two measurement bases share that column, and the labels say which. Rows one and four to seven are July sole-blocker counts from the pre-registered table; rows two and three come from the August re-audit of the seventeen that stayed blocked, and they overlap by the four questions that want both, so they do not sum. Difficulty and composability are engineering judgment, not measurement, and the sole-blocker counts are exactly the quantity this study showed to be an upper bound. Read the ordering, not the arithmetic.

Seven rows have now been tested against reality, and the upper-bound finding held every time. Predicted-versus-delivered runs 30/14, 7/4, 13/10, 16/14, 15/15, 8/4, 5/5 and 5/4. The one exact hit in the middle came from the session that re-audited no blocked question at all, and each of the three sessions after it found tags still on the board for capabilities that had already shipped — so a count agreeing is not evidence the tags did.

The last two rows are the first forecasts made per question rather than in aggregate, and they came in 8 of 8 and 7 of 7 — including cells where reading the question contradicted its own tag. That is the only method we have found that predicts which questions move, and it is laborious: it means reading every blocked question again, not the label attached to it.

The last row also retired a tag outright. "Global scan-select" turned out to name three unrelated things — reading the store's own revision log, comparing two columns of one row, and finding the longest chronological chain. Two of the three shipped together and delivered exactly two questions each, which is what a forecast looks like once the label has been replaced by the questions underneath it.

One item did not come from the histogram at all. Four questions anchor transaction time to event years — asking what the database believed in 2013, when its beliefs begin at ingest — and seven target months outside the log entirely. Those writers had read the two-clock explanation. Storing two clocks is not enough; the interface has to teach them, and expose its coverage window.

Takeaway

Letting users define the workload cost us a flattering number and bought a ranked, measured roadmap — plus the more durable lesson: a capability histogram built before those capabilities exist ranks the work correctly while overstating what each item delivers, because a reader can only report the first thing that stops them.

Evidence and reproduction

Raw questions and the hand-audited classification are in benchmarks/independent-v1/; the pre-registered table, the August diff and the invariants guarding it are in scripts/independent_questions.py, which also rebuilds the five scoreable questions into a suite whose gold answers are computed twice — once in SQL, once in plain Python — and asserted equal. That suite is generated rather than archived, and there is no separate protocol document: the script is the protocol.

Related work, covered elsewhere

An earlier version of this post also carried our equal-information SQL baseline — the same model given direct SQL access to the identical bi-temporal store. It answers a different question and diluted this one, so it now lives in the paper under same-information baselines. Two figures it used here are being re-derived from the run records first.

Continue reading

Before this: bigger models help only when the data interface can use them. After this: what it took to build the capability this study ranked first — nine wrong bottlenecks, and the misdiagnosis table we kept.