Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
5ee6670
deps: bump wasmtime to 46.0.1 for GHSA-4ch3-9j33-3pmj (#949)
dependabot[bot] Jul 8, 2026
d6b6510
deps: bump setuptools build floor to >=83.0.0 (#950)
dependabot[bot] Jul 8, 2026
fbf944f
docs: add an 18-figure SVG diagram set across the spec and top-level …
aallan Jul 8, 2026
44aba55
docs: diagram wave 2 — fifteen more figures (33 total)
aallan Jul 8, 2026
bca3803
docs: six-auditor consistency sweep — one behavioural claim, the rest…
aallan Jul 8, 2026
b49d894
docs(site): the write→prove→ship loop figure on the landing page
aallan Jul 8, 2026
0d52985
docs(spec): restore the bash tag on the §13.1 command fence (PR #959 …
aallan Jul 8, 2026
c6e334c
test: retire five stale bug-era annotations, each pytest-verified
aallan Jul 8, 2026
bb32e52
release: v0.1.1 — the visual documentation release
aallan Jul 8, 2026
8027b39
Merge pull request #959 from aallan/feat/doc-diagrams
aallan Jul 8, 2026
f091b23
docs(site): rebalance the loop figure + audit the landing page's claims
aallan Jul 8, 2026
6b31396
Merge pull request #961 from aallan/fix/site-loop-figure
aallan Jul 8, 2026
5de983d
docs: rework ROADMAP into staged sprints + fold the post-release tail…
aallan Jul 8, 2026
078b1d8
fix(tooling): require the plumbing-skip's sole ctor be reachable as t…
chethanuk Jul 8, 2026
4d1b4d4
fix(tooling): AnnAssign is a binding site — count it in reachability …
aallan Jul 9, 2026
8d3235d
fix(tooling): count rebinds generically — Store-context names, import…
aallan Jul 9, 2026
3f34140
ci: scheduled limitations-sync workflow — loud on undeterminable stat…
chethanuk Jul 9, 2026
0c47eab
ci: add ubuntu-24.04-arm to the test matrix as an advisory lane (#962)
chethanuk Jul 9, 2026
2be2c76
Merge remote-tracking branch 'origin/main' into pr964
aallan Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
permissions:
contents: read
strategy:
# #848: don't let one failed combo cancel the other 11 — a single
# #848: don't let one failed combo cancel the other 12 — a single
# flaky test cancelled two otherwise-green matrices on PR #846.
# Full per-run results also make real cross-platform breakage
# (one OS red, others green) legible at a glance.
Expand All @@ -26,6 +26,11 @@ jobs:
# (Tahoe) is current and dominant (~75%).
os: [ubuntu-latest, macos-15, macos-26, windows-latest]
python-version: ["3.11", "3.12", "3.13"]
include:
# #702: real end-to-end Linux aarch64 coverage — platform
# coverage, not python-version coverage, so one job only.
- os: ubuntu-24.04-arm
python-version: "3.12"

name: test (${{ matrix.os }}, ${{ matrix.python-version }})${{ matrix.python-version == '3.12' && matrix.os == 'ubuntu-latest' && ' + coverage' || '' }}
runs-on: ${{ matrix.os }}
Expand Down
102 changes: 102 additions & 0 deletions .github/workflows/limitations-sync.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
name: Limitations sync (issue states)

# Checks that spec/SKILL.md/README limitation tables agree with the live
# state of the GitHub issues they cite (#852) — e.g. a row still listing a
# limitation whose tracking issue has since been closed. This is a
# visibility signal on the Actions tab, not a merge gate: it is
# deliberately NOT added to required branch-protection status checks,
# since issue state can drift independently of any particular PR.

on:
schedule:
- cron: '0 7 * * 1' # Monday 07:00 UTC — offset from nightly-stress's 06:00 daily slot
workflow_dispatch:

# A manual workflow_dispatch run right around the Monday cron shouldn't race
# a scheduled run against the same live issue-state data; queue instead of
# cancelling either one.
concurrency:
group: limitations-sync
cancel-in-progress: false

jobs:
check-states:
permissions:
contents: read
issues: write # read for the state check; write for the on-failure tracking issue
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false

- name: Set up Python 3.12
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Check limitation tables against live issue states
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python scripts/check_limitations_sync.py --check-states

# Failure routing, mirroring nightly-stress.yml: scheduled-run
# failure emails go to the workflow author, not the maintainer,
# and nobody watches the Actions tab — so a failure (drift found,
# OR the state check itself couldn't run) files/updates a
# labelled tracking issue instead. Open tracking issues stay
# open until manually closed, by design.
- name: Open or update tracking issue on cron failure
if: failure() && github.event_name == 'schedule'
uses: actions/github-script@v9
env:
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
with:
script: |
const LABEL = "limitations-drift";
const TITLE = "Limitations sync failure on main (tracking)";
const runUrl = process.env.RUN_URL;
const commentBody = [
`The scheduled limitations-sync run failed.`,
``,
`**Run logs**: ${runUrl}`,
``,
`Either a limitation table cites an issue that has since closed (fix: retire the row per the no-strikethroughs convention), or the state check itself could not run (gh auth / rate limit — the check fails loud rather than passing vacuously).`,
].join("\n");

// Ensure the label exists (idempotent).
try {
await github.rest.issues.getLabel({
owner: context.repo.owner, repo: context.repo.repo, name: LABEL,
});
} catch (e) {
if (e.status === 404) {
await github.rest.issues.createLabel({
owner: context.repo.owner, repo: context.repo.repo,
name: LABEL, color: "d4a72c",
description: "Scheduled limitations-sync failure (#852)",
});
} else { throw e; }
}

// Find an existing open tracking issue (filter out PRs that
// might carry the label — same defensive filter as
// nightly-stress.yml).
const { data: candidates } = await github.rest.issues.listForRepo({
owner: context.repo.owner, repo: context.repo.repo,
labels: LABEL, state: "open", per_page: 10,
});
const existing = candidates.filter(item => !item.pull_request);

if (existing.length > 0) {
await github.rest.issues.createComment({
owner: context.repo.owner, repo: context.repo.repo,
issue_number: existing[0].number, body: commentBody,
});
} else {
await github.rest.issues.create({
owner: context.repo.owner, repo: context.repo.repo,
title: TITLE, body: commentBody, labels: [LABEL],
});
}
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Read `SKILL.md` for the full language reference. It covers syntax, slot referenc

### Conformance programs as reference

The conformance suite in `tests/conformance/` contains 143 small, self-contained programs — often one per language feature — that serve as minimal working examples (the exception is `ch07_cross_module_contracts.vera`, which imports its `ch07_cross_module_contracts_lib.vera` companion to exercise cross-module contracts). Each positive program must pass its declared verification level (see `manifest.json` for mappings: `parse`, `check`, `verify`, or `run`); the seven negative fixtures (`ch02_generic_over_unit_rejected`, `ch05_apply_fn_arity`, `ch08_circular_import`, `ch08_visibility_private`, `ch09_builtin_redefinition`, `ch09_ord_adt_rejected`, `ch09_eq_non_derivable_rejected`) instead must *fail* `check` with the E-code in their `expected_error` field. When you need to see how a specific construct works (e.g. effect handlers, match expressions, closures), check the corresponding conformance program before reading the spec.
The conformance suite in `tests/conformance/` contains 143 small, self-contained programs — often one per language feature — that serve as minimal working examples (the exceptions are `ch07_cross_module_contracts.vera` and `ch08_cross_module_generic.vera`, which import their `ch07_cross_module_contracts_lib.vera` companion to exercise cross-module contracts). Each positive program must pass its declared verification level (see `manifest.json` for mappings: `parse`, `check`, `verify`, or `run`); the seven negative fixtures (`ch02_generic_over_unit_rejected`, `ch05_apply_fn_arity`, `ch08_circular_import`, `ch08_visibility_private`, `ch09_builtin_redefinition`, `ch09_ord_adt_rejected`, `ch09_eq_non_derivable_rejected`) instead must *fail* `check` with the E-code in their `expected_error` field. When you need to see how a specific construct works (e.g. effect handlers, match expressions, closures), check the corresponding conformance program before reading the spec.

### Workflow

Expand Down Expand Up @@ -150,10 +150,10 @@ Read `vera/README.md` for architecture docs, module map, and design patterns.
### Pipeline

```
source -> parse (parser.py) -> transform (transform.py) -> typecheck (checker.py) -> verify (verifier.py) -> compile (codegen/ + wasm/) -> execute (wasmtime or browser/runtime.mjs)
source -> parse (parser.py) -> transform (transform.py) -> resolve (resolver.py) -> typecheck (checker.py) -> verify (verifier.py) -> compile (codegen/ + wasm/) -> execute (wasmtime or browser/runtime.mjs)
```

Each stage is a module with a single public API function (`parse_file`, `transform`, `typecheck`, `verify`, `compile`, `execute`, `test`) and is independently testable.
Each stage is a module with a single public API function (`parse_file`, `transform`, `resolve_imports`, `typecheck`, `verify`, `compile`, `execute`, `test`) and is independently testable.

### Key modules

Expand Down
Loading