678dac5efc
First concern moved out of el_runtime.c under the ratchet, and the move is
deliberately small: it exists to prove the mechanism end to end before anything
large depends on it.
engram_text.{c,h} — query tokenization, candidate-token hygiene, word-boundary
matching, and the text-damage signature. Four functions, moved verbatim; only
`static` was dropped and each doc comment travelled with the code. They touch no
EL value type and no engram store type: plain C over <ctype.h>/<string.h> over
char buffers. They were never el_runtime.c's business.
el_runtime.c 20,527 -> 20,427 lines (BUDGET max_lines ratcheted down)
engram fns 279 -> 275 (BUDGET max_engram_fns ratcheted down)
The Stage 1 extension point worked as designed: adding the file to
lang/runtime/SOURCES was one line, and every build path picked it up. The
Stage 2 drift guard then caught that I had NOT added it to install.sh's
standalone list — the exact class of drift it was written for, on its first
real change, before the commit rather than after a broken SDK shipped.
WHY ONLY 100 LINES, AND WHAT ACTUALLY BLOCKS THE REST
Measured, not estimated: of 273 engram-domain functions in el_runtime.c
(~9,700 lines), only 75 (~1,058 lines) can move today, and they are scattered
rather than clustered. The blocker is a single fact:
EngramNode, EngramEdge, EngramStore, EngramLayer, EngramWal and EngramIdSlot
are typedef'd INSIDE el_runtime.c. No sibling can see them. engram_store.h
defines a SEPARATE serializable "node view" struct and maps between the two.
So every engram function that takes an EngramNode* — which is most of them, 109
of 273 by direct type reference — cannot compile in engram_store.c until those
types move to a shared header. That extraction is the real Stage 3 enabler and
it deserves its own change: it touches the most load-bearing struct in the
system, and doing it in the same commit as a code move would make a regression
impossible to bisect.
REPAIRED: 10 engram harnesses that had silently stopped linking
Not new breakage from this move — verified against unmodified dev, where
el_runtime.c + engram_store.c alone already failed with undefined symbols.
They had been dead for as long as el_runtime.c has been calling into the
siblings, and nothing noticed because nothing ran them.
run_m3_parity, run_m7_traversal, run_m35_hebb_persist,
run_interoception_p0..p5 — now build from $(scripts/el-runtime-sources.sh)
run_wal_tests — its two TUs #include "el_runtime.c" directly, so
it links the SIBLINGS ONLY; adding el_runtime.c
to that link line would define every symbol twice
(That #include'd .c is worth recording: the runtime does have one, in
engram/test/test_wal.c and the generated test_failloud.c.)
Verified locally — every one of these was run, not assumed:
* m3_parity ............ PASS, incl. ASan+UBSan clean across seed/on/reboot
* m7_traversal ......... PASS
* m35_hebb_persist ..... PASS (the gate over the original prod hebb bug)
* interoception p0..p5 . PASS (all six)
* wal_tests ............ 66 passed, 0 failed, + fail-loud exit check
* self-host fixpoint ... byte-identical, AND the emitted C is byte-identical
to the pre-move compiler output — the move changes
nothing the compiler produces
* engram/src/server.el . compiles and links
* native suites ........ 8 of 13, unchanged from before the move; the same 5
pre-existing failures, no regression
* both runtime guards .. green at the new, lower budget
Also fixes a block comment left unterminated by the extraction (the deleted
range carried its closing */), restoring the compile to its single pre-existing
-Wcomment warning.
42 lines
2.0 KiB
Plaintext
42 lines
2.0 KiB
Plaintext
# BUDGET — a RATCHET on lang/runtime/el_runtime.c. Enforced by
|
|
# scripts/check-runtime-growth.sh. These numbers may only ever go DOWN.
|
|
#
|
|
# WHY THIS FILE EXISTS
|
|
# --------------------
|
|
# scripts/check-single-runtime.sh guards against el_runtime.c being COPIED.
|
|
# Nothing guarded against it GROWING. It grew from 10,607 lines to 20,527 —
|
|
# 94% — in 3.5 months, while under an explicit commit-message promise that it
|
|
# was a temporary shim about to be deleted.
|
|
#
|
|
# It grew because lang/AGENTS.md told every agent to grow it: it claimed
|
|
# el_runtime.c was "the authoritative single-file link target" and that a new
|
|
# C builtin "must live there to be linkable". That is false — placement is a
|
|
# link-time concern, `builtin_arity` is an arity guard not a dispatch table,
|
|
# and the shipped elc already links from ten translation units. The claim is
|
|
# corrected, and this file is the mechanism that keeps it corrected.
|
|
#
|
|
# THIS IS A RATCHET, NOT A LIMIT
|
|
# ------------------------------
|
|
# The budget is set at the CURRENT size. There is no headroom, deliberately.
|
|
# The file cannot grow by even one line. Any new code goes in the .c that owns
|
|
# the concern — that is the whole point, and every other runtime file is
|
|
# deliberately UNCAPPED.
|
|
#
|
|
# When you move code OUT, lower the number in the same commit. The guard tells
|
|
# you to when you have earned it.
|
|
#
|
|
# FORMAT: <key> <value> — `#` comments and blank lines ignored.
|
|
|
|
# Maximum lines in lang/runtime/el_runtime.c.
|
|
# 2026-08-16: 20,527 — the high-water mark.
|
|
# 2026-08-16: 20,427 — engram_text.c extracted (tokenize, token hygiene,
|
|
# word-boundary match, damage signature). Ratcheted down.
|
|
max_lines 20427
|
|
|
|
# Maximum top-level engram/eg_/cog_ function definitions in el_runtime.c.
|
|
# ~47.5% of the file is engram code, and engram already owns six dedicated
|
|
# sibling files (engram_{store,vindex,geometry,reason,verify,cognition}.c).
|
|
# Every one of these belongs in one of them. This is the Stage 3 scoreboard.
|
|
# 2026-08-16: 279 -> 275 (4 moved to engram_text.c).
|
|
max_engram_fns 275
|