Repository navigation
[0.5.0] #113: release identity, §2.3 completion release 0.5.0 and §30 for languages 1.0-1.2 (RP-17, CL-18) - #288
Conversation
…elease for every supported language (#113) §2.3 names the completion release: 0.5.0 when it satisfies the §30.4 criterion, 1.0.0 otherwise. §30.1 lists the three language identifiers, one compiler-semantics ID each, and says what identifies a release. §30.3 makes the completion release the one that publishes, publishes every language's semantics ID, and reports each language with its ID. §30.4 ties the criterion to the completion release instead of "LexLean 1.0". Edited with `cargo xtask spec`; SPEC.md regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se identity (#113) RP-17 (new): `release-check` reads the completion release from §2.3 and the version report from §30.3 out of the chapter modules. CL-18 (amended): the version output reports every supported language, each with its own compiler-semantics ID. conformance_rp_17 has no case wired; conformance_cl_18 expects the new report, which the binary does not print yet. Register 444. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reads §2.3 and §30.3 (#113) `lexlean --version` prints each supported language followed by its own compiler-semantics ID. `release::criterion` projects the chapter modules and reads the completion releases from the §2.3 sentence and the version report from the §30.3 fence; `check` requires the workspace version to be one §2.3 names, the staged report to be that fence filled in, its languages to be the compiler's, and the semantics-ID list to name each. RELEASE_VERSION is gone. `release-artifacts` writes one `<language> <ID>` line per language and adds `compiler_semantics_ids` to the release identity. The RP-17 case plants each item on a scratch tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nts recorded (#113) README and CHANGELOG state §2.3's completion release and the per-language version report. release.yml allows only `source-tag` before the completion release, since the version report now carries the tagged version and holds at every version. VERIFICATION.md records the chapter and reader plants. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…not a four-line count (#113) The `binaries` step required `--version` to print exactly four lines, the report before CL-18 was amended; with the eight-line report every `binary` job would have failed and `publish` never run (found by the #128 audit). The step now reads the §30.3 fence of SPEC.md, the text CL-18 reads: the fence's line count, the first line with the tagged version, each `<digest>` a 64-hex-digit ID, every other line exact. Recorded in VERIFICATION.md: the release binary passes; a report missing language 1.2, the four-line report, a truncated ID, swapped languages and a wrong version each fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The #128 audit (comment) found a defect at this PR's head. The The step's shell was run locally against the release binary, which passed. It was also run against a report missing language 1.2 and the old four-line report, and both failed. All of these runs are recorded in VERIFICATION.md under the RP-17 plants. The PR body has a "release.yml version check" section with the details. Generated by Claude Code |
|
Maintainer: read, and in the Generated by Claude Code |
|
Maintainer review of Blocking (mechanical): the merge with Should fix (R2): Nits: CHANGELOG.md:25-27 says What checked out: §2.3 names the completion release (0.5.0 when §30.4 holds, else 1.0.0); §30.1 lists 1.0, 1.1, 1.2 with one semantics ID each; the §30.3 fence is Generated by Claude Code |
|
Maintainer: #287 is on Generated by Claude Code |
Both sides added at the CHANGELOG Unreleased top and the VERIFICATION end; both are kept in the order the line landed them. The register is 445 with AU-14 (#241): README count, SPEC.md §31 total (regenerated), CHANGELOG. The AU-14/#241 Unreleased bullet that #287 lacked is added, ending Register 444, before this change's bullet, which ends Register 445. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ailing (#113) Maintainer round on #288 (R2): release-check compared the staged version report with the staged semantics-ID list, both written by release-artifacts from one --version run. Two plants on the scratch tree: language 1.1 listed with an ID that is not the compiled-in one must be refused as semantics-id naming the compiler's ID, and a list and report agreeing on such an ID must be refused as semantics-id and version-output. On the unfixed check the case fails at the first plant: semantics-id is not refused (repository.rs:2283). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iler's (#113) Maintainer round on #288 (R2). check builds the lookup from lexlean::compiler_semantics_id_for(language).to_hex() over LANGUAGE_VERSIONS. semantics-id refuses a listed ID that differs, naming the compiled-in ID, and a listed language the compiler does not support; version-output renders the §30.3 report with the same lookup, so neither staged file is held only to the other (release-artifacts writes both from one --version run). The CRITERIA texts say so, and the release.yml comment at the binaries step describes the check that now exists. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Maintainer: One line before I merge, by §27.9: the new plant is recorded nowhere in VERIFICATION (the RP-17 section at Generated by Claude Code |
… (#113) cargo xtask release-check on the committed tree with the binary's report and list staged under release/: language 1.1 listed with its first hex digit changed is refused as semantics-id naming the compiled-in ID; with the report changed to agree, semantics-id and version-output are both refused; both real, neither is. The unfixed check's failure at the skeleton commit is recorded beside them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The round is pushed. The head is 1. Merge (blocking). 2. AU-14 bullet. It is in 3. The ID comparison (R2).
Your 12:31 line. When the report was also changed to agree with the list, both 4. Nits. The CHANGELOG bullet now says Run locally in WSL on Linux x86-64 at
Generated by Claude Code |
|
Maintainer: Generated by Claude Code |
|
Last base merge done as asked: |
RP-11 reads the range against the register: RP-17 is #288 on release/v0.5, so on this line the last RP ID is RP-18. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Merged into |
…ail-call CHANGELOG.md conflicted again on the unreleased entries (#288 moved the AU-14 bullet); both sides are kept, the line's before RB-21. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…279) `just vv (rest)` on 6085271 failed eight cases. `rb_02`..`rb_05`, `rb_07`, `gc_01` and `gn_01` compared the 351 committed packages, provenance files and negative manifests under compiler/rust with their generator: their `sources` named the compiler build's semantic ID before the identity move (7a08f62b…) while compiler/expected/build/manifest.json names the build after it (3d5f7b04…), because `check-calculus --write` ran before the compiler record was regenerated. `check-calculus --write` rewrites them; nothing else in a record changes. `ns_01` found `spec/src/IdsRB.lex.tex` not canonical: `lexlean fmt` adds the blank line before `rb21`. With #288 (RP-17) on release/v0.5 the register holds 446 IDs: README's count sentence and SPEC.md's total (`validate-model --write`) say so. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…otheses # Conflicts: # CHANGELOG.md # VERIFICATION.md
…e-116-overflow-bound CHANGELOG keeps both sides, the line first; VERIFICATION auto-merged. README counts 448 registered IDs (AU-14 and RP-17 landed on the line); SPEC.md takes the line and is regenerated by validate-model --write. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The merge of #288 kept its count of 445 in the generated total; the register has 446 rows. Regenerated by validate-model --write. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e-bounds CHANGELOG and VERIFICATION keep both sides, the line first. README takes the line, counts 448 registered IDs (RP-17, PC-01 and PC-02 landed) and ends the PF row at PF-24. SPEC.md and spec/lexlean.lock take the line and are regenerated in the next commit. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Resolves #113 (plan item L1.2 of #106) on the v0.5 line. Against
release/v0.5, which is merged in at e600b58 (#285, #286, #287).The amended text
Edited in
spec/src/Chapter02.lex.texandspec/src/Chapter30.lex.texwithcargo xtask spec(each edit byte-checked against the intended SPEC.md); SPEC.md is the projection.§2.3, the last paragraph (the rule for
1.0.0is kept as the fallback):§30.1, the list gains the three identifiers and one semantics ID per language, and a paragraph says what identifies a release:
§30.3:
§30.4, the lead only, because "complete for LexLean 1.0" no longer names the release:
The §30.4 lead is one line outside the three paragraphs #113 names. Say if you want it left as it was.
Rows (R3 order: skeleton commit 093adfb, failing, before the implementation)
RP-17repository, §2.3, §30.3cargo xtask release-checkreads the completion release from §2.3 and the version report from §30.3 as the chapter modules of the specification project state them, and refuses a workspace version §2.3 does not name, a version report or semantics-ID list that is not the §30.3 report for the release version and each language's ID, and a §30.3 report whose languages are not the languages the compiler supports, a plant in either chapter item changing what it refuses.CL-18CL-18 is amended rather than duplicated, so the version report has one register row (C6), as #226 extended RP-14. Register 443 → 445:
AU-14(#241, merged in fromrelease/v0.5) is the 444th row andRP-17the 445th.At the skeleton head both tests failed for the intended reason:
What changed
crates/lexlean/src/cli.rs): everyLANGUAGE_VERSIONSentry withcompiler_semantics_id_forof that language. Thelexleanline and the firstlanguage/compiler-semanticspair are unchanged, so a reader that takes the first semantics line still gets language 1.0's. No identity moves: the CLI is not in the embedded tree.release-check(crates/model/src/release.rs):release::criterion(root)projects the chapter modules and reads the completion versions from the §2.3 sentence beginning "The completion release" and the report from the §30.3textfence beginninglexlean <version>.RELEASE_VERSION = "1.0.0"is gone.source-tagrequires the workspace version to be one §2.3 names;version-outputrequires the staged report to be the fence with the workspace version and each language's ID, and the fence's languages to belexlean::LANGUAGE_VERSIONS;semantics-idrequires one<language> <ID>line per reported language, each ID the one compiled into the compiler for that language (lexlean::compiler_semantics_id_for(language).to_hex()), andversion-outputis rendered with the same compiled-in IDs, so each staged file is held to the source and not to the other file (the maintainer's round; before it, the report was compared with the staged list, both written byrelease-artifactsfrom one--versionrun). A specification that does not say refuses both version criteria.release-artifacts(xtask): writescompiler-semantics-id.txtas one<language> <ID>line per language, and writesrelease-identity.jsonwithcompiler_semantics_id(language 1.0's, as before) andcompiler_semantics_ids.release-checkreads neither JSON field; the file is what the artifacts step writes, not a criterion.release.yml: the allowance before the completion release issource-tagalone.version-outputnow holds at every version, because the report carries the tagged version, so a pre-completion tag whose report is wrong now fails. Comments and release notes name the completion release instead of1.0.0.Version output now
release.yml version check
The #128 audit (comment) found that
release.yml'sbinariesstep still required--versionto print exactly four lines, so with the eight-line report everybinary (<target>)job would fail andpublishnever run. Fixed in 1b673fb.The step, now "The binary reports the §30.3 identity", reads the §30.3 fence of SPEC.md, the same text CL-18 reads. It expects the fence's line count, the
lexleanline with the tagged version, each<digest>as a 64-hex-digit ID, and every other line exactly. No count is written in the workflow. The exact IDs are compared inpublish:release-checkholds each ID thatrelease-artifactslists and reports from its own build of the tagged source to the ID compiled into that source, and refusessemantics-idandversion-outputon a difference (added in the maintainer's round; the comment atrelease.ymllines 176-177 now describes that check).Its shell was run as written on Linux x86-64 against the release binary and five plants; all are recorded in VERIFICATION.md under the RP-17 plants:
--version printed 6 lines, not the 8 of the §30.3 report, exit 1--version printed 4 lines, not the 8 of the §30.3 report, exit 1VERSIONAfter the change:
cargo xtask validate-modelreports 445 ids, clean;conformance_cl_18andconformance_rp_01toconformance_rp_17pass.Maintainer round (2026-10-23)
On
release/v0.5at e600b58, in five commits after1b673fb4f:db786cc48release/v0.5at bde798b (merge commit, no rebase); CHANGELOG.md and VERIFICATION.md keep both sides in landing order; README "All 445 registered conformance IDs",AU-01..AU-14; SPEC.md §31 total 445 bycargo xtask validate-model --write; the AU-14/#241 Unreleased bullet ending "Register 444" before this change's, ending "Register 445"; this change's bullet phrasesrelease-identity.jsonas whatrelease-artifactswritesf76d22e1drp_17()and the RP-17 scenario'sAndline. On the unfixedcheckthe case fails at the first plant:a list giving language 1.1 another ID is not refused as semantics-id (repository.rs:2283)fe83d572erelease/v0.5at e600b58 (#286 landed during the round); its CHANGELOG bullet goes between this change's and AU-14's; no register row, the count stays 44512bb58230release::checkbuilds the lookup fromlexlean::compiler_semantics_id_for(language).to_hex()overLANGUAGE_VERSIONS, refusessemantics-idfor a listed ID that differs (and a listed language the compiler does not support), and rendersversion-outputwith the same lookup;CRITERIAtexts and therelease.ymlcomment say so40483e759The plant,
cargo xtask release-checkon the committed tree with the binary's report and list staged underrelease/, language 1.1's listed ID with its first hex digit changed:With the report changed to agree with the list, as one
--versionrun of a compiler with that ID would stage both,semantics-idis refused as above andversion-outputwithmust be exactly:the compiled-in report. Both real: neither is refused.Gates
Run in WSL on Linux x86-64 at
12bb58230(validate-modelagain at40483e759, which changes only VERIFICATION.md):cargo fmt --all -- --checkcargo xtask validate-modeldocuments current, 445 ids, 86 codes, meta-gate and audits clean (R1)cargo xtask validate-spec-links445 table rows bijective with the register (RP-07)cargo clippy -p repo-model -p repo-conformance -p xtask --all-targets --all-features -- -D warningscargo test -p repo-modelconformance_rp_11,conformance_rp_12,conformance_rp_17conformance_cl_*Sibling work
#285, #286 and #287 are merged in (above). None of them overlaps this change outside the CHANGELOG top and the register count.
Not verified
just vvwhole was not run; only the gates above. The full gate runs on CI when the pull request is marked ready.release.ymlwas not run as a workflow. Its edits are the allowance (nowsource-tagonly), comments, notes,paste -sd ','over the multi-line semantics file, and the identity step, whose shell alone was run locally (above).X.Y.Zversions in it. Rewording that sentence makesrelease-checkrefuse both version criteria, never pass them; the RP-17 case plants that.🤖 Generated with Claude Code