diff --git a/.llm/BETA_25_USER_PROJECT_CONFORMANCE_MATRIX.md b/.llm/BETA_25_USER_PROJECT_CONFORMANCE_MATRIX.md new file mode 100644 index 0000000..50f17ef --- /dev/null +++ b/.llm/BETA_25_USER_PROJECT_CONFORMANCE_MATRIX.md @@ -0,0 +1,95 @@ +# 1.0.0-beta.25 User Project Conformance Matrix + +## Scope + +`1.0.0-beta.25` is a tooling/conformance evidence slice for ordinary +project and workspace usage. It adds a deterministic user-project conformance +matrix over the existing checked examples under `examples/projects/` and +`examples/workspaces/`. + +The matrix is stable-readiness evidence for the beta toolchain. It records +which existing user-shaped example projects and workspaces are expected to +pass `glagol check`, `glagol test --list`, and stable `glagol test` execution +through ordinary Glagol entry points. + +At release time the matrix covers all 43 top-level fixture roots with +`slovo.toml` under those inventories and 655 discovered tests. Environment +fixtures run with deterministic in-test environment values so host shell state +does not decide the result. + +This release changes tooling evidence only. It does not change the Slovo +source language, typed core, runtime behavior, standard-library helper +surface, compiler-known runtime names, package-manager behavior, package graph +semantics, registry behavior, lockfile behavior, semver behavior, ABI/layout +policy, stable schema policy, or performance policy. + +## Contract + +The conformance matrix is deterministic and repository-local: + +- inputs are every top-level `slovo.toml` fixture under the existing + `examples/projects/` and `examples/workspaces/` directories +- entries are sorted by stable repository-relative path +- each entry names the example kind, path, and ordinary project/workspace + test count covered by the matrix +- fixture inventory drift must fail the focused matrix test until the matrix + and release evidence are updated deliberately +- generated evidence must not depend on wall-clock time, host-specific + absolute paths, random ordering, or network access +- matrix output is beta readiness evidence, not a frozen public schema + +The matrix is intended to answer whether normal beta users can exercise the +current example projects and workspaces through the documented toolchain. It +does not promote new language forms, new standard-library helpers, new runtime +capabilities, new package manager behavior, or new compatibility guarantees. + +## Non-Scope + +This scope does not add: + +- source-language syntax or semantics +- typed-core changes +- standard-library helpers or stdlib behavior changes +- compiler-known `std.*` runtime names +- runtime behavior or runtime C capabilities +- package manager behavior +- remote registry behavior +- lockfiles +- semantic-version solving +- package publishing +- optional, dev, target, or feature-gated dependencies +- stable package ABI/layout +- stable artifact-manifest, Markdown, JSON, or conformance-matrix schema + guarantees +- performance thresholds, performance claims, or timing publication +- LSP/watch, SARIF, daemon, coverage, retry, tag/group, or event-stream + protocols + +## Acceptance Criteria + +- README names `1.0.0-beta.25` as the current release and describes the + user-project conformance matrix as tooling/readiness evidence only. +- Language and compiler release notes describe beta25 as a + tooling/conformance evidence slice over existing `examples/projects/` and + `examples/workspaces/`. +- Language and compiler roadmaps record beta25 as the current + stable-readiness evidence slice while keeping language, stdlib, runtime, + package-manager, stable-schema, and performance work deferred. +- The post-beta roadmap records beta25 under tooling/release hardening. +- Glagol is versioned as `1.0.0-beta.25`. +- `compiler/tests/user_project_conformance_beta25.rs` covers all 43 top-level + project/workspace fixture roots and 655 discovered tests. +- Fixture inventory drift is checked against discovered top-level + `slovo.toml` roots. +- `scripts/release-gate.sh` runs the focused beta25 matrix test. +- No compiler, runtime, standard-library, package-manager, registry, lockfile, + semver, ABI/layout, stable-schema, or performance claim is introduced by + the documentation. + +## Suggested Gates + +```bash +git diff --check +cargo fmt --check +cargo test --test user_project_conformance_beta25 +``` diff --git a/.llm/reviews/BETA_25_RELEASE_REVIEW.md b/.llm/reviews/BETA_25_RELEASE_REVIEW.md new file mode 100644 index 0000000..7cc51a8 --- /dev/null +++ b/.llm/reviews/BETA_25_RELEASE_REVIEW.md @@ -0,0 +1,64 @@ +# Beta25 Release Review + +Verdict: PASS. + +## Findings + +No blocking or non-blocking findings in the re-reviewed scope. + +The prior blocking finding is resolved. `compiler/tests/user_project_conformance_beta25.rs` now covers all 43 top-level fixture roots currently discovered under `examples/projects/` and `examples/workspaces/`: 41 project fixtures plus 2 workspace fixtures. The test also asserts the matrix length, total discovered-test count, sorted path order, and exact inventory completeness against discovered top-level `slovo.toml` fixture roots. + +## Acceptance Checklist + +- PASS: The conformance matrix covers every current top-level `slovo.toml` fixture root under `examples/projects/` and `examples/workspaces/`. +- PASS: `assert_matrix_inventory()` asserts the 43-root count, 655 discovered tests, sorted repository-relative path order, exact discovered fixture inventory, and the full expected path/test/run matrix. +- PASS: The test runs `glagol check`, `glagol test --list`, and stable `glagol test` for every matrix entry. +- PASS: Deterministic env fixture handling is wired through `configure_conformance_env()`: expected env variables are set to stable values and intentionally-missing env variables are removed before each Glagol command. +- PASS: `scripts/release-gate.sh` still runs `cargo test --test user_project_conformance_beta25`. +- PASS: `compiler/Cargo.toml` and `compiler/Cargo.lock` both version `glagol` as `1.0.0-beta.25`. +- PASS: README, release notes, roadmaps, and the beta25 matrix doc continue to frame the release as tooling/conformance evidence without claiming language, runtime, stdlib, package-manager, stable-schema, ABI/layout, or performance changes. + +## Verification Commands + +Ran: + +```bash +git status --short +git diff --stat +sed -n '1,620p' compiler/tests/user_project_conformance_beta25.rs +find examples/projects -mindepth 2 -maxdepth 2 -name slovo.toml -printf '%h\n' +find examples/workspaces -mindepth 2 -maxdepth 2 -name slovo.toml -printf '%h\n' +find examples/projects -mindepth 2 -maxdepth 2 -name slovo.toml -printf '.' | wc -c +find examples/workspaces -mindepth 2 -maxdepth 2 -name slovo.toml -printf '.' | wc -c +rg -n "assert_eq!\(MATRIX\.len\(\), 43|discover_fixture_paths|configure_conformance_env|GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT|GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT" compiler/tests/user_project_conformance_beta25.rs +git diff --check +cargo fmt --check +cargo test --test user_project_conformance_beta25 +``` + +Results: + +- `git diff --check`: PASS. +- `cargo fmt --check`: PASS. +- `cargo test --test user_project_conformance_beta25`: PASS, 1 test passed. +- Fixture inventory counts: 41 top-level project roots and 2 top-level workspace roots. +- Matrix inventory assertion: covers 43 roots and 655 discovered tests. + +## Residual Risks + +No release-blocking residual risks remain for this slice. + +## Final Gate Disposition + +The controller reran the full release gate after staging the generated +`docs/language/STDLIB_API.md` beta25 catalog update: + +```bash +./scripts/release-gate.sh +``` + +Result: PASS. The gate reported: + +```text +release gate passed: docs, stdlib API catalog, fmt, tests, promotion, binary, and LLVM smoke checks completed +``` diff --git a/README.md b/README.md index 19cb2d6..f8279e8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This repository is the canonical public monorepo for the language design, standard library source, compiler, runtime, examples, benchmarks, and technical documents. -Current release: `1.0.0-beta.24`. +Current release: `1.0.0-beta.25`. ## Repository Layout @@ -24,7 +24,7 @@ scripts/ local release and document tooling ## Beta Scope -`1.0.0-beta.24` keeps the `1.0.0-beta` language baseline, includes the +`1.0.0-beta.25` keeps the `1.0.0-beta` language baseline, includes the `1.0.0-beta.1` tooling/install hardening slice, the `1.0.0-beta.2` runtime/resource foundation bundle, the `1.0.0-beta.3` standard-library stabilization bundle, the `1.0.0-beta.4` language-usability diagnostics @@ -47,7 +47,8 @@ the `1.0.0-beta.17` JSON primitive scalar parsing foundation, the `1.0.0-beta.22` run manifest and execution report hardening slice, and the `1.0.0-beta.23` standard-library stability tier ledger and catalog alignment slice, and the `1.0.0-beta.24` package manifest identity and local dependency -diagnostic hardening slice. +diagnostic hardening slice, plus the `1.0.0-beta.25` user-project +conformance matrix evidence slice. The language baseline supports practical local command-line, file, and loopback-network programs with: @@ -206,10 +207,21 @@ semantic-version solving, package publishing, optional/dev/target dependencies, stable package ABI/layout, source-language changes, runtime changes, or standard-library changes. +The `1.0.0-beta.25` user-project conformance matrix slice adds deterministic +tooling/readiness evidence over the existing `examples/projects/` and +`examples/workspaces/` inventories. It currently covers all 43 top-level +fixture roots and 655 discovered tests through ordinary `check`, +`test --list`, and stable `test` entry points. The matrix is for ordinary +project and workspace usage evidence only: it does not add source-language +syntax or semantics, standard-library helpers, runtime behavior, package +manager or registry behavior, lockfile behavior, semantic-version solving, +stable schema guarantees, or performance claims. + Still deferred before stable: executable generics, generic aliases, maps/sets, broad package registry semantics, stable artifact-manifest schema, stable -Markdown schema, stable stdlib/API compatibility freeze, DNS/TLS/async -networking, LSP/watch guarantees, SARIF and daemon protocols, stable `1.0.0` +Markdown schema, stable conformance-matrix schema, stable stdlib/API +compatibility freeze, DNS/TLS/async networking, LSP/watch guarantees, SARIF +and daemon protocols, stable `1.0.0` diagnostics freeze, re-exports/globs/hierarchical modules, mutable vectors, slice/view APIs, iterators, additional compiler-known runtime names, stable ABI and layout, @@ -352,6 +364,19 @@ package publishing flow, optional/dev/target dependencies, stable package ABI/layout, source-language behavior, runtime behavior, or standard-library behavior. +## 1.0.0-beta.25 User Project Conformance Matrix + +The `1.0.0-beta.25` release adds deterministic tooling evidence for the +existing user-shaped examples under `examples/projects/` and +`examples/workspaces/`. The conformance matrix is sorted by repository path and +records ordinary `check`, `test --list`, and stable `test` behavior for all +43 top-level fixture roots and 655 discovered tests. + +This scope is stable-readiness evidence only. It adds no source-language +change, standard-library helper change, runtime behavior change, package +manager or registry behavior, lockfile behavior, semantic-version solving, +stable schema freeze, or performance claim. + ## 1.0.0-beta.6 Networking Foundation The `1.0.0-beta.6` release adds a narrow blocking loopback TCP foundation: diff --git a/compiler/Cargo.lock b/compiler/Cargo.lock index b7612e4..a8b7bdd 100644 --- a/compiler/Cargo.lock +++ b/compiler/Cargo.lock @@ -4,4 +4,4 @@ version = 3 [[package]] name = "glagol" -version = "1.0.0-beta.24" +version = "1.0.0-beta.25" diff --git a/compiler/Cargo.toml b/compiler/Cargo.toml index 297e2bd..b832a8b 100644 --- a/compiler/Cargo.toml +++ b/compiler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "glagol" -version = "1.0.0-beta.24" +version = "1.0.0-beta.25" edition = "2021" description = "Glagol, the first compiler for the Slovo language" license = "MIT OR Apache-2.0" diff --git a/compiler/tests/user_project_conformance_beta25.rs b/compiler/tests/user_project_conformance_beta25.rs new file mode 100644 index 0000000..c27b82f --- /dev/null +++ b/compiler/tests/user_project_conformance_beta25.rs @@ -0,0 +1,539 @@ +use std::{ + ffi::OsStr, + fs, + path::{Path, PathBuf}, + process::{Command, Output}, + sync::atomic::{AtomicUsize, Ordering}, + time::{SystemTime, UNIX_EPOCH}, +}; + +static NEXT_TEMP_ID: AtomicUsize = AtomicUsize::new(0); + +struct MatrixEntry { + path: &'static str, + expected_tests: usize, + run_tests: bool, +} + +const MATRIX: &[MatrixEntry] = &[ + MatrixEntry { + path: "examples/projects/basic", + expected_tests: 2, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/enum-imports", + expected_tests: 9, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-cli", + expected_tests: 17, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-env", + expected_tests: 23, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-fs", + expected_tests: 35, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-io", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-json", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-math", + expected_tests: 4, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-net", + expected_tests: 9, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-num", + expected_tests: 5, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-option", + expected_tests: 36, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-process", + expected_tests: 21, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-random", + expected_tests: 2, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-result", + expected_tests: 26, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-string", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-time", + expected_tests: 3, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-vec_bool", + expected_tests: 19, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-vec_f64", + expected_tests: 20, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-vec_i32", + expected_tests: 22, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-vec_i64", + expected_tests: 20, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-import-vec_string", + expected_tests: 19, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-cli", + expected_tests: 17, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-env", + expected_tests: 23, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-fs", + expected_tests: 35, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-io", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-json", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-math", + expected_tests: 7, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-net", + expected_tests: 9, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-num", + expected_tests: 5, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-option", + expected_tests: 36, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-process", + expected_tests: 21, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-random", + expected_tests: 3, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-result", + expected_tests: 26, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-string", + expected_tests: 12, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-time", + expected_tests: 3, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-vec_bool", + expected_tests: 19, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-vec_f64", + expected_tests: 20, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-vec_i32", + expected_tests: 22, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-vec_i64", + expected_tests: 20, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/std-layout-local-vec_string", + expected_tests: 19, + run_tests: true, + }, + MatrixEntry { + path: "examples/projects/stdlib-composition", + expected_tests: 3, + run_tests: true, + }, + MatrixEntry { + path: "examples/workspaces/exp-5-local", + expected_tests: 2, + run_tests: true, + }, + MatrixEntry { + path: "examples/workspaces/std-import-option", + expected_tests: 1, + run_tests: true, + }, +]; + +#[test] +fn user_project_conformance_matrix_checks_lists_and_runs_stable_tests() { + assert_matrix_inventory(); + + let repo_root = repo_root(); + for entry in MATRIX { + let fixture = repo_root.join(entry.path); + assert!( + fixture.join("slovo.toml").is_file(), + "{} must remain an existing project or workspace fixture", + entry.path + ); + + let check = run_glagol( + [OsStr::new("check"), fixture.as_os_str()], + &temp_root(entry.path, "check"), + ); + assert_success_no_stderr(entry.path, "check", &check); + assert_stdout_eq(entry.path, "check", &check, ""); + + let list = run_glagol( + [ + OsStr::new("test"), + OsStr::new("--list"), + fixture.as_os_str(), + ], + &temp_root(entry.path, "list"), + ); + assert_success_no_stderr(entry.path, "test --list", &list); + assert_stdout_contains( + entry.path, + "test --list", + &list, + &format!( + "{} test(s) selected (total_discovered {}, selected {}, passed 0, failed 0, skipped 0, filter none)", + entry.expected_tests, entry.expected_tests, entry.expected_tests + ), + ); + + if entry.run_tests { + let test = run_glagol( + [OsStr::new("test"), fixture.as_os_str()], + &temp_root(entry.path, "test"), + ); + assert_success_no_stderr(entry.path, "test", &test); + assert_stdout_contains( + entry.path, + "test", + &test, + &format!("{} test(s) passed", entry.expected_tests), + ); + } + } +} + +fn assert_matrix_inventory() { + assert_eq!(MATRIX.len(), 43, "beta25 fixture-root count changed"); + assert_eq!( + MATRIX + .iter() + .map(|entry| entry.expected_tests) + .sum::(), + 655, + "beta25 discovered-test count changed" + ); + + let matrix_paths = MATRIX + .iter() + .map(|entry| entry.path.to_owned()) + .collect::>(); + let mut sorted_matrix_paths = matrix_paths.clone(); + sorted_matrix_paths.sort(); + assert_eq!( + matrix_paths, sorted_matrix_paths, + "beta25 user-project conformance matrix must remain sorted by repository-relative path" + ); + + let discovered_paths = discover_fixture_paths(&repo_root()); + assert_eq!( + discovered_paths, matrix_paths, + "beta25 user-project conformance matrix must cover every top-level example project and workspace fixture" + ); + + let inventory = MATRIX + .iter() + .map(|entry| { + format!( + "{}|tests={}|run_tests={}", + entry.path, entry.expected_tests, entry.run_tests + ) + }) + .collect::>() + .join("\n"); + + assert_eq!( + inventory, + concat!( + "examples/projects/basic|tests=2|run_tests=true\n", + "examples/projects/enum-imports|tests=9|run_tests=true\n", + "examples/projects/std-import-cli|tests=17|run_tests=true\n", + "examples/projects/std-import-env|tests=23|run_tests=true\n", + "examples/projects/std-import-fs|tests=35|run_tests=true\n", + "examples/projects/std-import-io|tests=12|run_tests=true\n", + "examples/projects/std-import-json|tests=12|run_tests=true\n", + "examples/projects/std-import-math|tests=4|run_tests=true\n", + "examples/projects/std-import-net|tests=9|run_tests=true\n", + "examples/projects/std-import-num|tests=5|run_tests=true\n", + "examples/projects/std-import-option|tests=36|run_tests=true\n", + "examples/projects/std-import-process|tests=21|run_tests=true\n", + "examples/projects/std-import-random|tests=2|run_tests=true\n", + "examples/projects/std-import-result|tests=26|run_tests=true\n", + "examples/projects/std-import-string|tests=12|run_tests=true\n", + "examples/projects/std-import-time|tests=3|run_tests=true\n", + "examples/projects/std-import-vec_bool|tests=19|run_tests=true\n", + "examples/projects/std-import-vec_f64|tests=20|run_tests=true\n", + "examples/projects/std-import-vec_i32|tests=22|run_tests=true\n", + "examples/projects/std-import-vec_i64|tests=20|run_tests=true\n", + "examples/projects/std-import-vec_string|tests=19|run_tests=true\n", + "examples/projects/std-layout-local-cli|tests=17|run_tests=true\n", + "examples/projects/std-layout-local-env|tests=23|run_tests=true\n", + "examples/projects/std-layout-local-fs|tests=35|run_tests=true\n", + "examples/projects/std-layout-local-io|tests=12|run_tests=true\n", + "examples/projects/std-layout-local-json|tests=12|run_tests=true\n", + "examples/projects/std-layout-local-math|tests=7|run_tests=true\n", + "examples/projects/std-layout-local-net|tests=9|run_tests=true\n", + "examples/projects/std-layout-local-num|tests=5|run_tests=true\n", + "examples/projects/std-layout-local-option|tests=36|run_tests=true\n", + "examples/projects/std-layout-local-process|tests=21|run_tests=true\n", + "examples/projects/std-layout-local-random|tests=3|run_tests=true\n", + "examples/projects/std-layout-local-result|tests=26|run_tests=true\n", + "examples/projects/std-layout-local-string|tests=12|run_tests=true\n", + "examples/projects/std-layout-local-time|tests=3|run_tests=true\n", + "examples/projects/std-layout-local-vec_bool|tests=19|run_tests=true\n", + "examples/projects/std-layout-local-vec_f64|tests=20|run_tests=true\n", + "examples/projects/std-layout-local-vec_i32|tests=22|run_tests=true\n", + "examples/projects/std-layout-local-vec_i64|tests=20|run_tests=true\n", + "examples/projects/std-layout-local-vec_string|tests=19|run_tests=true\n", + "examples/projects/stdlib-composition|tests=3|run_tests=true\n", + "examples/workspaces/exp-5-local|tests=2|run_tests=true\n", + "examples/workspaces/std-import-option|tests=1|run_tests=true", + ), + "beta25 user-project conformance matrix changed without updating the inventory assertion" + ); +} + +fn discover_fixture_paths(repo_root: &Path) -> Vec { + let mut paths = Vec::new(); + for parent in ["examples/projects", "examples/workspaces"] { + let parent_path = repo_root.join(parent); + for entry in fs::read_dir(&parent_path).unwrap_or_else(|err| { + panic!( + "read fixture inventory `{}`: {}", + parent_path.display(), + err + ); + }) { + let entry = entry.unwrap_or_else(|err| { + panic!( + "read fixture entry under `{}`: {}", + parent_path.display(), + err + ); + }); + let path = entry.path(); + if path.join("slovo.toml").is_file() { + paths.push( + path.strip_prefix(repo_root) + .expect("fixture path under repository root") + .to_string_lossy() + .replace('\\', "/"), + ); + } + } + } + paths.sort(); + paths +} + +fn repo_root() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")) + .parent() + .expect("compiler crate has repository parent") + .to_path_buf() +} + +fn run_glagol(args: I, cwd: &Path) -> Output +where + I: IntoIterator, + S: AsRef, +{ + fs::create_dir_all(cwd).unwrap_or_else(|err| { + panic!("create command cwd `{}`: {}", cwd.display(), err); + }); + let mut command = Command::new(env!("CARGO_BIN_EXE_glagol")); + configure_conformance_env(&mut command); + command + .args(args) + .current_dir(cwd) + .output() + .expect("run glagol") +} + +fn configure_conformance_env(command: &mut Command) { + for key in [ + "GLAGOL_STD_IMPORT_ENV_ALPHA_UNLIKELY_MISSING", + "GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_UNLIKELY_MISSING", + ] { + command.env_remove(key); + } + + for (key, value) in [ + ( + "GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT", + "glagol-std-import-env-alpha-value", + ), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_I32", "42"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_I64", "42000000000"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_U32", "42"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_U64", "4294967296"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_F64", "42.5"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_PRESENT_BOOL", "true"), + ("GLAGOL_STD_IMPORT_ENV_ALPHA_INVALID", "not-a-number"), + ( + "GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT", + "glagol-std-layout-local-env-alpha-value", + ), + ("GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_I32", "42"), + ( + "GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_I64", + "42000000000", + ), + ("GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_U32", "42"), + ( + "GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_U64", + "4294967296", + ), + ("GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_F64", "42.5"), + ("GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_PRESENT_BOOL", "true"), + ("GLAGOL_STD_LAYOUT_LOCAL_ENV_ALPHA_INVALID", "not-a-number"), + ] { + command.env(key, value); + } +} + +fn temp_root(path: &str, command: &str) -> PathBuf { + let id = NEXT_TEMP_ID.fetch_add(1, Ordering::Relaxed); + let nanos = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("system clock before UNIX_EPOCH") + .as_nanos(); + let fixture = path + .chars() + .map(|ch| if ch == '/' || ch == '-' { '_' } else { ch }) + .collect::(); + std::env::temp_dir().join(format!( + "glagol-user-project-conformance-beta25-{}-{}-{}-{}-{}", + std::process::id(), + nanos, + id, + fixture, + command + )) +} + +fn assert_success_no_stderr(fixture: &str, command: &str, output: &Output) { + assert!( + output.status.success(), + "{} `{}` failed\nstatus: {:?}\nstdout:\n{}\nstderr:\n{}", + fixture, + command, + output.status.code(), + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + assert!( + output.stderr.is_empty(), + "{} `{}` wrote stderr:\n{}", + fixture, + command, + String::from_utf8_lossy(&output.stderr) + ); +} + +fn assert_stdout_eq(fixture: &str, command: &str, output: &Output, expected: &str) { + assert_eq!( + String::from_utf8_lossy(&output.stdout), + expected, + "{} `{}` stdout mismatch", + fixture, + command + ); +} + +fn assert_stdout_contains(fixture: &str, command: &str, output: &Output, needle: &str) { + let stdout = String::from_utf8_lossy(&output.stdout); + assert!( + stdout.contains(needle), + "{} `{}` stdout did not contain `{}`:\n{}", + fixture, + command, + needle, + stdout + ); +} diff --git a/docs/POST_BETA_ROADMAP.md b/docs/POST_BETA_ROADMAP.md index 8cceb51..424940f 100644 --- a/docs/POST_BETA_ROADMAP.md +++ b/docs/POST_BETA_ROADMAP.md @@ -56,6 +56,15 @@ LSP/watch behavior, SARIF/daemon protocols, JSON expansion, runtime helper names, source-language syntax, package registries, semver solving, or performance claims. +Released in `1.0.0-beta.25`: user-project conformance matrix evidence. The +scope adds a deterministic matrix over the existing `examples/projects/` and +`examples/workspaces/` inventories so ordinary project and workspace usage has +stable-readiness evidence across all 43 top-level fixture roots and 655 +discovered tests. It is tooling/conformance evidence only: no +source-language change, standard-library helper change, runtime behavior +change, package manager or registry behavior, lockfile behavior, +semantic-version solving, stable schema freeze, or performance claim. + Why first: it reduces friction for every later feature and gives users a better way to exercise the beta. @@ -567,7 +576,8 @@ Slovo should not become stable until all of these are true: - package/workspace behavior is deterministic - package manifest identity and dependency-key failures have explicit diagnostics -- conformance tests cover user-shaped projects +- conformance tests and matrix evidence cover user-shaped projects and + workspaces - release gates are reproducible on a clean checkout - diagnostics and formatter output are stable for promoted features - performance publications are repeatable and labeled as local-machine evidence diff --git a/docs/compiler/RELEASE_NOTES.md b/docs/compiler/RELEASE_NOTES.md index 2b84bc2..341cdb1 100644 --- a/docs/compiler/RELEASE_NOTES.md +++ b/docs/compiler/RELEASE_NOTES.md @@ -12,6 +12,40 @@ integration/readiness release, not the first real beta. No active unreleased compiler scope is documented here yet. +## 1.0.0-beta.25 + +Release label: `1.0.0-beta.25` + +Release date: 2026-05-23 + +Release state: user-project conformance matrix evidence + +### Summary + +The beta.25 compiler/tooling slice adds deterministic stable-readiness +evidence for ordinary project and workspace usage without changing the +language, runtime, stdlib, or package manager model: + +- Add a user-project conformance matrix over all 43 top-level fixture roots + under existing `examples/projects/` and `examples/workspaces/`, covering + 655 discovered tests. +- Keep matrix inputs repository-local and deterministically sorted by + repository-relative path. +- Record ordinary `check`, `test --list`, and stable `test` behavior for each + existing example in the matrix. +- Treat matrix output as beta tooling evidence rather than a stable public + schema. + +### Explicit Deferrals + +This release does not implement source-language change, standard-library +helper change, runtime behavior change, compiler-known `std.*` runtime names, +package manager behavior, remote registries, lockfiles, semantic-version +solving, package publishing, optional/dev/target dependencies, stable +artifact-manifest schema guarantees, stable Markdown schemas, stable +conformance-matrix schema guarantees, LSP/watch/SARIF/daemon protocols, stable +ABI/layout, or performance claims. + ## 1.0.0-beta.24 Release label: `1.0.0-beta.24` diff --git a/docs/compiler/ROADMAP.md b/docs/compiler/ROADMAP.md index 0d0f1ab..fabf076 100644 --- a/docs/compiler/ROADMAP.md +++ b/docs/compiler/ROADMAP.md @@ -21,8 +21,8 @@ general-purpose beta release. A Glagol feature is done only when it has parser/lowerer support, checker behavior, diagnostics for invalid forms, backend behavior or explicit unsupported diagnostics, and tests. -Current stage: `1.0.0-beta.24`, released on 2026-05-23 as package manifest -identity and local dependency diagnostic hardening. It keeps the +Current stage: `1.0.0-beta.25`, released on 2026-05-23 as user-project +conformance matrix evidence. It keeps the `1.0.0-beta` language/compiler support baseline and includes the `1.0.0-beta.1` tooling hardening release, the `1.0.0-beta.2` runtime/resource foundation release, the `1.0.0-beta.3` standard-library stabilization release, @@ -139,10 +139,21 @@ lockfile, semantic-version solving, package publishing, optional/dev/target dependencies, stable package ABI/layout, source-language behavior, runtime behavior, or standard-library behavior. +The beta.25 compiler/tooling slice adds deterministic stable-readiness +evidence for ordinary project and workspace usage over the existing +`examples/projects/` and `examples/workspaces/` inventories. The conformance +matrix is repository-local, sorted by stable path, and records ordinary +`check`, `test --list`, and stable `test` behavior for all 43 top-level +fixture roots and 655 discovered tests. It adds no source-language behavior, +runtime behavior, standard-library helper behavior, package manager or +registry behavior, lockfile behavior, semantic-version solving, stable schema +freeze, or performance claim. + Generic vectors, generic collections, maps, sets, generic stdlib dispatch, runtime collection changes, collection unification, stable human diagnostic -text, stable artifact-manifest or Markdown schema freezes, LSP/watch -protocols, SARIF/daemon protocols, re-exports/globs/hierarchical modules, +text, stable artifact-manifest, Markdown, or conformance-matrix schema +freezes, LSP/watch protocols, SARIF/daemon protocols, +re-exports/globs/hierarchical modules, registry semantics, semver solving, mutable vectors, stable slice/view APIs, tokenizers, broader JSON parsing, runtime helper names, source-language syntax, parallel test execution, retries, tags/groups, coverage/event streams, diff --git a/docs/language/RELEASE_NOTES.md b/docs/language/RELEASE_NOTES.md index 23a149b..90fe352 100644 --- a/docs/language/RELEASE_NOTES.md +++ b/docs/language/RELEASE_NOTES.md @@ -8,7 +8,7 @@ Historical `exp-*` releases listed here are experimental maturity milestones. The pushed tag `v2.0.0-beta.1` is historical. It is now documented as an experimental integration/readiness release, not as a beta maturity claim. -The current release is `1.0.0-beta.24`, published on 2026-05-23. It keeps the +The current release is `1.0.0-beta.25`, published on 2026-05-23. It keeps the `1.0.0-beta` language surface, includes the first post-beta tooling/install hardening bundle from `1.0.0-beta.1`, and adds the first runtime/resource foundation bundle from `1.0.0-beta.2` plus the first standard-library @@ -33,14 +33,38 @@ conformance foundation from `1.0.0-beta.19`, and the string search and ASCII trim foundation from `1.0.0-beta.20`, plus the JSON document scalar parsing foundation from `1.0.0-beta.21`, and the run manifest execution-report hardening slice from `1.0.0-beta.22`, plus the standard-library stability tier -ledger and catalog alignment slice from `1.0.0-beta.23`, and the package -manifest identity and local dependency diagnostic hardening slice from -`1.0.0-beta.24`. +ledger and catalog alignment slice from `1.0.0-beta.23`, the package manifest +identity and local dependency diagnostic hardening slice from +`1.0.0-beta.24`, and the user-project conformance matrix evidence slice from +`1.0.0-beta.25`. ## Unreleased No active unreleased language scope is documented here yet. +## 1.0.0-beta.25 + +Release label: `1.0.0-beta.25` + +Release name: User Project Conformance Matrix + +Release date: 2026-05-23 + +Status: released beta tooling/conformance evidence on the `1.0.0-beta` +language baseline. + +This release adds deterministic stable-readiness evidence for ordinary +project and workspace usage over the existing `examples/projects/` and +`examples/workspaces/` inventories. The conformance matrix records +repository-local example coverage for all 43 top-level fixture roots and 655 +discovered tests through ordinary Glagol project/workspace entry points. + +This release adds no source-language change, standard-library helper change, +runtime behavior change, compiler-known runtime names, package manager or +registry behavior, lockfile behavior, semantic-version solving, stable +artifact-manifest schema, stable Markdown schema, stable conformance-matrix +schema, stable ABI/layout, or performance claim. + ## 1.0.0-beta.24 Release label: `1.0.0-beta.24` diff --git a/docs/language/ROADMAP.md b/docs/language/ROADMAP.md index 7917fd0..0cb4fed 100644 --- a/docs/language/ROADMAP.md +++ b/docs/language/ROADMAP.md @@ -8,9 +8,9 @@ Guiding rule: the manifest wins. A feature is not accepted until it has surface Long-horizon planning lives in `.llm/ROADMAP_TO_STABLE.md`. It defines the release train beyond the first real general-purpose beta Slovo contract. -Current stage: `1.0.0-beta.24`, released on 2026-05-23 as post-beta -package manifest identity and local dependency diagnostic hardening. It keeps -the `1.0.0-beta` language contract and includes the `1.0.0-beta.1` tooling +Current stage: `1.0.0-beta.25`, released on 2026-05-23 as post-beta +user-project conformance matrix evidence. It keeps the `1.0.0-beta` language +contract and includes the `1.0.0-beta.1` tooling hardening release, the `1.0.0-beta.2` runtime/resource foundation release, the `1.0.0-beta.3` standard-library stabilization release, the `1.0.0-beta.4` @@ -29,8 +29,9 @@ scalar token parsing, `1.0.0-beta.18` JSON string token parsing, `1.0.0-beta.20` string search and ASCII trim helpers, plus `1.0.0-beta.21` JSON document scalar parsing helpers, and `1.0.0-beta.22` run manifest execution-report hardening, plus -`1.0.0-beta.23` standard-library stability tier documentation, and -`1.0.0-beta.24` package manifest/dependency diagnostic hardening. +`1.0.0-beta.23` standard-library stability tier documentation, +`1.0.0-beta.24` package manifest/dependency diagnostic hardening, and +`1.0.0-beta.25` user-project conformance matrix evidence. `1.0.0-beta.16` adds `std.string` source facades and examples for `byte_at_result`, `slice_result`, `starts_with`, and `ends_with`. These helpers @@ -127,6 +128,16 @@ It adds no remote registry, lockfile, semantic-version solving, package publishing, optional/dev/target dependencies, stable package ABI/layout, source-language change, runtime change, or stdlib change. +`1.0.0-beta.25` is tooling/conformance evidence, not a language, stdlib, +runtime, package-manager, schema-freeze, or performance feature. It adds a +deterministic user-project conformance matrix over the existing +`examples/projects/` and `examples/workspaces/` inventories so ordinary +project and workspace usage has stable-readiness evidence. The release covers +all 43 top-level fixture roots and 655 discovered tests. It adds no +source-language change, standard-library helper change, runtime behavior +change, package manager or registry behavior, lockfile behavior, +semantic-version solving, stable schema freeze, or performance claim. + The final experimental precursor scope is `exp-125`, defined in `.llm/EXP_125_UNSIGNED_U32_U64_NUMERIC_AND_STDLIB_BREADTH_ALPHA.md`. Its unsigned direct-value flow, parse/format runtime lanes, and matching staged diff --git a/docs/language/STDLIB_API.md b/docs/language/STDLIB_API.md index 155fe40..9dd7953 100644 --- a/docs/language/STDLIB_API.md +++ b/docs/language/STDLIB_API.md @@ -6,7 +6,7 @@ Do not edit this file by hand. ## Stability Tiers - `beta-supported`: exported from `lib/std` and covered by source-search, promotion, or facade gates in the current beta line. -- `experimental`: exported from `lib/std` in `1.0.0-beta.24`, but still has beta caveats around host behavior, resource handles, or API shape. +- `experimental`: exported from `lib/std` in `1.0.0-beta.25`, but still has beta caveats around host behavior, resource handles, or API shape. - `internal`: helper names that are not exported from their module; they are intentionally omitted from this catalog. The catalog is a beta API discovery aid, not a stable `1.0.0` standard-library freeze. diff --git a/scripts/release-gate.sh b/scripts/release-gate.sh index 316dc8f..bf0f5b9 100755 --- a/scripts/release-gate.sh +++ b/scripts/release-gate.sh @@ -77,6 +77,7 @@ cargo test --test standard_string_search_trim_beta20 cargo test --test standard_json_document_scalar_parsing_beta21 cargo test --test run_manifest_beta22 cargo test --test package_workspace_discipline_beta24 +cargo test --test user_project_conformance_beta25 # Full cargo test includes unignored integration gates such as dx_v1_7, # beta_v2_0_0_beta_1, and beta_1_0_0. cargo test