Compare commits
3 Commits
1.0.0-beta
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
573052fe00 | ||
|
|
b241a8a812 | ||
|
|
05ff5be5c5 |
@ -0,0 +1,73 @@
|
|||||||
|
# 1.0.0-beta.23 Standard Library Stability Tier Ledger And Catalog Alignment
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
`1.0.0-beta.23` is a documentation/catalog clarity slice for the standard
|
||||||
|
library. It adds a public stability-tier ledger and aligns the surrounding
|
||||||
|
README, roadmap, release-note, and specification text with the generated API
|
||||||
|
catalog boundary.
|
||||||
|
|
||||||
|
This release does not change the source language, typed core, runtime
|
||||||
|
capabilities, standard-library helper surface, compiler-known runtime names,
|
||||||
|
ABI/layout policy, or package behavior. It does change generated catalog
|
||||||
|
output and release-gate checks so tier metadata is visible and enforced.
|
||||||
|
|
||||||
|
## Contract
|
||||||
|
|
||||||
|
The public standard-library docs use exactly these tier labels:
|
||||||
|
|
||||||
|
- `beta-supported`
|
||||||
|
- `experimental`
|
||||||
|
- `internal`
|
||||||
|
|
||||||
|
The generated `docs/language/STDLIB_API.md` catalog remains the exact exported
|
||||||
|
signature inventory generated from `lib/std/*.slo`. The new
|
||||||
|
`docs/language/STDLIB_TIERS.md` ledger records maturity and stability
|
||||||
|
expectations for those helpers and surrounding standard-library domains.
|
||||||
|
|
||||||
|
Experimental domains in the beta23 ledger include JSON, loopback networking,
|
||||||
|
random/time, and filesystem resource-handle helpers. Concrete vector modules
|
||||||
|
remain beta-supported concrete lanes; they are not a generic collections
|
||||||
|
freeze and do not imply executable generics, maps, sets, iterators, mutable
|
||||||
|
vectors, slice/view APIs, runtime collection changes, or stable ABI/layout.
|
||||||
|
|
||||||
|
## Non-Scope
|
||||||
|
|
||||||
|
This scope does not add:
|
||||||
|
|
||||||
|
- source-language syntax
|
||||||
|
- standard-library helpers
|
||||||
|
- compiler-known `std.*` runtime names
|
||||||
|
- runtime C capabilities
|
||||||
|
- package, workspace, import, or registry behavior
|
||||||
|
- stable standard-library/API compatibility freeze
|
||||||
|
- stable manifest schema freeze
|
||||||
|
- stable Markdown schema freeze
|
||||||
|
- stable ABI/layout
|
||||||
|
- performance claims
|
||||||
|
- beta maturity beyond the existing `1.0.0-beta` line
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
- `docs/language/STDLIB_TIERS.md` defines the public tier labels and their
|
||||||
|
current meaning.
|
||||||
|
- The tier ledger marks JSON, loopback networking, random/time, and filesystem
|
||||||
|
resource-handle helpers as experimental domains.
|
||||||
|
- The tier ledger records concrete vector modules as beta-supported concrete
|
||||||
|
lanes without claiming generic collection stability.
|
||||||
|
- README, `lib/std/README.md`, language release notes, language roadmap,
|
||||||
|
post-beta roadmap, and the v1 spec link or describe the tier ledger.
|
||||||
|
- Documentation states beta23 is docs/catalog tooling clarity only and does
|
||||||
|
not add language, stdlib, runtime, stable schema, or stable API behavior.
|
||||||
|
- The generated API catalog emits tier metadata, and the release gate checks
|
||||||
|
that experimental tiers remain represented.
|
||||||
|
|
||||||
|
## Suggested Gates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node --check scripts/render-stdlib-api-doc.js
|
||||||
|
node --check scripts/check-stdlib-api-tiers.js
|
||||||
|
./scripts/render-stdlib-api-doc.sh
|
||||||
|
./scripts/check-stdlib-api-tiers.js
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
# 1.0.0-beta.24 Package Manifest Identity And Dependency Discipline
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
`1.0.0-beta.24` is a package/workspace discipline hardening slice for local
|
||||||
|
manifest diagnostics. It tightens how package manifest identity and local
|
||||||
|
dependency tables are reported when users write ambiguous or invalid manifest
|
||||||
|
keys.
|
||||||
|
|
||||||
|
This release changes diagnostics only. It does not change the Slovo source
|
||||||
|
language, typed core, runtime behavior, standard-library helper surface,
|
||||||
|
compiler-known runtime names, package graph semantics, ABI/layout policy, or
|
||||||
|
artifact/Markdown schema stability guarantees.
|
||||||
|
|
||||||
|
## Contract
|
||||||
|
|
||||||
|
The beta package model remains a closed local workspace model:
|
||||||
|
|
||||||
|
- package manifests declare `[package]` identity metadata and optional
|
||||||
|
`[dependencies]` local path records
|
||||||
|
- dependency keys name local packages and must match the target package name
|
||||||
|
- dependency paths remain local path records under the existing workspace and
|
||||||
|
package boundary checks
|
||||||
|
|
||||||
|
The beta24 diagnostic hardening makes these manifest errors explicit:
|
||||||
|
|
||||||
|
- duplicate keys in package manifests report `PackageManifestInvalid`
|
||||||
|
- invalid dependency keys report `InvalidPackageDependencyName`
|
||||||
|
- duplicate dependency keys report `DuplicatePackageDependencyName`
|
||||||
|
|
||||||
|
These diagnostics are part of the beta package/workspace discipline surface.
|
||||||
|
They do not promote a package manager, resolver, lockfile, registry, publish
|
||||||
|
flow, or stable package ABI/layout.
|
||||||
|
|
||||||
|
## Non-Scope
|
||||||
|
|
||||||
|
This scope does not add:
|
||||||
|
|
||||||
|
- remote registry behavior
|
||||||
|
- lockfiles
|
||||||
|
- semantic-version solving
|
||||||
|
- package publishing
|
||||||
|
- optional, dev, target, or feature-gated dependencies
|
||||||
|
- build scripts or package archives
|
||||||
|
- stable package ABI/layout
|
||||||
|
- stable package manager behavior
|
||||||
|
- source-language syntax or semantics
|
||||||
|
- runtime behavior or runtime C capabilities
|
||||||
|
- standard-library helpers or stdlib behavior
|
||||||
|
- compiler-known `std.*` runtime names
|
||||||
|
- stable artifact-manifest or Markdown schema guarantees
|
||||||
|
- performance claims
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
|
||||||
|
- `docs/language/PACKAGES.md` documents duplicate package-manifest keys,
|
||||||
|
invalid dependency keys, and duplicate dependency keys as explicit beta
|
||||||
|
diagnostics.
|
||||||
|
- Language and compiler release notes describe beta24 as package manifest
|
||||||
|
identity/dependency diagnostic hardening only.
|
||||||
|
- Language and compiler roadmaps record beta24 as a local package/workspace
|
||||||
|
diagnostics slice with all registry, lockfile, semver, publishing,
|
||||||
|
optional/dev/target dependency, ABI/layout, language, runtime, and stdlib
|
||||||
|
work deferred.
|
||||||
|
- README and the post-beta roadmap identify `1.0.0-beta.24` as the current
|
||||||
|
package/workspace discipline hardening slice.
|
||||||
|
- Glagol is versioned as `1.0.0-beta.24`.
|
||||||
|
- `compiler/tests/package_workspace_discipline_beta24.rs` covers the focused
|
||||||
|
package manifest/dependency diagnostics and a positive local dependency
|
||||||
|
workspace.
|
||||||
|
- `scripts/release-gate.sh` runs the focused beta24 test.
|
||||||
|
|
||||||
|
## Suggested Gates
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
cargo fmt --check
|
||||||
|
cargo test --test package_workspace_discipline_beta24
|
||||||
|
```
|
||||||
95
.llm/BETA_25_USER_PROJECT_CONFORMANCE_MATRIX.md
Normal file
95
.llm/BETA_25_USER_PROJECT_CONFORMANCE_MATRIX.md
Normal file
@ -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
|
||||||
|
```
|
||||||
54
.llm/reviews/BETA_23_RELEASE_REVIEW.md
Normal file
54
.llm/reviews/BETA_23_RELEASE_REVIEW.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# Beta23 Release Review
|
||||||
|
|
||||||
|
Verdict: PASS with notes.
|
||||||
|
|
||||||
|
## Findings
|
||||||
|
|
||||||
|
No blocking or non-blocking findings in the reviewed scope.
|
||||||
|
|
||||||
|
## Scope Reviewed
|
||||||
|
|
||||||
|
- `scripts/render-stdlib-api-doc.js` tier rendering.
|
||||||
|
- `scripts/check-stdlib-api-tiers.js` tier gate.
|
||||||
|
- `scripts/release-gate.sh` integration.
|
||||||
|
- Generated `docs/language/STDLIB_API.md`.
|
||||||
|
- `docs/language/STDLIB_TIERS.md`, README, release notes, roadmaps, and spec updates.
|
||||||
|
- Compiler package version bump and compiler release documentation.
|
||||||
|
|
||||||
|
## Acceptance Checklist
|
||||||
|
|
||||||
|
- PASS: `docs/language/STDLIB_TIERS.md` defines the public tier labels and explains the current beta meaning. See `docs/language/STDLIB_TIERS.md:21` through `docs/language/STDLIB_TIERS.md:25`.
|
||||||
|
- PASS: The tier ledger marks JSON, loopback networking, random/time, and filesystem resource-handle helpers as experimental domains. See `docs/language/STDLIB_TIERS.md:46` through `docs/language/STDLIB_TIERS.md:49`.
|
||||||
|
- PASS: The tier ledger records concrete vector modules as beta-supported concrete lanes without claiming generic collection stability. See `docs/language/STDLIB_TIERS.md:44`.
|
||||||
|
- PASS: The generated API catalog emits tier metadata and summary counts. See `docs/language/STDLIB_API.md:6` through `docs/language/STDLIB_API.md:24`.
|
||||||
|
- PASS: Generated catalog classification matches the beta23 contract: filesystem handle helpers are experimental in `docs/language/STDLIB_API.md:115` through `docs/language/STDLIB_API.md:119`; `std.json`, `std.net`, `std.random`, and `std.time` are experimental in `docs/language/STDLIB_API.md:195` through `docs/language/STDLIB_API.md:240`, `docs/language/STDLIB_API.md:294` through `docs/language/STDLIB_API.md:308`, `docs/language/STDLIB_API.md:425` through `docs/language/STDLIB_API.md:432`, and `docs/language/STDLIB_API.md:540` through `docs/language/STDLIB_API.md:547`.
|
||||||
|
- PASS: Concrete vector modules retain explicit no-generic-collection-freeze notes in generated output. Representative coverage is `docs/language/STDLIB_API.md:549` through `docs/language/STDLIB_API.md:554`, with the same note repeated for the other concrete `std.vec_*` modules.
|
||||||
|
- PASS: The renderer implements the tier map and emits per-module/per-helper tiers. See `scripts/render-stdlib-api-doc.js:12` through `scripts/render-stdlib-api-doc.js:46`, `scripts/render-stdlib-api-doc.js:245` through `scripts/render-stdlib-api-doc.js:263`, and `scripts/render-stdlib-api-doc.js:297` through `scripts/render-stdlib-api-doc.js:330`.
|
||||||
|
- PASS: The tier gate checks stale wording, summary tier definitions, experimental module/helper coverage, and vector boundary notes. See `scripts/check-stdlib-api-tiers.js:47` through `scripts/check-stdlib-api-tiers.js:80`.
|
||||||
|
- PASS: `scripts/release-gate.sh` runs syntax checks for both tier scripts and executes the tier checker after catalog rendering. See `scripts/release-gate.sh:12` through `scripts/release-gate.sh:16`.
|
||||||
|
- PASS: README, `lib/std/README.md`, language release notes, language roadmap, post-beta roadmap, and v1 spec link or describe the tier ledger and non-scope. Representative references: `README.md:69` through `README.md:79`, `lib/std/README.md:174` through `lib/std/README.md:184`, `docs/language/RELEASE_NOTES.md:53` through `docs/language/RELEASE_NOTES.md:69`, `docs/language/ROADMAP.md:109` through `docs/language/ROADMAP.md:119`, `docs/POST_BETA_ROADMAP.md:121` through `docs/POST_BETA_ROADMAP.md:132`, and `docs/language/SPEC-v1.md:268` through `docs/language/SPEC-v1.md:279`.
|
||||||
|
- PASS: Documentation states beta23 is documentation/catalog tooling clarity only and does not add language, stdlib, runtime, stable schema, ABI/layout, or stable API behavior. See `docs/language/STDLIB_TIERS.md:10` through `docs/language/STDLIB_TIERS.md:15` and `docs/language/STDLIB_TIERS.md:52` through `docs/language/STDLIB_TIERS.md:68`.
|
||||||
|
- PASS: Compiler package version and compiler release docs are aligned to `1.0.0-beta.23`. See `compiler/Cargo.toml:3`, `compiler/Cargo.lock:7`, `docs/compiler/RELEASE_NOTES.md:15` through `docs/compiler/RELEASE_NOTES.md:43`, and `docs/compiler/ROADMAP.md:126` through `docs/compiler/ROADMAP.md:132`.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
Ran:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node --check scripts/render-stdlib-api-doc.js
|
||||||
|
node --check scripts/check-stdlib-api-tiers.js
|
||||||
|
./scripts/check-stdlib-api-tiers.js
|
||||||
|
git diff --check
|
||||||
|
rg -n '^- `experimental`' docs/language/STDLIB_API.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: all focused checks passed. The `rg` inspection confirmed 58 experimental helper signatures across the expected filesystem-handle, JSON, loopback networking, random, and time surfaces.
|
||||||
|
|
||||||
|
Recommended before release tag:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/render-stdlib-api-doc.sh
|
||||||
|
./scripts/release-gate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: run the full release gate after the generated catalog changes are staged or committed; the gate intentionally fails if `docs/language/STDLIB_API.md` has unstaged generated-doc drift.
|
||||||
66
.llm/reviews/BETA_24_RELEASE_REVIEW.md
Normal file
66
.llm/reviews/BETA_24_RELEASE_REVIEW.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# Beta24 Release Review
|
||||||
|
|
||||||
|
Verdict: PASS.
|
||||||
|
|
||||||
|
## Findings
|
||||||
|
|
||||||
|
No blocking or non-blocking findings in the reviewed scope.
|
||||||
|
|
||||||
|
## Scope Reviewed
|
||||||
|
|
||||||
|
- `compiler/src/project.rs` package manifest diagnostics.
|
||||||
|
- `compiler/tests/package_workspace_discipline_beta24.rs`.
|
||||||
|
- `scripts/release-gate.sh` beta24 focused gate entry.
|
||||||
|
- `compiler/Cargo.toml` and `compiler/Cargo.lock` version bump.
|
||||||
|
- `.llm/BETA_24_PACKAGE_MANIFEST_IDENTITY_AND_DEPENDENCY_DISCIPLINE.md`.
|
||||||
|
- README, language package/diagnostic/release/roadmap docs, compiler release/roadmap docs, and post-beta roadmap updates.
|
||||||
|
|
||||||
|
## Acceptance Checklist
|
||||||
|
|
||||||
|
- PASS: Duplicate package manifest keys now use package-scoped diagnostics through `set_manifest_key(..., "PackageManifestInvalid", "package")` for package identity keys. See `compiler/src/project.rs:1505` through `compiler/src/project.rs:1545` and `compiler/src/project.rs:1752` through `compiler/src/project.rs:1771`.
|
||||||
|
- PASS: Invalid dependency keys are rejected before graph validation with `InvalidPackageDependencyName`. See `compiler/src/project.rs:1556` through `compiler/src/project.rs:1572`.
|
||||||
|
- PASS: Duplicate dependency keys are rejected before graph validation with `DuplicatePackageDependencyName`, and invalid/duplicate dependency records are not added to the dependency graph. See `compiler/src/project.rs:1573` through `compiler/src/project.rs:1593`.
|
||||||
|
- PASS: Existing local-path-only dependency parsing and later dependency key/name matching remain in place. See `compiler/src/project.rs:1594` through `compiler/src/project.rs:1601`, `compiler/src/project.rs:1743` through `compiler/src/project.rs:1749`, and `compiler/src/project.rs:2970` through `compiler/src/project.rs:3005`.
|
||||||
|
- PASS: Focused tests cover duplicate package keys, invalid dependency keys, duplicate dependency keys, and a clean local dependency workspace. See `compiler/tests/package_workspace_discipline_beta24.rs:11` through `compiler/tests/package_workspace_discipline_beta24.rs:109`.
|
||||||
|
- PASS: `scripts/release-gate.sh` runs the beta24 focused test before full `cargo test`. See `scripts/release-gate.sh:68` through `scripts/release-gate.sh:82`.
|
||||||
|
- PASS: The compiler package version is aligned to `1.0.0-beta.24` in both Cargo files. See `compiler/Cargo.toml:3` and `compiler/Cargo.lock:7`.
|
||||||
|
- PASS: The beta24 contract defines diagnostics-only scope, explicit non-scope, acceptance criteria, and focused gates. See `.llm/BETA_24_PACKAGE_MANIFEST_IDENTITY_AND_DEPENDENCY_DISCIPLINE.md:5` through `.llm/BETA_24_PACKAGE_MANIFEST_IDENTITY_AND_DEPENDENCY_DISCIPLINE.md:79`.
|
||||||
|
- PASS: README identifies `1.0.0-beta.24` as current and describes the package manifest/dependency diagnostic hardening scope without claiming package-manager, runtime, language, or stdlib changes. See `README.md:9` and `README.md:27` through `README.md:50`.
|
||||||
|
- PASS: `docs/language/PACKAGES.md` documents duplicate package manifest keys, invalid dependency keys, and duplicate dependency keys as beta package/workspace diagnostics. See `docs/language/PACKAGES.md:59` through `docs/language/PACKAGES.md:73` and `docs/language/PACKAGES.md:111` through `docs/language/PACKAGES.md:130`.
|
||||||
|
- PASS: `docs/language/DIAGNOSTICS.md` includes the new package/workspace diagnostic codes in the project/workspace catalog. See `docs/language/DIAGNOSTICS.md:240` through `docs/language/DIAGNOSTICS.md:279`.
|
||||||
|
- PASS: Language and compiler release notes describe beta24 as package manifest identity/dependency diagnostic hardening only. See `docs/language/RELEASE_NOTES.md:44` through `docs/language/RELEASE_NOTES.md:68` and `docs/compiler/RELEASE_NOTES.md:15` through `docs/compiler/RELEASE_NOTES.md:42`.
|
||||||
|
- PASS: Language/compiler roadmaps and post-beta roadmap mark beta24 as the current local package/workspace diagnostics slice with registry, lockfile, semver, publishing, optional/dev/target dependencies, ABI/layout, language, runtime, and stdlib work deferred. See `docs/language/ROADMAP.md:11` through `docs/language/ROADMAP.md:33`, `docs/compiler/ROADMAP.md:24` through `docs/compiler/ROADMAP.md:38`, `docs/compiler/ROADMAP.md:722` through `docs/compiler/ROADMAP.md:728`, and `docs/POST_BETA_ROADMAP.md:185` through `docs/POST_BETA_ROADMAP.md:191`.
|
||||||
|
|
||||||
|
## Verification Commands
|
||||||
|
|
||||||
|
Ran:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
cargo fmt --check
|
||||||
|
cargo test --test package_workspace_discipline_beta24
|
||||||
|
cargo test --test project_mode workspace_package_boundaries_are_diagnostics
|
||||||
|
cargo test --test project_mode
|
||||||
|
rg -n "beta\\.23|beta23|beta\\.24|beta24|1\\.0\\.0-beta\\.2[0-9]|current|Release state|Last updated" README.md docs/language/PACKAGES.md docs/language/DIAGNOSTICS.md docs/language/RELEASE_NOTES.md docs/language/ROADMAP.md docs/compiler/RELEASE_NOTES.md docs/compiler/ROADMAP.md docs/POST_BETA_ROADMAP.md .llm/BETA_24_PACKAGE_MANIFEST_IDENTITY_AND_DEPENDENCY_DISCIPLINE.md compiler/Cargo.toml compiler/Cargo.lock scripts/release-gate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: all executed checks passed. The focused beta24 test reported 4 passed tests. The full `project_mode` suite reported 36 passed tests.
|
||||||
|
|
||||||
|
## Final Gate Disposition
|
||||||
|
|
||||||
|
After this review, the controller ran the full release gate:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/release-gate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: PASS. The gate completed docs/catalog checks, focused beta13-beta24
|
||||||
|
tests, full `cargo test`, ignored promotion smoke, ignored binary smoke, and
|
||||||
|
ignored LLVM smoke.
|
||||||
|
|
||||||
|
## Residual Risks
|
||||||
|
|
||||||
|
- No release-blocking residual risks remain. The release gate regenerated and
|
||||||
|
checked the standard-library API catalog; publication PDFs were not
|
||||||
|
regenerated because this slice does not touch paper sources, and the gate
|
||||||
|
verified that the required PDF artifacts are present.
|
||||||
64
.llm/reviews/BETA_25_RELEASE_REVIEW.md
Normal file
64
.llm/reviews/BETA_25_RELEASE_REVIEW.md
Normal file
@ -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
|
||||||
|
```
|
||||||
76
README.md
76
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
|
standard library source, compiler, runtime, examples, benchmarks, and technical
|
||||||
documents.
|
documents.
|
||||||
|
|
||||||
Current release: `1.0.0-beta.22`.
|
Current release: `1.0.0-beta.25`.
|
||||||
|
|
||||||
## Repository Layout
|
## Repository Layout
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ scripts/ local release and document tooling
|
|||||||
|
|
||||||
## Beta Scope
|
## Beta Scope
|
||||||
|
|
||||||
`1.0.0-beta.22` 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`
|
`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
|
runtime/resource foundation bundle, the `1.0.0-beta.3` standard-library
|
||||||
stabilization bundle, the `1.0.0-beta.4` language-usability diagnostics
|
stabilization bundle, the `1.0.0-beta.4` language-usability diagnostics
|
||||||
@ -44,7 +44,12 @@ the `1.0.0-beta.17` JSON primitive scalar parsing foundation, the
|
|||||||
`1.0.0-beta.19` test discovery and user-project conformance foundation, the
|
`1.0.0-beta.19` test discovery and user-project conformance foundation, the
|
||||||
`1.0.0-beta.20` string search and ASCII trim foundation, and the
|
`1.0.0-beta.20` string search and ASCII trim foundation, and the
|
||||||
`1.0.0-beta.21` JSON document scalar parsing foundation, plus the
|
`1.0.0-beta.21` JSON document scalar parsing foundation, plus the
|
||||||
`1.0.0-beta.22` run manifest and execution report hardening slice.
|
`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, plus the `1.0.0-beta.25` user-project
|
||||||
|
conformance matrix evidence slice.
|
||||||
|
|
||||||
The language baseline supports practical local command-line, file, and
|
The language baseline supports practical local command-line, file, and
|
||||||
loopback-network programs with:
|
loopback-network programs with:
|
||||||
|
|
||||||
@ -68,6 +73,13 @@ The generated standard-library API catalog is a beta discovery aid: it lists
|
|||||||
exported helper signatures from `lib/std/*.slo`, normalizes module-local
|
exported helper signatures from `lib/std/*.slo`, normalizes module-local
|
||||||
concrete aliases such as `VecI32` and `ResultU64` to their concrete public
|
concrete aliases such as `VecI32` and `ResultU64` to their concrete public
|
||||||
types, and omits non-exported helpers and `(type ...)` aliases.
|
types, and omits non-exported helpers and `(type ...)` aliases.
|
||||||
|
The companion
|
||||||
|
[`docs/language/STDLIB_TIERS.md`](docs/language/STDLIB_TIERS.md) ledger
|
||||||
|
defines the public tier labels `beta-supported`, `experimental`, and
|
||||||
|
`internal`, marks JSON, loopback networking, random/time, and filesystem
|
||||||
|
resource-handle helpers as experimental domains, and keeps concrete vector
|
||||||
|
modules as beta-supported concrete lanes rather than a generic collections
|
||||||
|
freeze.
|
||||||
`glagol symbols <file.slo|project|workspace>` emits deterministic
|
`glagol symbols <file.slo|project|workspace>` emits deterministic
|
||||||
editor-facing S-expression metadata for modules, imports, exports, aliases,
|
editor-facing S-expression metadata for modules, imports, exports, aliases,
|
||||||
structs, enums, functions, tests, source spans, and workspace package names.
|
structs, enums, functions, tests, source spans, and workspace package names.
|
||||||
@ -177,10 +189,39 @@ syntax, standard-library helpers, compiler-known runtime names, runtime
|
|||||||
capabilities, package behavior, stable artifact-manifest schema guarantees,
|
capabilities, package behavior, stable artifact-manifest schema guarantees,
|
||||||
stable ABI/layout, or a stable stdlib/API freeze.
|
stable ABI/layout, or a stable stdlib/API freeze.
|
||||||
|
|
||||||
|
The `1.0.0-beta.23` standard-library stability tier ledger and catalog
|
||||||
|
alignment slice adds the public
|
||||||
|
[`STDLIB_TIERS.md`](docs/language/STDLIB_TIERS.md) maturity ledger beside the
|
||||||
|
generated [`STDLIB_API.md`](docs/language/STDLIB_API.md) signature catalog.
|
||||||
|
It is documentation/catalog tooling clarity only: no source-language syntax,
|
||||||
|
stdlib helpers, compiler-known runtime names, runtime behavior, stable manifest
|
||||||
|
schema, stable Markdown schema, stable ABI/layout, or stable stdlib/API freeze
|
||||||
|
changes. The generated catalog and release gate now expose and check tier
|
||||||
|
metadata.
|
||||||
|
|
||||||
|
The `1.0.0-beta.24` package manifest identity and local dependency discipline
|
||||||
|
slice tightens local manifest diagnostics only: duplicate package manifest
|
||||||
|
keys, invalid dependency keys, and duplicate dependency keys are explicit beta
|
||||||
|
package/workspace diagnostics. It does not add remote registries, lockfiles,
|
||||||
|
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,
|
Still deferred before stable: executable generics, generic aliases, maps/sets,
|
||||||
broad package registry semantics, stable artifact-manifest schema, stable
|
broad package registry semantics, stable artifact-manifest schema, stable
|
||||||
Markdown schema, stable stdlib/API compatibility freeze, DNS/TLS/async
|
Markdown schema, stable conformance-matrix schema, stable stdlib/API
|
||||||
networking, LSP/watch guarantees, SARIF and daemon protocols, stable `1.0.0`
|
compatibility freeze, DNS/TLS/async networking, LSP/watch guarantees, SARIF
|
||||||
|
and daemon protocols, stable `1.0.0`
|
||||||
diagnostics freeze,
|
diagnostics freeze,
|
||||||
re-exports/globs/hierarchical modules, mutable vectors, slice/view APIs,
|
re-exports/globs/hierarchical modules, mutable vectors, slice/view APIs,
|
||||||
iterators, additional compiler-known runtime names, stable ABI and layout,
|
iterators, additional compiler-known runtime names, stable ABI and layout,
|
||||||
@ -311,6 +352,31 @@ package/dependency summary, new workspace templates declare
|
|||||||
local-package rules. Remote registries, lockfiles, semantic-version solving,
|
local-package rules. Remote registries, lockfiles, semantic-version solving,
|
||||||
package publishing, and stable package ABI/layout remain deferred.
|
package publishing, and stable package ABI/layout remain deferred.
|
||||||
|
|
||||||
|
## 1.0.0-beta.24 Package Manifest Identity And Dependency Discipline
|
||||||
|
|
||||||
|
The `1.0.0-beta.24` release keeps the local package model closed and local. It
|
||||||
|
hardens diagnostics for manifest identity/dependency mistakes only: duplicate
|
||||||
|
package manifest keys, invalid dependency keys, and duplicate dependency keys
|
||||||
|
are reported explicitly.
|
||||||
|
|
||||||
|
This scope does not add a remote registry, lockfile, semantic-version solver,
|
||||||
|
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
|
## 1.0.0-beta.6 Networking Foundation
|
||||||
|
|
||||||
The `1.0.0-beta.6` release adds a narrow blocking loopback TCP foundation:
|
The `1.0.0-beta.6` release adds a narrow blocking loopback TCP foundation:
|
||||||
|
|||||||
2
compiler/Cargo.lock
generated
2
compiler/Cargo.lock
generated
@ -4,4 +4,4 @@ version = 3
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glagol"
|
name = "glagol"
|
||||||
version = "1.0.0-beta.22"
|
version = "1.0.0-beta.25"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "glagol"
|
name = "glagol"
|
||||||
version = "1.0.0-beta.22"
|
version = "1.0.0-beta.25"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Glagol, the first compiler for the Slovo language"
|
description = "Glagol, the first compiler for the Slovo language"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
|
|||||||
@ -1124,7 +1124,16 @@ fn parse_manifest(path: PathBuf, source: String) -> Result<Manifest, Vec<Diagnos
|
|||||||
};
|
};
|
||||||
|
|
||||||
match key {
|
match key {
|
||||||
"name" => set_manifest_key(&file, &mut errors, &mut name, parsed, line.span, "name"),
|
"name" => set_manifest_key(
|
||||||
|
&file,
|
||||||
|
&mut errors,
|
||||||
|
&mut name,
|
||||||
|
parsed,
|
||||||
|
line.span,
|
||||||
|
"name",
|
||||||
|
"ProjectManifestInvalid",
|
||||||
|
"project",
|
||||||
|
),
|
||||||
"source_root" => set_manifest_key(
|
"source_root" => set_manifest_key(
|
||||||
&file,
|
&file,
|
||||||
&mut errors,
|
&mut errors,
|
||||||
@ -1132,8 +1141,19 @@ fn parse_manifest(path: PathBuf, source: String) -> Result<Manifest, Vec<Diagnos
|
|||||||
parsed,
|
parsed,
|
||||||
line.span,
|
line.span,
|
||||||
"source_root",
|
"source_root",
|
||||||
|
"ProjectManifestInvalid",
|
||||||
|
"project",
|
||||||
|
),
|
||||||
|
"entry" => set_manifest_key(
|
||||||
|
&file,
|
||||||
|
&mut errors,
|
||||||
|
&mut entry,
|
||||||
|
parsed,
|
||||||
|
line.span,
|
||||||
|
"entry",
|
||||||
|
"ProjectManifestInvalid",
|
||||||
|
"project",
|
||||||
),
|
),
|
||||||
"entry" => set_manifest_key(&file, &mut errors, &mut entry, parsed, line.span, "entry"),
|
|
||||||
_ => errors.push(
|
_ => errors.push(
|
||||||
Diagnostic::new(
|
Diagnostic::new(
|
||||||
&file,
|
&file,
|
||||||
@ -1412,6 +1432,7 @@ fn parse_package_manifest(
|
|||||||
let mut source_root = None::<String>;
|
let mut source_root = None::<String>;
|
||||||
let mut entry = None::<String>;
|
let mut entry = None::<String>;
|
||||||
let mut dependencies = Vec::new();
|
let mut dependencies = Vec::new();
|
||||||
|
let mut dependency_keys = BTreeSet::<String>::new();
|
||||||
|
|
||||||
for line in manifest_lines(&source) {
|
for line in manifest_lines(&source) {
|
||||||
let trimmed = line.text.trim();
|
let trimmed = line.text.trim();
|
||||||
@ -1489,6 +1510,8 @@ fn parse_package_manifest(
|
|||||||
parsed,
|
parsed,
|
||||||
line.span,
|
line.span,
|
||||||
"name",
|
"name",
|
||||||
|
"PackageManifestInvalid",
|
||||||
|
"package",
|
||||||
),
|
),
|
||||||
"version" => set_manifest_key(
|
"version" => set_manifest_key(
|
||||||
&file,
|
&file,
|
||||||
@ -1497,6 +1520,8 @@ fn parse_package_manifest(
|
|||||||
parsed,
|
parsed,
|
||||||
line.span,
|
line.span,
|
||||||
"version",
|
"version",
|
||||||
|
"PackageManifestInvalid",
|
||||||
|
"package",
|
||||||
),
|
),
|
||||||
"source_root" => set_manifest_key(
|
"source_root" => set_manifest_key(
|
||||||
&file,
|
&file,
|
||||||
@ -1505,6 +1530,8 @@ fn parse_package_manifest(
|
|||||||
parsed,
|
parsed,
|
||||||
line.span,
|
line.span,
|
||||||
"source_root",
|
"source_root",
|
||||||
|
"PackageManifestInvalid",
|
||||||
|
"package",
|
||||||
),
|
),
|
||||||
"entry" => set_manifest_key(
|
"entry" => set_manifest_key(
|
||||||
&file,
|
&file,
|
||||||
@ -1513,6 +1540,8 @@ fn parse_package_manifest(
|
|||||||
parsed,
|
parsed,
|
||||||
line.span,
|
line.span,
|
||||||
"entry",
|
"entry",
|
||||||
|
"PackageManifestInvalid",
|
||||||
|
"package",
|
||||||
),
|
),
|
||||||
other => errors.push(
|
other => errors.push(
|
||||||
Diagnostic::new(
|
Diagnostic::new(
|
||||||
@ -1524,12 +1553,44 @@ fn parse_package_manifest(
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"dependencies" => match parse_dependency_path(value) {
|
"dependencies" => {
|
||||||
Some(path) => dependencies.push(PackageDependency {
|
let valid_key = if is_project_name(key) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
errors.push(
|
||||||
|
Diagnostic::new(
|
||||||
|
&file,
|
||||||
|
"InvalidPackageDependencyName",
|
||||||
|
format!(
|
||||||
|
"package dependency name `{}` must start with `a-z` and contain only `a-z`, `0-9`, and `-`",
|
||||||
|
key
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.with_span(line.span),
|
||||||
|
);
|
||||||
|
false
|
||||||
|
};
|
||||||
|
let unique_key = if dependency_keys.insert(key.to_string()) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
errors.push(
|
||||||
|
Diagnostic::new(
|
||||||
|
&file,
|
||||||
|
"DuplicatePackageDependencyName",
|
||||||
|
format!("duplicate package dependency name `{}`", key),
|
||||||
|
)
|
||||||
|
.with_span(line.span),
|
||||||
|
);
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
match parse_dependency_path(value) {
|
||||||
|
Some(path) if valid_key && unique_key => dependencies.push(PackageDependency {
|
||||||
key: key.to_string(),
|
key: key.to_string(),
|
||||||
path,
|
path,
|
||||||
span: line.span,
|
span: line.span,
|
||||||
}),
|
}),
|
||||||
|
Some(_) => {}
|
||||||
None => errors.push(
|
None => errors.push(
|
||||||
Diagnostic::new(
|
Diagnostic::new(
|
||||||
&file,
|
&file,
|
||||||
@ -1538,7 +1599,8 @@ fn parse_package_manifest(
|
|||||||
)
|
)
|
||||||
.with_span(line.span),
|
.with_span(line.span),
|
||||||
),
|
),
|
||||||
},
|
}
|
||||||
|
}
|
||||||
"" | "project" => errors.push(
|
"" | "project" => errors.push(
|
||||||
Diagnostic::new(
|
Diagnostic::new(
|
||||||
&file,
|
&file,
|
||||||
@ -1694,13 +1756,15 @@ fn set_manifest_key(
|
|||||||
value: String,
|
value: String,
|
||||||
span: Span,
|
span: Span,
|
||||||
key: &str,
|
key: &str,
|
||||||
|
code: &'static str,
|
||||||
|
manifest_kind: &str,
|
||||||
) {
|
) {
|
||||||
if slot.replace(value).is_some() {
|
if slot.replace(value).is_some() {
|
||||||
errors.push(
|
errors.push(
|
||||||
Diagnostic::new(
|
Diagnostic::new(
|
||||||
file,
|
file,
|
||||||
"ProjectManifestInvalid",
|
code,
|
||||||
format!("duplicate project manifest key `{}`", key),
|
format!("duplicate {} manifest key `{}`", manifest_kind, key),
|
||||||
)
|
)
|
||||||
.with_span(span),
|
.with_span(span),
|
||||||
);
|
);
|
||||||
|
|||||||
229
compiler/tests/package_workspace_discipline_beta24.rs
Normal file
229
compiler/tests/package_workspace_discipline_beta24.rs
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
use std::{
|
||||||
|
fs,
|
||||||
|
path::PathBuf,
|
||||||
|
process::{Command, Output},
|
||||||
|
sync::atomic::{AtomicUsize, Ordering},
|
||||||
|
time::{SystemTime, UNIX_EPOCH},
|
||||||
|
};
|
||||||
|
|
||||||
|
static NEXT_WORKSPACE_ID: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn duplicate_package_keys_report_package_manifest_invalid() {
|
||||||
|
let workspace = write_workspace(
|
||||||
|
"duplicate-package-key",
|
||||||
|
"[workspace]\nmembers = [\"packages/app\"]\n",
|
||||||
|
&[WorkspacePackageSpec {
|
||||||
|
member: "packages/app",
|
||||||
|
manifest: "[package]\nname = \"app\"\nname = \"other\"\nversion = \"0.1.0\"\n",
|
||||||
|
modules: &[("main", "(module main)\n\n(fn main () -> i32\n 0)\n")],
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let output = run_glagol([
|
||||||
|
"--json-diagnostics".as_ref(),
|
||||||
|
"check".as_ref(),
|
||||||
|
workspace.as_os_str(),
|
||||||
|
]);
|
||||||
|
assert_exit_code("duplicate package key", &output, 1);
|
||||||
|
assert_json_diagnostic_code("duplicate package key", &output, "PackageManifestInvalid");
|
||||||
|
assert_json_diagnostic_code_absent("duplicate package key", &output, "ProjectManifestInvalid");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invalid_dependency_key_reports_invalid_package_dependency_name() {
|
||||||
|
let workspace = write_workspace(
|
||||||
|
"invalid-dependency-key",
|
||||||
|
"[workspace]\nmembers = [\"packages/app\"]\n",
|
||||||
|
&[WorkspacePackageSpec {
|
||||||
|
member: "packages/app",
|
||||||
|
manifest: "[package]\nname = \"app\"\nversion = \"0.1.0\"\n\n[dependencies]\nBad_Name = { path = \"../util\" }\n",
|
||||||
|
modules: &[("main", "(module main)\n\n(fn main () -> i32\n 0)\n")],
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let output = run_glagol([
|
||||||
|
"--json-diagnostics".as_ref(),
|
||||||
|
"check".as_ref(),
|
||||||
|
workspace.as_os_str(),
|
||||||
|
]);
|
||||||
|
assert_exit_code("invalid dependency key", &output, 1);
|
||||||
|
assert_json_diagnostic_code(
|
||||||
|
"invalid dependency key",
|
||||||
|
&output,
|
||||||
|
"InvalidPackageDependencyName",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn duplicate_dependency_keys_report_duplicate_package_dependency_name() {
|
||||||
|
let workspace = write_workspace(
|
||||||
|
"duplicate-dependency-key",
|
||||||
|
"[workspace]\nmembers = [\"packages/app\"]\n",
|
||||||
|
&[WorkspacePackageSpec {
|
||||||
|
member: "packages/app",
|
||||||
|
manifest: "[package]\nname = \"app\"\nversion = \"0.1.0\"\n\n[dependencies]\nutil = { path = \"../util\" }\nutil = { path = \"../util-again\" }\n",
|
||||||
|
modules: &[("main", "(module main)\n\n(fn main () -> i32\n 0)\n")],
|
||||||
|
}],
|
||||||
|
);
|
||||||
|
|
||||||
|
let output = run_glagol([
|
||||||
|
"--json-diagnostics".as_ref(),
|
||||||
|
"check".as_ref(),
|
||||||
|
workspace.as_os_str(),
|
||||||
|
]);
|
||||||
|
assert_exit_code("duplicate dependency key", &output, 1);
|
||||||
|
assert_json_diagnostic_code(
|
||||||
|
"duplicate dependency key",
|
||||||
|
&output,
|
||||||
|
"DuplicatePackageDependencyName",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn valid_dependency_identity_checks_cleanly() {
|
||||||
|
let workspace = write_workspace(
|
||||||
|
"valid-dependency-identity",
|
||||||
|
"[workspace]\nmembers = [\"packages/app\", \"packages/util\"]\n",
|
||||||
|
&[
|
||||||
|
WorkspacePackageSpec {
|
||||||
|
member: "packages/util",
|
||||||
|
manifest: "[package]\nname = \"util\"\nversion = \"0.1.0\"\n",
|
||||||
|
modules: &[(
|
||||||
|
"util",
|
||||||
|
"(module util (export answer))\n\n(fn answer () -> i32\n 42)\n",
|
||||||
|
)],
|
||||||
|
},
|
||||||
|
WorkspacePackageSpec {
|
||||||
|
member: "packages/app",
|
||||||
|
manifest: "[package]\nname = \"app\"\nversion = \"0.1.0\"\n\n[dependencies]\nutil = { path = \"../util\" }\n",
|
||||||
|
modules: &[(
|
||||||
|
"main",
|
||||||
|
"(module main)\n\n(import util.util (answer))\n\n(fn main () -> i32\n (answer))\n",
|
||||||
|
)],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
let output = run_glagol(["check".as_ref(), workspace.as_os_str()]);
|
||||||
|
assert_success_stdout("valid dependency identity", output, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WorkspacePackageSpec<'a> {
|
||||||
|
member: &'a str,
|
||||||
|
manifest: &'a str,
|
||||||
|
modules: &'a [(&'a str, &'a str)],
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_workspace(
|
||||||
|
name: &str,
|
||||||
|
workspace_manifest: &str,
|
||||||
|
packages: &[WorkspacePackageSpec<'_>],
|
||||||
|
) -> PathBuf {
|
||||||
|
let root = unique_path(name);
|
||||||
|
fs::create_dir_all(&root).expect("create workspace root");
|
||||||
|
fs::write(root.join("slovo.toml"), workspace_manifest).expect("write workspace manifest");
|
||||||
|
|
||||||
|
for package in packages {
|
||||||
|
let package_root = root.join(package.member);
|
||||||
|
let src = package_root.join("src");
|
||||||
|
fs::create_dir_all(&src).expect("create workspace package src");
|
||||||
|
fs::write(package_root.join("slovo.toml"), package.manifest)
|
||||||
|
.expect("write workspace package manifest");
|
||||||
|
for (module, source) in package.modules {
|
||||||
|
fs::write(src.join(format!("{}.slo", module)), source)
|
||||||
|
.expect("write workspace package module");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
root
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unique_path(name: &str) -> PathBuf {
|
||||||
|
let id = NEXT_WORKSPACE_ID.fetch_add(1, Ordering::SeqCst);
|
||||||
|
let nanos = SystemTime::now()
|
||||||
|
.duration_since(UNIX_EPOCH)
|
||||||
|
.map(|duration| duration.as_nanos())
|
||||||
|
.unwrap_or(0);
|
||||||
|
std::env::temp_dir().join(format!(
|
||||||
|
"glagol-package-workspace-discipline-beta24-{}-{}-{}-{}",
|
||||||
|
std::process::id(),
|
||||||
|
nanos,
|
||||||
|
id,
|
||||||
|
name
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_glagol<I, S>(args: I) -> Output
|
||||||
|
where
|
||||||
|
I: IntoIterator<Item = S>,
|
||||||
|
S: AsRef<std::ffi::OsStr>,
|
||||||
|
{
|
||||||
|
Command::new(env!("CARGO_BIN_EXE_glagol"))
|
||||||
|
.args(args)
|
||||||
|
.output()
|
||||||
|
.expect("run glagol")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn assert_success_stdout(context: &str, output: Output, expected: &str) {
|
||||||
|
assert!(
|
||||||
|
output.status.success(),
|
||||||
|
"{} failed\nstdout:\n{}\nstderr:\n{}",
|
||||||
|
context,
|
||||||
|
String::from_utf8_lossy(&output.stdout),
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
String::from_utf8_lossy(&output.stdout),
|
||||||
|
expected,
|
||||||
|
"{} stdout mismatch",
|
||||||
|
context
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
output.stderr.is_empty(),
|
||||||
|
"{} wrote stderr:\n{}",
|
||||||
|
context,
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn assert_exit_code(context: &str, output: &Output, expected: i32) {
|
||||||
|
assert_eq!(
|
||||||
|
output.status.code(),
|
||||||
|
Some(expected),
|
||||||
|
"{} exit code mismatch\nstdout:\n{}\nstderr:\n{}",
|
||||||
|
context,
|
||||||
|
String::from_utf8_lossy(&output.stdout),
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn assert_json_diagnostic_code(context: &str, output: &Output, expected: &str) {
|
||||||
|
let diagnostics = diagnostic_text(output);
|
||||||
|
assert!(
|
||||||
|
diagnostics.contains(&format!(r#""code":"{}""#, expected)),
|
||||||
|
"{} did not report `{}`:\n{}",
|
||||||
|
context,
|
||||||
|
expected,
|
||||||
|
diagnostics
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn assert_json_diagnostic_code_absent(context: &str, output: &Output, unexpected: &str) {
|
||||||
|
let diagnostics = diagnostic_text(output);
|
||||||
|
assert!(
|
||||||
|
!diagnostics.contains(&format!(r#""code":"{}""#, unexpected)),
|
||||||
|
"{} unexpectedly reported `{}`:\n{}",
|
||||||
|
context,
|
||||||
|
unexpected,
|
||||||
|
diagnostics
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn diagnostic_text(output: &Output) -> String {
|
||||||
|
format!(
|
||||||
|
"{}{}",
|
||||||
|
String::from_utf8_lossy(&output.stdout),
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
)
|
||||||
|
}
|
||||||
539
compiler/tests/user_project_conformance_beta25.rs
Normal file
539
compiler/tests/user_project_conformance_beta25.rs
Normal file
@ -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::<usize>(),
|
||||||
|
655,
|
||||||
|
"beta25 discovered-test count changed"
|
||||||
|
);
|
||||||
|
|
||||||
|
let matrix_paths = MATRIX
|
||||||
|
.iter()
|
||||||
|
.map(|entry| entry.path.to_owned())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
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::<Vec<_>>()
|
||||||
|
.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<String> {
|
||||||
|
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<I, S>(args: I, cwd: &Path) -> Output
|
||||||
|
where
|
||||||
|
I: IntoIterator<Item = S>,
|
||||||
|
S: AsRef<OsStr>,
|
||||||
|
{
|
||||||
|
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::<String>();
|
||||||
|
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
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -56,6 +56,15 @@ LSP/watch behavior, SARIF/daemon protocols, JSON expansion, runtime helper
|
|||||||
names, source-language syntax, package registries, semver solving, or
|
names, source-language syntax, package registries, semver solving, or
|
||||||
performance claims.
|
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
|
Why first: it reduces friction for every later feature and gives users a better
|
||||||
way to exercise the beta.
|
way to exercise the beta.
|
||||||
|
|
||||||
@ -118,6 +127,19 @@ bytes `9`, `10`, `11`, `12`, `13`, and `32`. Unicode/grapheme semantics,
|
|||||||
case folding, regexes, tokenizers, mutable strings, slice/view syntax, new
|
case folding, regexes, tokenizers, mutable strings, slice/view syntax, new
|
||||||
runtime names, and stable stdlib/API promises remain deferred.
|
runtime names, and stable stdlib/API promises remain deferred.
|
||||||
|
|
||||||
|
Released in `1.0.0-beta.23`: the public
|
||||||
|
[`docs/language/STDLIB_TIERS.md`](language/STDLIB_TIERS.md) ledger defines the
|
||||||
|
current standard-library tier labels `beta-supported`, `experimental`, and
|
||||||
|
`internal`, and aligns the docs around the generated
|
||||||
|
[`docs/language/STDLIB_API.md`](language/STDLIB_API.md) signature catalog.
|
||||||
|
JSON, loopback networking, random/time, and filesystem resource-handle helpers
|
||||||
|
are documented as experimental domains. Concrete vector modules remain
|
||||||
|
beta-supported concrete lanes, not a generic collections freeze. The slice is
|
||||||
|
documentation/catalog tooling clarity only: no syntax, helper, runtime,
|
||||||
|
manifest-schema, Markdown-schema, ABI/layout, or stable stdlib/API behavior
|
||||||
|
changes. It updates generated catalog output and the release gate so tier
|
||||||
|
metadata is visible and checked.
|
||||||
|
|
||||||
Why third: stdlib growth is already broad enough that naming and stability tiers
|
Why third: stdlib growth is already broad enough that naming and stability tiers
|
||||||
matter more than adding another isolated helper group.
|
matter more than adding another isolated helper group.
|
||||||
|
|
||||||
@ -169,6 +191,14 @@ local-package rules. Lockfiles, remote registries, semver solving, publishing,
|
|||||||
optional/dev/target dependencies, and stable package ABI/layout remain out of
|
optional/dev/target dependencies, and stable package ABI/layout remain out of
|
||||||
scope.
|
scope.
|
||||||
|
|
||||||
|
Released in `1.0.0-beta.24`: package manifest identity and dependency
|
||||||
|
diagnostics are tightened without changing the package model. Duplicate
|
||||||
|
package manifest keys, invalid dependency keys, and duplicate dependency keys
|
||||||
|
are explicit diagnostics. The slice adds no remote registry, lockfile,
|
||||||
|
semantic-version solving, package publishing, optional/dev/target
|
||||||
|
dependencies, stable package ABI/layout, source-language change, runtime
|
||||||
|
change, or standard-library change.
|
||||||
|
|
||||||
Why fifth: stable package rules are a prerequisite for a usable public language,
|
Why fifth: stable package rules are a prerequisite for a usable public language,
|
||||||
but remote publishing can wait.
|
but remote publishing can wait.
|
||||||
|
|
||||||
@ -541,9 +571,13 @@ foundation before richer string or data-interchange APIs are credible.
|
|||||||
Slovo should not become stable until all of these are true:
|
Slovo should not become stable until all of these are true:
|
||||||
|
|
||||||
- migration and deprecation policy is documented
|
- migration and deprecation policy is documented
|
||||||
- `lib/std` has explicit stable and experimental tiers
|
- `lib/std` has explicit beta-supported, experimental, and internal tiers plus
|
||||||
|
a later stable-tier/deprecation policy before `1.0.0`
|
||||||
- package/workspace behavior is deterministic
|
- package/workspace behavior is deterministic
|
||||||
- conformance tests cover user-shaped projects
|
- package manifest identity and dependency-key failures have explicit
|
||||||
|
diagnostics
|
||||||
|
- conformance tests and matrix evidence cover user-shaped projects and
|
||||||
|
workspaces
|
||||||
- release gates are reproducible on a clean checkout
|
- release gates are reproducible on a clean checkout
|
||||||
- diagnostics and formatter output are stable for promoted features
|
- diagnostics and formatter output are stable for promoted features
|
||||||
- performance publications are repeatable and labeled as local-machine evidence
|
- performance publications are repeatable and labeled as local-machine evidence
|
||||||
|
|||||||
@ -12,6 +12,101 @@ integration/readiness release, not the first real beta.
|
|||||||
|
|
||||||
No active unreleased compiler scope is documented here yet.
|
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`
|
||||||
|
|
||||||
|
Release date: 2026-05-23
|
||||||
|
|
||||||
|
Release state: package manifest identity and local dependency diagnostic
|
||||||
|
hardening
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
The beta.24 compiler/tooling slice tightens local package manifest diagnostics
|
||||||
|
without changing the language, runtime, stdlib, or package graph model:
|
||||||
|
|
||||||
|
- Bump the `glagol` compiler package version to `1.0.0-beta.24`.
|
||||||
|
- Diagnose duplicate package manifest keys explicitly.
|
||||||
|
- Diagnose invalid dependency keys explicitly.
|
||||||
|
- Diagnose duplicate dependency keys explicitly.
|
||||||
|
- Keep dependency records local-path-only and require dependency keys to match
|
||||||
|
target package names.
|
||||||
|
|
||||||
|
### Explicit Deferrals
|
||||||
|
|
||||||
|
This release does not implement remote registries, lockfiles,
|
||||||
|
semantic-version solving, package publishing, optional/dev/target
|
||||||
|
dependencies, feature flags, build scripts, package archives, stable package
|
||||||
|
ABI/layout, source-language syntax, runtime C capabilities, standard-library
|
||||||
|
helpers, compiler-known `std.*` runtime names, stable artifact-manifest schema
|
||||||
|
guarantees, stable Markdown schemas, LSP/watch/SARIF/daemon protocols, or
|
||||||
|
performance claims.
|
||||||
|
|
||||||
|
## 1.0.0-beta.23
|
||||||
|
|
||||||
|
Release label: `1.0.0-beta.23`
|
||||||
|
|
||||||
|
Release date: 2026-05-23
|
||||||
|
|
||||||
|
Release state: standard-library stability tier ledger and catalog alignment
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
The beta.23 compiler/tooling slice aligns generated standard-library API
|
||||||
|
catalog output with the public tier ledger:
|
||||||
|
|
||||||
|
- Bump the `glagol` compiler package version to `1.0.0-beta.23`.
|
||||||
|
- Render per-module and per-helper `beta-supported` or `experimental` tier
|
||||||
|
metadata in `docs/language/STDLIB_API.md`.
|
||||||
|
- Add `scripts/check-stdlib-api-tiers.js` and wire it into the release gate.
|
||||||
|
- Mark JSON, loopback networking, random/time, and filesystem resource-handle
|
||||||
|
helpers as experimental in generated catalog output.
|
||||||
|
- Keep concrete vector modules beta-supported concrete lanes with an explicit
|
||||||
|
no-generic-collection-freeze note.
|
||||||
|
|
||||||
|
### Explicit Deferrals
|
||||||
|
|
||||||
|
This release does not implement source-language syntax, standard-library
|
||||||
|
helpers, compiler-known `std.*` runtime names, runtime C capabilities, package
|
||||||
|
or workspace behavior, stable artifact-manifest schema guarantees, stable
|
||||||
|
Markdown schemas, LSP/watch/SARIF/daemon protocols, performance claims,
|
||||||
|
stable ABI/layout, or a stable standard-library compatibility contract.
|
||||||
|
|
||||||
## 1.0.0-beta.22
|
## 1.0.0-beta.22
|
||||||
|
|
||||||
Release label: `1.0.0-beta.22`
|
Release label: `1.0.0-beta.22`
|
||||||
|
|||||||
@ -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.
|
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.22`, released on 2026-05-23 as run manifest and
|
Current stage: `1.0.0-beta.25`, released on 2026-05-23 as user-project
|
||||||
execution report hardening. It keeps the
|
conformance matrix evidence. It keeps the
|
||||||
`1.0.0-beta` language/compiler support baseline and includes 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
|
`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,
|
foundation release, the `1.0.0-beta.3` standard-library stabilization release,
|
||||||
@ -123,10 +123,37 @@ CLI evidence metadata under the existing `slovo.artifact-manifest` version
|
|||||||
`1` contract, not a stable schema freeze, and it adds no source-language,
|
`1` contract, not a stable schema freeze, and it adds no source-language,
|
||||||
runtime, package, or standard-library surface.
|
runtime, package, or standard-library surface.
|
||||||
|
|
||||||
|
The beta.23 compiler/tooling slice bumps the package version and updates
|
||||||
|
generated `docs/language/STDLIB_API.md` output with per-module and per-helper
|
||||||
|
tier metadata. It adds a release-gate checker for the tier catalog, marks JSON,
|
||||||
|
loopback networking, random/time, and filesystem resource-handle helpers as
|
||||||
|
experimental, and keeps concrete vector modules beta-supported concrete lanes
|
||||||
|
without claiming generic collection stability. It adds no source-language,
|
||||||
|
runtime, package, or standard-library helper surface.
|
||||||
|
|
||||||
|
The beta.24 compiler/tooling slice bumps the package version and tightens
|
||||||
|
local package manifest diagnostics. Duplicate package manifest keys, invalid
|
||||||
|
dependency keys, and duplicate dependency keys are explicit diagnostics. It
|
||||||
|
keeps the existing closed local workspace model and adds no remote registry,
|
||||||
|
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,
|
Generic vectors, generic collections, maps, sets, generic stdlib dispatch,
|
||||||
runtime collection changes, collection unification, stable human diagnostic
|
runtime collection changes, collection unification, stable human diagnostic
|
||||||
text, stable artifact-manifest or Markdown schema freezes, LSP/watch
|
text, stable artifact-manifest, Markdown, or conformance-matrix schema
|
||||||
protocols, SARIF/daemon protocols, re-exports/globs/hierarchical modules,
|
freezes, LSP/watch protocols, SARIF/daemon protocols,
|
||||||
|
re-exports/globs/hierarchical modules,
|
||||||
registry semantics, semver solving, mutable vectors, stable slice/view APIs,
|
registry semantics, semver solving, mutable vectors, stable slice/view APIs,
|
||||||
tokenizers, broader JSON parsing, runtime helper names, source-language
|
tokenizers, broader JSON parsing, runtime helper names, source-language
|
||||||
syntax, parallel test execution, retries, tags/groups, coverage/event streams,
|
syntax, parallel test execution, retries, tags/groups, coverage/event streams,
|
||||||
@ -706,6 +733,8 @@ Alpha is the latest compiler semantic/runtime-operation support slice.
|
|||||||
- [x] Diagnose missing packages, duplicate package names, dependency cycles,
|
- [x] Diagnose missing packages, duplicate package names, dependency cycles,
|
||||||
path escapes, invalid package names, invalid package versions, private
|
path escapes, invalid package names, invalid package versions, private
|
||||||
visibility, and dependency key mismatches.
|
visibility, and dependency key mismatches.
|
||||||
|
- [x] Diagnose duplicate package manifest keys, invalid dependency keys, and
|
||||||
|
duplicate dependency keys explicitly.
|
||||||
- [x] Keep registries, lockfiles, semver solving, aliases/globs/re-exports,
|
- [x] Keep registries, lockfiles, semver solving, aliases/globs/re-exports,
|
||||||
generated code, build scripts, publishing, optional/dev/target
|
generated code, build scripts, publishing, optional/dev/target
|
||||||
dependencies, stable package ABI, and remote dependencies deferred.
|
dependencies, stable package ABI, and remote dependencies deferred.
|
||||||
|
|||||||
@ -237,6 +237,47 @@ Future releases may add codes or split broad codes when the release scope
|
|||||||
requires more precise tooling behavior. Such changes must be documented using
|
requires more precise tooling behavior. Such changes must be documented using
|
||||||
the compatibility classes above.
|
the compatibility classes above.
|
||||||
|
|
||||||
|
## Project And Workspace Codes
|
||||||
|
|
||||||
|
Project, package, and workspace diagnostics are covered by integration tests
|
||||||
|
because they often require multiple files, manifests, or generated temporary
|
||||||
|
directories rather than a single `.slo` golden fixture. These codes still use
|
||||||
|
the same `slovo.diagnostic` version `1` schema and PascalCase code policy.
|
||||||
|
|
||||||
|
Current package/workspace loader and graph diagnostics include:
|
||||||
|
|
||||||
|
- `DependencyNameMismatch`
|
||||||
|
- `DependencyPathEscape`
|
||||||
|
- `DuplicatePackageDependencyName`
|
||||||
|
- `DuplicatePackageName`
|
||||||
|
- `DuplicateWorkspaceMember`
|
||||||
|
- `InvalidPackageDependencyName`
|
||||||
|
- `InvalidPackageName`
|
||||||
|
- `InvalidPackageVersion`
|
||||||
|
- `MissingPackageDependency`
|
||||||
|
- `MissingPackageModule`
|
||||||
|
- `PackageDependencyCycle`
|
||||||
|
- `PackageImportNotDependency`
|
||||||
|
- `PackageManifestInvalid`
|
||||||
|
- `PackageSourceReadFailed`
|
||||||
|
- `PackageSourceRootEscape`
|
||||||
|
- `PackageSourceRootMissing`
|
||||||
|
- `ProjectEntryMainInvalidSignature`
|
||||||
|
- `ProjectEntryMainMissing`
|
||||||
|
- `ProjectManifestInvalid`
|
||||||
|
- `ProjectManifestReadFailed`
|
||||||
|
- `ProjectSourceReadFailed`
|
||||||
|
- `ProjectSourceRootMissing`
|
||||||
|
- `UnsupportedDependency`
|
||||||
|
- `WorkspaceBuildAmbiguousEntryPackage`
|
||||||
|
- `WorkspaceDefaultPackageEntryMissing`
|
||||||
|
- `WorkspaceDefaultPackageMissing`
|
||||||
|
- `WorkspaceEntryMainInvalidSignature`
|
||||||
|
- `WorkspaceEntryMainMissing`
|
||||||
|
- `WorkspaceManifestInvalid`
|
||||||
|
- `WorkspaceMemberManifestMissing`
|
||||||
|
- `WorkspaceMemberPathEscape`
|
||||||
|
|
||||||
## Explicit Deferrals
|
## Explicit Deferrals
|
||||||
|
|
||||||
`1.0.0-beta.13` does not define:
|
`1.0.0-beta.13` does not define:
|
||||||
|
|||||||
@ -56,6 +56,10 @@ used for solving dependency constraints.
|
|||||||
dependency paths must stay inside the workspace/package boundary after
|
dependency paths must stay inside the workspace/package boundary after
|
||||||
normalization and canonical path checks.
|
normalization and canonical path checks.
|
||||||
|
|
||||||
|
Duplicate keys in package manifests are `PackageManifestInvalid` diagnostics.
|
||||||
|
The manifest loader does not silently choose one spelling for repeated package
|
||||||
|
identity or dependency entries.
|
||||||
|
|
||||||
Dependencies are local path records only. The dependency key must match the
|
Dependencies are local path records only. The dependency key must match the
|
||||||
target package name:
|
target package name:
|
||||||
|
|
||||||
@ -63,6 +67,11 @@ target package name:
|
|||||||
mathlib = { path = "../mathlib" }
|
mathlib = { path = "../mathlib" }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Dependency keys use the same package-name shape as package identities. Invalid
|
||||||
|
dependency keys are `InvalidPackageDependencyName` diagnostics, and duplicate
|
||||||
|
dependency keys are `DuplicatePackageDependencyName` diagnostics before the
|
||||||
|
local dependency graph is accepted.
|
||||||
|
|
||||||
## Imports
|
## Imports
|
||||||
|
|
||||||
Within a workspace, a package imports a dependency module through the package
|
Within a workspace, a package imports a dependency module through the package
|
||||||
@ -106,9 +115,12 @@ The package/workspace gate covers these user-facing error families:
|
|||||||
- missing member manifests
|
- missing member manifests
|
||||||
- duplicate normalized workspace members
|
- duplicate normalized workspace members
|
||||||
- invalid member or dependency paths
|
- invalid member or dependency paths
|
||||||
|
- duplicate package manifest keys
|
||||||
- invalid package names and versions
|
- invalid package names and versions
|
||||||
- duplicate package names
|
- duplicate package names
|
||||||
- missing local path dependencies
|
- missing local path dependencies
|
||||||
|
- invalid dependency keys
|
||||||
|
- duplicate dependency keys
|
||||||
- dependency key/name mismatches
|
- dependency key/name mismatches
|
||||||
- package dependency cycles
|
- package dependency cycles
|
||||||
- private cross-package imports
|
- private cross-package imports
|
||||||
|
|||||||
@ -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
|
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.
|
experimental integration/readiness release, not as a beta maturity claim.
|
||||||
|
|
||||||
The current release is `1.0.0-beta.22`, 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
|
`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
|
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
|
foundation bundle from `1.0.0-beta.2` plus the first standard-library
|
||||||
@ -32,12 +32,94 @@ foundation from `1.0.0-beta.18`, the test discovery and user-project
|
|||||||
conformance foundation from `1.0.0-beta.19`, and the string search and ASCII
|
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
|
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
|
foundation from `1.0.0-beta.21`, and the run manifest execution-report
|
||||||
hardening slice from `1.0.0-beta.22`.
|
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`, 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
|
## Unreleased
|
||||||
|
|
||||||
No active unreleased language scope is documented here yet.
|
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`
|
||||||
|
|
||||||
|
Release name: Package Manifest Identity And Dependency Discipline
|
||||||
|
|
||||||
|
Release date: 2026-05-23
|
||||||
|
|
||||||
|
Status: released beta package/workspace diagnostic hardening on the
|
||||||
|
`1.0.0-beta` language baseline.
|
||||||
|
|
||||||
|
This release tightens diagnostics for local package manifests only. Duplicate
|
||||||
|
package manifest keys, invalid dependency keys, and duplicate dependency keys
|
||||||
|
are explicit beta package/workspace diagnostics.
|
||||||
|
|
||||||
|
The package model remains the existing closed local workspace model:
|
||||||
|
dependencies are local path records, dependency keys must match target package
|
||||||
|
names, and package-qualified imports still resolve through the local workspace
|
||||||
|
graph.
|
||||||
|
|
||||||
|
This release adds no remote registry, lockfile, semantic-version solving,
|
||||||
|
package publishing, optional/dev/target dependencies, stable package
|
||||||
|
ABI/layout, source-language syntax or semantics, runtime behavior,
|
||||||
|
standard-library helpers, compiler-known runtime names, stable manifest schema,
|
||||||
|
stable Markdown schema, or performance claim.
|
||||||
|
|
||||||
|
## 1.0.0-beta.23
|
||||||
|
|
||||||
|
Release label: `1.0.0-beta.23`
|
||||||
|
|
||||||
|
Release name: Standard Library Stability Tier Ledger And Catalog Alignment
|
||||||
|
|
||||||
|
Release date: 2026-05-23
|
||||||
|
|
||||||
|
Status: released beta documentation/catalog clarity on the `1.0.0-beta`
|
||||||
|
language baseline.
|
||||||
|
|
||||||
|
This release adds [`STDLIB_TIERS.md`](STDLIB_TIERS.md) as the public maturity
|
||||||
|
ledger for the generated [`STDLIB_API.md`](STDLIB_API.md) standard-library API
|
||||||
|
catalog. The ledger defines the tier labels `beta-supported`, `experimental`,
|
||||||
|
and `internal`.
|
||||||
|
|
||||||
|
The beta23 ledger classifies JSON, loopback networking, random/time, and
|
||||||
|
filesystem resource-handle helpers as experimental domains. Concrete vector
|
||||||
|
modules remain beta-supported concrete lanes; this is not a generic
|
||||||
|
collections freeze and does not imply executable generics, maps, sets,
|
||||||
|
iterators, mutable vectors, slice/view APIs, runtime collection changes, or
|
||||||
|
stable ABI/layout.
|
||||||
|
|
||||||
|
This release adds no source-language syntax, standard-library helpers,
|
||||||
|
compiler-known runtime names, runtime behavior, package behavior, stable
|
||||||
|
artifact-manifest schema, stable Markdown schema, stable ABI/layout, or stable
|
||||||
|
stdlib/API compatibility freeze. It does update generated catalog output and
|
||||||
|
the release gate so tier metadata is visible and checked.
|
||||||
|
|
||||||
## 1.0.0-beta.22
|
## 1.0.0-beta.22
|
||||||
|
|
||||||
Release label: `1.0.0-beta.22`
|
Release label: `1.0.0-beta.22`
|
||||||
|
|||||||
@ -8,10 +8,10 @@ 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
|
Long-horizon planning lives in `.llm/ROADMAP_TO_STABLE.md`. It defines the
|
||||||
release train beyond the first real general-purpose beta Slovo contract.
|
release train beyond the first real general-purpose beta Slovo contract.
|
||||||
|
|
||||||
Current stage: `1.0.0-beta.22`, released on 2026-05-23 as post-beta run
|
Current stage: `1.0.0-beta.25`, released on 2026-05-23 as post-beta
|
||||||
manifest and execution-report hardening. It keeps the
|
user-project conformance matrix evidence. It keeps the `1.0.0-beta` language
|
||||||
`1.0.0-beta` language
|
contract and includes the `1.0.0-beta.1` tooling
|
||||||
contract and includes the `1.0.0-beta.1` tooling hardening release, the
|
hardening release, the
|
||||||
`1.0.0-beta.2` runtime/resource foundation release, the `1.0.0-beta.3`
|
`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`
|
standard-library stabilization release, the `1.0.0-beta.4`
|
||||||
language-usability diagnostics release, the `1.0.0-beta.5` package/workspace
|
language-usability diagnostics release, the `1.0.0-beta.5` package/workspace
|
||||||
@ -28,7 +28,10 @@ scalar token parsing, `1.0.0-beta.18` JSON string token parsing,
|
|||||||
`1.0.0-beta.19` test discovery and user-project conformance tooling, and
|
`1.0.0-beta.19` test discovery and user-project conformance tooling, and
|
||||||
`1.0.0-beta.20` string search and ASCII trim helpers, plus
|
`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.21` JSON document scalar parsing helpers, and
|
||||||
`1.0.0-beta.22` run manifest execution-report hardening.
|
`1.0.0-beta.22` run manifest execution-report hardening, plus
|
||||||
|
`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
|
`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
|
`byte_at_result`, `slice_result`, `starts_with`, and `ends_with`. These helpers
|
||||||
@ -105,6 +108,36 @@ contract. It is not a stable schema freeze and adds no language syntax,
|
|||||||
standard-library helpers, runtime capabilities, package/import behavior,
|
standard-library helpers, runtime capabilities, package/import behavior,
|
||||||
stable ABI/layout, or stable stdlib/API guarantees.
|
stable ABI/layout, or stable stdlib/API guarantees.
|
||||||
|
|
||||||
|
`1.0.0-beta.23` is documentation/catalog clarity, not a language or stdlib
|
||||||
|
behavior feature. It adds [`STDLIB_TIERS.md`](STDLIB_TIERS.md) as the public
|
||||||
|
stability-tier ledger beside the generated [`STDLIB_API.md`](STDLIB_API.md)
|
||||||
|
signature catalog. The ledger defines `beta-supported`, `experimental`, and
|
||||||
|
`internal`; marks JSON, loopback networking, random/time, and filesystem
|
||||||
|
resource-handle helpers as experimental domains; and keeps concrete vector
|
||||||
|
modules as beta-supported concrete lanes rather than a generic collections
|
||||||
|
freeze. It adds no source-language syntax, helpers, runtime names, runtime
|
||||||
|
behavior, stable manifest schema, stable Markdown schema, stable ABI/layout,
|
||||||
|
or stable stdlib/API freeze. It does update generated catalog output and the
|
||||||
|
release gate so tier metadata is visible and checked.
|
||||||
|
|
||||||
|
`1.0.0-beta.24` is package/workspace diagnostic hardening, not a language,
|
||||||
|
runtime, package-manager, or stdlib behavior feature. It makes duplicate
|
||||||
|
package manifest keys, invalid dependency keys, and duplicate dependency keys
|
||||||
|
explicit diagnostics while keeping the existing closed local workspace model.
|
||||||
|
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
|
The final experimental precursor scope is `exp-125`, defined in
|
||||||
`.llm/EXP_125_UNSIGNED_U32_U64_NUMERIC_AND_STDLIB_BREADTH_ALPHA.md`. Its
|
`.llm/EXP_125_UNSIGNED_U32_U64_NUMERIC_AND_STDLIB_BREADTH_ALPHA.md`. Its
|
||||||
unsigned direct-value flow, parse/format runtime lanes, and matching staged
|
unsigned direct-value flow, parse/format runtime lanes, and matching staged
|
||||||
|
|||||||
@ -13,10 +13,10 @@ foundation, `1.0.0-beta.18` JSON string token parsing foundation,
|
|||||||
`1.0.0-beta.19` test discovery and user-project conformance tooling, and
|
`1.0.0-beta.19` test discovery and user-project conformance tooling, and
|
||||||
`1.0.0-beta.20` string search and ASCII trim foundation, and
|
`1.0.0-beta.20` string search and ASCII trim foundation, and
|
||||||
`1.0.0-beta.21` JSON document scalar parsing foundation, and
|
`1.0.0-beta.21` JSON document scalar parsing foundation, and
|
||||||
`1.0.0-beta.22` run manifest and execution-report hardening. The
|
`1.0.0-beta.22` run manifest and execution-report hardening, and
|
||||||
language contract
|
`1.0.0-beta.23` standard-library stability tier ledger and catalog alignment.
|
||||||
integrates
|
The language contract integrates promoted language slices through `exp-125`
|
||||||
promoted language slices through `exp-125` and the historical publication
|
and the historical publication
|
||||||
baseline through `exp-123`. `1.0.0-beta` is the first real general-purpose
|
baseline through `exp-123`. `1.0.0-beta` is the first real general-purpose
|
||||||
beta release. `exp-125` completed the unsigned numeric and stdlib breadth
|
beta release. `exp-125` completed the unsigned numeric and stdlib breadth
|
||||||
precursor scope, `exp-124` is the last tagged experimental alpha language
|
precursor scope, `exp-124` is the last tagged experimental alpha language
|
||||||
@ -265,6 +265,18 @@ Current v1 release surface and explicit experimental targets:
|
|||||||
add source-language syntax, stdlib helpers, compiler-known runtime names,
|
add source-language syntax, stdlib helpers, compiler-known runtime names,
|
||||||
runtime C capabilities, package/import behavior, stable artifact-manifest
|
runtime C capabilities, package/import behavior, stable artifact-manifest
|
||||||
schema guarantees, stable ABI/layout, or stable stdlib/API freeze
|
schema guarantees, stable ABI/layout, or stable stdlib/API freeze
|
||||||
|
- `1.0.0-beta.23` standard-library stability tier ledger and catalog
|
||||||
|
alignment:
|
||||||
|
[`STDLIB_TIERS.md`](STDLIB_TIERS.md) defines the public tier labels
|
||||||
|
`beta-supported`, `experimental`, and `internal` beside the generated
|
||||||
|
[`STDLIB_API.md`](STDLIB_API.md) signature catalog. JSON, loopback
|
||||||
|
networking, random/time, and filesystem resource-handle helpers are
|
||||||
|
experimental domains. Concrete vector modules remain beta-supported concrete
|
||||||
|
lanes, not a generic collections freeze. This target does not add
|
||||||
|
source-language syntax, stdlib helpers, compiler-known runtime names,
|
||||||
|
runtime behavior, stable artifact-manifest schema, stable Markdown schema,
|
||||||
|
stable ABI/layout, or stable stdlib/API freeze. It does update generated
|
||||||
|
catalog output and the release gate so tier metadata is visible and checked
|
||||||
- `exp-1` owned runtime strings: compiler-known `std.string.concat` accepts two
|
- `exp-1` owned runtime strings: compiler-known `std.string.concat` accepts two
|
||||||
`string` values and returns an immutable runtime-owned `string`; existing
|
`string` values and returns an immutable runtime-owned `string`; existing
|
||||||
string equality, length, printing, locals, parameters, returns, and calls work
|
string equality, length, printing, locals, parameters, returns, and calls work
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
68
docs/language/STDLIB_TIERS.md
Normal file
68
docs/language/STDLIB_TIERS.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# Slovo Standard Library Stability Tiers
|
||||||
|
|
||||||
|
Status: beta public ledger for `1.0.0-beta.23`.
|
||||||
|
|
||||||
|
This document records the current maturity labels for the source-authored
|
||||||
|
standard-library facade surface. Exact exported helper signatures remain in
|
||||||
|
[`STDLIB_API.md`](STDLIB_API.md), which is generated from `lib/std/*.slo`.
|
||||||
|
This ledger explains how to read that catalog during the beta line.
|
||||||
|
|
||||||
|
`1.0.0-beta.23` is documentation and catalog-tooling alignment only. It adds no
|
||||||
|
source syntax, standard-library helpers, compiler-known runtime names, runtime
|
||||||
|
behavior, package behavior, manifest schema guarantee, Markdown schema
|
||||||
|
guarantee, ABI/layout guarantee, or stable standard-library/API compatibility
|
||||||
|
freeze. It does make the generated API catalog emit tier metadata and makes the
|
||||||
|
release gate check that experimental tier metadata is present.
|
||||||
|
|
||||||
|
## Tier Labels
|
||||||
|
|
||||||
|
Slovo uses these public standard-library tier labels:
|
||||||
|
|
||||||
|
| Tier | Meaning |
|
||||||
|
| --- | --- |
|
||||||
|
| `beta-supported` | Exported from `lib/std`, covered by current beta source-search, promotion, facade, or composition gates, and suitable for beta programs. Names and behavior are still beta contracts, not a stable `1.0.0` freeze. |
|
||||||
|
| `experimental` | Exported or documented in the beta line, but intentionally fluid because the domain still depends on deferred language, runtime, resource, platform, or schema policy. Use for feedback and narrow programs, not compatibility promises. |
|
||||||
|
| `internal` | Not public standard-library API. This includes non-exported helper names, module-local concrete aliases, implementation details, generated-document internals, and private runtime symbols. Internal names may be omitted from public catalogs or changed without migration promises. |
|
||||||
|
|
||||||
|
## Catalog Boundary
|
||||||
|
|
||||||
|
[`STDLIB_API.md`](STDLIB_API.md) is the generated signature inventory: it lists
|
||||||
|
exported `(fn ...)` helpers from `lib/std/*.slo`, normalizes module-local
|
||||||
|
concrete aliases to public concrete types, and omits non-exported helpers and
|
||||||
|
`(type ...)` aliases.
|
||||||
|
|
||||||
|
This ledger is the public maturity companion to that generated catalog. If the
|
||||||
|
catalog lists a signature, read the tier marker beside that signature as the
|
||||||
|
generated summary of this ledger. The generated catalog is a beta discovery
|
||||||
|
aid, not a stable Markdown schema or stable API freeze.
|
||||||
|
|
||||||
|
## Current Tier Ledger
|
||||||
|
|
||||||
|
| Surface | Current tier | Notes |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `std.cli`, `std.env`, `std.io`, `std.math`, `std.num`, `std.option`, `std.process`, `std.result`, and byte-oriented `std.string` helpers | `beta-supported` | Current source facade helpers over promoted concrete runtime/value families. The beta label still allows additive changes and scoped migrations before `1.0.0`. |
|
||||||
|
| Concrete vector modules: `std.vec_i32`, `std.vec_i64`, `std.vec_f64`, `std.vec_bool`, and `std.vec_string` | `beta-supported` | These are concrete immutable vector lanes over existing concrete runtime families. This is not a generic collections freeze and does not imply executable generics, generic aliases, maps, sets, iterators, mutable vectors, slice/view APIs, runtime collection changes, or stable ABI/layout. |
|
||||||
|
| Basic filesystem text/status helpers such as `read_text`, `write_text_result`, `exists`, `is_file`, `is_dir`, `remove_file_result`, and `create_dir_result` | `beta-supported` | Current concrete file helpers remain beta contracts over host filesystem behavior. Platform-specific errors and richer host-error ADTs remain deferred. |
|
||||||
|
| Filesystem resource-handle helpers such as `open_text_read_result`, `read_open_text_result`, `close_result`, `read_text_via_handle_result`, and `close_ok` | `experimental` | Handles are beta-scoped opaque `i32` values. Writable handles, directory handles/enumeration, stable handle ABI/layout, and richer platform error policy remain deferred. |
|
||||||
|
| `std.json` | `experimental` | Includes compact JSON text construction, exact primitive scalar token parsing, ASCII string-token parsing, and scalar document parsing. Object/array parsing, recursive `JsonValue`, parser/tokenizer objects, maps/sets, streaming, broad Unicode escape policy, embedded NUL policy, stable text encoding policy, and stable JSON API compatibility remain deferred. |
|
||||||
|
| `std.net` | `experimental` | Current blocking loopback TCP facade only. DNS, TLS, UDP, async IO, non-loopback binding, HTTP frameworks, stable socket ABI/layout, and rich host-error ADTs remain deferred. |
|
||||||
|
| `std.random` and `std.time` | `experimental` | Available as narrow beta host facades, but deterministic testing policy, seeding/time-source contracts, monotonic/wall-clock distinctions, reproducibility guarantees, and stable platform behavior remain deferred. |
|
||||||
|
| Non-exported helper names, module-local aliases, private runtime symbols, generated catalog internals, and release-tool implementation details | `internal` | Not part of the public standard-library compatibility surface. |
|
||||||
|
|
||||||
|
## Explicit Non-Changes
|
||||||
|
|
||||||
|
This ledger does not promote:
|
||||||
|
|
||||||
|
- source-language syntax
|
||||||
|
- standard-library helper additions, removals, or renames
|
||||||
|
- compiler-known runtime names
|
||||||
|
- runtime behavior changes
|
||||||
|
- executable generics or generic aliases
|
||||||
|
- generic stdlib dispatch
|
||||||
|
- maps, sets, iterators, mutable vectors, or slice/view APIs
|
||||||
|
- object/array JSON parsing or stable JSON schemas
|
||||||
|
- DNS, TLS, UDP, async networking, or non-loopback binding
|
||||||
|
- stable resource-handle ABI/layout
|
||||||
|
- stable artifact-manifest schema
|
||||||
|
- stable generated Markdown schema
|
||||||
|
- stable `1.0.0` standard-library/API compatibility freeze
|
||||||
@ -47,7 +47,8 @@ whole-document scalar parse facades over `std.string.trim_ascii` and the
|
|||||||
existing exact value-token parsers; the
|
existing exact value-token parsers; the
|
||||||
`1.0.0-beta.8` concrete type alias target keeps that same helper surface while
|
`1.0.0-beta.8` concrete type alias target keeps that same helper surface while
|
||||||
using local `JsonText` and `JsonField` aliases as transparent names for
|
using local `JsonText` and `JsonField` aliases as transparent names for
|
||||||
`string` JSON fragments.
|
`string` JSON fragments; `1.0.0-beta.23` adds the public
|
||||||
|
standard-library stability tier ledger without changing this helper surface.
|
||||||
|
|
||||||
This directory is the source home for staged standard library modules and
|
This directory is the source home for staged standard library modules and
|
||||||
examples. exp-44 lets project-mode source explicitly import `std/math.slo` as
|
examples. exp-44 lets project-mode source explicitly import `std/math.slo` as
|
||||||
@ -170,6 +171,18 @@ make the standard library fully self-hosted, does not add automatic
|
|||||||
standard-library imports, and does not replace the compiler-known `std.*`
|
standard-library imports, and does not replace the compiler-known `std.*`
|
||||||
standard-runtime calls cataloged in `../STANDARD_RUNTIME.md`.
|
standard-runtime calls cataloged in `../STANDARD_RUNTIME.md`.
|
||||||
|
|
||||||
|
`docs/language/STDLIB_API.md` remains the generated exact signature catalog
|
||||||
|
for exported helpers in this directory. `docs/language/STDLIB_TIERS.md` is the
|
||||||
|
beta23 public maturity ledger for that catalog. It defines the tier labels
|
||||||
|
`beta-supported`, `experimental`, and `internal`; classifies JSON, loopback
|
||||||
|
networking, random/time, and filesystem resource-handle helpers as
|
||||||
|
experimental domains; and records the concrete vector modules as
|
||||||
|
beta-supported concrete lanes, not a generic collections freeze. The tier
|
||||||
|
ledger is documentation/catalog tooling clarity only and does not add helpers,
|
||||||
|
syntax, runtime behavior, stable Markdown schema, or a stable stdlib/API
|
||||||
|
freeze. The generated catalog and release gate now expose and check tier
|
||||||
|
metadata.
|
||||||
|
|
||||||
The current `.slo` files use flat module declarations such as `(module math)`.
|
The current `.slo` files use flat module declarations such as `(module math)`.
|
||||||
For exp-44, exp-45, exp-47, exp-48, exp-49, exp-52, exp-53, exp-76, exp-94,
|
For exp-44, exp-45, exp-47, exp-48, exp-49, exp-52, exp-53, exp-76, exp-94,
|
||||||
exp-96, exp-97, exp-98, exp-99, exp-103, exp-104, exp-105, exp-107, exp-108,
|
exp-96, exp-97, exp-98, exp-99, exp-103, exp-104, exp-105, exp-107, exp-108,
|
||||||
|
|||||||
80
scripts/check-stdlib-api-tiers.js
Executable file
80
scripts/check-stdlib-api-tiers.js
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
const repoRoot = path.resolve(__dirname, "..");
|
||||||
|
const catalogPath = path.join(repoRoot, "docs", "language", "STDLIB_API.md");
|
||||||
|
const catalog = fs.readFileSync(catalogPath, "utf8");
|
||||||
|
|
||||||
|
function fail(message) {
|
||||||
|
console.error(`stdlib API tier check failed: ${message}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireText(text, message) {
|
||||||
|
if (!catalog.includes(text)) {
|
||||||
|
fail(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function moduleSection(moduleName) {
|
||||||
|
const marker = `### std.${moduleName}\n`;
|
||||||
|
const start = catalog.indexOf(marker);
|
||||||
|
if (start < 0) {
|
||||||
|
fail(`missing std.${moduleName} module section`);
|
||||||
|
}
|
||||||
|
const next = catalog.indexOf("\n### std.", start + marker.length);
|
||||||
|
return next < 0 ? catalog.slice(start) : catalog.slice(start, next);
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireModuleTier(moduleName, expectedTier) {
|
||||||
|
const section = moduleSection(moduleName);
|
||||||
|
if (!section.includes(`- Tiers: \`${expectedTier}\``)) {
|
||||||
|
fail(`std.${moduleName} is not marked as ${expectedTier}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireHelperTier(moduleName, helperName, expectedTier) {
|
||||||
|
const section = moduleSection(moduleName);
|
||||||
|
const helperPattern = new RegExp(`^- \`${expectedTier}\` \`${helperName} `, "m");
|
||||||
|
if (!helperPattern.test(section)) {
|
||||||
|
fail(`std.${moduleName}.${helperName} is not marked as ${expectedTier}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/experimental`: not used|experimental not used/i.test(catalog)) {
|
||||||
|
fail("catalog still contains stale wording that says experimental is unused");
|
||||||
|
}
|
||||||
|
|
||||||
|
requireText("- `beta-supported`:", "missing beta-supported tier definition");
|
||||||
|
requireText("- `experimental`:", "missing experimental tier definition");
|
||||||
|
requireText("- `internal`:", "missing internal tier definition");
|
||||||
|
requireText("- `experimental` helper signatures:", "missing experimental summary count");
|
||||||
|
requireText("Concrete `std.vec_*` modules are beta-supported as concrete helper families only; this does not freeze a generic collection API.", "missing concrete vector boundary");
|
||||||
|
|
||||||
|
if (!/^- `experimental` `[^`]+`/m.test(catalog)) {
|
||||||
|
fail("catalog does not list any experimental helper signatures");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const moduleName of ["json", "net", "random", "time"]) {
|
||||||
|
requireModuleTier(moduleName, "experimental");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const helperName of [
|
||||||
|
"open_text_read_result",
|
||||||
|
"read_open_text_result",
|
||||||
|
"close_result",
|
||||||
|
"read_text_via_handle_result",
|
||||||
|
"close_ok",
|
||||||
|
]) {
|
||||||
|
requireHelperTier("fs", helperName, "experimental");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const moduleName of ["vec_bool", "vec_f64", "vec_i32", "vec_i64", "vec_string"]) {
|
||||||
|
const section = moduleSection(moduleName);
|
||||||
|
if (!section.includes("- Note: concrete-only vector helper family; no generic collection freeze.")) {
|
||||||
|
fail(`std.${moduleName} is missing the concrete vector boundary note`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -9,8 +9,11 @@ cd "${repo_root}"
|
|||||||
git diff --check
|
git diff --check
|
||||||
bash -n scripts/install.sh
|
bash -n scripts/install.sh
|
||||||
bash -n scripts/render-stdlib-api-doc.sh
|
bash -n scripts/render-stdlib-api-doc.sh
|
||||||
|
node --check scripts/render-stdlib-api-doc.js
|
||||||
|
node --check scripts/check-stdlib-api-tiers.js
|
||||||
|
|
||||||
"${repo_root}/scripts/render-stdlib-api-doc.sh"
|
"${repo_root}/scripts/render-stdlib-api-doc.sh"
|
||||||
|
"${repo_root}/scripts/check-stdlib-api-tiers.js"
|
||||||
git diff --check
|
git diff --check
|
||||||
if ! git diff --quiet -- docs/language/STDLIB_API.md; then
|
if ! git diff --quiet -- docs/language/STDLIB_API.md; then
|
||||||
echo "standard library API catalog changed; review and commit generated docs before release" >&2
|
echo "standard library API catalog changed; review and commit generated docs before release" >&2
|
||||||
@ -73,6 +76,8 @@ cargo test --test test_discovery_beta19
|
|||||||
cargo test --test standard_string_search_trim_beta20
|
cargo test --test standard_string_search_trim_beta20
|
||||||
cargo test --test standard_json_document_scalar_parsing_beta21
|
cargo test --test standard_json_document_scalar_parsing_beta21
|
||||||
cargo test --test run_manifest_beta22
|
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,
|
# Full cargo test includes unignored integration gates such as dx_v1_7,
|
||||||
# beta_v2_0_0_beta_1, and beta_1_0_0.
|
# beta_v2_0_0_beta_1, and beta_1_0_0.
|
||||||
cargo test
|
cargo test
|
||||||
|
|||||||
@ -9,6 +9,46 @@ const stdDir = path.join(repoRoot, "lib", "std");
|
|||||||
const outputPath = path.join(repoRoot, "docs", "language", "STDLIB_API.md");
|
const outputPath = path.join(repoRoot, "docs", "language", "STDLIB_API.md");
|
||||||
const readmePath = path.join(repoRoot, "README.md");
|
const readmePath = path.join(repoRoot, "README.md");
|
||||||
|
|
||||||
|
const TIERS = Object.freeze({
|
||||||
|
BETA_SUPPORTED: "beta-supported",
|
||||||
|
EXPERIMENTAL: "experimental",
|
||||||
|
INTERNAL: "internal",
|
||||||
|
});
|
||||||
|
|
||||||
|
const EXPERIMENTAL_MODULES = new Set(["json", "net", "random", "time"]);
|
||||||
|
|
||||||
|
const EXPERIMENTAL_HELPERS = new Map([
|
||||||
|
[
|
||||||
|
"fs",
|
||||||
|
new Set([
|
||||||
|
"open_text_read_result",
|
||||||
|
"read_open_text_result",
|
||||||
|
"close_result",
|
||||||
|
"read_text_via_handle_result",
|
||||||
|
"close_ok",
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
const CONCRETE_VEC_MODULES = new Set(["vec_bool", "vec_f64", "vec_i32", "vec_i64", "vec_string"]);
|
||||||
|
|
||||||
|
function helperTier(moduleName, exportName) {
|
||||||
|
if (EXPERIMENTAL_MODULES.has(moduleName)) {
|
||||||
|
return TIERS.EXPERIMENTAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const experimentalHelpers = EXPERIMENTAL_HELPERS.get(moduleName);
|
||||||
|
if (experimentalHelpers && experimentalHelpers.has(exportName)) {
|
||||||
|
return TIERS.EXPERIMENTAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TIERS.BETA_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
function uniqueSorted(values) {
|
||||||
|
return Array.from(new Set(values)).sort();
|
||||||
|
}
|
||||||
|
|
||||||
function tokenize(source) {
|
function tokenize(source) {
|
||||||
const tokens = [];
|
const tokens = [];
|
||||||
let index = 0;
|
let index = 0;
|
||||||
@ -204,7 +244,11 @@ function stdModules() {
|
|||||||
|
|
||||||
for (const exported of module.exports) {
|
for (const exported of module.exports) {
|
||||||
if (functions.has(exported)) {
|
if (functions.has(exported)) {
|
||||||
signatures.push(functionSignature(functions.get(exported), aliases, relativePath));
|
signatures.push({
|
||||||
|
name: exported,
|
||||||
|
signature: functionSignature(functions.get(exported), aliases, relativePath),
|
||||||
|
tier: helperTier(module.name, exported),
|
||||||
|
});
|
||||||
} else if (aliases.has(exported)) {
|
} else if (aliases.has(exported)) {
|
||||||
omittedAliasExports.push(exported);
|
omittedAliasExports.push(exported);
|
||||||
} else {
|
} else {
|
||||||
@ -216,6 +260,7 @@ function stdModules() {
|
|||||||
fileName,
|
fileName,
|
||||||
relativePath,
|
relativePath,
|
||||||
name: module.name,
|
name: module.name,
|
||||||
|
tiers: uniqueSorted(signatures.map((signature) => signature.tier)),
|
||||||
signatures,
|
signatures,
|
||||||
omittedAliasExports,
|
omittedAliasExports,
|
||||||
};
|
};
|
||||||
@ -234,6 +279,15 @@ function releaseVersion() {
|
|||||||
function render(modules, version) {
|
function render(modules, version) {
|
||||||
const totalExports = modules.reduce((count, module) => count + module.signatures.length, 0);
|
const totalExports = modules.reduce((count, module) => count + module.signatures.length, 0);
|
||||||
const totalOmittedAliases = modules.reduce((count, module) => count + module.omittedAliasExports.length, 0);
|
const totalOmittedAliases = modules.reduce((count, module) => count + module.omittedAliasExports.length, 0);
|
||||||
|
const tierCounts = new Map([
|
||||||
|
[TIERS.BETA_SUPPORTED, 0],
|
||||||
|
[TIERS.EXPERIMENTAL, 0],
|
||||||
|
]);
|
||||||
|
for (const module of modules) {
|
||||||
|
for (const signature of module.signatures) {
|
||||||
|
tierCounts.set(signature.tier, (tierCounts.get(signature.tier) || 0) + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
const out = [];
|
const out = [];
|
||||||
out.push("# Slovo Standard Library API Catalog");
|
out.push("# Slovo Standard Library API Catalog");
|
||||||
out.push("");
|
out.push("");
|
||||||
@ -243,12 +297,13 @@ function render(modules, version) {
|
|||||||
out.push("## Stability Tiers");
|
out.push("## Stability Tiers");
|
||||||
out.push("");
|
out.push("");
|
||||||
out.push("- `beta-supported`: exported from `lib/std` and covered by source-search, promotion, or facade gates in the current beta line.");
|
out.push("- `beta-supported`: exported from `lib/std` and covered by source-search, promotion, or facade gates in the current beta line.");
|
||||||
out.push(`- \`experimental\`: not used for exported \`lib/std\` helpers in \`${version}\`; future releases may mark new helpers this way before they graduate.`);
|
out.push(`- \`experimental\`: exported from \`lib/std\` in \`${version}\`, but still has beta caveats around host behavior, resource handles, or API shape.`);
|
||||||
out.push("- `internal`: helper names that are not exported from their module; they are intentionally omitted from this catalog.");
|
out.push("- `internal`: helper names that are not exported from their module; they are intentionally omitted from this catalog.");
|
||||||
out.push("");
|
out.push("");
|
||||||
out.push("The catalog is a beta API discovery aid, not a stable `1.0.0` standard-library freeze.");
|
out.push("The catalog is a beta API discovery aid, not a stable `1.0.0` standard-library freeze.");
|
||||||
out.push("Module-local concrete aliases are normalized in signatures so names such as `VecI32` and `ResultU64` do not leak into the public catalog.");
|
out.push("Module-local concrete aliases are normalized in signatures so names such as `VecI32` and `ResultU64` do not leak into the public catalog.");
|
||||||
out.push("Only exported `(fn ...)` helpers are listed; `(type ...)` aliases and non-exported helpers are omitted.");
|
out.push("Only exported `(fn ...)` helpers are listed; `(type ...)` aliases and non-exported helpers are omitted.");
|
||||||
|
out.push("Concrete `std.vec_*` modules are beta-supported as concrete helper families only; this does not freeze a generic collection API.");
|
||||||
out.push("");
|
out.push("");
|
||||||
out.push("## Summary");
|
out.push("## Summary");
|
||||||
out.push("");
|
out.push("");
|
||||||
@ -256,6 +311,8 @@ function render(modules, version) {
|
|||||||
out.push(`- Exported helper signatures: ${totalExports}`);
|
out.push(`- Exported helper signatures: ${totalExports}`);
|
||||||
out.push(`- Exported type aliases omitted: ${totalOmittedAliases}`);
|
out.push(`- Exported type aliases omitted: ${totalOmittedAliases}`);
|
||||||
out.push("- Default tier: `beta-supported`");
|
out.push("- Default tier: `beta-supported`");
|
||||||
|
out.push(`- \`${TIERS.BETA_SUPPORTED}\` helper signatures: ${tierCounts.get(TIERS.BETA_SUPPORTED) || 0}`);
|
||||||
|
out.push(`- \`${TIERS.EXPERIMENTAL}\` helper signatures: ${tierCounts.get(TIERS.EXPERIMENTAL) || 0}`);
|
||||||
out.push("");
|
out.push("");
|
||||||
out.push("## Modules");
|
out.push("## Modules");
|
||||||
out.push("");
|
out.push("");
|
||||||
@ -263,11 +320,14 @@ function render(modules, version) {
|
|||||||
out.push(`### std.${module.name}`);
|
out.push(`### std.${module.name}`);
|
||||||
out.push("");
|
out.push("");
|
||||||
out.push(`- Path: \`${module.relativePath}\``);
|
out.push(`- Path: \`${module.relativePath}\``);
|
||||||
out.push("- Tier: `beta-supported`");
|
out.push(`- Tiers: ${module.tiers.map((tier) => `\`${tier}\``).join(", ")}`);
|
||||||
out.push(`- Exported helper signatures: ${module.signatures.length}`);
|
out.push(`- Exported helper signatures: ${module.signatures.length}`);
|
||||||
|
if (CONCRETE_VEC_MODULES.has(module.name)) {
|
||||||
|
out.push("- Note: concrete-only vector helper family; no generic collection freeze.");
|
||||||
|
}
|
||||||
out.push("");
|
out.push("");
|
||||||
for (const signature of module.signatures) {
|
for (const { signature, tier } of module.signatures) {
|
||||||
out.push(`- \`${signature}\``);
|
out.push(`- \`${tier}\` \`${signature}\``);
|
||||||
}
|
}
|
||||||
out.push("");
|
out.push("");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user