A coding suggestion I wanted to test was simple: when line-by-line review becomes a slog, generate an artifact that makes a change easier to understand and trust. One concrete version is to ask a separate agent to write a black-box validator before the implementation agent changes the code. The validator should define observable behavior without being steered by the eventual implementation.
I tried that on Fsdb, an F# database server targeting observable MySQL 8.4 behavior. Then I kept working for several more rounds before judging the experiment. This is a report on what happened, rather than a claim that one workflow won.
The two workflows
Fsdb already had a fairly demanding development loop. For a compatibility gap, we probe MySQL 8.4, turn the observed
behavior into a focused regression, implement the change, run the full suite and relevant differential lane, review the
diff, and update GAPS.md. For performance work, we also
measure the suspected bottleneck before accepting an optimization. The implementation and its focused test ordinarily
come from the same working loop.
The proposed variation kept those checks and added independent authorship before implementation. A separate agent would write a validator against the public behavior first. The implementation agent would have a proof to satisfy, not just its own newly written test. That distinction matters: “produce a useful proof artifact” was already normal for Fsdb; “have another agent define it before seeing the fix” was the experimental step.
The test task was a repeated embedded prepared lookup. The validator used the public Db API to check that a prepared
query handled changing parameter values, SQL NULL, missing rows, and the database selected when the statement was
prepared. It passed on the old code. The implementation then cached the function registry while its session inputs
stayed unchanged, and the same validator passed afterward. A separate regression covered changing database,
generated-ID, and time-zone values. Review caught a cache-lifetime risk and changed the stored functions to capture only
the values they needed; that catch came from implementation review, not uniquely from the independent validator.
The
same-host A/B record
used that validator's workload for five alternating 500-call trials. Reused PreparedCommand.QueryValues moved from
94.9 to 67.5 µs per call and from 321,621 to 131,993 allocated bytes per call. That is strong evidence for the
cache on that workload. It does not tell us whether independent authorship made the implementation faster or safer than
the ordinary process would have.
What the subsequent work added
I waited through real work rather than comparing two prompts in isolation. One later one-hour-plus window contributed 20 commits covering spatial reference systems, UTM transforms, geographic topology, and cleanup. Its MySQL oracle findings caught substantive mistakes: the NAD27 same-datum transform initially took an unnecessary round trip through WGS 84, and a shared-meridian polygon boundary was initially classified incorrectly. Focused regressions changed both implementations. The window ended with 3,377 passing tests and a 139-case, 18,222-step MySQL 8.4.11 contract run whose nine differences were the already documented identifier-case configuration signatures. No independent pre-change validator was authored in that window.
The next twelve commits, from 10:51 to 12:07 Oslo time on 11 October, extended materialized correlated equality and range lookups, proved a composite probe reduced residual work, and profiled the point-lookup path.
A project-backed stage profile corrected an interpretation error: the warmed text handler reuses a cached parsed statement, so a separate parser timing cannot be added to every handler call. A candidate shortcut for no-hint statements failed to improve measured latency and was removed. A same-fixture prepared profile then compared cached text and reused prepared handling. Runtime allocation tracing identified avoidable warning-suppressed coercion for exact integer index probes and full defaults-map reconstruction for single global-variable reads. The resulting integer-probe change saved about 3.4 KiB per call, and the global-variable change saved a further 10.4 KiB per call on that fixture. The separate short process runs did not establish a latency gain for either change.
That window used benchmarks, a trace, a focused consistency test, self-review, the full suite, and MySQL differential contracts. It ended at 3,385 passing tests. The pinned MySQL 8.4.11 run again covered 139 cases and 18,222 steps, with exactly the same nine case-and-step differences as the preceding run. The latest run's manifest path and method are recorded with the benchmark. The composite-probe test was a proof, but it was not written by a separate agent before the implementation.
I rechecked the conclusion against the next
nine commits, through the later status-counter pass.
The
SQL-mode reparse measurement
found about 1.1 KiB less allocation per prepared call, while its separate-process after run was slower; it cannot
establish a latency improvement. The
shared planner-set measurement
found about 5.1 KiB less allocation per call and likewise did not establish a latency gain. MySQL probes then guided
four regex-compatibility commits and two wire-byte status commits. A two-connection oracle check showed that
FLUSH STATUS also resets the other live connection's session byte counters, prompting a second implementation pass
and regression. The
oracle record
captures that correction. No second independent pre-change validator was authored. A subsequent
status-counter probe
also checked which values survive FLUSH STATUS, with the same 3,387 tests passing after the change. These nine
commits add evidence about the ordinary loop, not a second A/B trial.
Two more commits extended that ordinary loop. The aborted-client change used a live connection regression to distinguish an abnormal established-client disconnect from a failed handshake. A view-dependency profile then found an unnecessary view-catalog expansion on physical-table reads. Its final paired trials measured about 1.2 KiB less allocation per cached-text call and 1.8 KiB less per reused prepared call. The separate short process runs do not establish a latency gain. Neither task used an independent pre-change validator.
The next
sql_select_limit investigation
adds another useful distinction between a proof and a complete compatibility claim. Native MySQL probes established that
the variable caps top-level SELECT, UNION, and selected metadata SHOW results, while leaving nested and
mutation-source queries alone. A focused regression now covers those paths, prepared execution, FOUND_ROWS(),
assignment diagnostics, and column metadata when a SHOW result is empty. The oracle also exposed an EXPLAIN
difference. Follow-ups now reflect the implicit limit in top-level SELECT plans and plain-branch UNION plans,
including their JSON hierarchy and audited, explicitly limited derived SELECTs. Mergeable or lateral derived sources,
derived set operations, expression subqueries, MySQL cost details, and exact ANALYZE presentation remain open. The full
suite passed 3,389 tests after those changes. This is another example of the existing oracle-and-regression loop
revealing a boundary; it is not a new independent-validator trial.
A later same-host hot-path comparison checked whether that session-limit lookup taxed ordinary point reads. The first helper added about 152 bytes per cached text call and 120 bytes per reused prepared call against a pre-limit baseline. A simpler F# path reduced those measured differences to about 36 and 52 bytes per call, respectively, with all 3,389 tests passing. The process runs did not establish a latency change. This is another measured correction from the ordinary loop, not another independent-validator trial.
I checked the report again after the next regex-property change.
A native MySQL 8.4.11 probe distinguished accepted ASCII and Basic_Latin property spellings from a .NET spelling
that MySQL rejects. The
recorded cases
became a focused regression; the full suite reached 3,390 passing tests. This adds another concrete oracle-derived
compatibility correction, but no independent pre-change validator. A further native EXPLAIN probe found that MySQL puts
correlated scalar projection subqueries under select_list_subqueries and uncorrelated ones under
optimized_away_subqueries within the owning SELECT or UNION branch. A second native probe corrected the first
regression's placement of correlated subqueries: MySQL attaches select_list_subqueries to the query block, not the
table. The corrected implementation covers audited simple projection cases in both single SELECTs and UNION branches;
3,391 tests pass. Further clause probes placed audited dependent scalar WHERE subqueries under the scanned table,
HAVING and ORDER BY subqueries under their operation wrappers, and projected scalars under grouping, ordering, or
duplicate removal when those operations own the result. Another probe and regression now cover audited ordering around
grouping, including a case where the traditional Fsdb row omitted MySQL's scalar-order filesort. An audited DISTINCT
query ordered by its single projected scalar alias or ordinal now places the sort and temporary table under duplicate
removal, matching MySQL. Subsequent probes also placed independent order scalars under grouping or duplicate removal,
and kept dependent projection-plus-WHERE and projection-plus-HAVING scalars under their separate owners. Other
DISTINCT/ordering forms, multi-clause combinations, and mixed derived/scalar plans remain open. This is another
oracle-to-regression iteration, not a new independent-validator trial.
The next allocation investigation used a Release point-lookup runner and an EventPipe allocation sample to locate a
plausible source of fixed handler cost. Moving two synchronous execution-limit scopes to thread-local storage reduced
measured allocation by 4,734 bytes per warmed text call and 3,834 bytes per reused prepared call on that
fixture. The
trial data and caveats
show that short-run latency drift prevents a speed claim. A new concurrent-session regression checks that distinct
GROUP_CONCAT and CTE recursion limits stay isolated; the full suite passed 3,394 tests. This was another profile,
fix, and regression round in the ordinary workflow, with no independently authored pre-change validator.
Subsequent commits extended the EXPLAIN oracle work to audited mixed-clause plans, derived-source predicate subqueries,
and scalar subqueries inside materialized derived sources and UNION branches. The regressions were split by plan shape
so a failure identifies the broken relationship. These changes narrow the earlier mixed-plan caveat; they do not make
EXPLAIN generally complete. Two further
same-host allocation
measurements
found that synchronous handler scopes could avoid some AsyncLocal allocation while public scopes retained their
task-flow behavior. On the fixed point-lookup fixture, the variable/time-zone scope change saved 6,480 bytes per
warmed text call and 6,184 per reused prepared call; the later function-database scope change saved another
1,424 and 3,204 bytes per call, respectively, against its own immediate baseline. Concurrent-session and
delayed-task regressions cover the key isolation boundary. The full suite reached 3,402 passing tests. Short-run
latency drift does not justify a speed claim. These are separate measurements at successive revisions, not a controlled
A/B comparison of development workflows.
One further measured change skipped temporary session decoration when the stored-function catalog was empty. It saved about 1.2 KiB per warmed text call and 1.0 KiB per reused prepared call on the same fixture, while the 3,402-test suite still passed. Populated catalogs kept the existing behavior. This adds another ordinary-loop data point, not a workflow comparison.
I revisited the report after the next six commits, through the audited REGEXP diagnostics. Two successive allocation profiles measured another 964 and 1,253 bytes less allocation per reused prepared call, respectively, against their own immediate baselines. The stored-function change also measured 1,521 bytes less per warmed text call. The short latency trials still do not establish a speed gain, and these successive measurements should not be added into a single controlled result. MySQL probes also refined supplementary-character behavior in negated POSIX classes and Unicode properties, then pinned down several malformed-pattern error codes and positions. The full suite reached 3,406 passing tests; the 139-case, 18,237-step contract run retained the same nine documented identifier-case differences. These rounds strengthened the ordinary workflow's evidence, but added no independent pre-change validator.
I rechecked once more after six more commits.
MySQL-oracle probes refined possessive REGEXP quantifiers, letter escapes, and the Any Unicode property. The charset
work then moved from valid binary-literal decoding to invalid-byte behavior in CONVERT ... USING: UTF-8, UTF-16,
UTF-32, ASCII, UCS-2, and incomplete lead bytes in eight legacy multibyte families now have audited value-and-warning
cases. The
finding record
also keeps the single-byte codec boundary explicit. The newest focused regression failed before the fix, and all 16 new
MySQL comparison steps passed afterward. The full suite reached 3,414 passing tests; the 139-case, 18,294-step
contract run still had exactly the same nine identifier-case differences, with no new mismatch. This strengthens the
ordinary loop's compatibility evidence, but is still not a second independent-validator trial.
The next seven commits make the charset finding more
specific. A full high-byte sweep of the 25 supported single-byte charsets showed that MySQL preserves source bytes even
where decoding reports an invalid character; Fsdb now keeps those bytes and matches the audited warning sets. Follow-up
probes separated source decoding from target encoding, checked conversions of already encoded strings, and established
how CAST(... AS CHAR CHARACTER SET ...) retains its target charset and handles a character or byte width. The
CONVERT finding
and CAST finding
now record those boundaries. The full suite reached 3,423 passing tests; the 139-case, 18,347-step contract run
still had only the same nine documented identifier-case differences, and the five new binary-CAST steps passed. This
changes the breadth of the compatibility evidence, but the workflow comparison still has just one independently authored
pre-change validator.
One subsequent correction found another boundary: MySQL rejects
an unknown charset before evaluating CONVERT ... USING or CAST(... CHARACTER SET ...), including NULL input and an
unchosen IF branch. Fsdb's focused regression now covers that timing. All four new differential steps passed; the
139-case, 18,351-step run retained the same nine identifier-case differences, and the full suite reached 3,424
passing tests. This is another ordinary-loop correction, not a second trial of the independent-validator workflow.
I revisited the finding after five more commits.
MySQL probes established that typed CONVERT shares the audited CAST target behavior, explicit BINARY(n) casts use
byte widths, and national, legacy, and combined character modifiers have distinct warning and collation rules. The last
round overturned the CAST finding's remaining “outside this audit” note: MySQL accepts CHAR ASCII BINARY and
CHAR BINARY UNICODE, and the modifier order determines warning order. A failing focused regression preceded the fix;
the final
finding record now
states both accepted and rejected forms. The full suite passed 3,432 tests. All six new cast comparison steps passed
in the 139-case, 18,381-step MySQL 8.4.11 contract run, whose nine differences were the same documented
identifier-case signatures. This adds a concrete correction to the ordinary workflow sample, but no new independent
pre-change validator. It does not change the workflow verdict.
I rechecked that verdict after
five more CAST commits. MySQL 8.4.11 probes showed
that CAST and typed CONVERT accept a narrower target grammar than column declarations, retain CHARACTER(n) widths,
and validate precision, scale, packet-sized widths, and negative widths at different stages. The
CAST target finding
records the supported forms and diagnostic order; the
gap record keeps the remaining conversion boundary open.
Focused regressions and a 3,437-test suite passed. The latest 139-case, 18,432-step differential contract
retained the same nine identifier-case differences, while the six new negative-width steps passed. This changes the
detailed compatibility result, but it supplies no second independently authored pre-change validator and therefore does
not change the workflow comparison.
The next five CAST commits sharpened that finding again. The MySQL oracle distinguished negative target precision, unsigned character widths, DECIMAL range clamps and warnings, and DOUBLE versus FLOAT text overflow. In the last round, a focused regression first failed because Fsdb omitted a DOUBLE conversion warning; the implementation and new differential steps then matched MySQL. The revised CAST finding records these narrower outcomes and keeps other conversion contexts open. The full suite now passes 3,441 tests. The 139-case, 18,487-step contract has the same nine identifier-case differences and no new mismatch. This adds evidence that the ordinary oracle-and-regression loop keeps correcting its own findings. It still supplies no matched trial or second independent pre-change validator.
I checked the finding again after ten further CAST commits. The oracle exposed cases the earlier CAST summary had left open: finite text beyond .NET's decimal range, the high-exponent conversion boundary, non-ASCII digits in numeric prefixes, and different warning rules for introduced, computed, and stored binary values. A cleanup commit then classified binary sources by origin rather than by a list of function names. The last probe showed that text warning previews stop at NUL, while binary warnings escape that byte. The revised finding records the audited boundaries and still marks general wide DECIMAL values and other source expressions as open. The full suite passed 3,449 tests. The 139-case, 18,571-step MySQL 8.4.11 contract run had the same nine documented identifier-case differences and no new mismatch. These rounds strengthen the evidence for the existing oracle loop; they do not create another independent-validator trial.
I checked the result again after three more commits.
The MySQL oracle exposed a distinction between text and binary warning previews, then clarified how YEAR casts
normalize temporal and binary sources. Focused regressions and differential cases accompanied the fixes. The latest
completed full suite passed 3,456 tests; its 139-case, 18,663-step MySQL 8.4.11 contract run retained the same
nine identifier-case configuration differences and no new mismatch. A subsequent
TIME-cast fix began with a failing regression for invalid text,
partial text, and overflow. The completed 3,457-test suite passed, and all 14 new value-and-warning steps passed in
the 139-case, 18,677-step MySQL contract; the same nine configuration differences remained. A
follow-up matched five more leading- and trailing-space warning
cases, including warning order when both truncation and a superfluous delimiter apply. The 3,457-test suite passed
again, and all 24 audited TIME value-and-warning steps passed in the 139-case, 18,687-step contract run. The nine
configuration differences were unchanged. These checks sharpen the compatibility result. They still do not create a
second independent pre-change validator or change the workflow conclusion.
A further TIME delimiter round used MySQL probes to separate one- and two-space internal delimiters from three spaces before trailing junk, and to distinguish a clock-time prefix from a numeric prefix. After a small parser cleanup, 3,457 tests passed. All 38 audited TIME value-and-warning steps passed in the 139-case, 18,701-step MySQL contract; the same nine identifier-case differences remained. This is more evidence that the ordinary oracle loop can refine a finding. It still does not supply a matched workflow trial.
The next source-type correction began with a regression showing
that Fsdb returned zero for CAST(b'1' AS TIME) where MySQL returns NULL and warning 1292 for the underlying byte. Bit
and hex literals and stored BIT/VARBINARY columns now match the audited values and escaped-byte diagnostics. The
3,457-test suite passed; the 139-case, 18,715-step MySQL contract retained only the same nine identifier-case
differences. This adds a real ordinary-loop correction, but still no second independent-validator trial.
That probe also led to a finding correction: MySQL's NUL warning
preview depends on whether the source result is binary or text, not whether the expression is a literal or computed.
Binary CONCAT escapes control bytes; a text result stops its preview at NUL. A focused regression failed before the
fix. The TIME-cast logic was then moved into a named helper, 3,457 tests passed, and all eight new comparison steps
passed in the 139-case, 18,723-step MySQL contract. The same nine identifier-case differences remained. The
correction sharpens the compatibility finding, but does not change the workflow comparison.
The next CHAR byte-assembly fix replaced Unicode-character
construction with MySQL's binary bytes. A pre-change regression showed HEX(CHAR(128)) returning C280 instead of
80; it now also covers integer wrapping, rounding, NULL arguments, and downstream TIME warnings. The full suite passed
3,458 tests. Direct returned bytes and all new CHAR comparisons passed in the 139-case, 18,730-step MySQL
contract, which retained the same nine identifier-case differences. This strengthens the ordinary-loop sample, but still
provides no matched comparison of development workflows.
I rechecked that finding after the
following CHAR text-argument change. MySQL treats a string
argument as an integer prefix: CHAR('1.5') produces byte 01 and warning 1292, whereas numeric CHAR(1.5) rounds to
byte 02 without that warning. The regression checks ordered warnings, invalid and binary text, and signed or unsigned
overflow before 32-bit byte assembly. The full suite passed 3,459 tests. I inspected the latest 139-case,
18,734-step contract manifest from that round: all four new value-and-warning steps passed, and its nine nonpassing
steps are the same documented identifier-case signatures (eight result mismatches and one oracle-contract drift).
CHAR(... USING charset) and other source domains
remain open. The new evidence refines the compatibility finding, but it still comes from the ordinary
oracle-and-regression workflow.
I re-investigated the finding after
seven further CHAR commits. The earlier note that
CHAR(... USING charset) was open is now outdated: MySQL probes and regressions cover its audited byte decoding,
coercibility, and invalid-byte warnings. Other rounds pinned down binary warning previews, BIT and numeric overflow,
stored DOUBLE warnings, and JSON conversion values and diagnostics. The latest round found a real planner boundary: Fsdb
initially evaluated CHAR(payload) on all rows before applying a descending top-N order, so its warning rows disagreed
with MySQL. A failing regression led to deferred projections for a small set of pure expressions, followed by a separate
grouped-row warning fix. All six new ordering and grouping comparison steps pass. The full suite passes 3,465 tests;
the 139-case, 18,771-step MySQL 8.4.11 contract retains only the same nine documented identifier-case signatures.
The
revised CHAR finding
still marks other source forms and more complex plans as open. This changes the compatibility details and confirms the
ordinary workflow caught another error; it adds no second independent pre-change validator or matched workflow trial.
I re-investigated the CHAR finding after
eight further commits. MySQL probes exposed two
limits in the previous summary. JSON values coming through UNION and CTE sources had lost their JSON type in Fsdb, and
an expression view labeled the CHAR conversion warning with its exposed alias instead of the defining JSON function.
Both produced failing regressions before their fixes. The intervening rounds also checked more JSON-returning builtins,
JSON mutation sources, and computed numeric overflow. The
revised finding
now records direct, expression, and UNION view behavior while leaving deeper view nesting, user-defined JSON origins,
and more complex plans open. The full suite passed 3,472 tests. The latest 139-case, 18,819-step MySQL 8.4.11
contract passed all 11 new view steps and retained exactly the same nine documented identifier-case differences as the
preceding 18,808-step run. This changes the compatibility finding and demonstrates another correction by the ordinary
loop. It still adds no independently authored pre-change validator.
I checked the finding again after
seven further commits. The earlier open question
about deeper view nesting is narrower now: audited nested, star, mixed-projection, and joined views preserve the JSON
function's warning name. The latest MySQL probes exposed a more precise boundary. A mergeable derived query preserves
the underlying column or function name through an alias, while a materialized derived query, limited view, or
TEMPTABLE view uses its exposed alias. Fsdb initially treated those sources alike; focused regressions and native
comparison steps now cover the distinction. Joined warning row numbers remain an observed mismatch, and other view
shapes and complex plans remain unaudited. The full suite still passed 3,472 tests. The latest recorded 139-case,
18,864-step MySQL 8.4.11 contract has 18,855 passing steps and the same nine documented identifier-case
differences. It adds useful compatibility evidence, but no second independently authored validator or matched workflow
comparison.
I rechecked the result after the next thirteen commits. The keyless-insert load test found that eight Fsdb writers achieved only 1.35× the one-writer rate, while MySQL reached 2.54× on the same workload. Those rates compare an in-memory Fsdb with durable MySQL, so they are a scaling signal rather than a fair absolute-throughput contest. A proposed candidate fast path did not improve the eight-writer result and was removed. A narrower document-index shortcut reduced allocation on a direct storage fixture, but the wire benchmark did not establish a throughput gain. The measurements and retention checks make the performance finding useful without converting it into a workflow comparison.
The compatibility result changed more materially. A
fresh MySQL oracle check
found two costed, mixed-type join result mismatches that the older nine-difference summary did not include. The
physical access path can change which joined text value owns the numeric IN filter; the existing transfer covers
explicit join order or a MATCH owner, but not these costed plans. The gap remains open. Separate oracle-led regex
rounds added ASCII and Unicode hex-digit, join-control, bidi-control, regional-indicator, and emoji-modifier properties,
with failing regressions and matching differential steps. The
supplementary-property finding
also records a low-surrogate false match exposed by the new regression. These rounds refine regex coverage, but no
independent pre-change validator was authored. The contract at that point had 139 cases, 18,880 steps, and eleven
known differences: the earlier nine identifier-case signatures and these two costed-join mismatches. The full suite
passed 3,478 tests. This corrected the compatibility count at that point without changing the workflow conclusion.
The next join fix then closed both new result mismatches. Fsdb
now chooses the smaller unindexed source first for the audited two-table numeric-IN equality join when the other
source has a matching index. That choice also determines which text key receives the numeric filter; an index on the
other source leaves the original owner in place. The regression failed before the fix and now covers one and two label
rows plus the competing-index counterexample. The pinned
finding and contract record from that round
show 139 cases, 18,882 steps, and nine remaining differences, exactly the earlier identifier-case signatures. The
full suite still passed 3,478 tests. Other costed join shapes remain open. This is a meaningful compatibility
correction produced by the ordinary oracle-and-regression loop, but it is still not a matched workflow trial.
A
wider fresh-table matrix
then found a new boundary. With three names rows and three unindexed labels rows, MySQL returns both matching IDs;
Fsdb still returns one. Two-name/two-label and competing-index controls show why a blanket row-count rewrite would be
wrong. A follow-up closed two other singleton-source mismatches, while leaving this equal-cardinality case open. That
round's 139-case, 18,895-step MySQL contract had ten known differences: the original nine identifier-case
signatures and this one costed-join result mismatch. All 3,478 tests passed. This revision changes the compatibility
finding again, but it still gives no matched evidence that one development workflow is better overall.
A subsequent
native MySQL recheck
made that remaining mismatch more precise. On fresh three-by-three tables, ordinary SELECT repeatedly returns both
IDs, while EXPLAIN ANALYZE for the same SQL reports one actual hash-join row. Forcing the primary index also changes
the ordinary result to one ID. Disabling block nested-loop execution does not remove the two-ID result. The native
oracle script now checks these paths separately. The ten-difference count remains valid for the maintained ordinary
query contract; the plan instrumentation is evidence about an execution-path inconsistency, not a resolution of the
result mismatch. This strengthens the case for checking the public result directly, but still does not provide another
independent-validator trial.
The next connection check qualified that finding further. The connection that created and filled fresh tables kept returning two IDs; a second connection returned one, after which the first also returned one. MySQL showed the same TREE plan before and after. The maintained long-lived-connection contract still records ten differences, but an unconditional join rewrite to match its two-ID result would disagree with the other connection history. This changes the implementation decision, not the workflow verdict: the sample still lacks a second independently authored pre-change validator.
A later prepared-variable coverage pass added 46 table-backed, nested-query, and CTAS steps. All matched MySQL; the prepared CTAS retained a BIGINT column after a decimal reassignment. The full contract grew to 139 cases and 18,941 steps, with the same ten known differences, and 3,478 Fsdb tests passed. This narrowed an API compatibility gap without adding a second independent-validator trial.
A follow-up mutation contract added 21 prepared UPDATE, DELETE, and INSERT SELECT steps. Each matched MySQL on affected rows and stored values after decimal, text, and NULL assignments. The contract now has 140 cases, 18,962 steps, and the same ten differences; the Fsdb suite still passes 3,478 tests. This extends the audited behavior but does not change the workflow comparison.
A Greek-script regex fix then closed a real property-name mismatch. A regression failed with error 3685 before the change; separate MySQL and fsdb full-scalar scans agreed afterward on all 518 case-sensitive and 520 case-insensitive Greek members. The two new differential steps passed, bringing the contract to 140 cases and 18,964 steps with the same ten differences; 3,479 tests passed. These reusable oracle artifacts were created in the ordinary fix loop, not by a separate agent before implementation, so they strengthen the compatibility claim without supplying a second workflow trial.
A subsequent Greek Script_Extensions check found a related distinction: MySQL includes 13 shared marks and symbols beyond its case-sensitive Greek Script set. Independent full-scalar MySQL and fsdb scans now agree on all 531 case-sensitive and 532 case-insensitive extension members. A focused regression failed before the fix, and both new differential steps passed afterward. The contract reached 140 cases and 18,966 steps with the same ten differences, while 3,480 tests passed. This adds another reusable oracle proof to the ordinary fix loop; it still does not constitute a second pre-change validator trial.
I re-investigated that result after the next eight commits. The same MySQL-oracle method found that a Unicode block is not necessarily a script: Han, Latin, Cyrillic, Arabic, and Devanagari needed their own scalar membership and ScriptExtensions sets. Separate full-scalar scans of pinned MySQL 8.4.11 and Fsdb now agree on each audited set and its SHA-256 digest, including case-insensitive mode. The work also added the variation-selector property and refactored shared range construction and aliases. The latest finding records 3,486 passing tests and a 140-case, 18,978-step differential run with the same ten documented differences. Those numbers supersede the Greek-only snapshot above. The scans are strong evidence for the enumerated properties, but they were produced inside the ordinary fix loop; separate scan programs do not by themselves make an independently authored _pre-change validator. Other ICU properties and the costed-join mismatch remain open.
What this comparison can measure
The evidence supports narrow conclusions. The prepared-lookup validator existed before the cache, checked externally visible behavior, survived the code change, and doubled as a repeatable benchmark workload. The ordinary workflow also produced oracle cases, failing regressions, differential manifests, and measurements that caught errors and rejected an unhelpful shortcut. We can inspect those artifacts and reproduce specific claims.
We cannot infer a general productivity or correctness advantage from commit counts. The work items differed, the independent-validator condition had only one task, and the experiment did not assign comparable tasks to each workflow. Review minutes, agent cost, defects found only by the independent validator, and escaped defects were not collected consistently. A later green suite is evidence about the tested behavior, not proof that every untested behavior is correct.
A stronger comparison would predeclare which kinds of changes get an independent validator, then run several comparable tasks in each condition. It would record validator-writing time, implementation and review time, defects caught before merge, follow-up failures, and whether the resulting proof was reusable. Until then, the independent approach is best treated as a selective technique for a claim that is hard to assess from ordinary tests and a diff.
Results
The measured A/B trials compare Fsdb before and after the cache change; they do not compare development workflows. The subsequent compatibility and performance rounds broaden the ordinary workflow sample, but still provide no second independent pre-change validator or matched workflow trial.
| Question | Observed result |
|---|---|
| Did the independent validator work on its one task? | Yes. It checked prepared-lookup behavior before and after the cache and supplied a repeatable workload for the measured 94.9 → 67.5 µs and 321,621 → 131,993 B per-call change. |
| Did the later work change the comparison? | The latest recorded round reached 3,486 passing tests and an 18,978-step MySQL contract across 140 cases, with ten known differences. Full-scalar oracle scans strengthened the regex findings for Greek, Han, Latin, Cyrillic, Arabic, and Devanagari scripts and their extensions. The earlier prepared-variable and costed-join findings still stand, including MySQL's connection-sensitive join result. No second independent pre-implementation validator was recorded. |
| Did either workflow catch a defect the other demonstrably missed? | Not in the recorded sample. The cache-lifetime risk came from implementation review; later oracle and regression checks caught other real mistakes on different tasks. |
| Which workflow was faster or safer overall? | Undetermined. One treated task, unmatched work, and missing review-time, cost, and escaped-defect measures do not support an objective winner. |
Result: Keep the existing MySQL-oracle and failing-regression loop as the default for Fsdb. Use an independently authored, pre-change validator when the public behavior or performance claim is difficult to judge from the implementation and ordinary tests. The experiment shows that this can produce a valuable proof; it does not show that it is generally better than the old process.
