Skip to content

Commit 0328292

Browse files
committed
feat(runtime): add slice entrypoints and release evidence
1 parent 8a8a92e commit 0328292

49 files changed

Lines changed: 2257 additions & 52 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.async-pipeline/tasks.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,5 @@
127127
}
128128
],
129129
"hash": "sha256:a1c7ccd8157fb3d57d743d34dabc6ef0707128933927ad88bbf5115d54cb5fce",
130-
"generatedAt": "2026-06-19T06:33:36.393Z"
130+
"generatedAt": "2026-06-19T20:11:34.666Z"
131131
}

.github/async-pipeline.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"config": "pipeline.ts",
55
"workflow": ".github/workflows/async-pipeline.yml",
66
"hash": "sha256:ff505c9546fbc9043e54232d7642a1d6a2c6189b7263c0a4b1b8dd13ecf769b6",
7-
"generatedAt": "2026-06-19T04:42:19.199Z",
7+
"generatedAt": "2026-06-19T20:11:34.486Z",
88
"triggers": {
99
"pull_request": {},
1010
"push": {

.github/workflows/async-pipeline.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ jobs:
6565
- name: Install dependencies
6666
run: pnpm install --frozen-lockfile
6767

68-
- name: Run pipeline task pack
68+
- name: Run pipeline task release-evidence
6969
uses: async/actions/run@v0
7070
with:
71-
command: "pnpm async-pipeline github check && pnpm async-pipeline run-task pack"
71+
command: "pnpm async-pipeline github check && pnpm async-pipeline run-task release-evidence"
7272
check-generated: false
73-
artifact-name: async-pipeline-${{ github.job }}-pack-runs
73+
artifact-name: async-pipeline-${{ github.job }}-release-evidence-runs
7474
env:
7575
CI: true
7676
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

AGENTS.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ root workspace `AGENTS.md` still applies.
2626
path, no implicit fetches during startup, and no server-only state or cache
2727
contents leaking into browser snapshots.
2828
- Keep Layer 1 and Layer 1.5 understandable without future compiler layers.
29-
System 2 or compiler-required work must compile down to the same HTML,
29+
L2 or compiler-required work must compile down to the same HTML,
3030
registry, snapshot, server-envelope, route-partial, cache, and boundary
3131
protocol.
3232

@@ -37,19 +37,20 @@ Use these abbreviations in ADRs, issues, review notes, and Codex prompts:
3737
- `L1`: Layer 1, the no-build browser runtime core. It owns DOM scanning,
3838
attribute prefixes, event binding, signals, command handlers, startup, and the
3939
smallest usable runtime.
40-
- `L1.5`: Layer 1.5, the ordering layer above the runtime core. It owns the
41-
scheduler, async signal settling, boundary ordering, route partial activation,
42-
stream sequencing, and reveal/OOS coordination that still works without a
43-
compiler.
44-
- `L2`: Layer 2, the app/server integration layer. It owns server functions,
45-
routes, SSR output, build adapters, cache partitions, and higher-level
46-
conventions layered onto L1 and L1.5 protocols.
40+
- `L1.5`: Layer 1.5, the no-build/low-build server and streaming bridge above
41+
the runtime core. It owns scheduler ordering, async signal settling, SSR
42+
activation, route partials, browser/server cache split, boundary patches,
43+
stream sequencing, and reveal/OOS coordination without requiring a compiler.
44+
- `L2`: Layer 2, the build-required authoring/compiler profile. It owns JSX/TSX
45+
authoring, build adapters, optimizer reports, generated plans, generated
46+
registries, and chunk/manifest decisions that lower onto L1 and L1.5
47+
protocols.
4748
- `NB`: no-build profile. Author HTML and JavaScript run directly with
4849
`Async.start(...)`, default shorthand attributes, and no compiler.
4950
- `BR`: build-required profile. Author JSX/TSX uses imports such as
50-
`@async/framework/jsx`; the compiler/optimizer emits L1/L1.5/L2-compatible
51+
`@async/framework/jsx`; the compiler/optimizer emits L1/L1.5-compatible
5152
output.
52-
- `OOOS`: out-of-order streaming/rendering. Chunks may become ready in a
53+
- `OOS`: out-of-order streaming/rendering. Chunks may become ready in a
5354
different order than source order.
5455
- `Suspense`: async boundary ownership for fallback and final content.
5556
- `Reveal`: OOS commit policy for sibling boundaries, such as `as-ready`,

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## 0.11.16 - 2026-06-19
4+
5+
- Added runtime slice entrypoints for `@async/framework/runtime`,
6+
`@async/framework/runtime/signals`, and `@async/framework/runtime/events`.
7+
- Added generated package artifacts and installed-package coverage for runtime
8+
slice subpaths.
9+
- Added deterministic scenario-size fixtures and checks for runtime, router,
10+
server-call, and boundary receiver examples.
11+
- Added package-owned release evidence checks before release ensure so generated
12+
release workflows verify bundle and scenario evidence before publishing.
13+
- Bundle size from bundled TypeScript source: `browser.ts` raw 197,173 B (197.2 KB / 0.197 MB), gzip 37,198 B (37.2 KB / 0.037 MB), br 30,914 B (30.9 KB / 0.031 MB) -> `browser.min.js` raw 84,013 B (84.0 KB / 0.084 MB), gzip 24,894 B (24.9 KB / 0.025 MB), br 22,079 B (22.1 KB / 0.022 MB); delta raw -113,160 B (-113.2 KB / -0.113 MB), gzip -12,304 B (-12.3 KB / -0.012 MB), br -8,835 B (-8.8 KB / -0.009 MB).
14+
315
## 0.11.15 - 2026-06-19
416

517
- Made the source package private and kept its public surface to the minimal

README.md

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ Async.start({ root: document });
4343

4444
## What It Is
4545

46-
`@async/framework` is the Layer 1 runtime plus the first Layer 2 app/server
47-
primitives. It keeps the runtime small and explicit:
46+
`@async/framework` is the L1 runtime plus the first L1.5 app/server and
47+
streaming primitives. It keeps the runtime small and explicit:
4848

49-
- No build step for Layer 1 consumers.
49+
- No build step for L1 consumers.
5050
- No virtual DOM, diff path, hydration runtime, or component rerender loop.
5151
- Signals are the state boundary.
5252
- `Async.use(...)` registers app declarations before or after startup.
@@ -68,18 +68,14 @@ to the same runtime registries and HTML protocol.
6868
Async is designed as layers, so each level can stay useful without forcing the
6969
next level on every app.
7070

71-
| Layer | Name | Requirement | Purpose |
71+
| Shorthand | Name | Requirement | Purpose |
7272
| --- | --- | --- | --- |
73-
| 1 | Runtime bootloader | No build. CDN or direct ESM import. | Signals, async signals, scheduler, handlers, command events, lifecycle pseudo-events, scoped fragments, and boundary swaps. |
74-
| 2 | App/server layer | Light server integration. No app compiler required. | `Async.use(...)`, router modes, server function proxy, partial registry, SSR output, browser activation, and split browser/server cache. |
75-
| 3 | Authoring build | Build step required. | JSX, ESM, and TypeScript authoring that lowers into Layer 1 HTML attributes and Layer 2 registries. |
76-
| 4 | Chunk and resumability metadata | Build metadata required. | Lazy module manifests, visibility/prefetch hints, resource graphs, and resumability records that the bootloader can consume. |
77-
| 5 | Framework compiler | Compiler required. | Server/client partitioning, code motion, optimized registry generation, serialized closures, and deeper resumability transforms. |
78-
| 6 | TSRX and intent layer | Higher-level compiler required. | More declarative author intent, AI/compiler-friendly metadata, and source forms that generate lower-layer Async apps. |
79-
80-
The package in this repository intentionally focuses on Layers 1 and 2. Layers
81-
3 through 6 are higher authoring surfaces, not extra runtime requirements for
82-
plain HTML apps.
73+
| L1 | Runtime bootloader | No build. CDN or direct ESM import. | Signals, async signals, scheduler, handlers, command events, lifecycle pseudo-events, scoped fragments, and boundary swaps. |
74+
| L1.5 | App/server and streaming bridge | Light server integration. No app compiler required. | `Async.use(...)`, router modes, server function proxy, partial registry, SSR output, browser activation, split browser/server cache, and streamed boundary patches. |
75+
| L2 | Build-required authoring and compiler profile | Build step required. | JSX, ESM, and TypeScript authoring, optimizer reports, generated plans, generated registries, chunks, manifests, and future resumability records that lower onto L1 and L1.5 protocols. |
76+
77+
The package in this repository intentionally focuses on L1 and L1.5. L2 is a
78+
higher authoring surface, not an extra runtime requirement for plain HTML apps.
8379

8480
## Install
8581

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Async scenario: boundary receiver</title>
6+
</head>
7+
<body>
8+
<main>
9+
<section async:boundary="product">
10+
<p>Waiting for streamed HTML...</p>
11+
</section>
12+
</main>
13+
<script type="module" src="./main.js"></script>
14+
</body>
15+
</html>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { Async, createBoundaryReceiver } from "../../../dist/browser.min.js";
2+
3+
const runtime = Async.start({ root: document, router: false });
4+
const receiver = createBoundaryReceiver({
5+
loader: runtime.loader,
6+
signals: runtime.signals,
7+
cache: runtime.browser.cache,
8+
scheduler: runtime.scheduler
9+
});
10+
11+
globalThis.boundaryReceiverScenario = receiver;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"id": "boundary-receiver",
3+
"entry": "main.js",
4+
"scripts": [
5+
"../../../dist/browser.min.js",
6+
"main.js"
7+
],
8+
"budget": {
9+
"mode": "baseline",
10+
"maxGzipBytes": 26500
11+
}
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Async scenario: events counter</title>
6+
</head>
7+
<body>
8+
<main>
9+
<button type="button" on:click="increment">Add</button>
10+
<strong signal:text="count">0</strong>
11+
</main>
12+
<script type="module" src="./main.js"></script>
13+
</body>
14+
</html>

0 commit comments

Comments
 (0)