Oracle: drvec C 0.13, atsw-gui commit ae95446 (main, PR #48; the tag
drvec-v0.13 comes with the suite's release), engines/drvec with lib/optim,
lib/diagmv and lib/fuedet, built with gcc 13.3 on Linux x86_64 from
`git archive ae95446 engines/drvec lib`, against Ubuntu 24.04's GSL 2.7.1:
it loads /lib/x86_64-linux-gnu/libgsl.so.27 (ldd). (This line said "the
system GSL 2.8" until 2026-10-18: 2.8's headers and pkg-config are in
/usr/local, but no 2.8 library is loaded. The wheels build 2.7.1 from source,
tools/build_gsl.sh.) bin/drvec sha256
747fb37ee1f2c888add87b39428cd535dc812801ce53b228669c4c569e4453b7
(~/.local/share/atsw/drvec-ref-0.13/bin/drvec). 0.13 is the tag drvec-v0.12
with one change: a .pre's deterministic component follows fue's rule (nu(B)
truncated at 40 lags, the variables summed, one subtraction; BUG-40 closed
by agreeing with fue).

The same oracle with BUG-61 fixed (2026-10-18): atsw-gui commit 7ec4bf7
(branch drvec-bug61-rng32, PR #60, stacked on PR #52; still 0.13, fixed
before its tag), the commit csrc/ is vendored from. Both random generators
(the bootstrap's and -multistart's) hold a uint64_t instead of an
unsigned long, which is 32 bits on Windows and made every bootstrap hang
there (bugs/drvec-c-rng-long32). Built the same way (gcc 13.3, `git archive
7ec4bf7 engines/drvec lib`, Ubuntu's GSL 2.7.1, libgsl.so.27) into
~/.local/share/atsw/drvec-ref-0.13-bug61/bin/drvec, sha256
08aa1f278352874c8f8ff96cc2812a57d16ec12fbbfc3da6ecb20b1ca508458d
(it differs from ae95446's in the debug information only: the .text,
.rodata and .data sections are byte-identical). Run on every command below,
in the same way, its 83 files are byte-identical to ae95446's (cmp, no
filter). Nothing below was regenerated.

The same oracle with BUG-62 fixed (2026-10-24): atsw-gui commit e9304c6
(branch drvec-bug62-residual-labels; still 0.13), the commit csrc/ is
vendored from. With r >= 1 the residual block of a fit report gains one line
before "residual sd", naming its columns (`the columns: D.<series> ... ec<j>`:
the last r are the innovations of beta'Y, not of the Y1 series;
bugs/drvec-c-residual-labels). Every command below was run again with that
binary (engines/drvec/bin/drvec of the branch, gcc 13.3, GSL 2.7.1): 44 .out
files gain that line and nothing else (each, without it, is byte-identical to
the stored one after golden.sh's filter), the other 21 .out and every .boot,
.forecast, .recursive and .irfboot are unchanged but for the banner of the
files that still name DRVEC 0.12. The 44 were updated by inserting the line
into the stored file, so their banners did not move.

Milestones 1 to 4 were cut with drvec-v0.12 (4a89c00), bin/drvec sha256
9cf9d8ea01c3fd373cf781429dea7894465d7fbecd178980f421b2689aea5d76
(~/.local/share/atsw/drvec-ref/bin/drvec); rerun with 0.13 on 2026-10-17,
each of their files is byte-identical after golden.sh's filter (none of their
fixtures declares a deterministic variable), so they were not regenerated and
still name DRVEC 0.12 in their banner. Milestone 5's files are 0.13's (below).

Commands, run in a directory holding the two fixtures:
  drvec mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -mean -case 2 -name proute
  drvec mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -lrtest -bootstrap 20 -name rankboot
Golden hashes (engines/drvec/tests/golden/hashes.txt): preroute, rankboot.out, rankboot.boot.

Milestone 2, the three-series case (tests/data/fixtures/e1*.pre, see
tests/data/fixtures/e1-inp/SOURCE), same binary, run in a directory holding
the three fixtures:
  drvec e1invest.pre e1income.pre e1cons.pre 2 1 1 -mean -case 2 -name e1fit
  drvec e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 2 -lrtest -bootstrap 20 -name e1boot
Wall time on the machine of 2026-10-15: 2.4 s and 13.1 s.

Milestone 2, the remaining PRE_CASES of engines/drvec/tools/golden.sh, same
binary, run in a directory holding the fixtures (mmpre.*.pre, xrev.pre,
xnet1.txt, minkmu.pre; the last three copied byte for byte from
engines/drvec/tests/fixtures at the tag), each with `-name <label>`:
  fixb2row  mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -case 2 -fixb2row 1 0
  xlink     mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -xpre xrev.pre -xlink xnet1.txt
  xsys      mmpre.muskrat.pre mmpre.mink.pre 3 0 1 -case 2 -xsys 1
  nodrift   mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 3 -nodrift 1
  casepre   mmpre.muskrat.pre minkmu.pre 2 0 1 -case pre
  trend     mmpre.muskrat.pre minkmu.pre 2 0 1 -case pre -trend
  irfboot   mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -irfboot 40   (+ irfboot.irfboot)
Run again with -name under /tmp, each .out hashes (golden.sh's filter) to the
value in engines/drvec/tests/golden/hashes.txt at the tag; irfboot.irfboot too.

Milestone 3 (2026-10-15), same binary, run in a directory holding the
fixtures (mmpre.*.pre, minkmu.pre, e1*.pre, and e1alpha.txt, a matrix A with
alpha_invest = alpha_income), each with `-name <label>`:
  fdh201    mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -fdhess
  fdh211    mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -mean -case 2 -fdhess
  e1fdh     e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 2 -fdhess
  weakex1   mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -weakex 1
  weakex2   mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -weakex 2
  e1alpha   e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 2 -alpha e1alpha.txt
  fixb2v    mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -fixb2 0
  fixb2s    mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -fixb2
  wxfix     mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -weakex 1 -fixb2 0
  wxrow     e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 2 -weakex 3 -fixb2row 1 0
  fc201     mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -f 8          (+ .forecast)
  fc211     mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -mean -case 2 -f 6    (+ .forecast)
  fcpre     mmpre.muskrat.pre minkmu.pre 2 0 1 -case pre -f 5           (+ .forecast)
  ewin      mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -f 4 -estwin 50
            (+ .forecast, .recursive)
  e1fc      e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 2 -f 8 -estwin 70
            (+ .forecast, .recursive)
  ms201     mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -multistart 4
  ms211     mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -mean -case 2 -multistart 5
  msrank    mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -lrtest -multistart 3
  rungs     mmpre.muskrat.pre mmpre.mink.pre 2 1 1 -case 2 -rungs
  e1rungs   e1invest.pre e1income.pre e1cons.pre 2 1 1 -case 2 -rungs
  rungs3    mmpre.muskrat.pre minkmu.pre 2 0 0 -case 3 -rungs
Every run takes under 0.3 s.

Milestone 4 (2026-10-16), same binary, run in a directory holding the
fixtures (mmpre.*.pre, minkmu.pre, e1*.pre), each with `-name <label>`:
  cprank    mmpre.muskrat.pre minkmu.pre 2 0 0 -case pre -lrtest
  cprboot   mmpre.muskrat.pre minkmu.pre 2 0 1 -case pre -lrtest -bootstrap 20   (+ .boot)
  cprq      mmpre.muskrat.pre minkmu.pre 2 1 1 -case pre -lrtest
  e1cprank  e1invest.pre e1income.pre e1cons.pre 2 0 1 -case pre -lrtest
  e1ndrank  e1invest.pre e1income.pre e1cons.pre 2 0 1 -case 3 -nodrift 2 -lrtest
  dgate     mmpre.muskrat.pre minkmu.pre 2 0 0 -case pre -diagar -diagma -diagcov
  dgate2    mmpre.muskrat.pre mmpre.mink.pre 2 0 0 -case 2 -diagar -diagma -diagcov
  dgateq    mmpre.muskrat.pre mmpre.mink.pre 2 1 0 -case 2 -diagar -diagma -diagcov
  dgatepq   mmpre.muskrat.pre minkmu.pre 2 1 0 -case pre -diagar -diagma -diagcov
  e1gate    e1invest.pre e1income.pre e1cons.pre 2 1 0 -case 2 -diagar -diagma -diagcov
The E1 .pre files all estimate their mean, so e1cprank is case 3 with every
drift free; e1ndrank is the three-series case with a drift held. Wall time:
cprboot 0.51 s, e1ndrank 0.48 s, e1cprank 0.37 s, cprq 0.33 s, the rest
under 0.05 s. cprboot.boot's replication 16 is the C's stale-ladder defect
(bugs/drvec-c-ladder-key).

Milestone 5 (2026-10-16; regenerated with drvec C 0.13 on 2026-10-17, sha256
747fb37e... above), run in a directory holding every
fixture of tests/data/fixtures (milestone 5's are make_m5.py's, see
tests/data/fixtures/SOURCE), each with `-name <label>`:
  ddet201  mmpre.muskrat.pre mmdet.mink.pre 2 0 1 -case 2
  ddet211  mmdet.muskrat.pre mmdet.mink.pre 2 1 1 -mean -case 2
  dstep    mmpre.muskrat.pre mmpre.step.pre 2 1 1 -mean -case 2
  e1seas   e1seas.invest.pre e1seas.income.pre e1seas.cons.pre 2 0 1 -case 2
  mon201   mmmon.muskrat.pre mmmon.mink.pre 2 0 1 -case 2
  drank    mmdet.muskrat.pre mmdet.mink.pre 2 0 1 -case 2 -lrtest
  dboot    mmdet.muskrat.pre mmdet.mink.pre 2 0 1 -case 2 -lrtest -bootstrap 10  (+ .boot)
  e1srank  e1seas.invest.pre e1seas.income.pre e1seas.cons.pre 2 0 1 -case 2 -lrtest
  dfc      mmdet.muskrat.pre mmdet.mink.pre 2 0 1 -case 2 -f 8              (+ .forecast)
  dfcmon   mmmon.muskrat.pre mmmon.mink.pre 2 0 1 -case 2 -f 12             (+ .forecast)
  e1sfc    e1seas.invest.pre e1seas.income.pre e1seas.cons.pre 2 0 1 -case 2 -f 8 -estwin 70
           (+ .forecast, .recursive)
  dcpfc    mmdet.muskrat.pre mmdet.minkmu.pre 2 0 1 -case pre -f 5          (+ .forecast)
  dfdh     mmdet.muskrat.pre mmdet.mink.pre 2 0 1 -case 2 -fdhess
  dcpre    mmdet.muskrat.pre mmdet.minkmu.pre 2 0 1 -case pre
  dcprank  mmdet.muskrat.pre mmdet.minkmu.pre 2 0 1 -case pre -lrtest
  dxsys    mmdet.muskrat.pre mmdet.mink.pre 3 0 1 -case 2 -xsys 1
  xarma    mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -xpre xrevarma.pre -xlink xnet2.txt
  xarma1   mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -xpre xrevarma.pre -xlink xnet1.txt
  xar0     mmpre.muskrat.pre mmpre.mink.pre 2 0 1 -case 2 -xpre xrevar0.pre -xlink xnet2.txt
  xdet     mmdet.muskrat.pre mmdet.mink.pre 2 0 1 -case 2 -xpre xrevdet.pre -xlink xnet2.txt
  xmon     mmmon.muskrat.pre mmmon.mink.pre 2 0 1 -case 2 -xpre xmon.pre -xlink xnetm.txt
ddet211 and dstep are ill-defined (several starts over 1.4 and 5.3 logL
units, the best a criterion-3 stop). Wall time: e1srank 0.47 s, dstep 0.35 s, xar0 0.30 s,
ddet211 0.28 s, the rest under 0.25 s.
Milestone 5, the BUG-40 case (2026-10-16), the same binary and directory:
  b40      mmpre.muskrat.pre mmb40.mink.pre 2 0 1 -case 2 -f 8               (+ .forecast)
  b40rank  mmpre.muskrat.pre mmb40.mink.pre 2 0 1 -case 2 -lrtest
A step with delta 0.95 and 52 periods after it: fue's rule truncates its
nu(B) at 40 lags, and drvec C 0.12 applied the exact filter (the tail reaches
0.46; the logL moved by 0.47, and b40rank's LR(0), 13.2989 against 13.7873,
crossed the 10% critical value). drvec C 0.13 applies fue's rule: 13.7873,
"reject H0 at 10%", as the port.

The 0.13 regeneration (2026-10-17) changed 24 of milestone 5's 30 files:
b40 (.out, .forecast), b40rank, dboot (.out, .boot), dcpfc (.out,
.forecast), dcprank, dcpre, ddet201, ddet211, dfc (.out, .forecast), dfcmon
(.out, .forecast), dfdh, drank, dxsys, e1seas, e1sfc.recursive, e1srank,
mon201, xdet, xmon -- each a case with a file carrying two or more
deterministic variables or a rational one. Unchanged: dstep (one step, no
delta), xarma, xarma1, xar0 (no deterministic variable), and e1sfc.out and
e1sfc.forecast (several variables, but the rounding does not reach what they
print; its .recursive moved). Every one of the 83 files is now byte-identical to the port.

-gzero (2026-10-24): drvec C 0.13 with the option -gzero i j (Gamma_k[i][j]
held at 0 for every k), atsw-gui commit 8626a2d (branch drvec-gamma-zero, the
commit csrc/ is vendored from since), built in place with
its Makefile (gcc 13.3, Ubuntu's GSL 2.7.1, libgsl.so.27), bin/drvec sha256
431a8fce5c75e4ca3e308c59c7200e45ad9110783c2b5dc521f18d9a90ef9e7a, run in a
directory holding the two fixtures:
  gzero    mmpre.muskrat.pre mmpre.mink.pre 3 0 1 -case 2 -gzero 2 1
  gzeroa   mmpre.muskrat.pre mmpre.mink.pre 3 0 1 -case 2 -gzero 1 2 -weakex 1
Golden hashes: gzero, gzeroa. No other file of this oracle was regenerated:
the option touches no fit that does not ask for it (the 34 golden hashes
before it do not move).

main after PRs #84-#86 (2026-10-24): atsw-gui abe6602, drvec C 0.13 with
BUG-61, BUG-62 and BUG-63 fixed and -gzero, the commit csrc/ is vendored from
since. gzero.out and gzeroa.out regenerated with bin/drvec built in place from
that tree (gcc 13.3, Ubuntu's GSL 2.7.1), sha256
30f72355bdf7246dc4b580f1b0b91bf4358d17a1998d8fb25e0d3fa19d15f56c, the same
command lines as above: each gains BUG-62's line ("the columns: D.muskrat
ec1"), and nothing else moves. BUG-63 flushes the .boot as it is written and
changes no byte of any file.

main after PRs #93-#94 (2026-10-25): atsw-gui 800a540, drvec C 0.13 with
BUG-64 fixed (make_admissible's last resort, Lambda = 0.05 [I_r; 0]), the I(1, r)
check before the rank bootstrap and the bootstrap block's text measured on
Cavaliere, Rahbek and Taylor's (2012) design; the commit csrc/ is vendored from
since. bin/drvec built from `git archive 800a540 engines/drvec lib` with its
Makefile (gcc 13.3, Ubuntu's GSL 2.7.1), sha256
f61c9097c37b8a7db299a96a9fa9674e9df548adf141f54dbc7db89bd4eb1f95. Every command
above was run again with it: 14 .out files move, and nothing else (every .boot,
.forecast, .recursive and .irfboot, and the other 53 .out, byte-identical but
for the banner). The 14 were replaced by the new files with their stored first
line, so their banners did not move:
  rankboot, e1boot, cprboot   the bootstrap block's text (five lines)
  dboot                       that text, and BUG-64's search line (below)
  ddet201, ddet211, drank, dfc, e1sfc, dcpfc, dfdh, dcpre, dcprank
                              BUG-64: the `cold' start, "not found" before,
                              now converges; the best start and the optimum
                              do not change
  xdet                        BUG-64: the `cold' start converges to a better
                              optimum (criterion 3), logL -17.7259455996
                              against -20.9312, which the old binary did not
                              reach with -multistart 30 either; the whole fit
                              moves
