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:
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');