This repository has been archived on 2026-08-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
el-retired/docs/v1/experiments/evidence/cycles/16-tokens-carry-no-position/CLAIMS.md
T
will d3495476f4
El SDK Release / build-and-release (push) Failing after 13m0s
kill: purge old-paradigm dist/platform binaries from tree
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.
2026-08-19 19:46:15 -05:00

169 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAIMS — cycle 16, tokens carry no position
Source doc: `docs/v1/experiments/cycles/16-tokens-carry-no-position.md`
## Pinned commits
| role | sha | subject |
|---|---|---|
| parent / before-state | `1086ac965` | record the module answer: the partition is a path, not a neighbourhood |
| experiment (system under test) | `6c975b1d5019446c29d84d99b9b1c0ec512be8a6` | thread provenance through resolve_imports |
| land (merge) | `cb7289f06510c002b6ab7c5ca8c2bd182d8216bc` | thread provenance end to end: a diagnostic can finally name a place |
## Verdicts
| # | claim | artifact | commit | verdict |
|---|---|---|---|---|
| A1 | tokens had **no position at all** — a token was a flat `(kind, value)` pair | `0001-pre-token-is-flat-pair.out` | `1086ac9` | REPRODUCED (exact) |
| A2 | no diagnostic in El could name a place — every error named a symbol, never a line | `0001` (`tok_line` absent from all five compiler sources) | `1086ac9` | REPRODUCED |
| A3 | P1: **15 stride sites**, encapsulated in `tok_kind`/`tok_value` | `0014`, `0015-P1-stride-sites-all-files-clean-tree.out` | `1086ac9``6c975b1` | REPRODUCED (see note) |
| A4 | P2: adding a line field is mechanical; P3: the lexer must count newlines — stride **2 → 3** | `0014`, `0015` | `6c975b1` | REPRODUCED |
| A5 | P4: `resolve_imports` can record per-file line ranges (`<file> spans <start> <end>`) | `0009-P5-message-names-both-files.out` | `6c975b1` | REPRODUCED (via effect) |
| A6 | P5: the message can then name **both files** | `0009` | `6c975b1` | REPRODUCED (exact shape) |
| A7 | P6: token memory grows — **25.0 → 33.9 MB (+36%)** | `0005`, `0006`, `0007-P6-rss-five-runs-each.out`, `0008-P6-growth-arithmetic.out` | `1086ac9`/`6c975b1` | **DIVERGED** (endpoints reproduce; the percentage does not) |
| A8 | 105/105 native | `0011-post-native-suite.out` | `6c975b1` | REPRODUCED (exact) |
| A9 | 37/37 integration | `0012-post-integration-harnesses.out` | `6c975b1` | REPRODUCED (exact) |
| A10 | fixpoint ok | `0010-post-fixpoint.out` | `6c975b1` | REPRODUCED |
| A11 | compiler self-checks clean | `0013-post-compiler-self-check.out` | `6c975b1` | REPRODUCED |
| A12 | defect 1: `interp_tokens_append_all` walks the token list with its own copy of the stride; gen1 built, gen2 emitted corrupt C | — | — | **NOT-CAPTURED** |
| A13 | defect 2: `tok_count` in `test_compiler.el` carried the stride too, having escaped a compiler-scoped search | `0015` | `1086ac9` | REPRODUCED (corroborated — see note) |
| A14 | defect 3: nested `resolve_imports` accumulated spans into shared state | — | — | **NOT-CAPTURED** |
| A15 | defect 4: the first working version reported `b.el:3` — the COMBINED line against a file with no line 3 | `0009` (shows the corrected behaviour only) | `6c975b1` | **NOT-CAPTURED** |
| A16 | both compilers build | `0003`, `0004` | `1086ac9`, `6c975b1` | REPRODUCED |
## A1 / A4 — the token shape
`tok_append` at `1086ac9` (`0001`):
```el
fn tok_append(tokens: [Any], kind: String, value: String) -> [Any] {
let tokens = native_list_append(tokens, kind)
native_list_append(tokens, value)
}
```
Two slots. `tok_line` does not appear anywhere in `lexer.el`, `parser.el`,
`codegen.el`, `codegen-js.el` or `compiler.el` — count 0 in all five. At
`6c975b1` a third slot is appended from `state_get("__lex_line")` and
`tok_line(tokens, pos)` is defined at `parser.el:41`.
## A3 / A13 — the stride count, and the escapee
`0015`, run against `1086ac9`, finds **16** sites that hardcode the stride:
```
codegen.el 3 sites (3633, 3807, 4018)
parser.el 12 sites (20, 21, 31, 38, 42, 49, 1233, 2161, 2204, 2256, 2422, 2564)
tests/native/test_compiler.el 1 site (21)
```
Compiler sources alone: **3 + 12 = 15** — exactly P1's figure. The sixteenth is
`tok_count` in `test_compiler.el`, which is precisely what defect 2 in the
record says: *"tok_count in test_compiler.el carried the stride too. I had
scoped the search to compiler sources and it had escaped into the tests."*
So P1's 15 is the compiler-source count, it is correct as such, and the
independent count corroborates the recorded defect rather than contradicting the
prediction. After the change `parser.el` exposes three accessors
(`tok_kind:25`, `tok_line:41`, `tok_value:48`) with **187** call sites (`0014`).
## A6 — the diagnostic, exactly as recorded
Fixtures `fixtures/a.el`, `fixtures/b.el`, `fixtures/m.el`. At `6c975b1`
(`0009`, checker exit 1):
```
duplicate definition: 'helper' is defined 2 times — El has no namespacing, so imported modules share one global scope
…/mod16/a.el:1
…/mod16/b.el:1
```
Same shape as the record's
```
/tmp/modtest/a.el:1
/tmp/modtest/b.el:1
```
(the directory differs because the fixture was re-created in this re-run's
scratch space; `/tmp/modtest` from the original session no longer exists). Both
files are named, and each line number is the line **within that file** — which
is defect 4's repair: the combined-source line is no longer reported against a
file that has no such line.
## A7 — the divergence, in full
Peak RSS of the same compile (`elc-cli.el`), five runs each, `/usr/bin/time -l`
(`0007`):
```
pre run1 25018368 23.86 MiB 25.02 MB post run1 35536896 33.89 MiB 35.54 MB
pre run2 25001984 23.84 MiB 25.00 MB post run2 33980416 32.41 MiB 33.98 MB
pre run3 25067520 23.91 MiB 25.07 MB post run3 35061760 33.44 MiB 35.06 MB
pre run4 24887296 23.73 MiB 24.89 MB post run4 34947072 33.33 MiB 34.95 MB
pre run5 25067520 23.91 MiB 25.07 MB post run5 34848768 33.23 MiB 34.85 MB
```
**Both endpoint numbers in the record reproduce — but not in the same unit.**
* `25.0` is the **pre** figure read in decimal MB (25.0025.07 MB; the same
bytes are 23.84 MiB).
* `33.9` is the **post** figure read in **MiB** (33.89 MiB on run 1; the same
bytes are 35.54 MB).
Computed in consistent units (`0008`):
```
pre mean 25008537 bytes = 23.84 MiB = 25.00 MB
post mean 34874982 bytes = 33.25 MiB = 34.87 MB
growth, consistent units = 39.45 %
claimed 25.0 -> 33.9 implies 35.60 %
```
So the true growth is **≈ +39.5 %**, not +36 %. The +36 % figure is the
arithmetic of one decimal-MB reading against one MiB reading. P6's prediction
("token memory grows") is REPRODUCED and the direction is unaffected; the
magnitude as printed is DIVERGED, and understates the cost.
A note on what is being measured: `/usr/bin/time -l` reports process peak
resident set, not the token list in isolation. The record does not state the
method used for its own figures. Since both of its endpoints fall inside the
peak-RSS distribution measured here, peak RSS is the most likely original
instrument; but the +36 % is wrong under any single consistent unit, which is
what the divergence rests on. A stride change from 2 to 3 slots implies +50 % on
the token list alone, and +39.5 % on whole-process peak is consistent with the
token list being the dominant but not sole allocation.
## Suite results at `6c975b1`
```
105 tests, 105 passed, 0 failed, 253 assertions (0011)
FIXPOINT-OK gen2 == gen3 (0010)
definitions: clean exit=0 (compiler's own source) (0013)
arity_query.sh exit=0 assertions=5
capability_query.sh exit=0 assertions=5
definitions_query.sh exit=0 assertions=6
prohibition_query.sh exit=0 assertions=4
seam_binding.sh exit=0 assertions=7
temporal_query.sh exit=0 assertions=6
temporal_signatures.sh exit=0 assertions=4
TOTAL: 37 (0012)
```
105/105 and 37/37 — both exact.
## Provenance notes
`0002` carries a DIRTY-TREE flag (`git show` measurement run from the shared main
checkout while other agents were committing to it). It was re-run from a clean
worktree as `0014`, and extended as `0015`. Cite the `-clean-tree` artifacts.
Everything else is from `/tmp/rerun-v1b-16-pre` (`1086ac9`) and
`/tmp/rerun-v1b-16-post` (`6c975b1`).
The four defects the record lists (A12A15) were found and fixed *within* the
development of `6c975b1`; no intermediate states were committed, so no artifact
of them exists and none was manufactured. A13 is graded REPRODUCED only because
the escapee it names is independently visible in the stride census at the parent
commit.