tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

commit 2dc371aa8c81b65a2a87b987f2d1719e7873ba63
parent 1e847d672e27cc17baf593e52b1b39919166a915
Author: James Eversole <james@eversole.co>
Date:   Tue, 13 Oct 2026 21:27:28 -0500

Refresh authenticated demo-site compiler and immutable library releases

Pin fixture publication 1e847d6, regenerate independent Haskell compiler/demo/runtime/contract captures and practical environments, and stage the 15-package showcase at 0.1.1 without changing 34 prior releases. Patterns is now sourced from the support fixture. Add explicit showcase version selection and retain immutable-version conflict controls.

Validation: accepted fresh compiler pair and generation-two smokes; 39 support manifest/receipt reproductions; exact DAG equality of all 1165 common compiler and 581 common support exports; source freshness and shipped kit checks; offline published-library inspector against independent Haskell oracle; four retained-input native rebuilds and cache-poison controls; TypeScript parity; site/dependency-pack/seeding check; 12 site staging/UI tooling tests; final Nix fast gate, native server integration and current-source IO dependency probe. Haskell language host only; no cross-host evaluator matrix or public deployment.

Diffstat:
Mext/demo-site/README.md | 10++++++++--
Aext/demo-site/bundles/520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf.arboricx | 0
Aext/demo-site/bundles/a068c41275341b9baea81b33cdab32236032579fc6dfa12c014643317f114518.arboricx | 0
Mext/demo-site/compiler-reference.v1 | 5++---
Mext/demo-site/compiler.json | 4++--
Mext/demo-site/demos.json | 6+++---
Mext/demo-site/environments.json | 2+-
Mext/demo-site/packages.json | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mext/demo-site/prepare-showcase.py | 5+++--
Mext/demo-site/test/compiler-conformance.json | 4++--
Mext/demo-site/test/compiler.test.mjs | 3++-
Mext/demo-site/test/conformance.json | 2+-
Mext/demo-site/test/contracts-conformance.json | 4++--
Mext/demo-site/test/showcase-preparation.test.mjs | 11++++++++++-
14 files changed, 143 insertions(+), 20 deletions(-)

diff --git a/ext/demo-site/README.md b/ext/demo-site/README.md @@ -64,7 +64,7 @@ seeding, or browser package selection. ### Compiler packages, practical libraries and scanning demos -The Published packages group also contains these `0.1.0` interfaces: +The Published packages group also contains these `0.1.0` and `0.1.1` interfaces: - **tricu-compiler**: the exact compiler-library bytes already pinned by `compiler.json`, not a rebuilt or substituted compiler. The supported browser @@ -134,6 +134,9 @@ Nix, then run the opt-in bounded preparation: nix build .# python3 ext/demo-site/prepare-showcase.py result/bin/tricu \ --directory /tmp/arboricx-showcase --stage-site +# Refresh the package set under a new immutable version: +python3 ext/demo-site/prepare-showcase.py result/bin/tricu \ + --directory /tmp/arboricx-showcase-next --version 0.1.2 --stage-site ``` Preparation authenticates retained fixtures and requires all recorded working @@ -163,7 +166,10 @@ publication. Existing release pins cannot be replaced, all assets precede index discovery, and conflicts fail before staging. Native-prepared catalogue entries have `preparation: "native"`; `prepare.py` preserves them and `prepare-index.py` does not assign them a browser compilation environment. -Existing immutable versions are unchanged. +Existing immutable versions are unchanged. `--version` selects the exact label +for the entire prepared package set (default `0.1.1`); a changed bundle cannot +replace an existing name/version. The `patterns` interface comes from the support fixture, not a +build-only edge through IO or the compiler closure. ### Published packages and local drafts diff --git a/ext/demo-site/bundles/520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf.arboricx b/ext/demo-site/bundles/520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf.arboricx Binary files differ. diff --git a/ext/demo-site/bundles/a068c41275341b9baea81b33cdab32236032579fc6dfa12c014643317f114518.arboricx b/ext/demo-site/bundles/a068c41275341b9baea81b33cdab32236032579fc6dfa12c014643317f114518.arboricx Binary files differ. diff --git a/ext/demo-site/compiler-reference.v1 b/ext/demo-site/compiler-reference.v1 @@ -2,7 +2,7 @@ tricu.compiler-library-fixture.v1 module source.map source_map lib/source/map.tri 72638c3d2ec6f47598cba67c730249e8381c67cd5ba6437c4d24711e206afced module source.unit source_unit lib/source/unit.tri df06fabda353c5d88c0463e63f3d260c584abf0258ff2e3b9ca500481f4e0658 module prelude prelude lib/prelude.tri 0c26a0142d15cc2a11a4317264491c797944e76ea8afa07a1efef240a70f4289 -module io io lib/io.tri 1d79ec9eec9e14abbf8a44c9bd577e4a2a3f371a4f05d93fc711024d45d46543 +module io io lib/io.tri c4ec206590d25d581b9a96f242c22936d8d0b2e9903331ce50b30ad7de254bd6 module source.object source_object lib/source/object.tri 76a7e0ddde50e8a600ae8855d9091aa59af3235193605e5a7a07532ae90372af module source.module source_module lib/source/module.tri fb609a75a12659d2a05a63681c0cf96ef606045b4aebe044eac077c8cd23fbf2 module source.resolve source_resolve lib/source/resolve.tri bbb524d3e08a9961f8de6d8e2ab2e7dd47576b8ed78676a64d997bf65133b543 @@ -15,7 +15,6 @@ module source.ast source_ast lib/source/ast.tri b6d05cace61c04032ea39a858dedc748 module base base lib/base.tri 7ba2537cc4ec0571a7aa8a02557551245ca04f5bc08d9f9c1eb4d2606ec67b37 module bytes bytes lib/bytes.tri 6d057be42bc16788a34ce80cca7cb97251cf7dbbae8fd57100a31206ab3dd2a0 module conversions conversions lib/conversions.tri fd93454ad6cf7b0d906f367bed9a679f7f7e73cf424e33d8a62e63b023db6522 -module patterns patterns lib/patterns.tri d61f2de7b3dce93c9b8914fb980224437d0ea4207787caab9098041cf5bfe896 module source.lexer source_lexer lib/source/lexer.tri 94ee3a70dbed59015891f7f5c2ef588d64f1a885218edc35eed98d96d85fd11b module source.parser source_parser lib/source/parser.tri 00d64064122dace90dd8fa8535e4f9a76450bc61de572ae40f4a05692aeac9a0 module source.core source_core lib/source/core.tri b132ca49c22098c8a5d638517d701ad8141028d9389594ac2134240d240a2637 @@ -27,4 +26,4 @@ module source.pattern source_pattern lib/source/pattern.tri 1d43992c04f9881c1ebd module source.equations source_equations lib/source/equations.tri 825f175f5c6dd56e103b94e924283acf5913cbc4554fb42fc07a034f460d2076 module source.stable source_stable lib/source/stable.tri d52a595e2a4ab187b3d13b478b98a596d83b02fdeae0818c58a105b7a1d14c97 module math.native native_math lib/math/native.tri 3ee81d8c129a511ddb26b34d22ebc4fe257fb124a99e2b2f1afce8a1b3087009 -bundle 28eff5a74e5c2fdc8d38eb0332331684188ec40214bce4a1a4006c7e343e9c52 +bundle 42ef859ea271315a2b2687226773af32739030e419e105c36d4dc3742c979e6e diff --git a/ext/demo-site/compiler.json b/ext/demo-site/compiler.json @@ -1,8 +1,8 @@ { "schema": 1, - "hash": "eddb9464fdf42e5126b239a9481ad5915c6152ddf7f396278444894452d16a1a", + "hash": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", "export": "source_unit.compileStableModuleDefinitions", "backend": "stable", "reference": "test/fixtures/compiler-library.arboricx", - "referenceCommit": "633bb172a96c2417637f467a89ada7a6cb77040b" + "referenceCommit": "1e847d672e27cc17baf593e52b1b39919166a915" } diff --git a/ext/demo-site/demos.json b/ext/demo-site/demos.json @@ -2,9 +2,9 @@ "schema": 1, "backend": "stable", "compilerExport": "source_unit.compileStableModuleDefinitions", - "compilerBundleSha256": "eddb9464fdf42e5126b239a9481ad5915c6152ddf7f396278444894452d16a1a", - "compilerManifest": "feaf7c753b7e4dca1f5512efb701383558e7e327ac824311599767213583c519", - "hostSha256": "22d354ed4f8c245b4d9a79a5d4a358e80ac196966ce1d8d0281e571c4dba499a", + "compilerBundleSha256": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", + "compilerManifest": "c61020998ce5d424fd4f32c6fb41c548447c8431da036770c0d81733b7a4bae1", + "hostSha256": "a2cd93511c126b632a3c6dabe7b6d6dadec8727990355828b95a955c6314c6db", "demos": { "intro": { "demandCases": [], diff --git a/ext/demo-site/environments.json b/ext/demo-site/environments.json @@ -1,6 +1,6 @@ { "schema": 1, - "compiler": "eddb9464fdf42e5126b239a9481ad5915c6152ddf7f396278444894452d16a1a", + "compiler": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", "profiles": { "empty": null, "practical": { diff --git a/ext/demo-site/packages.json b/ext/demo-site/packages.json @@ -253,6 +253,113 @@ "manifest": "ebc3b77fbbdd82068bb3fb407a597bb3fe54144ca31f7dc32c38720783c7e326", "title": "Located scans: matched prefix, remainder and character positions", "demo": "lexer" + }, + { + "name": "tricu-compiler", + "version": "0.1.1", + "hash": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", + "manifest": "c61020998ce5d424fd4f32c6fb41c548447c8431da036770c0d81733b7a4bae1", + "title": "Compiler library (stable browser source-unit API; native helpers)" + }, + { + "name": "tricu-source-builder", + "version": "0.1.1", + "hash": "5d36d069562ca9b208cfd0aa8df9f0d3b5c39f8b13e070fb892e21b38e32ffb4", + "manifest": "83cfddf90747db82b693734b95469eeec2f4a783576886dcddef41515ec48588", + "title": "Stable native application compiler (modules, imports and publication)" + }, + { + "name": "arboricx-server", + "version": "0.1.1", + "hash": "ff2bb1bfb5a425eae5db7ecdf2cbaa18f5fe8b164cedc58c529944d532207a2c", + "manifest": "0ac89333ef54c48442b092cc9edc8d07adb590ea908c214eba644ada3ba4bf04", + "title": "Arboricx registry server (native sockets and filesystem)" + }, + { + "name": "tricu-http", + "version": "0.1.1", + "hash": "b8e1e83722eb6432dc354506e393129ec2f4742cc1e70695709d0a99fd7ba75b", + "manifest": "9705ec1c02fd90b27d77d29058f8290cc6a254acb774a0e27f8f8cf3d2da1ff2", + "title": "HTTP parsing, responses and native socket handlers" + }, + { + "name": "tricu-intensional-contracts", + "version": "0.1.1", + "hash": "c5b6b25cbe8d0d0515b483a39a2cb500761d64b05cb801a1249d25be3b8a3bbb", + "manifest": "9be22e7d68fddc1bbce1454c9fd78cd00eaaa5139a5534148941c893de48cae4", + "title": "Intensional contracts: tree shapes and numeric structure" + }, + { + "name": "tricu-graphs", + "version": "0.1.1", + "hash": "a6131b64f1d6eb3765d64da89e238b9c82adf90f47eb777ff4b4bd12e1d955cb", + "manifest": "64d44bbb8562f95148ad48133fc8d153e5bceb65a34339c68788d036d69551f1", + "title": "Dependency ordering and cycle witnesses (validated small graphs)" + }, + { + "name": "tricu-parser", + "version": "0.1.1", + "hash": "7254d123eb4acb98ae4d87f4f3e48b87c2bb7371237b7710ec6bd23c82b9ceed", + "manifest": "980838310f8ff39925e83ece218810b752df0cbc535f2decf9126dbbcc5d3452", + "title": "Parser combinators: diagnostics, consumption and commitment" + }, + { + "name": "tricu-math", + "version": "0.1.1", + "hash": "d2a20924fd6129069f3b8280289555dcf7d7cc67fb0a5cf488caea0ddaa153cf", + "manifest": "962c68b1f228cae96d5eb7423b44f77ab2bd8c1bec03b790d6eebe90bc048da6", + "title": "Binary arithmetic and ASCII classifiers (canonical naturals only)" + }, + { + "name": "tricu-lexer", + "version": "0.1.1", + "hash": "85184cd7e36328cf195ceb5599aa10c9a9f26a7134f260906379fc8df163531f", + "manifest": "7d9d5a8b46b7c2cec7a19ca4b430b249ed13f7c3133c2a395a07767ed4cde612", + "title": "Located character scans and token positions" + }, + { + "name": "tricu-binary", + "version": "0.1.1", + "hash": "200d0b3d4c58f604a951c986529636f3214c98f36d44b3e867560d74aa4f7a1b", + "manifest": "89273ee209a5e49b57193fab642f25f51a46885b11ce10af3951d8ef4d321bfe", + "title": "Checked byte readers, prefix parsing and UTF-8 validation" + }, + { + "name": "tricu-patterns", + "version": "0.1.1", + "hash": "a068c41275341b9baea81b33cdab32236032579fc6dfa12c014643317f114518", + "manifest": "16d074eda39e963b6aa931d9aa1cc7b01d94bf3203a9a75c26d194f7026f2232", + "title": "Ordered predicate/action dispatch and thunked conditionals" + }, + { + "name": "tricu-list-traversal", + "version": "0.1.1", + "hash": "260665917d6d973a0a543ea3ba983c47f13e18e60a30d94e502ee8c09ae33653", + "manifest": "37aa135a7d6e7365d632e65d5aaf12d18e734cee1ef1f1b47d5a730fddf6592e", + "title": "Early-stopping list folds with retained input suffixes" + }, + { + "name": "tricu-formatter", + "version": "0.1.1", + "hash": "086aabb4b95608428f0cb0776cd408102f6b1ff44aca3f9324c9e3dd9fbebd02", + "manifest": "d4223c2002a2f77789dc9bf413905689ee0f9e41bbef84367762d5e12ddc0fbe", + "title": "Conservative tricu equation alignment (not an AST printer)" + }, + { + "name": "parser-demo", + "version": "0.1.1", + "hash": "c7560f717712244810ed3b354912fe8791c2bab5c1df1520813426be01910c2f", + "manifest": "e6edf23a694a43f5b476c5fbb303ed722e60ead568388766a99867f588b7272a", + "title": "Parser combinators: complete input, prefixes and committed errors", + "demo": "parser" + }, + { + "name": "lexer-demo", + "version": "0.1.1", + "hash": "50c088ee7b87f229ef37c375e86d32d594610b5ef7cc61ea129351da0ce4b208", + "manifest": "ebc3b77fbbdd82068bb3fb407a597bb3fe54144ca31f7dc32c38720783c7e326", + "title": "Located scans: matched prefix, remainder and character positions", + "demo": "lexer" } ] } diff --git a/ext/demo-site/prepare-showcase.py b/ext/demo-site/prepare-showcase.py @@ -33,7 +33,7 @@ LIBRARIES = [ ('tricu-math', 'native_math', 'compiler', 'Binary arithmetic and ASCII classifiers (canonical naturals only)'), ('tricu-lexer', 'lexer', 'compiler', 'Located character scans and token positions'), ('tricu-binary', 'binary', 'support', 'Checked byte readers, prefix parsing and UTF-8 validation'), - ('tricu-patterns', 'patterns', 'compiler', 'Ordered predicate/action dispatch and thunked conditionals'), + ('tricu-patterns', 'patterns', 'support', 'Ordered predicate/action dispatch and thunked conditionals'), ] @@ -128,6 +128,7 @@ def main(): parser.add_argument('--directory', type=Path, required=True, help='New retained output directory') parser.add_argument('--reuse-directory', action='store_true', help='Reuse a local CAS; sources are rewritten and native receipts checked again') parser.add_argument('--stage-site', action='store_true', help='After acceptance, stage into this static site') + parser.add_argument('--version', default='0.1.1', help='New exact release label for the package set; existing versions remain immutable') args = parser.parse_args() metadata = verify() descriptor = json.loads((HERE / 'compiler.json').read_text()) @@ -178,7 +179,7 @@ def main(): if not 0 < len(data) <= limit or len(read(bundle)[2]) > 100000: raise ValueError('Package exceeds browser input bounds: ' + name) result = run('package', 'publish', '--root', root / 'registry', '--name', name, - '--version', '0.1.0', '--file', bundle) + '--version', args.version, '--file', bundle) _, row = result.splitlines(); actual_name, version, manifest, pin = row.split('\t') assert actual_name == name and pin == hashlib.sha256(data).hexdigest() # Independent clean indexed import must produce the advertised interface. diff --git a/ext/demo-site/test/compiler-conformance.json b/ext/demo-site/test/compiler-conformance.json @@ -1,6 +1,6 @@ { - "compilerBundleSha256": "eddb9464fdf42e5126b239a9481ad5915c6152ddf7f396278444894452d16a1a", - "hostSha256": "22d354ed4f8c245b4d9a79a5d4a358e80ac196966ce1d8d0281e571c4dba499a", + "compilerBundleSha256": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", + "hostSha256": "a2cd93511c126b632a3c6dabe7b6d6dadec8727990355828b95a955c6314c6db", "backend": "stable", "export": "source_unit.compileStableModuleDefinitions", "cases": [ diff --git a/ext/demo-site/test/compiler.test.mjs b/ext/demo-site/test/compiler.test.mjs @@ -20,7 +20,8 @@ test('compiler shipped pin matches authenticated reference and Haskell golden pr const fixtureDigest=createHash('sha256').update('tricu.compiler-library-fixture.v1\0').update(shipped).digest('hex'); assert.deepEqual(metadata.filter(row=>row.startsWith('bundle\t')),['bundle\t'+fixtureDigest]); const sources=metadata.filter(row=>row.startsWith('module\t')); - assert.equal(sources.length,28); + assert.equal(sources.length,27); + assert.ok(sources.every(row=>row.split('\t')[2]!=='patterns')); for(const row of sources){ const pin=row.split('\t')[4];assert.match(pin,/^[0-9a-f]{64}$/); const source=await readFile(new URL('../../../test/fixtures/reference-source/'+pin+'.tri',import.meta.url)); diff --git a/ext/demo-site/test/conformance.json b/ext/demo-site/test/conformance.json @@ -1,5 +1,5 @@ { - "hostSha256": "22d354ed4f8c245b4d9a79a5d4a358e80ac196966ce1d8d0281e571c4dba499a", + "hostSha256": "a2cd93511c126b632a3c6dabe7b6d6dadec8727990355828b95a955c6314c6db", "description": "All normal trees <=5 nodes, every ordered application pair; lazy regression and partial/multiple applications.", "cases": [ { diff --git a/ext/demo-site/test/contracts-conformance.json b/ext/demo-site/test/contracts-conformance.json @@ -1,6 +1,6 @@ { - "compilerBundleSha256": "eddb9464fdf42e5126b239a9481ad5915c6152ddf7f396278444894452d16a1a", - "hostSha256": "22d354ed4f8c245b4d9a79a5d4a358e80ac196966ce1d8d0281e571c4dba499a", + "compilerBundleSha256": "520a2bb435a56706164fb34c7ea06e12e143050ffeb1da2632747e427ce61faf", + "hostSha256": "a2cd93511c126b632a3c6dabe7b6d6dadec8727990355828b95a955c6314c6db", "contractsSourceSha256": "8f69b32c50461edd5db536becb6faedd5ba33945bf774534592034350702600a", "bindings": { "matchResult": "base.matchResult", diff --git a/ext/demo-site/test/showcase-preparation.test.mjs b/ext/demo-site/test/showcase-preparation.test.mjs @@ -13,7 +13,7 @@ site=Path(__import__('sys').argv[1]) spec=importlib.util.spec_from_file_location('showcase',site/'prepare-showcase.py') m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m) index=json.loads((site/'packages.json').read_text()) -releases=[r for r in index['releases'] if r['name'] in ['tricu-graphs','parser-demo','lexer-demo']] +releases=[r for r in index['releases'] if r['name'] in ['tricu-graphs','parser-demo','lexer-demo'] and r['version']=='0.1.0'] demo=[e for e in json.loads((site/'catalogue.json').read_text()) if e['id'] in ['parser','lexer']] goldens=[json.loads((site/(e['id']+'-demo.json')).read_text()) for e in demo] artifacts={r['hash']:site/'bundles'/(r['hash']+'.arboricx') for r in releases} @@ -46,6 +46,15 @@ with tempfile.TemporaryDirectory() as tmp: for pin,path in artifacts.items():assert (root/'bundles'/(pin+'.arboricx')).read_bytes()==path.read_bytes() m.stage(root,artifacts,releases,demo,goldens) # Exact retry is idempotent. assert len(json.loads((root/'packages.json').read_text())['releases'])==3 + # A reviewed new version discovers new bytes without changing the old pin. + import hashlib + data=b'new independently accepted test asset';pin=hashlib.sha256(data).hexdigest() + path=Path(tmp)/'new.arboricx';path.write_bytes(data) + next_release=dict(releases[0],version='new-test-version',hash=pin) + m.stage(root,{pin:path},[next_release],demo,goldens) + rows=json.loads((root/'packages.json').read_text())['releases'] + assert rows[:3]==releases and rows[-1]==next_release + assert (root/'bundles'/(pin+'.arboricx')).read_bytes()==data print('accepted') `,site],{encoding:'utf8',timeout:15000,maxBuffer:100000}); assert.equal(output.trim(),'accepted');