Cycle-close audit for the #44 Form-A `$`-reservation cycle
(b151990..HEAD). One drift item fixed inline. Both regression scripts
exited 1; investigated and attributed to machine load this session, NOT
a code regression — baseline deliberately NOT updated.
Architect drift review:
- [fixed] design/models/0001-authoring-surface.md — the line "The only
reserved tokens are `(`, `)`, and whitespace" was made stale by this
cycle (the lexer now rejects any identifier token containing `$`).
Corrected to distinguish token *delimiters* (`(`/`)`/whitespace) from
the `$` *character reservation within a token*, scoped to the Form-A
authoring surface, naming the enforcement site
(`LexError::ReservedDollar`) and the intentional `.ail.json` non-guard.
- [carry-on] honesty sweep otherwise clean: the only other `$`-mentions
in the ledger (0008-memory-model.md, 0003-pipeline.md) describe
synthetic mint names (buf$1, <hint>$lr_N) and remain correct. No
over-broad "no Module can contain `$`" prose exists. The corrected
fresh_binder doc-comment (feat commit) is Form-A-scoped and honest.
- Decision: no new ledger *contract* added. 0015-language-constraints
holds the four RC-soundness preconditions (strict eval, no recursive
value bindings, no shared mutable refs, acyclic ADTs); a lexical
character reservation is a different category and is documented in the
authoring-surface model doc with its enforcement site, which is its
natural home. Architect confirmed absence of `$`-contract prose is not
itself drift.
Lockstep pairs: none apply (architect walked each against the diff):
- Pattern::Lit typecheck <-> pre_desugar_validation.rs — neither changed.
- lower_app <-> is_static_callee — codegen unchanged.
- INTERCEPTS <-> (intrinsic) markers — intercepts.rs + kernel sources
unchanged.
Regression scripts:
- bench/cross_lang.py: EXIT 0. 25 metrics; 0 regressed, all stable.
- bench/compile_check.py: EXIT 1; "12 regressed" — ALL are check_ms.*
(type-check wall-clock), baseline ~1.8-3.3ms vs actual ~2.5-4.4ms,
~+0.8ms absolute and roughly UNIFORM across every fixture regardless
of size (hello +39%, bench_list_sum +51%). All 12 build_O0_ms.* (the
~93ms LLVM portion of the same `ail build`) are within tolerance but
also uniformly shifted +12-15%. Attribution: NOT this cycle's code.
The guard adds one `raw.contains('$')` byte-scan per token; a tiny
module is ~50 tokens, so the added cost is nanoseconds — physically
cannot account for +0.8ms on a 2ms check. The uniform ~12-15% shift
across the WHOLE `ail` invocation (check AND build) is a global
machine-slowdown fingerprint (heavy concurrent subagent/cargo load
this session); it crosses the 25% tolerance only on the tiny-baseline
check_ms metrics. Localised by reasoning, not by the bencher (the
effect is environmental, nothing to localise in code).
- bench/check.py: EXIT 1; throughput metrics flipping run-to-run with
identical code (rc_over_bump moved in/out of REGRESSION across four
runs; bump_s swung -9.5/-11/-14/-15%). Same machine-load variance;
rc_over_bump is a ratio of two independently-noisy wall-clock
measurements, the noisiest metric in the set.
Baseline NOT updated on either script: ratifying a machine-load delta
would bake an under-load baseline in and mask a future real regression.
OPEN VERIFICATION: re-run bench/compile_check.py and bench/check.py on a
quiet machine to confirm green; tracked as the cycle's one open item.
Cycle #44 closes (code + docs clean; regression gate pending a
clean-machine confirmation, baseline untouched).
All 176 files in the four accumulating directories now use a
zero-padded 4-digit counter prefix that reflects creation order
(`NNNN-slug.md`). The counter is assigned per directory in strict
git-log creation order; ties broken alphabetically by original name.
The old `YYYY-MM-DD-` prefix on docs/specs/ and docs/plans/ files is
dropped — the date is recoverable from git log and the counter
carries the ordering.
A file's counter is stable for the life of the file: never reassigned,
never reused, never compacted. Deleted files retire their counter;
subsequent files do not fill the gap. This is the property that lets
cross-references stay literal — refs use the full filename including
the counter (`design/contracts/0007-honesty-rule.md`) so they grep
cleanly and resolve directly without a glob step.
313 cross-references updated across .md/.rs/.toml/.c/.json files
(test pins, include_str! paths, design-INDEX entries, baseline notes,
runtime C comments, inter-contract markdown links incl. bare basename
and `../models/foo.md` forms).
CLAUDE.md gets a new "File-naming convention" section spelling out
the rule and rationale. skills/brainstorm/SKILL.md and
skills/planner/SKILL.md updated so new spec/plan creation produces
counter-prefixed names from the start.
The full test suite (cargo test --workspace) passes.