Skip to content

feat(#30): slice 4 — production of text components, examples/text-models, helper coverage - #247

Open
afflom wants to merge 53 commits into
release/v0.4from
claude/issue-30-slice-4
Open

afflom wants to merge 53 commits into
release/v0.4from
claude/issue-30-slice-4

Conversation

@afflom

@afflom afflom commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Slice 4 of #30. Intent: #30 (comment). Bridge spike: #30 (comment).

What it does

Text components are produced. A tokenizer, a context window, a text generator and a text classifier are runtime constructs whose elaborated definitions are ordinary executable definitions applying production forms in LexLeanStd.TextModels (a new module of std). Each form is related to its library function by a bridge the elaboration proves in the user module, and each library law has an of-equality form whose bridge is a hypothesis, so the generated laws are proved of the realized definitions and no proof variant was added.

  • LM-10: a root reaching a text component is eligible for rust-std (effects allocation, overflow, recursion) and refused for rust-core (LLT4005); the eligibility report carries text_rows (closed members and qualified names only); the nine roots of the example agree with an independent oracle and satisfy certificates A, B and E under real Lean.
  • LM-11: examples/text-models: both tokenizer schemes, both overflow dispositions, a greedy and a sampled generator, a classifier of each tokenizer, nine production roots. Its kernel facts are stated on tokens and bytes (the kernel does not reduce Lean's string primitives); the longest-match scheme is covered by the bridges and the oracle differential. Its lexlean.lock and expected/ are written at the regeneration, so LM-11 is red on this head until then.
  • LM-12: whole-word textual reach of the 113 fixed names in the Lean generated for the example's main module, plus transitive reach through library declarations; unreached names fail by name as dead library.
  • LM-09 is extended over text_rows.

Cost of the explicit import

A module that declares a text component must write \importmodule{LexLeanStd.TextModels} and its project must list the std source package; without either the declaration is refused naming the import (LLT4006). Every existing text-component user pays that line and that manifest entry. A source package may declare builtin lexicons only (LLC0101), so TextModels.lex.tex keeps a builtin title (Natural number addition, as Sha256 and Text do); examples/text-models has its own glossary and title.

The certificate A pin rule (production/certificate/data_a.rs)

Rule: a definition that a construct elaborates to has as its pin the union of the pins of the definitions its body names, to a fixed point (the sets only grow and are finite). Before, such a definition pinned [] ("the audit finds none for it"). That holds when its callees carry no axioms and is false for a text component, whose definitions apply stdlib forms with measured axioms (decodeText brings Classical.choice); Lean then reported Classical.choice for the row R7.__fits_1 while the pin was [Quot.sound, propext] (LLV7013). #221's union pin covers the rows of one mutual group (_unsafe_rec), not a derived definition's callees, so it did not apply.

The rule conditions on the callees' pins, not on the module (an earlier version keyed on the laws import; that was a proxy and is gone). It follows Call and FunctionRef terms, and visit_terms reaches lambda bodies and arguments; a primitive names no definition. A name the walk missed leaves the pin short and the audit refuses it loudly (LLV7013). The certificate-A pins of examples/helpdesk, examples/models and examples/reasoning are identical before and after the rule (diffed row by row, 1072 rows). The plant that fails when the union is dropped is conformance_lm_10 (see VERIFICATION.md).

Identity

This slice moves the language-1.2 identity (language/production-1.2.toml, schemas/production-eligibility.schema.json, compiler semantics). Records, locks and fixtures are not regenerated here; they regenerate once on the head the maintainer names (after #248 and #254). The register is 452 IDs on the merged line (README, SPEC, repository.rs, spec_links.rs).

Measured

Real Lean 4.32.1 on GitHub-hosted runners, each case on its own, from a scratch workflow on scratch/issue-30-slice-4-lm that is never merged. Every job of run 40035862345 passes on the head 06b55609e's tree (that head plus the workflow file):

Case Time
LM-10 (nine roots, oracle, certificates A, B, E) 277 s (280 s and 428 s in two earlier runs)
LM-11, against a lock and records written in scratch (331 s of it the verification) 365 s
LM-12 2 s
LM-09, LM-13, LM-01, LM-03 under 8 s each
LM-08 68 s
LM-02, LM-04, LM-05, LM-06 337 to 394 s each
LM-07 (earlier run 40027798810, same cases) 149 s
conformance_au_04 21 s

fmt, validate-model, validate-spec-links, check-test-inventory and clippy -D warnings pass on the merged head. The draft's own CI cannot show the LM-* cases: its rest leg stops in test at the stale lexlean.lock of examples/collections before bdd starts.

Since the last head

  • origin/release/v0.4 (0208701b4) merged by merge commit; both sides kept in CHANGELOG and VERIFICATION, register 452, stdlib/lexlean.toml lists Buffer, Sha256, Text and TextModels.
  • LM-08 was red: its adapters apply the elaborated classifier, which applies production forms, and the fixture's exact axiom policies said propext (LLV7005). The adapter definition, realization, theorem, evidence and model, and the stream run, now state what Lean observes.
  • stdlib/src/TextModels.lex.tex is its own canonical source again (conformance_au_04): the formatter wraps three long parameter lists, the text of the forms is unchanged.
  • Helpers: none remain; the audit is on #30.

What fails here until the regeneration

The identity move (compiler semantics, production-1.2.toml, the eligibility schema) and the new std tree make every language-1.2 record stale. Every failure of a full ci run on this head (40029277870) that I read is LLC0102 (compiler semantics changed since locking), LLC0105 (the std tree differs from the locked one), or a fixture that differs from its generator:

  • examples/text-models/lexlean.lock and expected/, stdlib/lexlean.lock and stdlib/expected: not written, so LM-11 is red on this head (it passes against records written in scratch).
  • The locks and records of every other project, so formatter_is_idempotent_on_every_example, repro, the examples leg and the cases that lock or snapshot a project fail (bs_04..bs_06, rs_*, md_*, px_*, sp_*, ne_*, cl_23).
  • The fixtures and Lean modules of the calculus (tc_03, tc_04, tc_05), which check-calculus --write regenerates.

🤖 Generated with Claude Code

…ed tests

LM-10 (production of text components, text_rows), LM-11 (examples/text-models)
and LM-12 (coverage of the text-laws helpers), in the R3 order: register row,
SPEC section 31 row, scenario, and a named test that fails because its case is
not wired. The count is 436 on this head and is re-measured when the line moves.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
The first two uniqueness lemmas of the production bridge (LM-10), exported by
the migration round trip and joined to the committed core module; entry 4 of
the text-laws MIGRATION record.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…extModels

Ordinary executable language-1.2 definitions (structural recursion on a list
and on a count) that the stdlib project builds and verifies, the first two
realizations of the text-laws library functions an elaboration applies.
The stdlib records and lock regenerate on the identity the maintainer names.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
claude added 23 commits October 21, 2026 02:13
The of-equality form of the classifier's features_fit law: for any function
equal to fitWidth, the features are unchanged. Proved once by substitution and
exported with entry 4 of the text-laws MIGRATION record, so the generated
proof is one application and the proof language gains no rewrite.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
A package definition is an ordinary definition when imported: the
certificates are those of the importing project's roots. A production clause
on the forms made the stdlib build certify them (about 6 minutes) for no
claim of the package; the forms keep executable and their recursive argument.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…ridge

The classifier's fixed-width map is the production form in
LexLeanStd.TextModels: the elaboration generates fitWidth_bridge (the
production form equals the library's, by fitWidth_of applied to the production
take and zeros with their equations proved by unfolding) and proves
features_fit through features_fit_of and that bridge. A module that declares a
classifier must import LexLeanStd.TextModels and its project list the std
source package; the refusal names the import to write. The language-models
cases build their project in a workspace beside the standard library.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…ibrary

admitRefuse_bridge, admitKeepLast_bridge, pushRefuse_bridge,
pushKeepLast_bridge, keepLast_bridge and the of-equality form of each window
law (bounded, push_bounded, exact, suffix, refuses), exported with the
migration round trip. The refuse path is axiom-free so a refuse window's
exact policy is unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…tModels

fits, dropTokens, keepLast, admitRefuse, admitKeepLast, pushRefuse and
pushKeepLast as ordinary executable definitions.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…rated bridges

The window's fit and push are the production admission and push; the
elaboration generates admit_bridge and push_bridge and proves each law through
the library's of-equality form. A window in a module that does not import
LexLeanStd.TextModels is refused with the import to write.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…able

declaration.context_window (and the other three text declarations) are
runtime in the production registry: the elaborated definitions apply the
production forms in LexLeanStd.TextModels, so a root that calls a window's fit
has the forms in its closure. A window's capacity, admission and push are
executable definitions. A scratch project with a keep_last window behind a
rust-std root verifies, including the preservation certificates.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…t-laws library

tokenId, firstMaxGo, firstMax, chooseGreedy, admitWith, pushWith, genGo,
generateWith and generateGreedy bridges, the of-equality form of the
generator's bounded and context_bounded laws under greedy, and the production
vocabSize bridge with the tokenizer's in_range of-forms, exported with the
migration round trip. The library now imports LexLeanRuntime.Portable and
LexLeanRuntime.Collections, whose checked operations the bridges state.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
tokenIdFrom, tokenId, guard, firstMaxGo, firstMax, chooseGreedy, admitWith,
pushWith, genGo, generateWith, generateGreedy, byteVocab and vocabSize, each
with the axiom policy Lean observes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…uction forms

The greedy generator's run is the production loop, proved equal to the
library's by a generated run_bridge, and bounded and context_bounded are
proved through it; a tokenizer's size is the production vocabSize with a
generated size_bridge. The text laws library may import the runtime modules,
which the verifier now stages before it; a text declaration's definitions are
executable when everything they apply is, and the four text declaration
constructs are runtime.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
xorshift32, the seed read bit by bit as an Int, weight, totalWeight, drawGo,
proportional, chooseSample and generateSample bridges, and the of-equality
forms of the generator's laws under sample, exported with the migration round
trip. The calculus has no widening of a UInt32 to a Nat to state the seed by,
so the production seed is accumulated as an Int and the bridge proves it is
the seed's value.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
xorshift32, seedBits, seedInt, weight, totalWeight, drawGo, proportional,
chooseSample and generateSample, with the axiom policy Lean observes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
… bridge

Both policies now prove bounded and context_bounded through a generated
run_bridge from the production loop to the library's; the sampling bridge
passes through the chooser, the draw, the seed and xorshift32.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
The conversions the production tokenizer reads bytes, tokens and pieces by
(checked widening of a byte, a token read bit by bit, bytes to list, the
table of all byte values), the bridges of the longest-match scan, encode and
decode, and the of-equality forms of the round-trip laws, exported with the
migration round trip. The in_range forms now take the encoder as well as the
size, because the encoder is a production form too.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
The longest-match scan over identifier-carrying entries, encode and decode
over bytes and strings, the token read bit by bit, and the byte table decode
builds bytes from, with the axiom policy Lean observes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
… bridges

encode, decode, encodeText and decodeText are the production forms, each with
a generated bridge to the library's, and roundtrip, in_range and
text_roundtrip are proved through them; the library's loader allows the
runtime imports the bridges state, and the cases expect the new theorems.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
countOf and features bridges and the of-equality forms of the classifier's
width, fit and total laws, exported with the migration round trip.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…ated bridges

features, classifyTokens and classify are executable when the model and the
tokenizer's encoder are, and the three laws are proved through the library's
of-equality forms.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
… contract

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
…eport

A text row states only numbers, closed members, and qualified names: the
eligibility schema patterns its component and bound names, and the audit finds
a free string in any member of a row by the same walk that finds one in a text
declaration. SPEC.md states production of text components (§17.12 rule 11) and
text_rows (§17.13).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BZGMa1Z5Q42SPBuyHhWkbr
Ilya Paveliev and others added 5 commits October 23, 2026 22:31
Register is 452 IDs (449 on the line plus LM-10..LM-12 net of the three the
line already carried); stdlib entrypoints list Buffer, Sha256, Text, TextModels.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…oduction forms

The adapters' definitions, realization, theorem, evidence and model apply the
elaborated Words classifier, which now applies production forms of
LexLeanStd.TextModels. Lean observes Quot.sound as well as propext for them
(LLV7005 on Models.Recognizer.Adapted, scratch run on the merged line), and the
exact policy must name it. The generator's declarations already named all three.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…axioms the width law brings

classify_text_adapted applies Words.features_width, whose of-equality form
observes Classical.choice (LLV7005, scratch run on the merged line); the
evidence and model that cite it carry the same set.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…an observes

The model's generated declarations observe Quot.sound and propext, not the
width law's Classical.choice, and the scan over the window's production forms
observes no axiom (exact policies, LLV7005). conformance_lm_08 passes with the
pinned Lean 4.32.1 in CI (scratch run).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The formatter wraps the long parameter lists of genGo, generateWith and
generateGreedy; conformance_au_04 (one surface) named the file as not
canonical. The text of the forms is unchanged; the stdlib lock and records are
regenerated at the landing.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@humuhumu33
humuhumu33 marked this pull request as ready for review October 23, 2026 23:15

afflom commented Oct 23, 2026

Copy link
Copy Markdown
Member Author

Maintainer: the four commits after c7f1ac891 (b25f132, 477a8d6, e2a9c7c, 06b5560) and the merge of the line at 5847d8a1e are accepted. LM-08's row, scenario and §31 statement are unchanged and byte-equal; the generated test module now carries the axioms the adapters observe through the production forms (["Quot.sound","propext"] on the adapter definition, realization and model, ["Classical.choice","Quot.sound","propext"] on classify_text_adapted and its evidence through Words.features_width, [] on recent_stream_run), the exact-policy answer to LLV7005; TextModels.lex.tex changes are layout only, for conformance_au_04; the register is 452 everywhere and consistent with model/ids.toml; nothing identity-bound moves. The PR lands after the #91 heap half; the stdlib lock, examples/text-models records and LM-11's records regenerate at my landing, which is why LM-11 is red in run 40035862345 and will not be after.


Generated by Claude Code

humuhumu33 and others added 3 commits October 24, 2026 10:02
…30-slice-4

Conflicts were the register count only (README.md, SPEC.md section 31 total,
cases/repository.rs, xtask/src/spec_links.rs). The register is 454: the line's
451 plus the three rows of this branch; CHANGELOG states it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…30-slice-4

Conflicts were the register count only (README.md, SPEC.md section 31 total,
cases/repository.rs, xtask/src/spec_links.rs). The register is 455: the line
gained SP-27 (452) and this branch holds three more rows; CHANGELOG states it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…30-slice-4

The line gained #261 (CL-24, register 453); conflicts were the register count
(README.md, SPEC.md section 31 total, cases/repository.rs, xtask/src/spec_links.rs)
and the CHANGELOG entries, both sides kept. The register is 456: the line plus
this branch's three rows; CHANGELOG states it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@humuhumu33

Copy link
Copy Markdown
Contributor

Head a770343cf: release/v0.4 at fbfaa73fe (with #262, #264 and #261) merged in, one merge commit, no rewrite. The conflicts were the register count only (README.md, SPEC.md §31 total, cases/repository.rs, spec_links.rs) and the two CHANGELOG entries, both kept. The register is 456: the line's 453 plus this branch's three rows (ids.toml has 456 [[id]] rows); the CHANGELOG sentence says it.

Checks run in WSL on this head: cargo fmt --all -- --check clean; validate-model 456 ids; validate-spec-links 456 rows bijective; check-test-inventory 795 tests (294 + 501). check-fixtures is red on the stale locks (LLC0102, "the compiler semantics changed since locking", first at tests/negative/application-arity): the regeneration's debt, as before, not the merge's. Not run locally: the conformance_lm_* cases and the full gate.

LM-11 stays red until the regeneration writes the text-models and stdlib records (lock and expected/), as in my 10-24 note; nothing else in the merge touches it. The CI gate on this head has started; I expect it red only on LLC0102/LLC0105, fixtures against generators and LM-11, like run 40029277870 on the previous head. I will merge the line forward again after the next landing unless you say otherwise.


Generated by Claude Code

…30-slice-4

The line gained #265 (SP-28, register 454); conflicts were the register count
only (README.md, SPEC.md section 31 total, cases/repository.rs,
xtask/src/spec_links.rs). The register is 457: the line plus this branch's
three rows; CHANGELOG states it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@humuhumu33

Copy link
Copy Markdown
Contributor

Head 5f1728fe2: release/v0.4 at 18de05031 (#265 landed) merged in, one merge commit. Conflicts were the register count only; it is 457 (the line's 454 plus this branch's three rows), at README.md, SPEC.md §31, repository.rs, spec_links.rs and the CHANGELOG sentence. Local: fmt clean, validate-model 457 ids, validate-spec-links 457 rows. Unchanged from the last report: check-fixtures is red only on stale locks (LLC0102) and LM-11 waits for the regeneration; the CI gate on this head has started.


Generated by Claude Code

…30-slice-4

The line gained #293 and #297 (identity moved twice; register 456); conflicts
were the register count only (README.md, SPEC.md section 31 total,
cases/repository.rs, xtask/src/spec_links.rs). The register is 459: the line
plus this branch's three rows; CHANGELOG states it. The landing regeneration of
this branch's own records (stdlib and text-models locks and expected/) is still
owed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@humuhumu33

Copy link
Copy Markdown
Contributor

Head c5ee12354: release/v0.4 at 201519a1b (#293 and #297 landed, the compiler-semantics identity moved twice, register 456) merged in, one merge commit. The only conflicts were the register count (README.md, SPEC.md §31, repository.rs, spec_links.rs); it is 459, the line's 456 plus this branch's three rows, and the CHANGELOG sentence says it. Local: fmt clean, validate-model 459 ids, validate-spec-links 459 rows, check-test-inventory 798 tests. Not done and not mine: this branch's own records (stdlib and text-models locks and expected/, calculus fixtures) are still on the old identity, so check-fixtures and LM-11 stay red until the landing regeneration. The CI gate on this head has started.


Generated by Claude Code

afflom commented Oct 25, 2026

Copy link
Copy Markdown
Member Author

Maintainer: c5ee12354 is fine as the base for the landing. This PR is now the fifth landing of the v0.4.1 patch milestone (owner's cut, #92 6399888863): after the tag, the heap half (#298, #304, #305) and the bootstrap stack (#315), then this one with its regeneration (stdlib and text-models locks and expected/, calculus fixtures), which is mine. Nothing to do here until I say the line is ready; the count will move again by then.


Generated by Claude Code

…30-slice-4

The line gained #298, #309 (the 0.4.0 bump) and #318-#320 (release gate; register
457); conflicts were the register count (README.md, SPEC.md section 31 total,
cases/repository.rs, xtask/src/spec_links.rs) and the CHANGELOG. The register is
460: the line plus this branch's three rows. The line records v0.4.0 as tagged at
its own commit, so this branch's entry moves to a new Unreleased section above
0.4.0 instead of joining the released section.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@humuhumu33

Copy link
Copy Markdown
Contributor

Head ed662ef0b: release/v0.4 at 8f5790317 (#298, the 0.4.0 bump #309 and the release-gate work #318 to #320 landed; register 457) merged in, one merge commit. Conflicts: the register count (README.md, SPEC.md §31, repository.rs, spec_links.rs), now 460 (the line's 457 plus this branch's three rows), and the CHANGELOG. The line records v0.4.0 as tagged at its own commit, so this branch's entry sits under a new ## Unreleased above ## 0.4.0 instead of in the released section; say if you want it elsewhere. Local: fmt clean, validate-model 460 ids, validate-spec-links 460 rows, check-test-inventory 799 tests. Not done and not mine: this branch's stdlib and text-models locks and expected/ records and the calculus fixtures are still on the older identity, so check-fixtures and LM-11 stay red until the landing regeneration. The CI gate on this head has started.


Generated by Claude Code

afflom commented Oct 26, 2026

Copy link
Copy Markdown
Member Author

Thanks. ## Unreleased above ## 0.4.0 is the right place: this slice is 0.4.1 material, and the 0.4.0 section describes the tag commit.

Order on the line: landings on release/v0.4 are held until the v0.4.0 tag is pushed (the tag commit is #321's merge; rehearsal 5 was green on the release-gate fix), then #304 (H6, regeneration in progress) and then this one, with the landing regeneration (stdlib and text-models locks and expected/, the calculus fixtures, verify-examples) done by me on your head as before. Nothing more is owed on this branch now; I will merge the line in once more before the landing if it moves again.


Generated by Claude Code

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants