- C 57.6%
- JavaScript 14.6%
- Go Template 8%
- Python 5%
- C++ 4.7%
- Other 10%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| assets | ||
| docs/api | ||
| scenario-tools | ||
| tools | ||
| vendor/lace-js | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| index.md | ||
| LICENSE | ||
| Makefile | ||
| package-lock.json | ||
| package.json | ||
| pyproject.toml | ||
| README.md | ||
| TRADEMARK.md | ||
| typedoc.json | ||
| uv.lock | ||
Lace website
Plain static sources for the Lace landing page and scenario workbench.
From this lace-site checkout, with the lace checkout next to it at
../lace and at the exact revision in vendor/lace-js/LACE_REVISION, run:
make # build public/, check it, and run Chromium smoke
make api-docs # generate Rust, Python, and JavaScript API references
make syntax-test # regenerate/test all three grammars and the Rust highlighter
make test # execute every indexed scenario against pinned Lace
make serve HOST=0.0.0.0 PORT=8000
API generation runs cargo doc --locked --no-deps for lace-sans-io,
lace-compiler, lace-rt, and lace-tokio; pdoc for the public lace and lace.advanced
Python modules through the locked uv project; and the pinned TypeDoc tool over
the package declaration entry points. The generated landing page is
public/docs/api/index.html. Install GNU Make, Rust/Cargo, a C compiler, uv,
Node.js 24, npm, Pandoc, Tree-sitter CLI 0.26.10, and Chromium before building. The
smoke check uses chromium by default; set CHROMIUM to another Chromium
executable path if needed. The Python and JavaScript documentation tools are
resolved from uv.lock and package-lock.json.
public/ is generated and ignored. The build publishes the landing page, the
current numbered specifications and their linked local Markdown documents,
generated language API references, the scenario workbench, and the authenticated
browser runtime at vendor/lace-js/, the same relative path the workbench
imports from the source tree. make specs follows Pandoc links from the numbered specifications,
preserves source directory paths and link fragments, and renders directory links
to their README. The generated docs/source-pages.json inventory records pages
for stale-page removal and anchor validation. Run the documentation-generator
tests with timeout 55s uv run --frozen python -m unittest discover -s tools/tests.
public/downloads/lace.zip contains the pinned Lace Git tree and every pinned
submodule tree, including their source and notices, under a lace/ root folder.
Initialize the submodules before building: their pinned commits must be available
locally. Archive generation performs no fetches and never reads working-tree file
contents. The ZIP comment retains the Lace revision; the publication check compares
all archived bytes and file modes against those pinned trees. It contains source,
not prebuilt libraries. The build does not publish the copied paper, presentations,
examples, or incubators.
vendor/lace-js/SHA256SUMS authenticates every copied distribution file. The
build checks that the vendored files match it exactly and that the clean source
checkout is at LACE_REVISION. The distribution includes LICENSE, TRADEMARK.md,
THIRD-PARTY-NOTICES.txt, and RUST-STANDARD-LIBRARY-NOTICES.html; make runtime
copies them unchanged with the bundles and WASM. It does not compare the checkout's own build,
because the WASM is not byte-reproducible across hosts or toolchains.
No generated output uses a symlink or sibling-relative import.
After committing changes in ../lace, rebuild and refresh the runtime pin:
rustup component add rust-docs
rustup target add wasm32-unknown-unknown
npm --prefix ../lace/js/crates/lace-js run build:wasm
npm --prefix ../lace/js/crates/lace-js run build:dist
rm -rf vendor/lace-js/dist && cp -R ../lace/js/crates/lace-js/dist vendor/lace-js/dist
git -C ../lace rev-parse HEAD > vendor/lace-js/LACE_REVISION
(cd vendor/lace-js/dist && sha256sum * > ../SHA256SUMS)
make runtime-check
The source checkout must be clean for pin validation to pass.
Individual checks
After building their inputs, each check can run separately:
make syntax-test
make tooling-test
make scenario-test
make check-output
make smoke
index.md owns the landing-page source and its page-specific styles. It and the
published documents render through the shared Pandoc template
assets/template.html, which the build does not publish. The landing visual is
assets/interactive-expose-converge-quadrants.html; make extracts its inline
SVG to assets/visual-local-first-expose-converge.svg for the static fallback,
then copies both to public/.
Landing and source-document code blocks are highlighted at build time by the
vendored Rust/Tree-sitter tool in tools/lace-tree-sitter/, through its Pandoc
Lua filter and shared /assets/syntax.css. C blocks in linked Lace documents
use Pandoc's built-in highlighter. The same Tree-sitter executable highlights
scenario Interlang. Its tests verify that
removing markup recovers every source byte for JavaScript, Python, Rust, Bash,
Interlang/Lacegram, and Lace records.
These grammars are non-normative editor/build tooling synchronized to Lace-010,
Lace-030, and Lace-120/130; the numbered specifications remain authoritative.
Scenario policies use Interlang, including indented datalog: blocks for advanced
rules. Lacegram highlighting displays ordinary Datalog and whole-line comments;
it is not canonical Lace-030 validation. The record mode is only a UTF-8
documentation-display grammar; it cannot enforce Blob Data-Length framing or
parse arbitrary non-UTF-8 Blob bytes and is not syntax-complete validation.
Generated parser.c, grammar.json, and node-types.json files are tracked and
updated with their grammar sources. See tools/lace-tree-sitter/README.md.
Scenario record fixtures use ordered [name, value] field occurrences and
include only fields needed by their story or policy. Generic fields remain
occurrence-based unless a policy records a real singleton contract. Numeric
ordering fields use canonical unsigned decimal text with explicit Int
ordering.
Every case is an ordered list of steps; each step adds records and runs one
bounded interlace, checking every side's exact held and received records and
the expected terminal (see scenario-tools/README.md). make also regenerates
exact-source highlighted fragments for every rendered scenario policy while
publishing the current scenario fixtures and workbench. They load inline from each scenario's
policy-highlights.json; the browser falls back to escaped plain source if an
artifact is unavailable. The Chromium smoke follows the landing's Explore
link to the first beginner scenario and checks the level groups, timeline,
dark mode, narrow-screen layout, the trusted-members record values, and a
browser OPFS store across close and reopen.
The language libraries are source-checkout surfaces, not promised registry
installs. In ../lace, Rust starts at core/crates/lace-tokio/ for async use,
core/crates/lace-rt/ for standalone synchronous use, and
core/crates/lace-sans-io/ for state machines. The JavaScript and Python guides
are js/crates/lace-js/README.md and python/README.md.