The generated C, amalgams, vendored runtime pins, and compiled binaries from the Claude Code era are removed from the worktree. The El sources survive; this tree is now source-only for the first-principles rebuild. Per Principal direction 2026-08-19.
5.9 KiB
CLAIMS — cycle 18, async — half expressible, and the cycle that was dogma
Source doc: docs/v1/experiments/cycles/18-async-half-expressible.md
This cycle is unusual: the doc already carries a chain-of-custody note stating that its original artifacts were destroyed and that it was rerun, not reconstructed. The verdicts below respect that. Where the original artifact is gone the verdict is NOT-CAPTURED, and the replication is graded separately.
Pinned commits
| role | sha | subject |
|---|---|---|
| replication landed (system under test) | 511db25230c69b9484ece39ed4131d3920b16596 |
rerun cycle 18 rather than reconstruct it |
| original measurement | — | no commit. The C stub lived in /tmp and was destroyed with the session worktrees |
511db252 is the only commit that has ever contained
lang/tests/integration/async_future.sh or
lang/tests/integration/fixtures/future.c.
Verdicts
| # | claim | artifact | commit | verdict |
|---|---|---|---|---|
| A1 | the first attempt was dogma: pthread_join immediately after pthread_create, and the test printed the word DEFERRED itself |
— | — | NOT-CAPTURED (artifact destroyed; the doc says so) |
| A2 | second run, 4/4: [18 us] wrap RETURNS, [29 us] body START, caller continues, got 0, [50176 us] body END (computed 42) |
— | — | NOT-CAPTURED (artifact destroyed; the doc says so) |
| A3 | the caller got 0, not 42 on the second run | — | — | NOT-CAPTURED |
| A4 | the fixture now lives at lang/tests/integration/fixtures/future.c and the harness at lang/tests/integration/async_future.sh |
0002, repo tree at 511db252 |
511db252 |
REPRODUCED |
| A5 | 6/6 on the replication harness | 0002-async-future-harness-6-assertions.out |
511db252 |
REPRODUCED (exact) |
| A6 | follow-on P1: el_val_t already carries tagged heap objects — 5 magic tags exist |
0003-P1-five-magic-tags.out |
511db252 |
REPRODUCED (exact) |
| A7 | follow-on P2/P3: a future is one more; the caller awaits and gets 42 | 0005-P2P3-bound-run-interleaving.out |
511db252 |
REPRODUCED |
| A8 | follow-on P4: ZERO compiler changes — runtime C plus one binding | 0004, 0005 |
511db252 |
REPRODUCED |
| A9 | P1/P2 of the second run: the caller proceeds while the body runs; interleaving is observable in timestamps | 0005 |
511db252 |
REPRODUCED |
| A10 | follow-on P5: the unbound path still works — FALSE, SIGSEGV | — | — | NOT-CAPTURED (see note) |
| A11 | the compiler builds at 511db252 |
0001-build-gen1-511db252.out |
511db252 |
REPRODUCED |
A5 — the replication, 6/6
0002, harness run against the compiler built from 511db252:
ok unbound: no construct, synchronous, correct result
ok unbound: el_await on a non-future passes through, no crash
ok bound: does not crash
ok bound: the awaited result is correct
ok bound: the caller continues BEFORE the body finishes
ok bound: the wrap returns in under 10ms while the body takes 50ms
6 assertions, 6 passed, 0 failed
Exit 0. The harness's own header states it is a replication and not a blind test — the outcomes were known before it was written — and that grading is carried forward here unchanged.
A8 / A9 — zero compiler changes, demonstrated
The same El source (fixtures/probe.el), compiled by the stock elc, run twice
against the same binary.
Unbound — no construct file, synchronous (0004):
CALLER_CONTINUED
RESULT 42
Bound — EL_CONSTRUCTS=c.txt containing work async wrap defer (0005):
WRAP_RETURNED 12
CALLER_CONTINUED
BODY_START 20
BODY_END 55034
RESULT 42
Same compiler, same emitted C, same binary; deferral appears only because a
construct was bound after the build. The wrap returns at 12 µs while the
body finishes at 55 034 µs, and CALLER_CONTINUED precedes BODY_END —
the caller demonstrably proceeds while the body runs. The record's own numbers
were 18 µs / 29 µs / 50 176 µs; the shape matches and the magnitudes are
consistent (the body sleeps 50 ms by construction).
RESULT 42 is the follow-on P3: with a future as one more tagged heap object,
the caller awaits and gets the real value.
A6 — five tags, and a future would be the sixth
0003, over el_runtime.c and el_runtime.h at 511db252:
#define EL_MAGIC_BIN
#define EL_MAGIC_GEOM
#define EL_MAGIC_LIST
#define EL_MAGIC_MAP
#define EL_MAGIC_MFLD
count: 5
and fixtures/future.c adds #define EL_MAGIC_FUT 0xE1F07000u in the fixture,
not in the compiler.
A10 — why the SIGSEGV is NOT-CAPTURED
Follow-on P5 records that the first el_await read ->magic off an unvalidated
slot and segfaulted on the unbound path. That version was never committed. The
committed future.c carries the repair and a comment naming the defect:
el_val_t el_await(el_val_t h){
if (h < 0x10000) return h; /* small ints / low addresses */
if (h & 0x7) return h; /* malloc returns 8-aligned */
ElFuture* f = (ElFuture*)(intptr_t)h;
if (f->magic != EL_MAGIC_FUT) return h; /* safe to read now */
so the harness's second assertion ("unbound: el_await on a non-future passes
through, no crash") passes today. The historical failure has no artifact and one
was not manufactured. The class it belongs to is independently reproduced in
cycle 19 (0005-P6-sha256-hex-50000-exit-code.out, exit 139), which is the
cycle P5 opened.
Provenance notes
All artifacts from /tmp/rerun-v1b-18, a dedicated worktree at 511db252, with
capture.sh invoked by absolute path from inside it. No DIRTY-TREE flags in
this cycle.
Three of this cycle's claims (A1, A2, A3) rest on a file that no longer exists.
They are recorded as NOT-CAPTURED. Producing a /tmp C stub today and dating it
to 2026-08-17 would be fabrication with a fresh timestamp; the doc's own
chain-of-custody note already says as much, and this re-run does not go behind
it.