Literate AI

Repository documentation

Private test matrix

Private test matrices map the repository's sample and lifecycle gates onto operator-owned workers without making hostnames, credentials, or private routing part of project authority.

Documentation feedback and release qualification

Repository CI classifies exact changed paths. Ordinary documentation-only pull requests and documentation-only pushes to main run documentation and presentation checks, without rebuilding unrelated native products. Changes confined to the CI selector or its policy add the focused selector tests. Pull requests compare their merge base; pushes compare their exact before/after commits, including removals.

Product changes, missing or unreadable comparisons, manual qualification, release branches and version tags retain the full applicable qualification matrix. A narrow documentation pass does not qualify a software release or renew a product receipt. The conference website has its own build, link/archive check and deployment workflow, which does not wait for product CI.

The native scripts/windows_release_gate.py runner follows hosted CI's isolation of the live admitted-receiver dependency observation. Its tests phase runs that case without xdist first, then runs every remaining test root with the requested workers and deselects only the already executed case. On Windows, a fresh short wg-* directory beside the checkout retains temporary fixtures and separate windows-admitted-receiver.xml and windows-tests.xml reports. The runner prints that directory and preserves previous runs, including the legacy <checkout>.tmp tree. Non-Windows diagnostic calls retain the _build/ report locations. A failure in either command fails the gate; the live observation's production deadline and the full qualification requirement are unchanged.

FreeBSD workers

FreeBSD workers may be physical machines or virtual guests. Their OS Flavor is flavor://literate-ai/os-freebsd; their execution requirement is freebsd, regardless of the hypervisor host. Use a dedicated build worker for packages and images, disposable guests for installation/upgrade/rollback, and physical targets for hardware acceptance. QEMU guests can be registered through private SSH worker configuration; the optional provisioner command owns guest creation and cleanup. Registration never implicitly creates a VM.

The FreeBSD repository template requires native Git and Git LFS, GNU Make (gmake), the base C compiler, native readelf/ldconfig, Node/npm and Python 3.11+. FreeBSD inventory and resource collection use noninteractive native commands, not interactive Bash startup. --skip-model alignment proves only declared tool/file readiness; it does not qualify a coding CLI or provider. Generation needs its separately configured and qualified runner.

Native Python build discovery also accepts versioned commands such as python3.12; an unversioned alias is unnecessary. Within each PATH directory, python3 and python precede numerically descending versioned commands. Explicit pins remain authoritative, and every selected executable must pass actual runtime version and identity checks.

Native ELF observation reads the FreeBSD hints directory order and recursively included global library maps, binds the inspector/configuration/library bytes, and rechecks library search candidates. It supports RPATH/RUNPATH, $ORIGIN and explicit LD_LIBRARY_PATH. It never runs a target image to discover dependencies. Filter and auxiliary library targets are retained as potential imports, including their recursive closure; that label does not assert that lazy loading occurred. Constrained, conflicting or chained library maps, other loader environment controls, other ABI interpreters, unmodeled dynamic tokens, unresolved filtees and NODEFLIB remain explicit refusals. These restrictions follow the observed FreeBSD loader contract; they do not qualify an arbitrary loader configuration or a complete lifecycle.

FreeBSD initialization, registration, alignment and resource observations are under active qualification in issue #67. End-to-end installed-wheel build/test, retained source custody and release qualification remain required; a hardware probe is not a substitute for those gates. Native quota observation is explicitly unsupported and requiring capacity policies continue to hold rather than infer no quotas. Retained secondary-account execution additionally requires POSIX.1e ACLs enabled on the filesystem containing the allocated workspace prefix. Literate AI tests the required named-user access and default ACL operations beneath that prefix before it captures inputs; it refuses unsupported or NFSv4-only ACL backends and never changes mount configuration itself.

Configure workers and selections

Copy literate.workers.example.json to user workers.json and replace its SSH placeholders with user-owned endpoints and workspaces. Copy literate.test.example.json to project-scoped user test.json and select those exact worker IDs with their matching freebsd, linux, macos, or windows platform Flavors. The resolved paths are reported by litai init: Linux/macOS default to ${XDG_CONFIG_HOME:-$HOME/.config}/literate-ai, while Windows uses the user's Roaming AppData Known Folder. LITAI_CONFIG_DIR is an absolute override.

Never commit either private file. Worker names, credentials, dynamic provisioning skills, and private routes are operator/session configuration rather than application authority. Set LITAI_TEST_CONFIG=/absolute/path/to/private-matrix.json to override the project-scoped path and LITAI_WORKER_CONFIG=/absolute/path/to/private-workers.json for its worker catalog.

Live generation (installed-project-e2e --live, make samples, and remote fan-out) fails closed unless both a coding CLI and a model are explicit. Put durable defaults in project-scoped user test.json as coding_cli and model (see literate.test.example.json for inert placeholders). Precedence is --coding-cli / --model, then CODING_CLI / LITAI_LIVE_MODEL, then that file. PATH first-available search is not a live-test default. Remote SSH workers require opencode on PATH, configured with credentials for the pinned model's provider; opencode resolves them from its own configuration or auth store, so Literate AI requires no specific key. Do not put keys in workers.json. A one-shot --coding-cli / --model override does not rewrite the JSON file.

LITAI_SESSION_ID=dev make samples \
  SAMPLE_FLAVORS='--sample hello-component --coding-cli cursor-agent --model gpt-5.6-sol-high'

POSIX --target local release fan-out requires user workers.json with at least one SSH POSIX worker, opencode on that worker's PATH, and opencode credentials for the pinned model's provider. Project user test.json must name that opencode plus model pair. Probe first, then check a prepared plan:

litai worker probe --all
litai release check PLAN.json --target local --project .

Each worker gate runs in a dedicated checkout, <workspace>/release/<repository>, that litai release syncs to the exact revision over SSH and SCP before the gate starts; you do not need to check out the release on the worker yourself.

Without that catalog the gate fails closed (release.target_unconfigured). A JSON pin that is not opencode fails closed on the controller (coding_cli.remote_prerequisite) before the gate command is dispatched. Do not put provider keys in workers.json or on the SSH command line.

Before capability-gated work, run litai worker probe --all. It probes configured SSH workers concurrently and atomically writes worker-observations.json beneath the resolved user state root. An absent nvidia-smi means no discoverable NVIDIA GPU; an installed command whose device query fails is degraded and must not be treated as GPU-capable. These observations never overwrite minimum routing requirements.

Host configuration via detect-before-install also attempts NTP synchronization to time.nist.gov because skewed clocks break coding-agent TLS and tokens. A failed attempt is logged in host-bootstrap.json under clock_sync and does not fail sample-worker readiness.

Run the supported matrix

make python-check bounds each parallel test module to 3,600 seconds by default. Set PYTHON_TEST_WORKER_TIMEOUT to configure that module deadline. Native FreeBSD qualification sets PYTHON_TEST_WORKERS=4 PYTHON_TEST_WORKER_TIMEOUT=10800 when running gmake python-check: the snapshot proof runs four clean generations and their probes, with a separate 1,800-second deadline for each candidate process. These module and process deadlines remain finite; increasing the module bound does not remove the individual process limits.

The framework's sample suite defaults unpinned samples to exactly flavor://literate-ai/lang-python, flavor://literate-ai/build-make, and the current host OS. Explicit sample pins remain authoritative. Opt into the full supported matrix with:

make samples-platform-regression \
  TEST_CONFIG=/path/to/matrix.json SAMPLE='*' \
  SAMPLE_FLAVORS="--flavor flavor://literate-ai/os-* \
--flavor flavor://literate-ai/lang-* \
--flavor flavor://literate-ai/build-*"

The exact expanded Flavor selectors participate in the remote checkpoint identity, and the persistent worker cache retains generated-source and build results between runs. Supply WORKER_CONFIG=/path/to/workers.json alongside the matrix command.

For an external dispatcher, add a kind: command worker whose command is a direct argument array. It receives one canonical request on standard input (or at the exact {request_file} argument), returns one typed result, and reads credentials only through declared environment bindings. Successful builds/tests publish an immutable, credential-free artifact URI and exact content identity. LitAI validates this protocol; the external command remains responsible for scheduling and provisioning.

A derived project may connect the same private matrix to its CI or task router and run litai rebuild for the selected Component and platform Flavor on each worker. The packaged CLI does not yet claim a generic derived-project fanout verb; consult litai help for the commands actually supported by the installed release.

Read the Markdown sourceConference homePublished 1.3.0 · Patch 1.3.1 in progress · Development 1.4