@skenora/tooling 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +32 -0
  2. package/bin/skenora-mcp-http.mjs +131 -0
  3. package/bin/skenora-mcp.mjs +50 -0
  4. package/bin/skenora.mjs +388 -0
  5. package/dist/doctor.d.ts +3 -0
  6. package/dist/doctor.d.ts.map +1 -0
  7. package/dist/doctor.js +109 -0
  8. package/dist/doctor.js.map +1 -0
  9. package/dist/examples.d.ts +26 -0
  10. package/dist/examples.d.ts.map +1 -0
  11. package/dist/examples.js +207 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp-http.d.ts +16 -0
  18. package/dist/mcp-http.d.ts.map +1 -0
  19. package/dist/mcp-http.js +279 -0
  20. package/dist/mcp-http.js.map +1 -0
  21. package/dist/mcp.d.ts +79 -0
  22. package/dist/mcp.d.ts.map +1 -0
  23. package/dist/mcp.js +817 -0
  24. package/dist/mcp.js.map +1 -0
  25. package/dist/resources.d.ts +24 -0
  26. package/dist/resources.d.ts.map +1 -0
  27. package/dist/resources.js +141 -0
  28. package/dist/resources.js.map +1 -0
  29. package/dist/wgsl.d.ts +42 -0
  30. package/dist/wgsl.d.ts.map +1 -0
  31. package/dist/wgsl.js +133 -0
  32. package/dist/wgsl.js.map +1 -0
  33. package/package.json +53 -0
  34. package/resources/docs/diagnostics.md +16 -0
  35. package/resources/docs/overview.md +26 -0
  36. package/resources/docs/runtime-probe.md +17 -0
  37. package/resources/examples/gallery.json +1818 -0
  38. package/resources/examples/invalid-scene.json +9 -0
  39. package/resources/examples/valid-scene.json +69 -0
  40. package/resources/llms-full.txt +52 -0
  41. package/resources/llms.txt +19 -0
  42. package/resources/manifest.json +97 -0
  43. package/resources/schemas/example-manifest.schema.json +454 -0
  44. package/resources/schemas/scene-check-report.schema.json +36 -0
@@ -0,0 +1,1818 @@
1
+ {
2
+ "schema": "skenora.example-gallery-bundle",
3
+ "version": 1,
4
+ "packageVersion": "0.1.2",
5
+ "examples": [
6
+ {
7
+ "manifest": {
8
+ "schema": "skenora.example-manifest",
9
+ "schemaVersion": 1,
10
+ "id": "clipping-section",
11
+ "title": "Clipping Section",
12
+ "description": "A public Recipe expanding to a bounded signed-plane cut, emissive cut edge, and an explicit fitted companion cap.",
13
+ "tags": [
14
+ "cap",
15
+ "clip",
16
+ "cutaway",
17
+ "recipe"
18
+ ],
19
+ "mode": "recipe",
20
+ "tier": "bounded-effects",
21
+ "requiredCapabilities": [
22
+ {
23
+ "id": "skenora.entity.primitive",
24
+ "version": "1",
25
+ "reason": "Creates the clipped sphere."
26
+ },
27
+ {
28
+ "id": "skenora.entity.shape",
29
+ "version": "1",
30
+ "reason": "Creates the explicit bounded polygon cap and visible outline."
31
+ },
32
+ {
33
+ "id": "skenora.material.pbr",
34
+ "version": "1",
35
+ "reason": "Owns the body and cap surfaces."
36
+ },
37
+ {
38
+ "id": "skenora.material.effect.clip",
39
+ "version": "1",
40
+ "reason": "Evaluates the signed plane and surviving cut-edge emission."
41
+ }
42
+ ],
43
+ "optionalCapabilities": [
44
+ {
45
+ "id": "skenora.scene.post-process",
46
+ "version": "1",
47
+ "reason": "Glow consumes the explicit edge emission but is not part of clip semantics."
48
+ }
49
+ ],
50
+ "assets": [],
51
+ "controls": {
52
+ "type": "object",
53
+ "description": "Bounded clipping-section recipe options.",
54
+ "additionalProperties": false,
55
+ "properties": {
56
+ "radius": {
57
+ "type": "number",
58
+ "description": "Sphere radius",
59
+ "minimum": 0.1,
60
+ "maximum": 1000,
61
+ "default": 1,
62
+ "unit": "meters",
63
+ "update": "rebuild"
64
+ },
65
+ "offset": {
66
+ "type": "number",
67
+ "description": "Clip-plane offset inside the radius",
68
+ "minimum": -1000,
69
+ "maximum": 1000,
70
+ "default": 0,
71
+ "unit": "meters",
72
+ "update": "parameter"
73
+ },
74
+ "side": {
75
+ "type": "string",
76
+ "description": "Retained half-space",
77
+ "enum": [
78
+ "positive",
79
+ "negative"
80
+ ],
81
+ "default": "positive",
82
+ "update": "parameter"
83
+ },
84
+ "edgeWidth": {
85
+ "type": "number",
86
+ "description": "Cut-edge band width",
87
+ "minimum": 0,
88
+ "maximum": 100,
89
+ "default": 0.035,
90
+ "unit": "meters",
91
+ "update": "parameter"
92
+ },
93
+ "edgeIntensity": {
94
+ "type": "number",
95
+ "description": "Cut-edge emission",
96
+ "minimum": 0,
97
+ "maximum": 64,
98
+ "default": 4,
99
+ "update": "parameter"
100
+ },
101
+ "cap": {
102
+ "type": "boolean",
103
+ "description": "Generate the fitted companion plane",
104
+ "default": true,
105
+ "update": "rebuild"
106
+ }
107
+ }
108
+ },
109
+ "evidence": [
110
+ {
111
+ "kind": "parse",
112
+ "required": true,
113
+ "status": "passed",
114
+ "note": "Manifest, Recipe options and expanded Blueprint parse."
115
+ },
116
+ {
117
+ "kind": "compile",
118
+ "required": true,
119
+ "status": "passed",
120
+ "note": "Expanded ordinary Blueprint compilation."
121
+ },
122
+ {
123
+ "kind": "capability",
124
+ "required": true,
125
+ "status": "passed",
126
+ "note": "Clip allow, deny, unknown, version and normal cases."
127
+ },
128
+ {
129
+ "kind": "preparation",
130
+ "required": true,
131
+ "status": "passed",
132
+ "note": "Cutout variant preparation and parameter reuse."
133
+ },
134
+ {
135
+ "kind": "runtime",
136
+ "required": true,
137
+ "status": "passed",
138
+ "note": "Offset update, replacement, reset and disposal."
139
+ },
140
+ {
141
+ "kind": "pixels",
142
+ "required": true,
143
+ "status": "passed",
144
+ "note": "Kept/discarded regions, cut edge and companion cap."
145
+ },
146
+ {
147
+ "kind": "visual",
148
+ "required": true,
149
+ "status": "passed",
150
+ "note": "Human composition and cap-fit review."
151
+ },
152
+ {
153
+ "kind": "performance",
154
+ "required": true,
155
+ "status": "passed",
156
+ "note": "Offset changes retain material/program identity."
157
+ },
158
+ {
159
+ "kind": "package-consumption",
160
+ "required": true,
161
+ "status": "passed",
162
+ "note": "Recipe and Example through development tarballs."
163
+ },
164
+ {
165
+ "kind": "cross-device",
166
+ "required": true,
167
+ "status": "passed",
168
+ "note": "WebGL backend/degradation matrix."
169
+ }
170
+ ],
171
+ "fallback": {
172
+ "strategy": "substitute-example",
173
+ "description": "Use Shared PBR when clip is unavailable; never present an uncut scene as clip support.",
174
+ "exampleId": "shared-pbr"
175
+ },
176
+ "files": [
177
+ {
178
+ "path": "README.md",
179
+ "role": "readme",
180
+ "mediaType": "text/markdown",
181
+ "bytes": 488,
182
+ "sha256": "d45913b70865f468cae3e9158849f43e953edd25cbc3a333ad5836b5194c2ea3"
183
+ },
184
+ {
185
+ "path": "blueprint.json",
186
+ "role": "blueprint",
187
+ "mediaType": "application/json",
188
+ "bytes": 8622,
189
+ "sha256": "9db8258e7544d22eb044d185bf58bba9f191ef2fb32219f114788f2253f12b49"
190
+ },
191
+ {
192
+ "path": "recipe.json",
193
+ "role": "source",
194
+ "mediaType": "application/json",
195
+ "bytes": 373,
196
+ "sha256": "92115122c1ddeb69687d9d79c9b95896b7a3293047569c200c7c8b4d199896a4"
197
+ }
198
+ ],
199
+ "license": {
200
+ "spdx": "MIT",
201
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Clipping example.",
202
+ "source": "https://vgpu.sh/examples/clipping"
203
+ },
204
+ "aggregateSha256": "5ac142e8aa41162242ea1f04455db93bdf5feed17c0c87587c09312ca072f1ab"
205
+ },
206
+ "sources": [
207
+ {
208
+ "path": "README.md",
209
+ "mediaType": "text/markdown",
210
+ "sha256": "d45913b70865f468cae3e9158849f43e953edd25cbc3a333ad5836b5194c2ea3",
211
+ "contentBase64": "IyBDbGlwcGluZyBTZWN0aW9uCgrov5nkuKogYHJlY2lwZWAg56S65L6L6LCD55SoIGBjcmVhdGVDbGlwcGluZ1NlY3Rpb25SZWNpcGUoKWDvvIzlsZXlvIDkuLrmma7pgJogU2NlbmVCbHVlcHJpbnTvvJpgY2xpcEAxYCDlj6rmi6XmnInmnInnrKblj7flubPpnaLoo4HliIflkozliIfovrnlj5HlhYnvvIzlsIHlj6PliJnmmK/kuIDkuKrmmI7noa7jgIHlj6/mo4Dmn6XjgIHlj6/ljZXni6znu5HlrprmnZDotKjnmoQgY29tcGFuaW9uIHBsYW5l77yI6YWN5aWX5bmz6Z2i5a6e5L2T77yJ44CCCgpSZWNpcGUg5LiN5rOo5YWlIHNoYWRlciDmlofmnKzjgIHkuI3liJvlu7rpmpDol48gUnVudGltZSDlr7nosaHvvIzkuZ/kuI3kvJrlnKjlkI7nu63kv67mlLkgYGNsaXBPZmZzZXRgIOaXtuaal+S4reenu+WKqOWwgeWPo+OAgumcgOimgeWKqOaAgeaIqumdouS4juWwgeWPo+WQjOatpeeahCBIb3N0IOW6lOWQjOaXtuabtOaWsOaZrumAmuWunuS9k+WPmOaNouOAggo="
212
+ },
213
+ {
214
+ "path": "blueprint.json",
215
+ "mediaType": "application/json",
216
+ "sha256": "9db8258e7544d22eb044d185bf58bba9f191ef2fb32219f114788f2253f12b49",
217
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7CiAgICAiaWQiOiAiY2xpcHBpbmctc2VjdGlvbiIsCiAgICAibmFtZSI6ICJDbGlwcGluZyBTZWN0aW9uIgogIH0sCiAgImVudGl0aWVzIjogWwogICAgewogICAgICAiaWQiOiAiY2xpcHBpbmctc2VjdGlvbi1ib2R5IiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJzcGhlcmUiLAogICAgICAiZGlhbWV0ZXIiOiAyCiAgICB9LAogICAgewogICAgICAiaWQiOiAiY2xpcHBpbmctc2VjdGlvbi1jYXAiLAogICAgICAia2luZCI6ICJzaGFwZSIsCiAgICAgICJzaGFwZSI6ICJwb2x5Z29uIiwKICAgICAgInBvaW50cyI6IFsKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuOTk1LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuOTg2NDg3NjM3MDY2OTQxMywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC4xMjk4NzM1NjEyNTg5NTEzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuOTYxMDk2MTk3MTU3NjIzLAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwLjI1NzUyNDk0OTg3NzAwODE0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuOTE5MjYwMTM0ODQ4NzMwMywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC4zODA3NzAwMTUyMDMyNjQzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuODYxNjk1Mjc2NzY1NTE2NSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC40OTc0OTk5OTk5OTk5OTk5NAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAwLjc4OTM4NjU3MzU4OTc3OSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC42MDU3MTc2MjE4NjM2NzcxCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuNzAzNTcxMjQ3MjgwNjE0OCwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC43MDM1NzEyNDcyODA2MTQ3CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuNjA1NzE3NjIxODYzNjc3MSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC43ODkzODY1NzM1ODk3NzkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC40OTc1MDAwMDAwMDAwMDAxLAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwLjg2MTY5NTI3Njc2NTUxNjQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC4zODA3NzAwMTUyMDMyNjQzNywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC45MTkyNjAxMzQ4NDg3MzAzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuMjU3NTI0OTQ5ODc3MDA4MTQsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuOTYxMDk2MTk3MTU3NjIzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuMTI5ODczNTYxMjU4OTUxNDQsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuOTg2NDg3NjM3MDY2OTQxMwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiA2LjA5MjYxNzgyNTc1ODA4MmUtMTcsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuOTk1CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjEyOTg3MzU2MTI1ODk1MTEsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuOTg2NDg3NjM3MDY2OTQxNAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC4yNTc1MjQ5NDk4NzcwMDgyNSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC45NjEwOTYxOTcxNTc2MjMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuMzgwNzcwMDE1MjAzMjY0MjYsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuOTE5MjYwMTM0ODQ4NzMwMwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC40OTc0OTk5OTk5OTk5OTk4LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwLjg2MTY5NTI3Njc2NTUxNjUKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuNjA1NzE3NjIxODYzNjc3MSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC43ODkzODY1NzM1ODk3NzkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuNzAzNTcxMjQ3MjgwNjE0NywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC43MDM1NzEyNDcyODA2MTQ4CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjc4OTM4NjU3MzU4OTc3ODksCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuNjA1NzE3NjIxODYzNjc3MwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC44NjE2OTUyNzY3NjU1MTY1LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwLjQ5NzQ5OTk5OTk5OTk5OTk0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjkxOTI2MDEzNDg0ODczMDMsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuMzgwNzcwMDE1MjAzMjY0NAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC45NjEwOTYxOTcxNTc2MjI4LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAwLjI1NzUyNDk0OTg3NzAwODQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuOTg2NDg3NjM3MDY2OTQxMywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC4xMjk4NzM1NjEyNTg5NTEzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjk5NSwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMS4yMTg1MjM1NjUxNTE2MTYzZS0xNgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC45ODY0ODc2MzcwNjY5NDEzLAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC4xMjk4NzM1NjEyNTg5NTE1CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjk2MTA5NjE5NzE1NzYyMzEsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjI1NzUyNDk0OTg3NzAwNzc1CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjkxOTI2MDEzNDg0ODczMDQsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjM4MDc3MDAxNTIwMzI2NDE0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjg2MTY5NTI3Njc2NTUxNjQsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjQ5NzUwMDAwMDAwMDAwMDEKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuNzg5Mzg2NTczNTg5Nzc5MywKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogLTAuNjA1NzE3NjIxODYzNjc2NwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAtMC43MDM1NzEyNDcyODA2MTQ5LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC43MDM1NzEyNDcyODA2MTQ3CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjYwNTcxNzYyMTg2MzY3NzMsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjc4OTM4NjU3MzU4OTc3ODgKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuNDk3NTAwMDAwMDAwMDAwNDQsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjg2MTY5NTI3Njc2NTUxNjMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogLTAuMzgwNzcwMDE1MjAzMjY0ODcsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjkxOTI2MDEzNDg0ODczCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjI1NzUyNDk0OTg3NzAwOCwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogLTAuOTYxMDk2MTk3MTU3NjIzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0wLjEyOTg3MzU2MTI1ODk1MTM2LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC45ODY0ODc2MzcwNjY5NDEzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IC0xLjgyNzc4NTM0NzcyNzQyNDZlLTE2LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC45OTUKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC4xMjk4NzM1NjEyNTg5NTEsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjk4NjQ4NzYzNzA2Njk0MTQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC4yNTc1MjQ5NDk4NzcwMDc3LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC45NjEwOTYxOTcxNTc2MjMxCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuMzgwNzcwMDE1MjAzMjY0NTMsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjkxOTI2MDEzNDg0ODczMDEKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC40OTc1MDAwMDAwMDAwMDAxLAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC44NjE2OTUyNzY3NjU1MTY0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuNjA1NzE3NjIxODYzNjc3LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC43ODkzODY1NzM1ODk3NzkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC43MDM1NzEyNDcyODA2MTQ2LAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC43MDM1NzEyNDcyODA2MTQ5CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuNzg5Mzg2NTczNTg5Nzc4OCwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogLTAuNjA1NzE3NjIxODYzNjc3MwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgIngiOiAwLjg2MTY5NTI3Njc2NTUxNjIsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjQ5NzUwMDAwMDAwMDAwMDQ0CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAieCI6IDAuOTE5MjYwMTM0ODQ4NzMsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjM4MDc3MDAxNTIwMzI2NDkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC45NjEwOTYxOTcxNTc2MjMsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IC0wLjI1NzUyNDk0OTg3NzAwODEKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ4IjogMC45ODY0ODc2MzcwNjY5NDEzLAogICAgICAgICAgInkiOiAwLAogICAgICAgICAgInoiOiAtMC4xMjk4NzM1NjEyNTg5NTE0MQogICAgICAgIH0KICAgICAgXSwKICAgICAgImNsb3NlZCI6IHRydWUsCiAgICAgICJzdHJva2VDb2xvciI6IHsKICAgICAgICAiciI6IDAuMDUsCiAgICAgICAgImciOiAxLjM1LAogICAgICAgICJiIjogMC43NQogICAgICB9LAogICAgICAidHJhbnNmb3JtIjogewogICAgICAgICJwb3NpdGlvbiI6IHsKICAgICAgICAgICJ4IjogMCwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMC4wMDEKICAgICAgICB9LAogICAgICAgICJyb3RhdGlvblJhZGlhbnMiOiB7CiAgICAgICAgICAieCI6IDEuNTcwNzk2MzI2Nzk0ODk2NiwKICAgICAgICAgICJ5IjogMCwKICAgICAgICAgICJ6IjogMAogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sCiAgIm1hdGVyaWFscyI6IFsKICAgIHsKICAgICAgImlkIjogImNsaXBwaW5nLXNlY3Rpb24tc3VyZmFjZSIsCiAgICAgICJjcmVhdGlvbiI6IHsKICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgImZhbWlseSI6ICJwYnIiCiAgICAgIH0sCiAgICAgICJiYXNlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLjAyNSwKICAgICAgICAiZyI6IDAuMTgsCiAgICAgICAgImIiOiAwLjQyCiAgICAgIH0sCiAgICAgICJtZXRhbGxpYyI6IDAuMTUsCiAgICAgICJyb3VnaG5lc3MiOiAwLjI3LAogICAgICAiZWZmZWN0cyI6IHsKICAgICAgICAidmVyc2lvbiI6IDIsCiAgICAgICAgImNsaXAiOiB7CiAgICAgICAgICAicGxhbmVOb3JtYWwiOiB7CiAgICAgICAgICAgICJ4IjogMCwKICAgICAgICAgICAgInkiOiAwLAogICAgICAgICAgICAieiI6IDEKICAgICAgICAgIH0sCiAgICAgICAgICAib2Zmc2V0IjogMCwKICAgICAgICAgICJzaWRlIjogInBvc2l0aXZlIiwKICAgICAgICAgICJzcGFjZSI6ICJsb2NhbCIsCiAgICAgICAgICAiZWRnZVdpZHRoIjogMC4wNDUsCiAgICAgICAgICAiZWRnZUNvbG9yIjogewogICAgICAgICAgICAiciI6IDAuMDUsCiAgICAgICAgICAgICJnIjogMS4zNSwKICAgICAgICAgICAgImIiOiAwLjc1CiAgICAgICAgICB9LAogICAgICAgICAgImVkZ2VJbnRlbnNpdHkiOiA1CiAgICAgICAgfQogICAgICB9LAogICAgICAiYW5pbWF0aW9ucyI6IFsKICAgICAgICB7CiAgICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgICAiaWQiOiAiY2xpcC1zd2VlcCIsCiAgICAgICAgICAicHJvcGVydHkiOiAiY2xpcE9mZnNldCIsCiAgICAgICAgICAiZnJvbSI6IDAsCiAgICAgICAgICAidG8iOiAwLjM1LAogICAgICAgICAgImR1cmF0aW9uTXMiOiA5MDAsCiAgICAgICAgICAiZWFzaW5nIjogImVhc2VJbk91dCIsCiAgICAgICAgICAibG9vcCI6ICJwaW5nLXBvbmciLAogICAgICAgICAgImF1dG9TdGFydCI6IGZhbHNlCiAgICAgICAgfQogICAgICBdCiAgICB9LAogICAgewogICAgICAiaWQiOiAiY2xpcHBpbmctc2VjdGlvbi1jYXAtc3VyZmFjZSIsCiAgICAgICJjcmVhdGlvbiI6IHsKICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgImZhbWlseSI6ICJwYnIiCiAgICAgIH0sCiAgICAgICJiYXNlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLjAxOCwKICAgICAgICAiZyI6IDAuMDk1LAogICAgICAgICJiIjogMC4xNAogICAgICB9LAogICAgICAiZW1pc3NpdmVDb2xvciI6IHsKICAgICAgICAiciI6IDAuMDUsCiAgICAgICAgImciOiAxLjM1LAogICAgICAgICJiIjogMC43NQogICAgICB9LAogICAgICAiZW1pc3NpdmVJbnRlbnNpdHkiOiAwLjQ1LAogICAgICAibWV0YWxsaWMiOiAwLjI1LAogICAgICAicm91Z2huZXNzIjogMC4zMiwKICAgICAgImRvdWJsZVNpZGVkIjogdHJ1ZQogICAgfQogIF0sCiAgIm1hdGVyaWFsQmluZGluZ3MiOiBbCiAgICB7CiAgICAgICJpZCI6ICJjbGlwcGluZy1zZWN0aW9uLWJvZHktc3VyZmFjZSIsCiAgICAgICJtYXRlcmlhbElkIjogImNsaXBwaW5nLXNlY3Rpb24tc3VyZmFjZSIsCiAgICAgICJlbnRpdHlJZCI6ICJjbGlwcGluZy1zZWN0aW9uLWJvZHkiCiAgICB9LAogICAgewogICAgICAiaWQiOiAiY2xpcHBpbmctc2VjdGlvbi1jYXAtYmluZGluZyIsCiAgICAgICJtYXRlcmlhbElkIjogImNsaXBwaW5nLXNlY3Rpb24tY2FwLXN1cmZhY2UiLAogICAgICAiZW50aXR5SWQiOiAiY2xpcHBpbmctc2VjdGlvbi1jYXAiLAogICAgICAidGFyZ2V0IjogewogICAgICAgICJub2RlSWQiOiAiY2xpcHBpbmctc2VjdGlvbi1jYXAtZmlsbCIsCiAgICAgICAgInNsb3QiOiAwCiAgICAgIH0KICAgIH0KICBdLAogICJjYW1lcmEiOiB7CiAgICAibW9kZSI6ICJvcmJpdCIsCiAgICAicG9zaXRpb24iOiB7CiAgICAgICJ4IjogMi43LAogICAgICAieSI6IDEuOCwKICAgICAgInoiOiAtNC4yCiAgICB9LAogICAgInRhcmdldCI6IHsKICAgICAgIngiOiAwLAogICAgICAieSI6IDAsCiAgICAgICJ6IjogMAogICAgfQogIH0sCiAgImVudmlyb25tZW50IjogewogICAgImVuYWJsZWQiOiBmYWxzZSwKICAgICJiYWNrZ3JvdW5kIjogewogICAgICAibW9kZSI6ICJjb2xvciIsCiAgICAgICJjb2xvciI6ICIjMDUwYzEzIgogICAgfQogIH0sCiAgImxpZ2h0cyI6IFsKICAgIHsKICAgICAgImlkIjogImNsaXBwaW5nLXNlY3Rpb24tZmlsbCIsCiAgICAgICJ0eXBlIjogImhlbWlzcGhlcmljIiwKICAgICAgImVuYWJsZWQiOiB0cnVlLAogICAgICAiaW50ZW5zaXR5IjogMS4xLAogICAgICAiY29sb3IiOiB7CiAgICAgICAgInIiOiAwLjc1LAogICAgICAgICJnIjogMC44OCwKICAgICAgICAiYiI6IDEKICAgICAgfSwKICAgICAgInJvdGF0aW9uIjogewogICAgICAgICJ4IjogLTEuNTcwNzk2MzI2Nzk0ODk2NiwKICAgICAgICAieSI6IDAsCiAgICAgICAgInoiOiAwCiAgICAgIH0KICAgIH0KICBdLAogICJwb3N0UHJvY2VzcyI6IHsKICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICJhbnRpYWxpYXNpbmciOiAiZnhhYSIsCiAgICAidG9uZU1hcHBpbmdFbmFibGVkIjogdHJ1ZSwKICAgICJ0b25lTWFwcGluZ1R5cGUiOiAiYWNlcyIsCiAgICAiZXhwb3N1cmUiOiAxLAogICAgImdsb3ciOiB0cnVlLAogICAgImRlcHRoT2ZGaWVsZCI6IGZhbHNlLAogICAgInNzYW8iOiB7CiAgICAgICJlbmFibGVkIjogZmFsc2UKICAgIH0KICB9Cn0K"
218
+ },
219
+ {
220
+ "path": "recipe.json",
221
+ "mediaType": "application/json",
222
+ "sha256": "92115122c1ddeb69687d9d79c9b95896b7a3293047569c200c7c8b4d199896a4",
223
+ "contentBase64": "ewogICJpZCI6ICJjbGlwcGluZy1zZWN0aW9uLXYxIiwKICAib3B0aW9ucyI6IHsKICAgICJpZCI6ICJjbGlwcGluZy1zZWN0aW9uIiwKICAgICJyYWRpdXMiOiAxLAogICAgIm9mZnNldCI6IDAsCiAgICAic2lkZSI6ICJwb3NpdGl2ZSIsCiAgICAiZWRnZVdpZHRoIjogMC4wNDUsCiAgICAiZWRnZUNvbG9yIjogeyAiciI6IDAuMDUsICJnIjogMS4zNSwgImIiOiAwLjc1IH0sCiAgICAiZWRnZUludGVuc2l0eSI6IDUsCiAgICAic3VyZmFjZUNvbG9yIjogeyAiciI6IDAuMDI1LCAiZyI6IDAuMTgsICJiIjogMC40MiB9LAogICAgImNhcENvbG9yIjogeyAiciI6IDAuMDE4LCAiZyI6IDAuMDk1LCAiYiI6IDAuMTQgfSwKICAgICJjYXAiOiB0cnVlCiAgfQp9Cg=="
224
+ }
225
+ ]
226
+ },
227
+ {
228
+ "manifest": {
229
+ "schema": "skenora.example-manifest",
230
+ "schemaVersion": 1,
231
+ "id": "fft-ocean",
232
+ "title": "FFT Ocean",
233
+ "description": "A staged WebGPU frequency-space ocean with bit reversal, horizontal and vertical butterfly passes, and GPU-resident presentation.",
234
+ "tags": [
235
+ "compute",
236
+ "fft",
237
+ "ocean",
238
+ "simulation",
239
+ "webgpu"
240
+ ],
241
+ "mode": "renderer-lab",
242
+ "tier": "advanced-simulation",
243
+ "requiredCapabilities": [
244
+ {
245
+ "id": "skenora.simulation.program",
246
+ "version": "1",
247
+ "reason": "Owns bounded spectral generation, staged inverse FFT and compute-to-render storage."
248
+ }
249
+ ],
250
+ "optionalCapabilities": [],
251
+ "assets": [],
252
+ "controls": {
253
+ "type": "object",
254
+ "description": "Bounded trusted ocean spectrum parameters.",
255
+ "additionalProperties": false,
256
+ "properties": {
257
+ "windSpeed": {
258
+ "type": "number",
259
+ "description": "Spectrum wind speed",
260
+ "minimum": 0.1,
261
+ "maximum": 40,
262
+ "default": 14,
263
+ "update": "parameter"
264
+ },
265
+ "amplitude": {
266
+ "type": "number",
267
+ "description": "Spectrum amplitude",
268
+ "minimum": 0.01,
269
+ "maximum": 4,
270
+ "default": 1.15,
271
+ "update": "parameter"
272
+ }
273
+ }
274
+ },
275
+ "evidence": [
276
+ {
277
+ "kind": "parse",
278
+ "required": true,
279
+ "status": "passed",
280
+ "note": "Power-of-two grid and trusted kernel fields parse."
281
+ },
282
+ {
283
+ "kind": "compile",
284
+ "required": true,
285
+ "status": "passed",
286
+ "note": "Frequency, bit-reversal and butterfly passes are ordered deterministically."
287
+ },
288
+ {
289
+ "kind": "capability",
290
+ "required": true,
291
+ "status": "passed",
292
+ "note": "Non-square/non-power-of-two and pass budgets reject."
293
+ },
294
+ {
295
+ "kind": "preparation",
296
+ "required": true,
297
+ "status": "passed",
298
+ "note": "Physical WebGPU FFT and presentation pipeline preparation."
299
+ },
300
+ {
301
+ "kind": "runtime",
302
+ "required": true,
303
+ "status": "passed",
304
+ "note": "Stable ping-pong, fixed step, reset, resize and disposal."
305
+ },
306
+ {
307
+ "kind": "pixels",
308
+ "required": true,
309
+ "status": "passed",
310
+ "note": "IFFT output creates non-background water and foam pixels."
311
+ },
312
+ {
313
+ "kind": "visual",
314
+ "required": true,
315
+ "status": "passed",
316
+ "note": "Human review of animated ocean field."
317
+ },
318
+ {
319
+ "kind": "performance",
320
+ "required": true,
321
+ "status": "passed",
322
+ "note": "17 bounded passes and two persistent 256 KiB buffers."
323
+ },
324
+ {
325
+ "kind": "package-consumption",
326
+ "required": true,
327
+ "status": "passed",
328
+ "note": "Advanced program and optional renderer subpath from tarballs."
329
+ },
330
+ {
331
+ "kind": "cross-device",
332
+ "required": true,
333
+ "status": "passed",
334
+ "note": "Physical WebGPU plus explicit unsupported degradation."
335
+ }
336
+ ],
337
+ "fallback": {
338
+ "strategy": "substitute-example",
339
+ "description": "Use Procedural Earth as a non-equivalent generated-surface demonstration when WebGPU is unavailable.",
340
+ "exampleId": "procedural-earth"
341
+ },
342
+ "files": [
343
+ {
344
+ "path": "README.md",
345
+ "role": "readme",
346
+ "mediaType": "text/markdown",
347
+ "bytes": 551,
348
+ "sha256": "837f499419bc50251553de93b4d30ba41d0f3bda961371539da4e1f288b21713"
349
+ },
350
+ {
351
+ "path": "simulation.json",
352
+ "role": "source",
353
+ "mediaType": "application/json",
354
+ "bytes": 693,
355
+ "sha256": "0384db8572711eb291b4a910f1dec2f6b15dd936159d2113de2086fe2ec92234"
356
+ }
357
+ ],
358
+ "license": {
359
+ "spdx": "MIT",
360
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU FFT Ocean Surface example.",
361
+ "source": "https://vgpu.sh/examples/fft-ocean-surface"
362
+ },
363
+ "aggregateSha256": "ed061d59025140483f0b59a515a48a09527a21f6d067e8c10cff60dfbd92a140"
364
+ },
365
+ "sources": [
366
+ {
367
+ "path": "README.md",
368
+ "mediaType": "text/markdown",
369
+ "sha256": "837f499419bc50251553de93b4d30ba41d0f3bda961371539da4e1f288b21713",
370
+ "contentBase64": "IyBGRlQgT2NlYW4KCui/meS4qiBgcmVuZGVyZXItbGFiYCDlnKjnnJ/lrp4gV2ViR1BVIOS4iuWFiOeUn+aIkOaXtumXtOebuOWFs+mikeiwse+8jOWGjeaJp+ihjOaoquWQkeS9jeWPjei9rOS4jiA3IOS4quidtuW9oumYtuauteOAgee6teWQkeS9jeWPjei9rOS4jiA3IOS4quidtuW9oumYtuaute+8jOacgOWQjuebtOaOpeS7jiBHUFUgc3RvcmFnZSBidWZmZXIg5ZGI546w5rW36Z2i6auY5bqm44CB5rOV57q/6L+R5Ly85ZKM5rOh5rKr44CCMTI4w5cxMjgg572R5qC85q+P5q2l5Zu65a6a5Li6IDE3IOS4qiBjb21wdXRlIHBhc3PvvIzkuKTlnZfnvJPlhrLkuqTmm7/kvb/nlKjkuJTkuI3mjInluKfliIbphY3jgIIKCuWug+aYr+WFrOWFsSBgU2ltdWxhdGlvblByb2dyYW0gVjFgIOeahOmrmOe6p+WunumqjOiDveWKm++8jOS4jeaYryBTY2VuZURvY3VtZW50IOabsumdouS9jeenu+OAgldlYkdQVSDkuI3lj6/nlKjml7blj6rmiqXlkYogdW5zdXBwb3J0ZWTvvIzlubbmjIflkJEgYHByb2NlZHVyYWwtZWFydGhgIOS9nOS4uumdnuetieS7t+inhuinieabv+S7o+OAggo="
371
+ },
372
+ {
373
+ "path": "simulation.json",
374
+ "mediaType": "application/json",
375
+ "sha256": "0384db8572711eb291b4a910f1dec2f6b15dd936159d2113de2086fe2ec92234",
376
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zaW11bGF0aW9uLXByb2dyYW0iLAogICJ2ZXJzaW9uIjogMSwKICAia2VybmVsIjogImZmdC1vY2VhbiIsCiAgImdyaWQiOiB7CiAgICAid2lkdGgiOiAxMjgsCiAgICAiaGVpZ2h0IjogMTI4CiAgfSwKICAiZml4ZWRTdGVwIjogewogICAgIm1pbGxpc2Vjb25kcyI6IDMzLjMzMzMsCiAgICAibWF4U3Vic3RlcHMiOiAyCiAgfSwKICAiZGlzcGF0Y2giOiB7CiAgICAid29ya2dyb3VwU2l6ZSI6IDgKICB9LAogICJyZXNvdXJjZXMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJvY2Vhbi1zcGVjdHJ1bS1hIiwKICAgICAgImtpbmQiOiAic3RvcmFnZS1idWZmZXIiLAogICAgICAiZm9ybWF0IjogInZlYzRmIiwKICAgICAgImVsZW1lbnRzIjogImdyaWQiLAogICAgICAicGluZ1BvbmciOiB0cnVlCiAgICB9LAogICAgewogICAgICAiaWQiOiAib2NlYW4tc3BlY3RydW0tYiIsCiAgICAgICJraW5kIjogInN0b3JhZ2UtYnVmZmVyIiwKICAgICAgImZvcm1hdCI6ICJ2ZWM0ZiIsCiAgICAgICJlbGVtZW50cyI6ICJncmlkIiwKICAgICAgInBpbmdQb25nIjogdHJ1ZQogICAgfQogIF0sCiAgInBhcmFtZXRlcnMiOiB7CiAgICAia2luZCI6ICJmZnQtb2NlYW4iLAogICAgIndpbmRTcGVlZCI6IDE0LAogICAgImFtcGxpdHVkZSI6IDEuMTUsCiAgICAiY2hvcHBpbmVzcyI6IDEuMzUKICB9Cn0K"
377
+ }
378
+ ]
379
+ },
380
+ {
381
+ "manifest": {
382
+ "schema": "skenora.example-manifest",
383
+ "schemaVersion": 1,
384
+ "id": "glass-transmission",
385
+ "title": "Glass Transmission",
386
+ "description": "A bounded scene capture and Gaussian blur RenderGraph feeding refraction, tint and dispersion on an owned glass surface.",
387
+ "tags": [
388
+ "blur",
389
+ "glass",
390
+ "refraction",
391
+ "render-graph",
392
+ "transmission"
393
+ ],
394
+ "mode": "recipe",
395
+ "tier": "render-graph",
396
+ "requiredCapabilities": [
397
+ {
398
+ "id": "skenora.entity.primitive",
399
+ "version": "1",
400
+ "reason": "Creates one glass surface and explicit captured backdrop geometry."
401
+ },
402
+ {
403
+ "id": "skenora.material.pbr",
404
+ "version": "1",
405
+ "reason": "Owns glass and backdrop surfaces."
406
+ },
407
+ {
408
+ "id": "skenora.render.graph",
409
+ "version": "1",
410
+ "reason": "Validates and owns scene capture, blur and transmission passes."
411
+ }
412
+ ],
413
+ "optionalCapabilities": [
414
+ {
415
+ "id": "skenora.scene.post-process",
416
+ "version": "1",
417
+ "reason": "Glow presents backdrop emission independently of glass graph semantics."
418
+ }
419
+ ],
420
+ "assets": [],
421
+ "controls": {
422
+ "type": "object",
423
+ "description": "Bounded glass transmission Recipe options.",
424
+ "additionalProperties": false,
425
+ "properties": {
426
+ "radius": {
427
+ "type": "number",
428
+ "description": "Glass sphere radius",
429
+ "minimum": 0.1,
430
+ "maximum": 1000,
431
+ "default": 1,
432
+ "update": "rebuild"
433
+ },
434
+ "indexOfRefraction": {
435
+ "type": "number",
436
+ "description": "Index of refraction",
437
+ "minimum": 1,
438
+ "maximum": 3,
439
+ "default": 1.46,
440
+ "update": "parameter"
441
+ },
442
+ "intensity": {
443
+ "type": "number",
444
+ "description": "Transmission intensity",
445
+ "minimum": 0,
446
+ "maximum": 1,
447
+ "default": 0.92,
448
+ "update": "parameter"
449
+ },
450
+ "dispersion": {
451
+ "type": "number",
452
+ "description": "Chromatic dispersion",
453
+ "minimum": 0,
454
+ "maximum": 1,
455
+ "default": 0.22,
456
+ "update": "parameter"
457
+ },
458
+ "blurRadius": {
459
+ "type": "number",
460
+ "description": "Two-pass blur radius",
461
+ "minimum": 1,
462
+ "maximum": 24,
463
+ "default": 7,
464
+ "update": "rebuild"
465
+ }
466
+ }
467
+ },
468
+ "evidence": [
469
+ {
470
+ "kind": "parse",
471
+ "required": true,
472
+ "status": "passed",
473
+ "note": "Recipe, Blueprint and graph parse."
474
+ },
475
+ {
476
+ "kind": "compile",
477
+ "required": true,
478
+ "status": "passed",
479
+ "note": "Stable target/pass IR and topology signature."
480
+ },
481
+ {
482
+ "kind": "capability",
483
+ "required": true,
484
+ "status": "passed",
485
+ "note": "Cycle, missing target, alias, format and memory budget cases."
486
+ },
487
+ {
488
+ "kind": "preparation",
489
+ "required": true,
490
+ "status": "passed",
491
+ "note": "Capture and both blur shaders prepare before visible activation."
492
+ },
493
+ {
494
+ "kind": "runtime",
495
+ "required": true,
496
+ "status": "passed",
497
+ "note": "Resize replacement, last usable target and disposal."
498
+ },
499
+ {
500
+ "kind": "pixels",
501
+ "required": true,
502
+ "status": "passed",
503
+ "note": "Captured backdrop is refracted inside the glass silhouette."
504
+ },
505
+ {
506
+ "kind": "visual",
507
+ "required": true,
508
+ "status": "passed",
509
+ "note": "Human glass, tint and dispersion composition review."
510
+ },
511
+ {
512
+ "kind": "performance",
513
+ "required": true,
514
+ "status": "passed",
515
+ "note": "Bounded half-resolution target and two blur passes."
516
+ },
517
+ {
518
+ "kind": "package-consumption",
519
+ "required": true,
520
+ "status": "passed",
521
+ "note": "Graph compiler and Recipe through development tarballs."
522
+ },
523
+ {
524
+ "kind": "cross-device",
525
+ "required": true,
526
+ "status": "passed",
527
+ "note": "WebGL target/format support and explicit fallback."
528
+ }
529
+ ],
530
+ "fallback": {
531
+ "strategy": "substitute-example",
532
+ "description": "Use Shared PBR when RenderGraph is unavailable; do not present alpha alone as transmission.",
533
+ "exampleId": "shared-pbr"
534
+ },
535
+ "files": [
536
+ {
537
+ "path": "README.md",
538
+ "role": "readme",
539
+ "mediaType": "text/markdown",
540
+ "bytes": 484,
541
+ "sha256": "283941b1a6e77a233145ed1f7c7f9e439d5822053ade311172a255e021d4abc9"
542
+ },
543
+ {
544
+ "path": "blueprint.json",
545
+ "role": "blueprint",
546
+ "mediaType": "application/json",
547
+ "bytes": 6815,
548
+ "sha256": "42c30cc3bd44bb5915a7cf7fe7a66f23d4bb32e6b24481e27be647cde1b6ccd7"
549
+ },
550
+ {
551
+ "path": "recipe.json",
552
+ "role": "source",
553
+ "mediaType": "application/json",
554
+ "bytes": 203,
555
+ "sha256": "4d96b1c3be17bff7750efe04df92367271d9dadcbb87ccf0ea6b70061f746520"
556
+ }
557
+ ],
558
+ "license": {
559
+ "spdx": "MIT",
560
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Transmission example.",
561
+ "source": "https://vgpu.sh/examples/transmission"
562
+ },
563
+ "aggregateSha256": "1c5f9da6b4924e33e944c24d060b0953aad7e1be284297431501c814254b2cd9"
564
+ },
565
+ "sources": [
566
+ {
567
+ "path": "README.md",
568
+ "mediaType": "text/markdown",
569
+ "sha256": "283941b1a6e77a233145ed1f7c7f9e439d5822053ade311172a255e021d4abc9",
570
+ "contentBase64": "IyBHbGFzcyBUcmFuc21pc3Npb24KCui/meS4qiBgcmVjaXBlYCDnpLrkvovosIPnlKggYGNyZWF0ZUdsYXNzVHJhbnNtaXNzaW9uUmVjaXBlKClg77yM5oqKIHNjZW5lIGNhcHR1cmXjgIHmqKrlkJEv57q15ZCRIEdhdXNzaWFuIGJsdXIg5ZKMIGdsYXNzIGNvbXBvc2l0ZSDlo7DmmI7kuLogYFJlbmRlckdyYXBoIFYxYO+8iOa4suafk+WbvuesrOS4gOeJiO+8ieOAglJ1bnRpbWUg5Li65a6D5oyB5pyJIEJhYnlsb24gcmVuZGVyIHRhcmdldOOAgXJlc2l6ZSBvYnNlcnZlcuOAgeaooeeziumTvuWSjCByZWZyYWN0aW9uL2Rpc3BlcnNpb24g5Y+C5pWw44CCCgrlm77kvJrmi5Lnu53njq/jgIHnvLrlpLEgdGFyZ2V044CB5ZCMIHRhcmdldCDor7vlhpnjgIHotoXpooTnrpflkozmnKrnn6UgcGFzc+OAguWug+S4jeaOpeWPlyBXR1NML0dMU0wg5oiW5bqV5bGCIGNvbW1hbmQgZW5jb2RpbmfvvIzkuZ/kuI3lvJXlhaXnrKzkuozkuKogM0Qg5byV5pOO44CCCg=="
571
+ },
572
+ {
573
+ "path": "blueprint.json",
574
+ "mediaType": "application/json",
575
+ "sha256": "42c30cc3bd44bb5915a7cf7fe7a66f23d4bb32e6b24481e27be647cde1b6ccd7",
576
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7CiAgICAiaWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uIiwKICAgICJuYW1lIjogIkdsYXNzIFRyYW5zbWlzc2lvbiIKICB9LAogICJlbnRpdGllcyI6IFsKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1nbGFzcyIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAic3BoZXJlIiwKICAgICAgImRpYW1ldGVyIjogMgogICAgfSwKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1iYWNrZHJvcC1wYW5lbCIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAicGxhbmUiLAogICAgICAic2l6ZSI6IDQuOCwKICAgICAgInRyYW5zZm9ybSI6IHsKICAgICAgICAicG9zaXRpb24iOiB7CiAgICAgICAgICAieCI6IDAsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDIuNzUKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24tYmFja2Ryb3AtYSIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAidG9ydXMiLAogICAgICAiZGlhbWV0ZXIiOiAxLjcsCiAgICAgICJ0cmFuc2Zvcm0iOiB7CiAgICAgICAgInBvc2l0aW9uIjogewogICAgICAgICAgIngiOiAtMC42NSwKICAgICAgICAgICJ5IjogMC4yNSwKICAgICAgICAgICJ6IjogMS42CiAgICAgICAgfSwKICAgICAgICAicm90YXRpb25SYWRpYW5zIjogewogICAgICAgICAgIngiOiAwLjMsCiAgICAgICAgICAieSI6IDAuNiwKICAgICAgICAgICJ6IjogMAogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1iYWNrZHJvcC1iIiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJib3giLAogICAgICAic2l6ZSI6IDAuODUsCiAgICAgICJ0cmFuc2Zvcm0iOiB7CiAgICAgICAgInBvc2l0aW9uIjogewogICAgICAgICAgIngiOiAwLjc1LAogICAgICAgICAgInkiOiAtMC4zOCwKICAgICAgICAgICJ6IjogMS44NQogICAgICAgIH0sCiAgICAgICAgInJvdGF0aW9uUmFkaWFucyI6IHsKICAgICAgICAgICJ4IjogMC4yLAogICAgICAgICAgInkiOiAwLjU1LAogICAgICAgICAgInoiOiAwLjQKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24tYmFja2Ryb3AtYyIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAiY3lsaW5kZXIiLAogICAgICAiZGlhbWV0ZXIiOiAwLjcsCiAgICAgICJoZWlnaHQiOiAxLjU1LAogICAgICAidHJhbnNmb3JtIjogewogICAgICAgICJwb3NpdGlvbiI6IHsKICAgICAgICAgICJ4IjogMC4wNSwKICAgICAgICAgICJ5IjogMC42NSwKICAgICAgICAgICJ6IjogMi4xCiAgICAgICAgfSwKICAgICAgICAicm90YXRpb25SYWRpYW5zIjogewogICAgICAgICAgIngiOiAwLjUsCiAgICAgICAgICAieSI6IDAsCiAgICAgICAgICAieiI6IDAuNwogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sCiAgIm1hdGVyaWFscyI6IFsKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1nbGFzcy1tYXRlcmlhbCIsCiAgICAgICJjcmVhdGlvbiI6IHsKICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgImZhbWlseSI6ICJwYnIiCiAgICAgIH0sCiAgICAgICJiYXNlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLjcyLAogICAgICAgICJnIjogMC45LAogICAgICAgICJiIjogMQogICAgICB9LAogICAgICAibWV0YWxsaWMiOiAwLAogICAgICAicm91Z2huZXNzIjogMC4wOCwKICAgICAgImFscGhhIjogMSwKICAgICAgInRyYW5zcGFyZW5jeU1vZGUiOiAwLAogICAgICAiaW5kZXhPZlJlZnJhY3Rpb24iOiAxLjQ2LAogICAgICAiZG91YmxlU2lkZWQiOiB0cnVlLAogICAgICAicmVuZGVyR3JhcGgiOiB7CiAgICAgICAgInNjaGVtYSI6ICJza2Vub3JhLnJlbmRlci5ncmFwaCIsCiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJ0YXJnZXRzIjogWwogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAic2NlbmUiLAogICAgICAgICAgICAic2l6ZSI6ICJoYWxmIiwKICAgICAgICAgICAgImZvcm1hdCI6ICJyZ2JhOHVub3JtIiwKICAgICAgICAgICAgInNhbXBsZXMiOiAxLAogICAgICAgICAgICAiZGVwdGgiOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiYmx1ci14IiwKICAgICAgICAgICAgInNpemUiOiAiaGFsZiIsCiAgICAgICAgICAgICJmb3JtYXQiOiAicmdiYTh1bm9ybSIsCiAgICAgICAgICAgICJzYW1wbGVzIjogMSwKICAgICAgICAgICAgImRlcHRoIjogZmFsc2UKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJibHVyLXkiLAogICAgICAgICAgICAic2l6ZSI6ICJoYWxmIiwKICAgICAgICAgICAgImZvcm1hdCI6ICJyZ2JhOHVub3JtIiwKICAgICAgICAgICAgInNhbXBsZXMiOiAxLAogICAgICAgICAgICAiZGVwdGgiOiBmYWxzZQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInBhc3NlcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogImNhcHR1cmUiLAogICAgICAgICAgICAidHlwZSI6ICJzY2VuZS5jYXB0dXJlIiwKICAgICAgICAgICAgIm91dHB1dCI6ICJzY2VuZSIsCiAgICAgICAgICAgICJjbGVhckNvbG9yIjogIiMwNDA3MTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiYmx1ci1ob3Jpem9udGFsIiwKICAgICAgICAgICAgInR5cGUiOiAiYmx1ci5nYXVzc2lhbiIsCiAgICAgICAgICAgICJpbnB1dCI6ICJzY2VuZSIsCiAgICAgICAgICAgICJvdXRwdXQiOiAiYmx1ci14IiwKICAgICAgICAgICAgInJhZGl1cyI6IDcsCiAgICAgICAgICAgICJkaXJlY3Rpb24iOiAiaG9yaXpvbnRhbCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJibHVyLXZlcnRpY2FsIiwKICAgICAgICAgICAgInR5cGUiOiAiYmx1ci5nYXVzc2lhbiIsCiAgICAgICAgICAgICJpbnB1dCI6ICJibHVyLXgiLAogICAgICAgICAgICAib3V0cHV0IjogImJsdXIteSIsCiAgICAgICAgICAgICJyYWRpdXMiOiA3LAogICAgICAgICAgICAiZGlyZWN0aW9uIjogInZlcnRpY2FsIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogInRyYW5zbWlzc2lvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImdsYXNzLnRyYW5zbWlzc2lvbiIsCiAgICAgICAgICAgICJpbnB1dCI6ICJibHVyLXkiLAogICAgICAgICAgICAib3V0cHV0IjogInN1cmZhY2UiLAogICAgICAgICAgICAiaW5kZXhPZlJlZnJhY3Rpb24iOiAxLjQ2LAogICAgICAgICAgICAiaW50ZW5zaXR5IjogMC45MiwKICAgICAgICAgICAgImRpc3BlcnNpb24iOiAwLjIyLAogICAgICAgICAgICAidGludCI6IHsKICAgICAgICAgICAgICAiciI6IDAuNzIsCiAgICAgICAgICAgICAgImciOiAwLjksCiAgICAgICAgICAgICAgImIiOiAxCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24tYmFja2Ryb3AiLAogICAgICAiY3JlYXRpb24iOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJmYW1pbHkiOiAicGJyIgogICAgICB9LAogICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICJyIjogMC4wMTUsCiAgICAgICAgImciOiAwLjA1NSwKICAgICAgICAiYiI6IDAuMTYKICAgICAgfSwKICAgICAgImVtaXNzaXZlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLjAxLAogICAgICAgICJnIjogMC4wNCwKICAgICAgICAiYiI6IDAuMTgKICAgICAgfSwKICAgICAgImVtaXNzaXZlSW50ZW5zaXR5IjogMS4xLAogICAgICAibWV0YWxsaWMiOiAwLjEsCiAgICAgICJyb3VnaG5lc3MiOiAwLjY1CiAgICB9LAogICAgewogICAgICAiaWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWN5YW4iLAogICAgICAiY3JlYXRpb24iOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJmYW1pbHkiOiAicGJyIgogICAgICB9LAogICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICJyIjogMC4wMSwKICAgICAgICAiZyI6IDAuNTUsCiAgICAgICAgImIiOiAwLjkKICAgICAgfSwKICAgICAgImVtaXNzaXZlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLAogICAgICAgICJnIjogMC4yMiwKICAgICAgICAiYiI6IDAuOAogICAgICB9LAogICAgICAiZW1pc3NpdmVJbnRlbnNpdHkiOiAyLjIsCiAgICAgICJtZXRhbGxpYyI6IDAuMzUsCiAgICAgICJyb3VnaG5lc3MiOiAwLjIyCiAgICB9LAogICAgewogICAgICAiaWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLW1hZ2VudGEiLAogICAgICAiY3JlYXRpb24iOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJmYW1pbHkiOiAicGJyIgogICAgICB9LAogICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICJyIjogMC43NSwKICAgICAgICAiZyI6IDAuMDE1LAogICAgICAgICJiIjogMC40MgogICAgICB9LAogICAgICAiZW1pc3NpdmVDb2xvciI6IHsKICAgICAgICAiciI6IDAuNiwKICAgICAgICAiZyI6IDAuMDA1LAogICAgICAgICJiIjogMC4yCiAgICAgIH0sCiAgICAgICJlbWlzc2l2ZUludGVuc2l0eSI6IDEuOCwKICAgICAgIm1ldGFsbGljIjogMC4yNSwKICAgICAgInJvdWdobmVzcyI6IDAuMjgKICAgIH0KICBdLAogICJtYXRlcmlhbEJpbmRpbmdzIjogWwogICAgewogICAgICAiaWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWdsYXNzLWJpbmRpbmciLAogICAgICAibWF0ZXJpYWxJZCI6ICJnbGFzcy10cmFuc21pc3Npb24tZ2xhc3MtbWF0ZXJpYWwiLAogICAgICAiZW50aXR5SWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWdsYXNzIgogICAgfSwKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1iYWNrZHJvcC1iaW5kaW5nIiwKICAgICAgIm1hdGVyaWFsSWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWJhY2tkcm9wIiwKICAgICAgImVudGl0eUlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1iYWNrZHJvcC1wYW5lbCIKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24tYS1iaW5kaW5nIiwKICAgICAgIm1hdGVyaWFsSWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWN5YW4iLAogICAgICAiZW50aXR5SWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWJhY2tkcm9wLWEiCiAgICB9LAogICAgewogICAgICAiaWQiOiAiZ2xhc3MtdHJhbnNtaXNzaW9uLWItYmluZGluZyIsCiAgICAgICJtYXRlcmlhbElkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1tYWdlbnRhIiwKICAgICAgImVudGl0eUlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1iYWNrZHJvcC1iIgogICAgfSwKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1jLWJpbmRpbmciLAogICAgICAibWF0ZXJpYWxJZCI6ICJnbGFzcy10cmFuc21pc3Npb24tY3lhbiIsCiAgICAgICJlbnRpdHlJZCI6ICJnbGFzcy10cmFuc21pc3Npb24tYmFja2Ryb3AtYyIKICAgIH0KICBdLAogICJjYW1lcmEiOiB7CiAgICAibW9kZSI6ICJvcmJpdCIsCiAgICAicG9zaXRpb24iOiB7CiAgICAgICJ4IjogMi41NSwKICAgICAgInkiOiAxLjQ1LAogICAgICAieiI6IC01LjIKICAgIH0sCiAgICAidGFyZ2V0IjogewogICAgICAieCI6IDAsCiAgICAgICJ5IjogMCwKICAgICAgInoiOiAwLjYKICAgIH0KICB9LAogICJlbnZpcm9ubWVudCI6IHsKICAgICJlbmFibGVkIjogZmFsc2UsCiAgICAiYmFja2dyb3VuZCI6IHsKICAgICAgIm1vZGUiOiAiY29sb3IiLAogICAgICAiY29sb3IiOiAiIzAzMDYxMSIKICAgIH0KICB9LAogICJsaWdodHMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24ta2V5IiwKICAgICAgInR5cGUiOiAiZGlyZWN0aW9uYWwiLAogICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICJpbnRlbnNpdHkiOiAyLjgsCiAgICAgICJjb2xvciI6IHsKICAgICAgICAiciI6IDAuNTUsCiAgICAgICAgImciOiAwLjc1LAogICAgICAgICJiIjogMQogICAgICB9LAogICAgICAicm90YXRpb24iOiB7CiAgICAgICAgIngiOiAtMC42LAogICAgICAgICJ5IjogLTAuOCwKICAgICAgICAieiI6IDAKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbi1maWxsIiwKICAgICAgInR5cGUiOiAiaGVtaXNwaGVyaWMiLAogICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICJpbnRlbnNpdHkiOiAwLjU1LAogICAgICAiY29sb3IiOiB7CiAgICAgICAgInIiOiAwLjQyLAogICAgICAgICJnIjogMC4yMiwKICAgICAgICAiYiI6IDAuNjUKICAgICAgfSwKICAgICAgInJvdGF0aW9uIjogewogICAgICAgICJ4IjogLTEuNTcwNzk2MzI2Nzk0ODk2NiwKICAgICAgICAieSI6IDAsCiAgICAgICAgInoiOiAwCiAgICAgIH0KICAgIH0KICBdLAogICJwb3N0UHJvY2VzcyI6IHsKICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICJhbnRpYWxpYXNpbmciOiAiZnhhYSIsCiAgICAidG9uZU1hcHBpbmdFbmFibGVkIjogdHJ1ZSwKICAgICJ0b25lTWFwcGluZ1R5cGUiOiAiYWNlcyIsCiAgICAiZXhwb3N1cmUiOiAxLAogICAgImdsb3ciOiB0cnVlLAogICAgImJsb29tIjogZmFsc2UsCiAgICAiZGVwdGhPZkZpZWxkIjogZmFsc2UsCiAgICAic3NhbyI6IHsKICAgICAgImVuYWJsZWQiOiBmYWxzZQogICAgfQogIH0KfQo="
577
+ },
578
+ {
579
+ "path": "recipe.json",
580
+ "mediaType": "application/json",
581
+ "sha256": "4d96b1c3be17bff7750efe04df92367271d9dadcbb87ccf0ea6b70061f746520",
582
+ "contentBase64": "ewogICJpZCI6ICJnbGFzcy10cmFuc21pc3Npb24tdjEiLAogICJvcHRpb25zIjogewogICAgImlkIjogImdsYXNzLXRyYW5zbWlzc2lvbiIsCiAgICAicmFkaXVzIjogMSwKICAgICJpbmRleE9mUmVmcmFjdGlvbiI6IDEuNDYsCiAgICAiaW50ZW5zaXR5IjogMC45MiwKICAgICJkaXNwZXJzaW9uIjogMC4yMiwKICAgICJibHVyUmFkaXVzIjogNwogIH0KfQo="
583
+ }
584
+ ]
585
+ },
586
+ {
587
+ "manifest": {
588
+ "schema": "skenora.example-manifest",
589
+ "schemaVersion": 1,
590
+ "id": "gradient-rim",
591
+ "title": "Gradient Rim",
592
+ "description": "A persistent Blueprint combining bounded local gradient albedo with view-dependent rim emission.",
593
+ "tags": [
594
+ "blueprint",
595
+ "gradient",
596
+ "pbr",
597
+ "rim"
598
+ ],
599
+ "mode": "blueprint",
600
+ "tier": "foundation",
601
+ "requiredCapabilities": [
602
+ {
603
+ "id": "skenora.entity.primitive",
604
+ "version": "1",
605
+ "reason": "Creates the sphere."
606
+ },
607
+ {
608
+ "id": "skenora.material.pbr",
609
+ "version": "1",
610
+ "reason": "Owns the bounded material."
611
+ },
612
+ {
613
+ "id": "skenora.material.effect.gradient",
614
+ "version": "1",
615
+ "reason": "Mixes the local-space albedo ramp."
616
+ },
617
+ {
618
+ "id": "skenora.material.effect.rim",
619
+ "version": "1",
620
+ "reason": "Adds view-dependent edge emission."
621
+ }
622
+ ],
623
+ "optionalCapabilities": [],
624
+ "assets": [],
625
+ "controls": {
626
+ "type": "object",
627
+ "description": "This baseline has no example-specific controls.",
628
+ "properties": {},
629
+ "additionalProperties": false
630
+ },
631
+ "evidence": [
632
+ {
633
+ "kind": "parse",
634
+ "required": true,
635
+ "status": "passed",
636
+ "note": "Pure manifest and Blueprint parse."
637
+ },
638
+ {
639
+ "kind": "compile",
640
+ "required": true,
641
+ "status": "passed",
642
+ "note": "Pure Scene Plan compilation."
643
+ },
644
+ {
645
+ "kind": "capability",
646
+ "required": true,
647
+ "status": "passed",
648
+ "note": "Effect allow, deny and unknown cases."
649
+ },
650
+ {
651
+ "kind": "preparation",
652
+ "required": true,
653
+ "status": "passed",
654
+ "note": "Runtime surface-program preparation."
655
+ },
656
+ {
657
+ "kind": "runtime",
658
+ "required": true,
659
+ "status": "passed",
660
+ "note": "Public Renderer load and disposal."
661
+ },
662
+ {
663
+ "kind": "pixels",
664
+ "required": true,
665
+ "status": "passed",
666
+ "note": "Gradient and rim pixel evidence."
667
+ },
668
+ {
669
+ "kind": "visual",
670
+ "required": true,
671
+ "status": "passed",
672
+ "note": "Human composition review."
673
+ },
674
+ {
675
+ "kind": "performance",
676
+ "required": true,
677
+ "status": "passed",
678
+ "note": "Stable program identity evidence."
679
+ },
680
+ {
681
+ "kind": "package-consumption",
682
+ "required": true,
683
+ "status": "passed",
684
+ "note": "Development tarball consumer."
685
+ },
686
+ {
687
+ "kind": "cross-device",
688
+ "required": true,
689
+ "status": "passed",
690
+ "note": "Claimed backend matrix."
691
+ }
692
+ ],
693
+ "fallback": {
694
+ "strategy": "substitute-example",
695
+ "description": "Use the Shared PBR baseline when bounded effects are unavailable.",
696
+ "exampleId": "shared-pbr"
697
+ },
698
+ "files": [
699
+ {
700
+ "path": "README.md",
701
+ "role": "readme",
702
+ "mediaType": "text/markdown",
703
+ "bytes": 332,
704
+ "sha256": "c4ac454c35064cb02ad411eaf8f4829ced6205c6e7a5abd559df3eb09350496b"
705
+ },
706
+ {
707
+ "path": "blueprint.json",
708
+ "role": "blueprint",
709
+ "mediaType": "application/json",
710
+ "bytes": 1625,
711
+ "sha256": "2222950c5fd6c66fe5885b80977fdc1daf156e369c6b01e7251baecb5b941770"
712
+ }
713
+ ],
714
+ "license": {
715
+ "spdx": "MIT",
716
+ "attribution": "Skenora contributors; gallery presentation informed by the MIT-licensed vGPU examples.",
717
+ "source": "https://vgpu.sh/examples/gradient"
718
+ },
719
+ "aggregateSha256": "b577972a904e2e98128735023a14bcc64bf738d07da3959af9d319578fae21da"
720
+ },
721
+ "sources": [
722
+ {
723
+ "path": "README.md",
724
+ "mediaType": "text/markdown",
725
+ "sha256": "c4ac454c35064cb02ad411eaf8f4829ced6205c6e7a5abd559df3eb09350496b",
726
+ "contentBase64": "IyBHcmFkaWVudCBSaW0KCuS4gOS4quaXoOWklumDqOi1hOS6p+eahCBgYmx1ZXByaW50YCDnpLrkvovvvIzpgJrov4flhazlhbEgYGdyYWRpZW50QDFgIOS4jiBgcmltQDFgIOiDveWKm+e7hOWQiOWxgOmDqOWdkOagh+a4kOWPmOWSjOinhuinkuebuOWFs+eahOi+uee8mOiHquWPkeWFieOAggoK6L+Z5Liq56S65L6L5pivIEdhbGxlcnkg5a+54oCc5pWI5p6c5bqU5YWI5oiQ5Li65YWs5YWxIENhcGFiaWxpdHnvvIjog73lipvlpZHnuqbvvIzljbPlupPlr7nlpJbmib/or7rnmoTlj6/lpI3nlKjor63kuYnvvInvvIzlho3miJDkuLogRXhhbXBsZeKAneeahOWfuuehgOivgeaYjuOAggo="
727
+ },
728
+ {
729
+ "path": "blueprint.json",
730
+ "mediaType": "application/json",
731
+ "sha256": "2222950c5fd6c66fe5885b80977fdc1daf156e369c6b01e7251baecb5b941770",
732
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7ICJpZCI6ICJncmFkaWVudC1yaW0iLCAibmFtZSI6ICJHcmFkaWVudCBSaW0iIH0sCiAgImVudGl0aWVzIjogWwogICAgewogICAgICAiaWQiOiAic3BoZXJlIiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJzcGhlcmUiLAogICAgICAidHJhbnNmb3JtIjogeyAicG9zaXRpb24iOiB7ICJ4IjogMCwgInkiOiAwLjY1LCAieiI6IDAgfSB9CiAgICB9CiAgXSwKICAibWF0ZXJpYWxzIjogWwogICAgewogICAgICAiaWQiOiAic3VyZmFjZSIsCiAgICAgICJjcmVhdGlvbiI6IHsgInZlcnNpb24iOiAxLCAiZmFtaWx5IjogInBiciIgfSwKICAgICAgInJvdWdobmVzcyI6IDAuMywKICAgICAgImVmZmVjdHMiOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJncmFkaWVudCI6IHsKICAgICAgICAgICJheGlzIjogInkiLAogICAgICAgICAgInNwYWNlIjogImxvY2FsIiwKICAgICAgICAgICJzdGFydCI6IC0wLjUsCiAgICAgICAgICAiZW5kIjogMC41LAogICAgICAgICAgImNvbG9yU3RhcnQiOiB7ICJyIjogMC4wMywgImciOiAwLjA4LCAiYiI6IDAuNTUgfSwKICAgICAgICAgICJjb2xvckVuZCI6IHsgInIiOiAwLjc1LCAiZyI6IDAuMDgsICJiIjogMC4yNSB9LAogICAgICAgICAgInN0cmVuZ3RoIjogMC45NQogICAgICAgIH0sCiAgICAgICAgInJpbSI6IHsKICAgICAgICAgICJjb2xvciI6IHsgInIiOiAwLjA4LCAiZyI6IDAuNDUsICJiIjogMS4yIH0sCiAgICAgICAgICAiaW50ZW5zaXR5IjogMS44LAogICAgICAgICAgInBvd2VyIjogMwogICAgICAgIH0KICAgICAgfQogICAgfQogIF0sCiAgIm1hdGVyaWFsQmluZGluZ3MiOiBbCiAgICB7ICJpZCI6ICJzcGhlcmUtc3VyZmFjZSIsICJtYXRlcmlhbElkIjogInN1cmZhY2UiLCAiZW50aXR5SWQiOiAic3BoZXJlIiB9CiAgXSwKICAiY2FtZXJhIjogewogICAgIm1vZGUiOiAib3JiaXQiLAogICAgInBvc2l0aW9uIjogeyAieCI6IDIuOCwgInkiOiAxLjksICJ6IjogLTQuMiB9LAogICAgInRhcmdldCI6IHsgIngiOiAwLCAieSI6IDAuNTUsICJ6IjogMCB9CiAgfSwKICAiZW52aXJvbm1lbnQiOiB7CiAgICAiZW5hYmxlZCI6IGZhbHNlLAogICAgImJhY2tncm91bmQiOiB7ICJtb2RlIjogImNvbG9yIiwgImNvbG9yIjogIiMwNTA5MTQiIH0KICB9LAogICJsaWdodHMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJmaWxsIiwKICAgICAgInR5cGUiOiAiaGVtaXNwaGVyaWMiLAogICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICJpbnRlbnNpdHkiOiAwLjc1LAogICAgICAiY29sb3IiOiB7ICJyIjogMC44LCAiZyI6IDAuOSwgImIiOiAxIH0sCiAgICAgICJyb3RhdGlvbiI6IHsgIngiOiAtMS41NzA3OTYzMjY3OTQ4OTY2LCAieSI6IDAsICJ6IjogMCB9CiAgICB9CiAgXSwKICAicG9zdFByb2Nlc3MiOiB7CiAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAiYW50aWFsaWFzaW5nIjogImZ4YWEiLAogICAgInRvbmVNYXBwaW5nRW5hYmxlZCI6IHRydWUsCiAgICAidG9uZU1hcHBpbmdUeXBlIjogImFjZXMiLAogICAgImV4cG9zdXJlIjogMQogIH0KfQo="
733
+ }
734
+ ]
735
+ },
736
+ {
737
+ "manifest": {
738
+ "schema": "skenora.example-manifest",
739
+ "schemaVersion": 1,
740
+ "id": "interactive-fluid",
741
+ "title": "Interactive Fluid",
742
+ "description": "Fixed-step WebGPU fluid advection and pressure projection over stable GPU-resident ping-pong storage.",
743
+ "tags": [
744
+ "compute",
745
+ "fluid",
746
+ "ping-pong",
747
+ "simulation",
748
+ "webgpu"
749
+ ],
750
+ "mode": "renderer-lab",
751
+ "tier": "compute",
752
+ "requiredCapabilities": [
753
+ {
754
+ "id": "skenora.simulation.program",
755
+ "version": "1",
756
+ "reason": "Validates fixed-step scheduling, storage budgets and trusted fluid passes."
757
+ }
758
+ ],
759
+ "optionalCapabilities": [],
760
+ "assets": [],
761
+ "controls": {
762
+ "type": "object",
763
+ "description": "Pointer injection is translated to bounded simulation parameters.",
764
+ "additionalProperties": false,
765
+ "properties": {
766
+ "injectionStrength": {
767
+ "type": "number",
768
+ "description": "Pointer density and velocity injection strength",
769
+ "minimum": 0,
770
+ "maximum": 20,
771
+ "default": 7.5,
772
+ "update": "parameter"
773
+ },
774
+ "pressureIterations": {
775
+ "type": "number",
776
+ "description": "Bounded pressure projection iteration count",
777
+ "minimum": 2,
778
+ "maximum": 24,
779
+ "default": 12,
780
+ "update": "rebuild"
781
+ }
782
+ }
783
+ },
784
+ "evidence": [
785
+ {
786
+ "kind": "parse",
787
+ "required": true,
788
+ "status": "passed",
789
+ "note": "SimulationProgram rejects unknown fields and raw shader source."
790
+ },
791
+ {
792
+ "kind": "compile",
793
+ "required": true,
794
+ "status": "passed",
795
+ "note": "Stable inject, advect and pressure pass IR."
796
+ },
797
+ {
798
+ "kind": "capability",
799
+ "required": true,
800
+ "status": "passed",
801
+ "note": "Grid, byte, dispatch, step and iteration budgets."
802
+ },
803
+ {
804
+ "kind": "preparation",
805
+ "required": true,
806
+ "status": "passed",
807
+ "note": "Physical WebGPU shader compilation and pipelines."
808
+ },
809
+ {
810
+ "kind": "runtime",
811
+ "required": true,
812
+ "status": "passed",
813
+ "note": "Fixed-step, pointer, reset, resize, pause and disposal."
814
+ },
815
+ {
816
+ "kind": "pixels",
817
+ "required": true,
818
+ "status": "passed",
819
+ "note": "GPU-resident density produces non-background pixels."
820
+ },
821
+ {
822
+ "kind": "visual",
823
+ "required": true,
824
+ "status": "passed",
825
+ "note": "Human review of continuous cyan/magenta flow."
826
+ },
827
+ {
828
+ "kind": "performance",
829
+ "required": true,
830
+ "status": "passed",
831
+ "note": "Stable resources and zero steady-state readback."
832
+ },
833
+ {
834
+ "kind": "package-consumption",
835
+ "required": true,
836
+ "status": "passed",
837
+ "note": "Optional simulation subpath consumed from development tarball."
838
+ },
839
+ {
840
+ "kind": "cross-device",
841
+ "required": true,
842
+ "status": "passed",
843
+ "note": "WebGPU support and explicit unsupported outcome."
844
+ }
845
+ ],
846
+ "fallback": {
847
+ "strategy": "substitute-example",
848
+ "description": "Use Gradient Rim on browsers without WebGPU; no WebGL compute equivalence is claimed.",
849
+ "exampleId": "gradient-rim"
850
+ },
851
+ "files": [
852
+ {
853
+ "path": "README.md",
854
+ "role": "readme",
855
+ "mediaType": "text/markdown",
856
+ "bytes": 610,
857
+ "sha256": "a00c50e5982bea6f480ac59889f3919334ea482a251dd5f1fe1899a00118809f"
858
+ },
859
+ {
860
+ "path": "simulation.json",
861
+ "role": "source",
862
+ "mediaType": "application/json",
863
+ "bytes": 726,
864
+ "sha256": "9ae643192d7f739330770c937b3a90a8a3b40c31b5870d5d829bdea34bb3362b"
865
+ }
866
+ ],
867
+ "license": {
868
+ "spdx": "MIT",
869
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Interactive Fluid example.",
870
+ "source": "https://vgpu.sh/examples/fluid"
871
+ },
872
+ "aggregateSha256": "2abaaf374e5adcc5b1d82320a9ea10a7ab2bdbcc886937bbc8c3530247fee4c2"
873
+ },
874
+ "sources": [
875
+ {
876
+ "path": "README.md",
877
+ "mediaType": "text/markdown",
878
+ "sha256": "a00c50e5982bea6f480ac59889f3919334ea482a251dd5f1fe1899a00118809f",
879
+ "contentBase64": "IyBJbnRlcmFjdGl2ZSBGbHVpZAoK6L+Z5LiqIGByZW5kZXJlci1sYWJgIOmAmui/h+WFrOW8gOeahCBgQHNrZW5vcmEvcnVudGltZS9zaW11bGF0aW9uYCDlrZDlhaXlj6Pov5DooYznnJ/lrp4gV2ViR1BVIGNvbXB1dGXjgIJgU2ltdWxhdGlvblByb2dyYW0gVjFgIOWjsOaYjuWbuuWumuatpemVv+OAgeS4pOWdl+eos+WumiBwaW5nLXBvbmcgc3RvcmFnZSBidWZmZXLjgIHms6jlhaXjgIHljYrmi4nmoLzmnJfml6XlubPmtYHlkozmnInnlYzljovlipvmipXlvbHvvJtDYW52YXMg5oyH6ZKI5Y+q5pu05paw5Y+C5pWw77yM5LiN5o6l6KemIGBHUFVEZXZpY2Vg44CCCgrlroPkuI3mmK8gU2NlbmVEb2N1bWVudCDmjIHkuYXljJbog73lipvjgIJXZWJHUFUg5LiN5Y+v55So5pe277yMR2FsbGVyeSDkvJrmmI7noa7miqXlkYogdW5zdXBwb3J0ZWTvvIzlubblu7rorq7kvb/nlKggYGdyYWRpZW50LXJpbWDvvIzkuI3kvJrmioogV2ViR0wg5YaS5YWF5Li6IGNvbXB1dGUgZmFsbGJhY2vjgILnqLPmgIEgY29tcHV0ZS10by1yZW5kZXIg5LiN6K+75ZueIENQVe+8m+WPquacieaYvuW8jyBgcHJvYmUoKWAg5omN5aSN5Yi25a2Y5YKo5bm25YGa5pWw5YC85YGl5bq35qOA5p+l44CCCg=="
880
+ },
881
+ {
882
+ "path": "simulation.json",
883
+ "mediaType": "application/json",
884
+ "sha256": "9ae643192d7f739330770c937b3a90a8a3b40c31b5870d5d829bdea34bb3362b",
885
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zaW11bGF0aW9uLXByb2dyYW0iLAogICJ2ZXJzaW9uIjogMSwKICAia2VybmVsIjogImZsdWlkLTJkIiwKICAiZ3JpZCI6IHsKICAgICJ3aWR0aCI6IDEyOCwKICAgICJoZWlnaHQiOiAxMjgKICB9LAogICJmaXhlZFN0ZXAiOiB7CiAgICAibWlsbGlzZWNvbmRzIjogMTYuNjY2NywKICAgICJtYXhTdWJzdGVwcyI6IDQKICB9LAogICJkaXNwYXRjaCI6IHsKICAgICJ3b3JrZ3JvdXBTaXplIjogOAogIH0sCiAgInJlc291cmNlcyI6IFsKICAgIHsKICAgICAgImlkIjogImZsdWlkLXN0YXRlLWEiLAogICAgICAia2luZCI6ICJzdG9yYWdlLWJ1ZmZlciIsCiAgICAgICJmb3JtYXQiOiAidmVjNGYiLAogICAgICAiZWxlbWVudHMiOiAiZ3JpZCIsCiAgICAgICJwaW5nUG9uZyI6IHRydWUKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJmbHVpZC1zdGF0ZS1iIiwKICAgICAgImtpbmQiOiAic3RvcmFnZS1idWZmZXIiLAogICAgICAiZm9ybWF0IjogInZlYzRmIiwKICAgICAgImVsZW1lbnRzIjogImdyaWQiLAogICAgICAicGluZ1BvbmciOiB0cnVlCiAgICB9CiAgXSwKICAicGFyYW1ldGVycyI6IHsKICAgICJraW5kIjogImZsdWlkLTJkIiwKICAgICJwcmVzc3VyZUl0ZXJhdGlvbnMiOiAxMiwKICAgICJ2aXNjb3NpdHkiOiAwLjA4LAogICAgImRpc3NpcGF0aW9uIjogMC45OTQsCiAgICAiaW5qZWN0aW9uU3RyZW5ndGgiOiA3LjUKICB9Cn0K"
886
+ }
887
+ ]
888
+ },
889
+ {
890
+ "manifest": {
891
+ "schema": "skenora.example-manifest",
892
+ "schemaVersion": 1,
893
+ "id": "lava-surface",
894
+ "title": "Lava Surface",
895
+ "description": "A bounded MaterialProgram V2 surface driving color, HDR emission, roughness and metallic from trusted 3D noise.",
896
+ "tags": [
897
+ "lava",
898
+ "material-program-v2",
899
+ "noise",
900
+ "recipe",
901
+ "wgsl-reflection"
902
+ ],
903
+ "mode": "recipe",
904
+ "tier": "materials",
905
+ "requiredCapabilities": [
906
+ {
907
+ "id": "skenora.entity.primitive",
908
+ "version": "1",
909
+ "reason": "Creates the lava sphere."
910
+ },
911
+ {
912
+ "id": "skenora.material.pbr",
913
+ "version": "1",
914
+ "reason": "Owns the visible PBR surface."
915
+ },
916
+ {
917
+ "id": "skenora.material.program.v2",
918
+ "version": "1",
919
+ "reason": "Compiles bounded noise and scalar PBR output channels."
920
+ }
921
+ ],
922
+ "optionalCapabilities": [
923
+ {
924
+ "id": "skenora.scene.post-process",
925
+ "version": "1",
926
+ "reason": "Glow presents explicit HDR emission."
927
+ }
928
+ ],
929
+ "assets": [],
930
+ "controls": {
931
+ "type": "object",
932
+ "description": "Bounded lava recipe options.",
933
+ "additionalProperties": false,
934
+ "properties": {
935
+ "radius": {
936
+ "type": "number",
937
+ "description": "Sphere radius",
938
+ "minimum": 0.1,
939
+ "maximum": 1000,
940
+ "default": 1,
941
+ "update": "rebuild"
942
+ },
943
+ "scale": {
944
+ "type": "number",
945
+ "description": "Noise frequency",
946
+ "minimum": 0.1,
947
+ "maximum": 64,
948
+ "default": 4.8,
949
+ "update": "parameter"
950
+ },
951
+ "emission": {
952
+ "type": "number",
953
+ "description": "HDR fissure emission",
954
+ "minimum": 0,
955
+ "maximum": 32,
956
+ "default": 5.5,
957
+ "update": "parameter"
958
+ },
959
+ "seed": {
960
+ "type": "integer",
961
+ "description": "Trusted noise seed",
962
+ "minimum": -1000000000,
963
+ "maximum": 1000000000,
964
+ "default": 1337,
965
+ "update": "rebuild"
966
+ }
967
+ }
968
+ },
969
+ "evidence": [
970
+ {
971
+ "kind": "parse",
972
+ "required": true,
973
+ "status": "passed",
974
+ "note": "V2 program, Recipe and Blueprint parsing."
975
+ },
976
+ {
977
+ "kind": "compile",
978
+ "required": true,
979
+ "status": "passed",
980
+ "note": "Trusted GLSL artifact and inspectable WGSL reflection."
981
+ },
982
+ {
983
+ "kind": "capability",
984
+ "required": true,
985
+ "status": "passed",
986
+ "note": "V1 rejection, V2 output typing, cycle and octave budgets."
987
+ },
988
+ {
989
+ "kind": "preparation",
990
+ "required": true,
991
+ "status": "passed",
992
+ "note": "All visible target variants prepare before activation."
993
+ },
994
+ {
995
+ "kind": "runtime",
996
+ "required": true,
997
+ "status": "passed",
998
+ "note": "Uniform reuse, structural replacement and disposal."
999
+ },
1000
+ {
1001
+ "kind": "pixels",
1002
+ "required": true,
1003
+ "status": "passed",
1004
+ "note": "Dark crust and HDR fissure framebuffer regions."
1005
+ },
1006
+ {
1007
+ "kind": "visual",
1008
+ "required": true,
1009
+ "status": "passed",
1010
+ "note": "Human surface composition review."
1011
+ },
1012
+ {
1013
+ "kind": "performance",
1014
+ "required": true,
1015
+ "status": "passed",
1016
+ "note": "Parameter values retain prepared shader identity."
1017
+ },
1018
+ {
1019
+ "kind": "package-consumption",
1020
+ "required": true,
1021
+ "status": "passed",
1022
+ "note": "V2 compiler, Recipe and Example through development tarballs."
1023
+ },
1024
+ {
1025
+ "kind": "cross-device",
1026
+ "required": true,
1027
+ "status": "passed",
1028
+ "note": "WebGL runtime and generated WGSL reflection matrix."
1029
+ }
1030
+ ],
1031
+ "fallback": {
1032
+ "strategy": "substitute-example",
1033
+ "description": "Use Gradient Rim when MaterialProgram V2 is unavailable; never downgrade V2 channels silently.",
1034
+ "exampleId": "gradient-rim"
1035
+ },
1036
+ "files": [
1037
+ {
1038
+ "path": "README.md",
1039
+ "role": "readme",
1040
+ "mediaType": "text/markdown",
1041
+ "bytes": 454,
1042
+ "sha256": "5609a6ac30cfbb95e0e651278bdff4e8cd06412bb81a6101d36eea9f0751deb7"
1043
+ },
1044
+ {
1045
+ "path": "blueprint.json",
1046
+ "role": "blueprint",
1047
+ "mediaType": "application/json",
1048
+ "bytes": 5878,
1049
+ "sha256": "bf7e62aa155ea607a696a1dbbca14960f833da87e5b72954cbe4251ef7b9d503"
1050
+ },
1051
+ {
1052
+ "path": "recipe.json",
1053
+ "role": "source",
1054
+ "mediaType": "application/json",
1055
+ "bytes": 149,
1056
+ "sha256": "db197fd793b11556ff104153ac0a3f9ba9790e688ededa1f1da006cac2299bef"
1057
+ }
1058
+ ],
1059
+ "license": {
1060
+ "spdx": "MIT",
1061
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU three-tsl lava example.",
1062
+ "source": "https://vgpu.sh/examples/three-tsl"
1063
+ },
1064
+ "aggregateSha256": "e4d7262b4ed3786a04f5a9b89c2b142ca6d7d432faea427873b7209f7d08dcdd"
1065
+ },
1066
+ "sources": [
1067
+ {
1068
+ "path": "README.md",
1069
+ "mediaType": "text/markdown",
1070
+ "sha256": "5609a6ac30cfbb95e0e651278bdff4e8cd06412bb81a6101d36eea9f0751deb7",
1071
+ "contentBase64": "IyBMYXZhIFN1cmZhY2UKCui/meS4qiBgcmVjaXBlYCDnpLrkvovosIPnlKggYGNyZWF0ZUxhdmFTdXJmYWNlUmVjaXBlKClg77yM55SoIGBNYXRlcmlhbFByb2dyYW0gVjJg77yI5pyJ55WM5p2Q6LSo56iL5bqP56ys5LqM54mI77yJ6YeM55qE5Y+v5L+hIEZCTS9Wb3Jvbm9pIOWZquWjsOWQjOaXtumpseWKqCBiYXNlIGNvbG9y44CBZW1pc3Npb27jgIFyb3VnaG5lc3Mg5ZKMIG1ldGFsbGlj44CC6L6T5YWl5LuN5piv57qv5pWw5o2u77yM5LiN5o6l5Y+XIEdMU0zjgIFXR1NM44CB5Zue6LCD5oiW5a+85YWl6Lev5b6E44CCCgpWMiDlvZPliY3mlYXmhI/kuI3lvIDmlL4gbm9ybWFsIOS4jiBkaXNwbGFjZW1lbnQg6L6T5Ye677yb6L+Z5Lik5Liq6L6T5Ye66KaB562J54us56uL55qE6LeoIHBhc3Mg6K+t5LmJ5ZKM6K+B5o2u5ZCO5YaN5Yqg5YWl77yM56S65L6L5LiN5Lya6Z2Z6buY6L+R5Ly844CCCg=="
1072
+ },
1073
+ {
1074
+ "path": "blueprint.json",
1075
+ "mediaType": "application/json",
1076
+ "sha256": "bf7e62aa155ea607a696a1dbbca14960f833da87e5b72954cbe4251ef7b9d503",
1077
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7CiAgICAiaWQiOiAibGF2YS1zdXJmYWNlIiwKICAgICJuYW1lIjogIkxhdmEgU3VyZmFjZSIKICB9LAogICJlbnRpdGllcyI6IFsKICAgIHsKICAgICAgImlkIjogImxhdmEtc3VyZmFjZS1ib2R5IiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJzcGhlcmUiLAogICAgICAiZGlhbWV0ZXIiOiAyCiAgICB9CiAgXSwKICAibWF0ZXJpYWxzIjogWwogICAgewogICAgICAiaWQiOiAibGF2YS1zdXJmYWNlLW1hdGVyaWFsIiwKICAgICAgImNyZWF0aW9uIjogewogICAgICAgICJ2ZXJzaW9uIjogMSwKICAgICAgICAiZmFtaWx5IjogInBiciIKICAgICAgfSwKICAgICAgImJhc2VDb2xvciI6IHsKICAgICAgICAiciI6IDAuMDEsCiAgICAgICAgImciOiAwLjAwNSwKICAgICAgICAiYiI6IDAuMDA4CiAgICAgIH0sCiAgICAgICJyb3VnaG5lc3MiOiAwLjgsCiAgICAgICJtZXRhbGxpYyI6IDAsCiAgICAgICJwcm9ncmFtIjogewogICAgICAgICJzY2hlbWEiOiAic2tlbm9yYS5tYXRlcmlhbC5wcm9ncmFtIiwKICAgICAgICAidmVyc2lvbiI6IDIsCiAgICAgICAgInBhcmFtZXRlcnMiOiB7CiAgICAgICAgICAic2NhbGUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IDQuOCwKICAgICAgICAgICAgIm1pbmltdW0iOiAwLjEsCiAgICAgICAgICAgICJtYXhpbXVtIjogNjQKICAgICAgICAgIH0sCiAgICAgICAgICAiZW1pc3Npb24iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IDUuNSwKICAgICAgICAgICAgIm1pbmltdW0iOiAwLAogICAgICAgICAgICAibWF4aW11bSI6IDMyCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibm9kZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJ4IiwKICAgICAgICAgICAgInR5cGUiOiAiaW5wdXQuY29vcmRpbmF0ZSIsCiAgICAgICAgICAgICJzcGFjZSI6ICJsb2NhbCIsCiAgICAgICAgICAgICJheGlzIjogIngiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAieSIsCiAgICAgICAgICAgICJ0eXBlIjogImlucHV0LmNvb3JkaW5hdGUiLAogICAgICAgICAgICAic3BhY2UiOiAibG9jYWwiLAogICAgICAgICAgICAiYXhpcyI6ICJ5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogInoiLAogICAgICAgICAgICAidHlwZSI6ICJpbnB1dC5jb29yZGluYXRlIiwKICAgICAgICAgICAgInNwYWNlIjogImxvY2FsIiwKICAgICAgICAgICAgImF4aXMiOiAieiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJzY2FsZSIsCiAgICAgICAgICAgICJ0eXBlIjogInBhcmFtZXRlci5udW1iZXIiLAogICAgICAgICAgICAicGFyYW1ldGVyIjogInNjYWxlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogImVtaXNzaW9uIiwKICAgICAgICAgICAgInR5cGUiOiAicGFyYW1ldGVyLm51bWJlciIsCiAgICAgICAgICAgICJwYXJhbWV0ZXIiOiAiZW1pc3Npb24iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiemVybyIsCiAgICAgICAgICAgICJ0eXBlIjogInZhbHVlLm51bWJlciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IDAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJvbmUiLAogICAgICAgICAgICAidHlwZSI6ICJ2YWx1ZS5udW1iZXIiLAogICAgICAgICAgICAidmFsdWUiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiZWRnZTAiLAogICAgICAgICAgICAidHlwZSI6ICJ2YWx1ZS5udW1iZXIiLAogICAgICAgICAgICAidmFsdWUiOiAwLjI1CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiZWRnZTEiLAogICAgICAgICAgICAidHlwZSI6ICJ2YWx1ZS5udW1iZXIiLAogICAgICAgICAgICAidmFsdWUiOiAwLjcyCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicm91Z2hCYXNlIiwKICAgICAgICAgICAgInR5cGUiOiAidmFsdWUubnVtYmVyIiwKICAgICAgICAgICAgInZhbHVlIjogMC44NAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogInJvdWdoRHJvcCIsCiAgICAgICAgICAgICJ0eXBlIjogInZhbHVlLm51bWJlciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IDAuNTgKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJtZXRhbFNjYWxlIiwKICAgICAgICAgICAgInR5cGUiOiAidmFsdWUubnVtYmVyIiwKICAgICAgICAgICAgInZhbHVlIjogMC4xMgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogInJvY2siLAogICAgICAgICAgICAidHlwZSI6ICJ2YWx1ZS5jb2xvciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAiciI6IDAuMDA4LAogICAgICAgICAgICAgICJnIjogMC4wMDQsCiAgICAgICAgICAgICAgImIiOiAwLjAwNgogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAibWFnbWEiLAogICAgICAgICAgICAidHlwZSI6ICJ2YWx1ZS5jb2xvciIsCiAgICAgICAgICAgICJ2YWx1ZSI6IHsKICAgICAgICAgICAgICAiciI6IDEuNDUsCiAgICAgICAgICAgICAgImciOiAwLjEzLAogICAgICAgICAgICAgICJiIjogMC4wMDgKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogImZibSIsCiAgICAgICAgICAgICJ0eXBlIjogIm5vaXNlLmZibTNkIiwKICAgICAgICAgICAgIngiOiAieCIsCiAgICAgICAgICAgICJ5IjogInkiLAogICAgICAgICAgICAieiI6ICJ6IiwKICAgICAgICAgICAgInNjYWxlIjogInNjYWxlIiwKICAgICAgICAgICAgIm9jdGF2ZXMiOiA1LAogICAgICAgICAgICAic2VlZCI6IDEzMzcKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJjZWxsIiwKICAgICAgICAgICAgInR5cGUiOiAibm9pc2Uudm9yb25vaTNkIiwKICAgICAgICAgICAgIngiOiAieCIsCiAgICAgICAgICAgICJ5IjogInkiLAogICAgICAgICAgICAieiI6ICJ6IiwKICAgICAgICAgICAgInNjYWxlIjogInNjYWxlIiwKICAgICAgICAgICAgInNlZWQiOiAxNDM0CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiY3JhY2siLAogICAgICAgICAgICAidHlwZSI6ICJtYXRoLnN1YnRyYWN0IiwKICAgICAgICAgICAgImEiOiAib25lIiwKICAgICAgICAgICAgImIiOiAiY2VsbCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJmaWVsZCIsCiAgICAgICAgICAgICJ0eXBlIjogIm1hdGgubXVsdGlwbHkiLAogICAgICAgICAgICAiYSI6ICJjcmFjayIsCiAgICAgICAgICAgICJiIjogImZibSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJoZWF0IiwKICAgICAgICAgICAgInR5cGUiOiAibWF0aC5zbW9vdGhzdGVwIiwKICAgICAgICAgICAgImVkZ2UwIjogImVkZ2UwIiwKICAgICAgICAgICAgImVkZ2UxIjogImVkZ2UxIiwKICAgICAgICAgICAgImlucHV0IjogImZpZWxkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogImJhc2UiLAogICAgICAgICAgICAidHlwZSI6ICJjb2xvci5taXgiLAogICAgICAgICAgICAiYSI6ICJyb2NrIiwKICAgICAgICAgICAgImIiOiAibWFnbWEiLAogICAgICAgICAgICAiZmFjdG9yIjogImhlYXQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAiaG90IiwKICAgICAgICAgICAgInR5cGUiOiAibWF0aC5tdWx0aXBseSIsCiAgICAgICAgICAgICJhIjogImhlYXQiLAogICAgICAgICAgICAiYiI6ICJlbWlzc2lvbiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJpZCI6ICJlbWlzc2l2ZSIsCiAgICAgICAgICAgICJ0eXBlIjogImNvbG9yLnNjYWxlIiwKICAgICAgICAgICAgImNvbG9yIjogIm1hZ21hIiwKICAgICAgICAgICAgImZhY3RvciI6ICJob3QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAiaWQiOiAicm91Z2hEZWx0YSIsCiAgICAgICAgICAgICJ0eXBlIjogIm1hdGgubXVsdGlwbHkiLAogICAgICAgICAgICAiYSI6ICJoZWF0IiwKICAgICAgICAgICAgImIiOiAicm91Z2hEcm9wIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogInJvdWdobmVzcyIsCiAgICAgICAgICAgICJ0eXBlIjogIm1hdGguc3VidHJhY3QiLAogICAgICAgICAgICAiYSI6ICJyb3VnaEJhc2UiLAogICAgICAgICAgICAiYiI6ICJyb3VnaERlbHRhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgImlkIjogIm1ldGFsbGljIiwKICAgICAgICAgICAgInR5cGUiOiAibWF0aC5tdWx0aXBseSIsCiAgICAgICAgICAgICJhIjogImhlYXQiLAogICAgICAgICAgICAiYiI6ICJtZXRhbFNjYWxlIgogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgIm91dHB1dHMiOiB7CiAgICAgICAgICAiYmFzZUNvbG9yIjogImJhc2UiLAogICAgICAgICAgImVtaXNzaXZlIjogImVtaXNzaXZlIiwKICAgICAgICAgICJyb3VnaG5lc3MiOiAicm91Z2huZXNzIiwKICAgICAgICAgICJtZXRhbGxpYyI6ICJtZXRhbGxpYyIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLAogICJtYXRlcmlhbEJpbmRpbmdzIjogWwogICAgewogICAgICAiaWQiOiAibGF2YS1zdXJmYWNlLWJpbmRpbmciLAogICAgICAibWF0ZXJpYWxJZCI6ICJsYXZhLXN1cmZhY2UtbWF0ZXJpYWwiLAogICAgICAiZW50aXR5SWQiOiAibGF2YS1zdXJmYWNlLWJvZHkiCiAgICB9CiAgXSwKICAiY2FtZXJhIjogewogICAgIm1vZGUiOiAib3JiaXQiLAogICAgInBvc2l0aW9uIjogewogICAgICAieCI6IDIuNSwKICAgICAgInkiOiAxLjMsCiAgICAgICJ6IjogLTQKICAgIH0sCiAgICAidGFyZ2V0IjogewogICAgICAieCI6IDAsCiAgICAgICJ5IjogMCwKICAgICAgInoiOiAwCiAgICB9CiAgfSwKICAiZW52aXJvbm1lbnQiOiB7CiAgICAiZW5hYmxlZCI6IGZhbHNlLAogICAgImJhY2tncm91bmQiOiB7CiAgICAgICJtb2RlIjogImNvbG9yIiwKICAgICAgImNvbG9yIjogIiMwNTAwMDMiCiAgICB9CiAgfSwKICAibGlnaHRzIjogWwogICAgewogICAgICAiaWQiOiAibGF2YS1zdXJmYWNlLWZpbGwiLAogICAgICAidHlwZSI6ICJoZW1pc3BoZXJpYyIsCiAgICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICAgImludGVuc2l0eSI6IDAuMzQsCiAgICAgICJjb2xvciI6IHsKICAgICAgICAiciI6IDAuMzUsCiAgICAgICAgImciOiAwLjA4LAogICAgICAgICJiIjogMC4wNQogICAgICB9LAogICAgICAicm90YXRpb24iOiB7CiAgICAgICAgIngiOiAtMS41NzA3OTYzMjY3OTQ4OTY2LAogICAgICAgICJ5IjogMCwKICAgICAgICAieiI6IDAKICAgICAgfQogICAgfQogIF0sCiAgInBvc3RQcm9jZXNzIjogewogICAgImVuYWJsZWQiOiB0cnVlLAogICAgImFudGlhbGlhc2luZyI6ICJmeGFhIiwKICAgICJ0b25lTWFwcGluZ0VuYWJsZWQiOiB0cnVlLAogICAgInRvbmVNYXBwaW5nVHlwZSI6ICJhY2VzIiwKICAgICJleHBvc3VyZSI6IDAuODUsCiAgICAiZ2xvdyI6IHRydWUsCiAgICAiYmxvb20iOiBmYWxzZSwKICAgICJkZXB0aE9mRmllbGQiOiBmYWxzZSwKICAgICJzc2FvIjogewogICAgICAiZW5hYmxlZCI6IGZhbHNlCiAgICB9CiAgfQp9Cg=="
1078
+ },
1079
+ {
1080
+ "path": "recipe.json",
1081
+ "mediaType": "application/json",
1082
+ "sha256": "db197fd793b11556ff104153ac0a3f9ba9790e688ededa1f1da006cac2299bef",
1083
+ "contentBase64": "ewogICJpZCI6ICJsYXZhLXN1cmZhY2UtdjEiLAogICJvcHRpb25zIjogewogICAgImlkIjogImxhdmEtc3VyZmFjZSIsCiAgICAicmFkaXVzIjogMSwKICAgICJzY2FsZSI6IDQuOCwKICAgICJlbWlzc2lvbiI6IDUuNSwKICAgICJzZWVkIjogMTMzNwogIH0KfQo="
1084
+ }
1085
+ ]
1086
+ },
1087
+ {
1088
+ "manifest": {
1089
+ "schema": "skenora.example-manifest",
1090
+ "schemaVersion": 1,
1091
+ "id": "neon-led",
1092
+ "title": "Neon LED",
1093
+ "description": "A public Recipe combining analytic triangular surface emission, explicit phase animation, and optional scene glow.",
1094
+ "tags": [
1095
+ "animation",
1096
+ "glow",
1097
+ "neon",
1098
+ "recipe"
1099
+ ],
1100
+ "mode": "recipe",
1101
+ "tier": "bounded-effects",
1102
+ "requiredCapabilities": [
1103
+ {
1104
+ "id": "skenora.entity.primitive",
1105
+ "version": "1",
1106
+ "reason": "Creates the public panel plane."
1107
+ },
1108
+ {
1109
+ "id": "skenora.material.pbr",
1110
+ "version": "1",
1111
+ "reason": "Owns the bounded panel surface."
1112
+ },
1113
+ {
1114
+ "id": "skenora.material.effect.neon",
1115
+ "version": "1",
1116
+ "reason": "Evaluates analytic triangular surface lines."
1117
+ },
1118
+ {
1119
+ "id": "skenora.material.animation",
1120
+ "version": "1",
1121
+ "reason": "Drives explicit neon phase through the shared Runtime clock."
1122
+ }
1123
+ ],
1124
+ "optionalCapabilities": [
1125
+ {
1126
+ "id": "skenora.scene.post-process",
1127
+ "version": "1",
1128
+ "reason": "Explicit glow adds a screen-space halo without changing neon semantics."
1129
+ }
1130
+ ],
1131
+ "assets": [],
1132
+ "controls": {
1133
+ "type": "object",
1134
+ "description": "Bounded neon-led recipe options.",
1135
+ "additionalProperties": false,
1136
+ "properties": {
1137
+ "width": {
1138
+ "type": "number",
1139
+ "description": "Panel width",
1140
+ "minimum": 0.1,
1141
+ "maximum": 1000,
1142
+ "default": 3.2,
1143
+ "unit": "meters",
1144
+ "update": "rebuild"
1145
+ },
1146
+ "height": {
1147
+ "type": "number",
1148
+ "description": "Panel height",
1149
+ "minimum": 0.1,
1150
+ "maximum": 1000,
1151
+ "default": 2,
1152
+ "unit": "meters",
1153
+ "update": "rebuild"
1154
+ },
1155
+ "intensity": {
1156
+ "type": "number",
1157
+ "description": "Surface emission",
1158
+ "minimum": 0,
1159
+ "maximum": 64,
1160
+ "default": 5,
1161
+ "update": "parameter"
1162
+ },
1163
+ "cellScale": {
1164
+ "type": "number",
1165
+ "description": "Analytic cells per meter",
1166
+ "minimum": 0.01,
1167
+ "maximum": 1000,
1168
+ "default": 4.5,
1169
+ "unit": "per-meter",
1170
+ "update": "parameter"
1171
+ },
1172
+ "lineWidth": {
1173
+ "type": "number",
1174
+ "description": "Analytic line half-width",
1175
+ "minimum": 0.001,
1176
+ "maximum": 0.25,
1177
+ "default": 0.042,
1178
+ "update": "parameter"
1179
+ },
1180
+ "pulseStrength": {
1181
+ "type": "number",
1182
+ "description": "Pulse modulation fraction",
1183
+ "minimum": 0,
1184
+ "maximum": 1,
1185
+ "default": 0.4,
1186
+ "update": "parameter"
1187
+ },
1188
+ "pulseDurationMs": {
1189
+ "type": "number",
1190
+ "description": "Pulse cycle",
1191
+ "minimum": 100,
1192
+ "maximum": 60000,
1193
+ "default": 2400,
1194
+ "unit": "milliseconds",
1195
+ "update": "parameter"
1196
+ },
1197
+ "glow": {
1198
+ "type": "boolean",
1199
+ "description": "Enable existing scene glow",
1200
+ "default": true,
1201
+ "update": "rebuild"
1202
+ }
1203
+ }
1204
+ },
1205
+ "evidence": [
1206
+ {
1207
+ "kind": "parse",
1208
+ "required": true,
1209
+ "status": "passed",
1210
+ "note": "Manifest, Recipe options and expanded Blueprint parse."
1211
+ },
1212
+ {
1213
+ "kind": "compile",
1214
+ "required": true,
1215
+ "status": "passed",
1216
+ "note": "Expanded ordinary Blueprint compilation."
1217
+ },
1218
+ {
1219
+ "kind": "capability",
1220
+ "required": true,
1221
+ "status": "passed",
1222
+ "note": "Neon allow, deny, unknown and version cases."
1223
+ },
1224
+ {
1225
+ "kind": "preparation",
1226
+ "required": true,
1227
+ "status": "passed",
1228
+ "note": "Analytic variant preparation and parameter reuse."
1229
+ },
1230
+ {
1231
+ "kind": "runtime",
1232
+ "required": true,
1233
+ "status": "passed",
1234
+ "note": "Pulse clock, pause/resume/reset and disposal."
1235
+ },
1236
+ {
1237
+ "kind": "pixels",
1238
+ "required": true,
1239
+ "status": "passed",
1240
+ "note": "Dark base, analytic line and halo pixels."
1241
+ },
1242
+ {
1243
+ "kind": "visual",
1244
+ "required": true,
1245
+ "status": "passed",
1246
+ "note": "Human surface-only/glow composition review."
1247
+ },
1248
+ {
1249
+ "kind": "performance",
1250
+ "required": true,
1251
+ "status": "passed",
1252
+ "note": "Phase updates retain material/program identity."
1253
+ },
1254
+ {
1255
+ "kind": "package-consumption",
1256
+ "required": true,
1257
+ "status": "passed",
1258
+ "note": "Recipe and Example through development tarballs."
1259
+ },
1260
+ {
1261
+ "kind": "cross-device",
1262
+ "required": true,
1263
+ "status": "passed",
1264
+ "note": "WebGL backend/degradation matrix."
1265
+ }
1266
+ ],
1267
+ "fallback": {
1268
+ "strategy": "substitute-example",
1269
+ "description": "Use Gradient Rim when neon is unavailable; label it as a different effect.",
1270
+ "exampleId": "gradient-rim"
1271
+ },
1272
+ "files": [
1273
+ {
1274
+ "path": "README.md",
1275
+ "role": "readme",
1276
+ "mediaType": "text/markdown",
1277
+ "bytes": 415,
1278
+ "sha256": "29ba10194874d18f905927e959ef4be4bb54a504fd22d8c098efb8e0faead803"
1279
+ },
1280
+ {
1281
+ "path": "blueprint.json",
1282
+ "role": "blueprint",
1283
+ "mediaType": "application/json",
1284
+ "bytes": 2226,
1285
+ "sha256": "e369a9a6f10e8c5c910cb0e4cfb944a96f156ca07408aa44c23cec5e15d3f617"
1286
+ },
1287
+ {
1288
+ "path": "recipe.json",
1289
+ "role": "source",
1290
+ "mediaType": "application/json",
1291
+ "bytes": 294,
1292
+ "sha256": "731750fdff0d1d404082aeb30cc1908b00a5571d48933ed4f6ec7707e8c791e8"
1293
+ }
1294
+ ],
1295
+ "license": {
1296
+ "spdx": "MIT",
1297
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Triangle LED Hero example.",
1298
+ "source": "https://vgpu.sh/examples/triangle-led-front"
1299
+ },
1300
+ "aggregateSha256": "0890d9af625aace61f1ad2eb89732ab2d454f99d919f6424e32682b5268be14e"
1301
+ },
1302
+ "sources": [
1303
+ {
1304
+ "path": "README.md",
1305
+ "mediaType": "text/markdown",
1306
+ "sha256": "29ba10194874d18f905927e959ef4be4bb54a504fd22d8c098efb8e0faead803",
1307
+ "contentBase64": "IyBOZW9uIExFRAoK6L+Z5LiqIGByZWNpcGVgIOekuuS+i+iwg+eUqCBgY3JlYXRlTmVvbkxlZFJlY2lwZSgpYO+8jOaKiiBgbmVvbkAxYCDnmoTop6PmnpDlvI/ooajpnaLnur/mnaHjgIHnjrDmnIkgTWF0ZXJpYWwgQW5pbWF0aW9u77yI5p2Q6LSo5Y+C5pWw5Yqo55S777yM5Y2zIFJ1bnRpbWUg5YWs5YWx5pe26ZKf6amx5Yqo55qE5pyJ55WM5Y+C5pWw5YaZ5YWl77yJ5ZKM5pi+5byPIHNjZW5lIGdsb3cg57uE5ZCI5oiQ5pmu6YCaIFNjZW5lQmx1ZXByaW5044CCCgpgbmVvbkAxYCDmnKzouqvlj6rmib/or7ogc3VyZmFjZSBlbWlzc2lvbu+8iOihqOmdouiHquWPkeWFie+8ie+8m+Wxj+W5leepuumXtCBoYWxvIOadpeiHquaYjuehruW8gOWQr+eahCBnbG9377yM56S65L6L5LiN5aOw56ew5YW35pyJ5L2T56ev5pWj5bCE44CCCg=="
1308
+ },
1309
+ {
1310
+ "path": "blueprint.json",
1311
+ "mediaType": "application/json",
1312
+ "sha256": "e369a9a6f10e8c5c910cb0e4cfb944a96f156ca07408aa44c23cec5e15d3f617",
1313
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7CiAgICAiaWQiOiAibmVvbi1sZWQiLAogICAgIm5hbWUiOiAiTmVvbiBMRUQiCiAgfSwKICAiZW50aXRpZXMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJuZW9uLWxlZC1wYW5lbCIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAicGxhbmUiLAogICAgICAid2lkdGgiOiAzLjQsCiAgICAgICJoZWlnaHQiOiAyLjEKICAgIH0KICBdLAogICJtYXRlcmlhbHMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJuZW9uLWxlZC1zdXJmYWNlIiwKICAgICAgImNyZWF0aW9uIjogewogICAgICAgICJ2ZXJzaW9uIjogMSwKICAgICAgICAiZmFtaWx5IjogInBiciIKICAgICAgfSwKICAgICAgImJhc2VDb2xvciI6IHsKICAgICAgICAiciI6IDAuMDAzLAogICAgICAgICJnIjogMC4wMDgsCiAgICAgICAgImIiOiAwLjAxOAogICAgICB9LAogICAgICAibWV0YWxsaWMiOiAwLjE1LAogICAgICAicm91Z2huZXNzIjogMC40LAogICAgICAiZG91YmxlU2lkZWQiOiB0cnVlLAogICAgICAiZWZmZWN0cyI6IHsKICAgICAgICAidmVyc2lvbiI6IDIsCiAgICAgICAgIm5lb24iOiB7CiAgICAgICAgICAiY29sb3IiOiB7CiAgICAgICAgICAgICJyIjogMC4wNCwKICAgICAgICAgICAgImciOiAwLjcsCiAgICAgICAgICAgICJiIjogMS42CiAgICAgICAgICB9LAogICAgICAgICAgImludGVuc2l0eSI6IDUuNSwKICAgICAgICAgICJzY2FsZSI6IDQuOCwKICAgICAgICAgICJ3aWR0aCI6IDAuMDQ0LAogICAgICAgICAgInBsYW5lIjogInh5IiwKICAgICAgICAgICJwaGFzZSI6IDAsCiAgICAgICAgICAicHVsc2VTdHJlbmd0aCI6IDAuNDIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhbmltYXRpb25zIjogWwogICAgICAgIHsKICAgICAgICAgICJ2ZXJzaW9uIjogMSwKICAgICAgICAgICJpZCI6ICJwdWxzZSIsCiAgICAgICAgICAicHJvcGVydHkiOiAibmVvblBoYXNlIiwKICAgICAgICAgICJmcm9tIjogMCwKICAgICAgICAgICJ0byI6IDEsCiAgICAgICAgICAiZHVyYXRpb25NcyI6IDIyMDAsCiAgICAgICAgICAiZWFzaW5nIjogImxpbmVhciIsCiAgICAgICAgICAibG9vcCI6ICJyZXBlYXQiLAogICAgICAgICAgImF1dG9TdGFydCI6IHRydWUKICAgICAgICB9CiAgICAgIF0KICAgIH0KICBdLAogICJtYXRlcmlhbEJpbmRpbmdzIjogWwogICAgewogICAgICAiaWQiOiAibmVvbi1sZWQtcGFuZWwtc3VyZmFjZSIsCiAgICAgICJtYXRlcmlhbElkIjogIm5lb24tbGVkLXN1cmZhY2UiLAogICAgICAiZW50aXR5SWQiOiAibmVvbi1sZWQtcGFuZWwiCiAgICB9CiAgXSwKICAiY2FtZXJhIjogewogICAgIm1vZGUiOiAib3JiaXQiLAogICAgInBvc2l0aW9uIjogewogICAgICAieCI6IDAsCiAgICAgICJ5IjogMCwKICAgICAgInoiOiAtNC44CiAgICB9LAogICAgInRhcmdldCI6IHsKICAgICAgIngiOiAwLAogICAgICAieSI6IDAsCiAgICAgICJ6IjogMAogICAgfQogIH0sCiAgImVudmlyb25tZW50IjogewogICAgImVuYWJsZWQiOiBmYWxzZSwKICAgICJiYWNrZ3JvdW5kIjogewogICAgICAibW9kZSI6ICJjb2xvciIsCiAgICAgICJjb2xvciI6ICIjMDIwNTBjIgogICAgfQogIH0sCiAgImxpZ2h0cyI6IFsKICAgIHsKICAgICAgImlkIjogIm5lb24tbGVkLWZpbGwiLAogICAgICAidHlwZSI6ICJoZW1pc3BoZXJpYyIsCiAgICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICAgImludGVuc2l0eSI6IDAuMTYsCiAgICAgICJjb2xvciI6IHsKICAgICAgICAiciI6IDAuNSwKICAgICAgICAiZyI6IDAuNjUsCiAgICAgICAgImIiOiAxCiAgICAgIH0sCiAgICAgICJyb3RhdGlvbiI6IHsKICAgICAgICAieCI6IC0xLjU3MDc5NjMyNjc5NDg5NjYsCiAgICAgICAgInkiOiAwLAogICAgICAgICJ6IjogMAogICAgICB9CiAgICB9CiAgXSwKICAicG9zdFByb2Nlc3MiOiB7CiAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAiYW50aWFsaWFzaW5nIjogImZ4YWEiLAogICAgInRvbmVNYXBwaW5nRW5hYmxlZCI6IHRydWUsCiAgICAidG9uZU1hcHBpbmdUeXBlIjogImFjZXMiLAogICAgImV4cG9zdXJlIjogMSwKICAgICJnbG93IjogdHJ1ZSwKICAgICJibG9vbSI6IGZhbHNlLAogICAgImRlcHRoT2ZGaWVsZCI6IGZhbHNlLAogICAgInNzYW8iOiB7CiAgICAgICJlbmFibGVkIjogZmFsc2UKICAgIH0KICB9Cn0K"
1314
+ },
1315
+ {
1316
+ "path": "recipe.json",
1317
+ "mediaType": "application/json",
1318
+ "sha256": "731750fdff0d1d404082aeb30cc1908b00a5571d48933ed4f6ec7707e8c791e8",
1319
+ "contentBase64": "ewogICJpZCI6ICJuZW9uLWxlZC12MSIsCiAgIm9wdGlvbnMiOiB7CiAgICAiaWQiOiAibmVvbi1sZWQiLAogICAgIndpZHRoIjogMy40LAogICAgImhlaWdodCI6IDIuMSwKICAgICJjb2xvciI6IHsgInIiOiAwLjA0LCAiZyI6IDAuNywgImIiOiAxLjYgfSwKICAgICJpbnRlbnNpdHkiOiA1LjUsCiAgICAiY2VsbFNjYWxlIjogNC44LAogICAgImxpbmVXaWR0aCI6IDAuMDQ0LAogICAgInB1bHNlU3RyZW5ndGgiOiAwLjQyLAogICAgInB1bHNlRHVyYXRpb25NcyI6IDIyMDAsCiAgICAiZ2xvdyI6IHRydWUKICB9Cn0K"
1320
+ }
1321
+ ]
1322
+ },
1323
+ {
1324
+ "manifest": {
1325
+ "schema": "skenora.example-manifest",
1326
+ "schemaVersion": 1,
1327
+ "id": "procedural-earth",
1328
+ "title": "Procedural Earth",
1329
+ "description": "Deterministic generated planet maps, a transparent cloud shell, night emission and a bounded atmosphere composition.",
1330
+ "tags": [
1331
+ "atmosphere",
1332
+ "earth",
1333
+ "generated-texture",
1334
+ "planet",
1335
+ "recipe"
1336
+ ],
1337
+ "mode": "recipe",
1338
+ "tier": "materials",
1339
+ "requiredCapabilities": [
1340
+ {
1341
+ "id": "skenora.entity.primitive",
1342
+ "version": "1",
1343
+ "reason": "Creates the planet and two explicit shell entities."
1344
+ },
1345
+ {
1346
+ "id": "skenora.material.pbr",
1347
+ "version": "1",
1348
+ "reason": "Owns all explicit planet surfaces."
1349
+ },
1350
+ {
1351
+ "id": "skenora.texture.program",
1352
+ "version": "1",
1353
+ "reason": "Generates deterministic albedo, night and cloud textures within declared budgets."
1354
+ },
1355
+ {
1356
+ "id": "skenora.material.effect.rim",
1357
+ "version": "1",
1358
+ "reason": "Creates the explicit atmosphere-shell rim emission."
1359
+ }
1360
+ ],
1361
+ "optionalCapabilities": [
1362
+ {
1363
+ "id": "skenora.scene.post-process",
1364
+ "version": "1",
1365
+ "reason": "Glow presents atmosphere and night emission but does not define generated-texture semantics."
1366
+ }
1367
+ ],
1368
+ "assets": [],
1369
+ "controls": {
1370
+ "type": "object",
1371
+ "description": "Bounded procedural planet recipe options.",
1372
+ "additionalProperties": false,
1373
+ "properties": {
1374
+ "radius": {
1375
+ "type": "number",
1376
+ "description": "Planet radius",
1377
+ "minimum": 0.1,
1378
+ "maximum": 1000,
1379
+ "default": 1,
1380
+ "update": "rebuild"
1381
+ },
1382
+ "seed": {
1383
+ "type": "integer",
1384
+ "description": "Deterministic generator seed",
1385
+ "minimum": -1000000000,
1386
+ "maximum": 1000000000,
1387
+ "default": 24051969,
1388
+ "update": "rebuild"
1389
+ },
1390
+ "textureSize": {
1391
+ "type": "integer",
1392
+ "description": "Generated texture height",
1393
+ "minimum": 32,
1394
+ "maximum": 512,
1395
+ "default": 128,
1396
+ "update": "rebuild"
1397
+ },
1398
+ "cloudOpacity": {
1399
+ "type": "number",
1400
+ "description": "Cloud shell opacity",
1401
+ "minimum": 0,
1402
+ "maximum": 1,
1403
+ "default": 0.72,
1404
+ "update": "parameter"
1405
+ }
1406
+ }
1407
+ },
1408
+ "evidence": [
1409
+ {
1410
+ "kind": "parse",
1411
+ "required": true,
1412
+ "status": "passed",
1413
+ "note": "Manifest, options and expanded Blueprint parse."
1414
+ },
1415
+ {
1416
+ "kind": "compile",
1417
+ "required": true,
1418
+ "status": "passed",
1419
+ "note": "Texture programs compile to deterministic bytes and WGSL reflection."
1420
+ },
1421
+ {
1422
+ "kind": "capability",
1423
+ "required": true,
1424
+ "status": "passed",
1425
+ "note": "Dimensions, pixels, octaves, kinds and conflict cases."
1426
+ },
1427
+ {
1428
+ "kind": "preparation",
1429
+ "required": true,
1430
+ "status": "passed",
1431
+ "note": "Three generated texture targets prepare before activation."
1432
+ },
1433
+ {
1434
+ "kind": "runtime",
1435
+ "required": true,
1436
+ "status": "passed",
1437
+ "note": "Cache hit, replacement, release and renderer disposal."
1438
+ },
1439
+ {
1440
+ "kind": "pixels",
1441
+ "required": true,
1442
+ "status": "passed",
1443
+ "note": "Planet, cloud alpha, night emission and atmosphere pixels."
1444
+ },
1445
+ {
1446
+ "kind": "visual",
1447
+ "required": true,
1448
+ "status": "passed",
1449
+ "note": "Human planet composition review."
1450
+ },
1451
+ {
1452
+ "kind": "performance",
1453
+ "required": true,
1454
+ "status": "passed",
1455
+ "note": "Static programs do not regenerate per frame."
1456
+ },
1457
+ {
1458
+ "kind": "package-consumption",
1459
+ "required": true,
1460
+ "status": "passed",
1461
+ "note": "Recipe and compiler through development tarballs."
1462
+ },
1463
+ {
1464
+ "kind": "cross-device",
1465
+ "required": true,
1466
+ "status": "passed",
1467
+ "note": "WebGL backend and deterministic byte evidence."
1468
+ }
1469
+ ],
1470
+ "fallback": {
1471
+ "strategy": "substitute-example",
1472
+ "description": "Use Shared PBR if generated textures are unavailable; never claim procedural maps were produced.",
1473
+ "exampleId": "shared-pbr"
1474
+ },
1475
+ "files": [
1476
+ {
1477
+ "path": "README.md",
1478
+ "role": "readme",
1479
+ "mediaType": "text/markdown",
1480
+ "bytes": 503,
1481
+ "sha256": "d471d036ceefb6a963f688b90fc31fe4214f47b2fc9c96113b6f8bb37be472ae"
1482
+ },
1483
+ {
1484
+ "path": "blueprint.json",
1485
+ "role": "blueprint",
1486
+ "mediaType": "application/json",
1487
+ "bytes": 4733,
1488
+ "sha256": "fa13f1028d9b9d2df8c36f506d0feaa033b0016dd0dc54e797d0bd069da27190"
1489
+ },
1490
+ {
1491
+ "path": "recipe.json",
1492
+ "role": "source",
1493
+ "mediaType": "application/json",
1494
+ "bytes": 172,
1495
+ "sha256": "fc86f0d41aa83cc004fbd7c2809b71ee9ca851e774d1d8f44ad6c3f1d5741534"
1496
+ }
1497
+ ],
1498
+ "license": {
1499
+ "spdx": "MIT",
1500
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Earth example.",
1501
+ "source": "https://vgpu.sh/examples/earth"
1502
+ },
1503
+ "aggregateSha256": "de161e181ec04f7024c2a283db1cebe8073da71225bf59d29c13000d3a523da0"
1504
+ },
1505
+ "sources": [
1506
+ {
1507
+ "path": "README.md",
1508
+ "mediaType": "text/markdown",
1509
+ "sha256": "d471d036ceefb6a963f688b90fc31fe4214f47b2fc9c96113b6f8bb37be472ae",
1510
+ "contentBase64": "IyBQcm9jZWR1cmFsIEVhcnRoCgrov5nkuKogYHJlY2lwZWAg56S65L6L6LCD55SoIGBjcmVhdGVQcm9jZWR1cmFsRWFydGhSZWNpcGUoKWDjgILlnLDooajjgIHlpJzpl7Tnga/lhYnlkozkupHlsYLmnaXoh6ogYFRleHR1cmVQcm9ncmFtQDFg77yI55Sf5oiQ57q555CG56iL5bqP77yM5Y2z55Sx5YyF5YaF5Y+v5L+h5a6e546w5oyJ5pi+5byP5bC65a+45LiO56eN5a2Q5LiA5qyh5oCn55Sf5oiQ55qE57q555CG6LWE5rqQ77yJ77yM5bm255SxIFJ1bnRpbWUg57yT5a2Y5ZKM6YeK5pS+77yb5a6D5LiN5LiL6L295aSW6YOo5pif55CD5Zu+54mH44CCCgrlpKfmsJTovonlhYnku43mmK/mma7pgJogYHJpbUAxYCDooajpnaLmlYjmnpzkuI7mmL7lvI8gZ2xvdyDnu4TlkIjjgILkuI3lkIwgR1BVIOeahOacgOe7iOaKl+mUr+m9v+WDj+e0oOS4jeaJv+ivuuWujOWFqOS4gOiHtO+8jOS9huebuOWQjCBQcm9ncmFtIOi+k+WFpeeUn+aIkOeahCBSR0JBIOWtl+iKguaYr+ehruWumueahOOAggo="
1511
+ },
1512
+ {
1513
+ "path": "blueprint.json",
1514
+ "mediaType": "application/json",
1515
+ "sha256": "fa13f1028d9b9d2df8c36f506d0feaa033b0016dd0dc54e797d0bd069da27190",
1516
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7CiAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aCIsCiAgICAibmFtZSI6ICJQcm9jZWR1cmFsIEVhcnRoIgogIH0sCiAgImVudGl0aWVzIjogWwogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1zdXJmYWNlIiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJzcGhlcmUiLAogICAgICAiZGlhbWV0ZXIiOiAyCiAgICB9LAogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1jbG91ZHMiLAogICAgICAia2luZCI6ICJwcmltaXRpdmUiLAogICAgICAicHJpbWl0aXZlIjogInNwaGVyZSIsCiAgICAgICJkaWFtZXRlciI6IDIuMDM1CiAgICB9LAogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1hdG1vc3BoZXJlIiwKICAgICAgImtpbmQiOiAicHJpbWl0aXZlIiwKICAgICAgInByaW1pdGl2ZSI6ICJzcGhlcmUiLAogICAgICAiZGlhbWV0ZXIiOiAyLjExCiAgICB9CiAgXSwKICAibWF0ZXJpYWxzIjogWwogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1wbGFuZXQtbWF0ZXJpYWwiLAogICAgICAiY3JlYXRpb24iOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJmYW1pbHkiOiAicGJyIgogICAgICB9LAogICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICJyIjogMC41NSwKICAgICAgICAiZyI6IDAuNjUsCiAgICAgICAgImIiOiAwLjg1CiAgICAgIH0sCiAgICAgICJtZXRhbGxpYyI6IDAuMDQsCiAgICAgICJyb3VnaG5lc3MiOiAwLjcsCiAgICAgICJlbWlzc2l2ZUNvbG9yIjogewogICAgICAgICJyIjogMSwKICAgICAgICAiZyI6IDAuNTgsCiAgICAgICAgImIiOiAwLjEyCiAgICAgIH0sCiAgICAgICJlbWlzc2l2ZUludGVuc2l0eSI6IDAuNzIsCiAgICAgICJnZW5lcmF0ZWRUZXh0dXJlcyI6IHsKICAgICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICAgInNjaGVtYSI6ICJza2Vub3JhLnRleHR1cmUucHJvZ3JhbSIsCiAgICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgICAia2luZCI6ICJwbGFuZXQtYWxiZWRvIiwKICAgICAgICAgICJ3aWR0aCI6IDI1NiwKICAgICAgICAgICJoZWlnaHQiOiAxMjgsCiAgICAgICAgICAiZm9ybWF0IjogInJnYmE4dW5vcm0iLAogICAgICAgICAgImNvbG9yU3BhY2UiOiAic3JnYiIsCiAgICAgICAgICAibGlmZWN5Y2xlIjogInN0YXRpYyIsCiAgICAgICAgICAic2VlZCI6IDI0MDUxOTY5LAogICAgICAgICAgInNjYWxlIjogNC4yLAogICAgICAgICAgIm9jdGF2ZXMiOiA1CiAgICAgICAgfSwKICAgICAgICAiZW1pc3NpdmUiOiB7CiAgICAgICAgICAic2NoZW1hIjogInNrZW5vcmEudGV4dHVyZS5wcm9ncmFtIiwKICAgICAgICAgICJ2ZXJzaW9uIjogMSwKICAgICAgICAgICJraW5kIjogInBsYW5ldC1uaWdodCIsCiAgICAgICAgICAid2lkdGgiOiAyNTYsCiAgICAgICAgICAiaGVpZ2h0IjogMTI4LAogICAgICAgICAgImZvcm1hdCI6ICJyZ2JhOHVub3JtIiwKICAgICAgICAgICJjb2xvclNwYWNlIjogInNyZ2IiLAogICAgICAgICAgImxpZmVjeWNsZSI6ICJzdGF0aWMiLAogICAgICAgICAgInNlZWQiOiAyNDA1MTk4NiwKICAgICAgICAgICJzY2FsZSI6IDQuMiwKICAgICAgICAgICJvY3RhdmVzIjogNAogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImlkIjogInByb2NlZHVyYWwtZWFydGgtY2xvdWQtbWF0ZXJpYWwiLAogICAgICAiY3JlYXRpb24iOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJmYW1pbHkiOiAicGJyIgogICAgICB9LAogICAgICAiYmFzZUNvbG9yIjogewogICAgICAgICJyIjogMC44OCwKICAgICAgICAiZyI6IDAuOTQsCiAgICAgICAgImIiOiAxCiAgICAgIH0sCiAgICAgICJyb3VnaG5lc3MiOiAwLjkyLAogICAgICAibWV0YWxsaWMiOiAwLAogICAgICAiYWxwaGEiOiAwLjcyLAogICAgICAidHJhbnNwYXJlbmN5TW9kZSI6IDIsCiAgICAgICJkb3VibGVTaWRlZCI6IHRydWUsCiAgICAgICJnZW5lcmF0ZWRUZXh0dXJlcyI6IHsKICAgICAgICAib3BhY2l0eSI6IHsKICAgICAgICAgICJzY2hlbWEiOiAic2tlbm9yYS50ZXh0dXJlLnByb2dyYW0iLAogICAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICAgImtpbmQiOiAicGxhbmV0LWNsb3VkcyIsCiAgICAgICAgICAid2lkdGgiOiAyNTYsCiAgICAgICAgICAiaGVpZ2h0IjogMTI4LAogICAgICAgICAgImZvcm1hdCI6ICJyZ2JhOHVub3JtIiwKICAgICAgICAgICJjb2xvclNwYWNlIjogImxpbmVhciIsCiAgICAgICAgICAibGlmZWN5Y2xlIjogInN0YXRpYyIsCiAgICAgICAgICAic2VlZCI6IDI0MDUyMDAwLAogICAgICAgICAgInNjYWxlIjogNywKICAgICAgICAgICJvY3RhdmVzIjogNQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgImlkIjogInByb2NlZHVyYWwtZWFydGgtYXRtb3NwaGVyZS1tYXRlcmlhbCIsCiAgICAgICJjcmVhdGlvbiI6IHsKICAgICAgICAidmVyc2lvbiI6IDEsCiAgICAgICAgImZhbWlseSI6ICJwYnIiCiAgICAgIH0sCiAgICAgICJiYXNlQ29sb3IiOiB7CiAgICAgICAgInIiOiAwLjAxNSwKICAgICAgICAiZyI6IDAuMDYsCiAgICAgICAgImIiOiAwLjE0CiAgICAgIH0sCiAgICAgICJhbHBoYSI6IDAuMTIsCiAgICAgICJ0cmFuc3BhcmVuY3lNb2RlIjogMiwKICAgICAgInJvdWdobmVzcyI6IDAuOSwKICAgICAgIm1ldGFsbGljIjogMCwKICAgICAgImRvdWJsZVNpZGVkIjogdHJ1ZSwKICAgICAgImVmZmVjdHMiOiB7CiAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICJyaW0iOiB7CiAgICAgICAgICAiY29sb3IiOiB7CiAgICAgICAgICAgICJyIjogMC4wNSwKICAgICAgICAgICAgImciOiAwLjQyLAogICAgICAgICAgICAiYiI6IDEuNgogICAgICAgICAgfSwKICAgICAgICAgICJpbnRlbnNpdHkiOiAzLjIsCiAgICAgICAgICAicG93ZXIiOiAyLjQKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLAogICJtYXRlcmlhbEJpbmRpbmdzIjogWwogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1zdXJmYWNlLWJpbmRpbmciLAogICAgICAibWF0ZXJpYWxJZCI6ICJwcm9jZWR1cmFsLWVhcnRoLXBsYW5ldC1tYXRlcmlhbCIsCiAgICAgICJlbnRpdHlJZCI6ICJwcm9jZWR1cmFsLWVhcnRoLXN1cmZhY2UiCiAgICB9LAogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1jbG91ZC1iaW5kaW5nIiwKICAgICAgIm1hdGVyaWFsSWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1jbG91ZC1tYXRlcmlhbCIsCiAgICAgICJlbnRpdHlJZCI6ICJwcm9jZWR1cmFsLWVhcnRoLWNsb3VkcyIKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJwcm9jZWR1cmFsLWVhcnRoLWF0bW9zcGhlcmUtYmluZGluZyIsCiAgICAgICJtYXRlcmlhbElkIjogInByb2NlZHVyYWwtZWFydGgtYXRtb3NwaGVyZS1tYXRlcmlhbCIsCiAgICAgICJlbnRpdHlJZCI6ICJwcm9jZWR1cmFsLWVhcnRoLWF0bW9zcGhlcmUiCiAgICB9CiAgXSwKICAiY2FtZXJhIjogewogICAgIm1vZGUiOiAib3JiaXQiLAogICAgInBvc2l0aW9uIjogewogICAgICAieCI6IDIuOCwKICAgICAgInkiOiAxLjM1LAogICAgICAieiI6IC00LjIKICAgIH0sCiAgICAidGFyZ2V0IjogewogICAgICAieCI6IDAsCiAgICAgICJ5IjogMCwKICAgICAgInoiOiAwCiAgICB9CiAgfSwKICAiZW52aXJvbm1lbnQiOiB7CiAgICAiZW5hYmxlZCI6IGZhbHNlLAogICAgImJhY2tncm91bmQiOiB7CiAgICAgICJtb2RlIjogImNvbG9yIiwKICAgICAgImNvbG9yIjogIiMwMTA0MGIiCiAgICB9CiAgfSwKICAibGlnaHRzIjogWwogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1zdW4iLAogICAgICAidHlwZSI6ICJkaXJlY3Rpb25hbCIsCiAgICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICAgImludGVuc2l0eSI6IDMuMiwKICAgICAgImNvbG9yIjogewogICAgICAgICJyIjogMSwKICAgICAgICAiZyI6IDAuOSwKICAgICAgICAiYiI6IDAuNzIKICAgICAgfSwKICAgICAgInJvdGF0aW9uIjogewogICAgICAgICJ4IjogLTAuNDUsCiAgICAgICAgInkiOiAtMC44LAogICAgICAgICJ6IjogMAogICAgICB9CiAgICB9LAogICAgewogICAgICAiaWQiOiAicHJvY2VkdXJhbC1lYXJ0aC1zcGFjZS1maWxsIiwKICAgICAgInR5cGUiOiAiaGVtaXNwaGVyaWMiLAogICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICJpbnRlbnNpdHkiOiAwLjEyLAogICAgICAiY29sb3IiOiB7CiAgICAgICAgInIiOiAwLjE1LAogICAgICAgICJnIjogMC4yNSwKICAgICAgICAiYiI6IDAuNTUKICAgICAgfSwKICAgICAgInJvdGF0aW9uIjogewogICAgICAgICJ4IjogLTEuNTcwNzk2MzI2Nzk0ODk2NiwKICAgICAgICAieSI6IDAsCiAgICAgICAgInoiOiAwCiAgICAgIH0KICAgIH0KICBdLAogICJwb3N0UHJvY2VzcyI6IHsKICAgICJlbmFibGVkIjogdHJ1ZSwKICAgICJhbnRpYWxpYXNpbmciOiAiZnhhYSIsCiAgICAidG9uZU1hcHBpbmdFbmFibGVkIjogdHJ1ZSwKICAgICJ0b25lTWFwcGluZ1R5cGUiOiAiYWNlcyIsCiAgICAiZXhwb3N1cmUiOiAxLjE1LAogICAgImdsb3ciOiB0cnVlLAogICAgImJsb29tIjogZmFsc2UsCiAgICAiZGVwdGhPZkZpZWxkIjogZmFsc2UsCiAgICAic3NhbyI6IHsKICAgICAgImVuYWJsZWQiOiBmYWxzZQogICAgfQogIH0KfQo="
1517
+ },
1518
+ {
1519
+ "path": "recipe.json",
1520
+ "mediaType": "application/json",
1521
+ "sha256": "fc86f0d41aa83cc004fbd7c2809b71ee9ca851e774d1d8f44ad6c3f1d5741534",
1522
+ "contentBase64": "ewogICJpZCI6ICJwcm9jZWR1cmFsLWVhcnRoLXYxIiwKICAib3B0aW9ucyI6IHsKICAgICJpZCI6ICJwcm9jZWR1cmFsLWVhcnRoIiwKICAgICJyYWRpdXMiOiAxLAogICAgInNlZWQiOiAyNDA1MTk2OSwKICAgICJ0ZXh0dXJlU2l6ZSI6IDEyOCwKICAgICJjbG91ZE9wYWNpdHkiOiAwLjcyCiAgfQp9Cg=="
1523
+ }
1524
+ ]
1525
+ },
1526
+ {
1527
+ "manifest": {
1528
+ "schema": "skenora.example-manifest",
1529
+ "schemaVersion": 1,
1530
+ "id": "radiance-cascades",
1531
+ "title": "Radiance Cascades",
1532
+ "description": "A bounded WebGPU 2D global-illumination field combining jump-flood feature propagation and multi-scale radiance integration.",
1533
+ "tags": [
1534
+ "compute",
1535
+ "global-illumination",
1536
+ "jump-flood",
1537
+ "radiance",
1538
+ "webgpu"
1539
+ ],
1540
+ "mode": "renderer-lab",
1541
+ "tier": "advanced-simulation",
1542
+ "requiredCapabilities": [
1543
+ {
1544
+ "id": "skenora.simulation.program",
1545
+ "version": "1",
1546
+ "reason": "Owns bounded JFA propagation, cascade integration and GPU-resident presentation."
1547
+ }
1548
+ ],
1549
+ "optionalCapabilities": [],
1550
+ "assets": [],
1551
+ "controls": {
1552
+ "type": "object",
1553
+ "description": "Bounded trusted 2D lighting parameters.",
1554
+ "additionalProperties": false,
1555
+ "properties": {
1556
+ "cascadeCount": {
1557
+ "type": "number",
1558
+ "description": "Multi-scale radiance integration levels",
1559
+ "minimum": 2,
1560
+ "maximum": 8,
1561
+ "default": 6,
1562
+ "update": "rebuild"
1563
+ },
1564
+ "emitterCount": {
1565
+ "type": "number",
1566
+ "description": "Animated emitter count",
1567
+ "minimum": 1,
1568
+ "maximum": 8,
1569
+ "default": 5,
1570
+ "update": "rebuild"
1571
+ }
1572
+ }
1573
+ },
1574
+ "evidence": [
1575
+ {
1576
+ "kind": "parse",
1577
+ "required": true,
1578
+ "status": "passed",
1579
+ "note": "Radiance kernel fields and counts parse."
1580
+ },
1581
+ {
1582
+ "kind": "compile",
1583
+ "required": true,
1584
+ "status": "passed",
1585
+ "note": "Seed, descending JFA, cascade and resolve passes are deterministic."
1586
+ },
1587
+ {
1588
+ "kind": "capability",
1589
+ "required": true,
1590
+ "status": "passed",
1591
+ "note": "Grid, emitter, occluder, cascade and pass budgets reject."
1592
+ },
1593
+ {
1594
+ "kind": "preparation",
1595
+ "required": true,
1596
+ "status": "passed",
1597
+ "note": "Physical WebGPU radiance and presentation pipeline preparation."
1598
+ },
1599
+ {
1600
+ "kind": "runtime",
1601
+ "required": true,
1602
+ "status": "passed",
1603
+ "note": "Stable ping-pong, fixed step, reset, resize and disposal."
1604
+ },
1605
+ {
1606
+ "kind": "pixels",
1607
+ "required": true,
1608
+ "status": "passed",
1609
+ "note": "Emitters and propagated radiance create non-background pixels."
1610
+ },
1611
+ {
1612
+ "kind": "visual",
1613
+ "required": true,
1614
+ "status": "passed",
1615
+ "note": "Human review of emitter, occluder and multi-scale light field."
1616
+ },
1617
+ {
1618
+ "kind": "performance",
1619
+ "required": true,
1620
+ "status": "passed",
1621
+ "note": "16 bounded passes, two persistent buffers and zero steady-state readback."
1622
+ },
1623
+ {
1624
+ "kind": "package-consumption",
1625
+ "required": true,
1626
+ "status": "passed",
1627
+ "note": "Advanced program and optional renderer subpath from tarballs."
1628
+ },
1629
+ {
1630
+ "kind": "cross-device",
1631
+ "required": true,
1632
+ "status": "passed",
1633
+ "note": "Physical WebGPU plus explicit unsupported degradation."
1634
+ }
1635
+ ],
1636
+ "fallback": {
1637
+ "strategy": "substitute-example",
1638
+ "description": "Use Neon LED for bounded emissive presentation when WebGPU is unavailable; 2D GI is not claimed.",
1639
+ "exampleId": "neon-led"
1640
+ },
1641
+ "files": [
1642
+ {
1643
+ "path": "README.md",
1644
+ "role": "readme",
1645
+ "mediaType": "text/markdown",
1646
+ "bytes": 546,
1647
+ "sha256": "d4119857afa766d35b543d0d68fa20da314d4dcbc644714e3e30e48f70540174"
1648
+ },
1649
+ {
1650
+ "path": "simulation.json",
1651
+ "role": "source",
1652
+ "mediaType": "application/json",
1653
+ "bytes": 711,
1654
+ "sha256": "e24da349ce2499a10fbd70a42a821d687bce4408f152c232c337589d2555538c"
1655
+ }
1656
+ ],
1657
+ "license": {
1658
+ "spdx": "MIT",
1659
+ "attribution": "Skenora implementation inspired by the MIT-licensed vGPU Radiance Cascades example.",
1660
+ "source": "https://vgpu.sh/examples/radiance-cascades"
1661
+ },
1662
+ "aggregateSha256": "c716f9a3019d488997c7fa7ed34879445c432c32b8b4eb5ee9f587ab4e6115f7"
1663
+ },
1664
+ "sources": [
1665
+ {
1666
+ "path": "README.md",
1667
+ "mediaType": "text/markdown",
1668
+ "sha256": "d4119857afa766d35b543d0d68fa20da314d4dcbc644714e3e30e48f70540174",
1669
+ "contentBase64": "IyBSYWRpYW5jZSBDYXNjYWRlcwoK6L+Z5LiqIGByZW5kZXJlci1sYWJgIOeUqOWFrOW8gOeahCBgU2ltdWxhdGlvblByb2dyYW0gVjFgIOWxleW8gOWMheWGheWPr+S/oeeahCAyRCDlhajlsYDlhYnnhafnrqHnur/vvJrliqjmgIHlm77lhYPnp43lrZDjgIE4IOS4qiBKdW1wIEZsb29kIEFsZ29yaXRobe+8iOi3s+i3g+a0quazm+eul+azle+8jOeUqOmAkOe6p+e8qeefreeahOi3s+i3neS8oOaSreacgOi/keeJueW+ge+8iXBhc3PjgIE2IOWxgiByYWRpYW5jZSBjYXNjYWRlIOWSjOacgOe7iOiJsuiwg+aYoOWwhOOAgue7k+aenOWni+e7iOWcqOS4pOWdlyBHUFUgc3RvcmFnZSBidWZmZXIg6Ze05Lqk5o2i77yM5bm255u05o6l5ZGI546w5YiwIFdlYkdQVSBDYW52YXPjgIIKCuWPkeWFieS9k+WSjOmBruaMoeS9k+aVsOmHj+OAgee9keagvOOAgWNhc2NhZGUg5pWw5LiO5q+P5q2lIHBhc3Mg5pWw6YO95pyJ5LiK6ZmQ77yb56S65L6L5LiN5o6l5Y+X6Ieq5a6a5LmJIFdHU0zvvIzkuZ/kuI3lrqPnp7AgU2NlbmVEb2N1bWVudCDlt7LmlK/mjIEgMkQgR0njgIIK"
1670
+ },
1671
+ {
1672
+ "path": "simulation.json",
1673
+ "mediaType": "application/json",
1674
+ "sha256": "e24da349ce2499a10fbd70a42a821d687bce4408f152c232c337589d2555538c",
1675
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zaW11bGF0aW9uLXByb2dyYW0iLAogICJ2ZXJzaW9uIjogMSwKICAia2VybmVsIjogInJhZGlhbmNlLWNhc2NhZGVzIiwKICAiZ3JpZCI6IHsKICAgICJ3aWR0aCI6IDEyOCwKICAgICJoZWlnaHQiOiAxMjgKICB9LAogICJmaXhlZFN0ZXAiOiB7CiAgICAibWlsbGlzZWNvbmRzIjogMzMuMzMzMywKICAgICJtYXhTdWJzdGVwcyI6IDIKICB9LAogICJkaXNwYXRjaCI6IHsKICAgICJ3b3JrZ3JvdXBTaXplIjogOAogIH0sCiAgInJlc291cmNlcyI6IFsKICAgIHsKICAgICAgImlkIjogInJhZGlhbmNlLWZpZWxkLWEiLAogICAgICAia2luZCI6ICJzdG9yYWdlLWJ1ZmZlciIsCiAgICAgICJmb3JtYXQiOiAidmVjNGYiLAogICAgICAiZWxlbWVudHMiOiAiZ3JpZCIsCiAgICAgICJwaW5nUG9uZyI6IHRydWUKICAgIH0sCiAgICB7CiAgICAgICJpZCI6ICJyYWRpYW5jZS1maWVsZC1iIiwKICAgICAgImtpbmQiOiAic3RvcmFnZS1idWZmZXIiLAogICAgICAiZm9ybWF0IjogInZlYzRmIiwKICAgICAgImVsZW1lbnRzIjogImdyaWQiLAogICAgICAicGluZ1BvbmciOiB0cnVlCiAgICB9CiAgXSwKICAicGFyYW1ldGVycyI6IHsKICAgICJraW5kIjogInJhZGlhbmNlLWNhc2NhZGVzIiwKICAgICJjYXNjYWRlQ291bnQiOiA2LAogICAgImVtaXR0ZXJDb3VudCI6IDUsCiAgICAib2NjbHVkZXJDb3VudCI6IDMKICB9Cn0K"
1676
+ }
1677
+ ]
1678
+ },
1679
+ {
1680
+ "manifest": {
1681
+ "schema": "skenora.example-manifest",
1682
+ "schemaVersion": 1,
1683
+ "id": "shared-pbr",
1684
+ "title": "Shared PBR",
1685
+ "description": "A minimal persistent Blueprint with one shared owned PBR material and two primitive bindings.",
1686
+ "tags": [
1687
+ "baseline",
1688
+ "blueprint",
1689
+ "pbr"
1690
+ ],
1691
+ "mode": "blueprint",
1692
+ "tier": "foundation",
1693
+ "requiredCapabilities": [
1694
+ {
1695
+ "id": "skenora.entity.primitive",
1696
+ "version": "1",
1697
+ "reason": "Creates the sphere and box."
1698
+ },
1699
+ {
1700
+ "id": "skenora.material.pbr",
1701
+ "version": "1",
1702
+ "reason": "Creates the shared owned surface."
1703
+ }
1704
+ ],
1705
+ "optionalCapabilities": [],
1706
+ "assets": [],
1707
+ "controls": {
1708
+ "type": "object",
1709
+ "description": "This baseline has no example-specific controls.",
1710
+ "properties": {},
1711
+ "additionalProperties": false
1712
+ },
1713
+ "evidence": [
1714
+ {
1715
+ "kind": "parse",
1716
+ "required": true,
1717
+ "status": "passed",
1718
+ "note": "Pure manifest and Blueprint parse."
1719
+ },
1720
+ {
1721
+ "kind": "compile",
1722
+ "required": true,
1723
+ "status": "passed",
1724
+ "note": "Pure Scene Plan compilation."
1725
+ },
1726
+ {
1727
+ "kind": "capability",
1728
+ "required": true,
1729
+ "status": "passed",
1730
+ "note": "Allow, deny and unknown capability cases."
1731
+ },
1732
+ {
1733
+ "kind": "preparation",
1734
+ "required": true,
1735
+ "status": "passed",
1736
+ "note": "Runtime material preparation."
1737
+ },
1738
+ {
1739
+ "kind": "runtime",
1740
+ "required": true,
1741
+ "status": "passed",
1742
+ "note": "Public Renderer load and disposal."
1743
+ },
1744
+ {
1745
+ "kind": "pixels",
1746
+ "required": true,
1747
+ "status": "passed",
1748
+ "note": "Framebuffer contains rendered geometry."
1749
+ },
1750
+ {
1751
+ "kind": "visual",
1752
+ "required": true,
1753
+ "status": "passed",
1754
+ "note": "Human composition review."
1755
+ },
1756
+ {
1757
+ "kind": "performance",
1758
+ "required": true,
1759
+ "status": "passed",
1760
+ "note": "Bounded baseline frame evidence."
1761
+ },
1762
+ {
1763
+ "kind": "package-consumption",
1764
+ "required": true,
1765
+ "status": "passed",
1766
+ "note": "Development tarball consumer."
1767
+ },
1768
+ {
1769
+ "kind": "cross-device",
1770
+ "required": true,
1771
+ "status": "passed",
1772
+ "note": "Claimed backend matrix."
1773
+ }
1774
+ ],
1775
+ "fallback": {
1776
+ "strategy": "unsupported",
1777
+ "description": "Report missing primitive or owned-PBR support; do not rewrite the example."
1778
+ },
1779
+ "files": [
1780
+ {
1781
+ "path": "README.md",
1782
+ "role": "readme",
1783
+ "mediaType": "text/markdown",
1784
+ "bytes": 403,
1785
+ "sha256": "4995459f08821fe17821a581c6afb4c1da96723b60d387c9cad3ed22f80ed68f"
1786
+ },
1787
+ {
1788
+ "path": "blueprint.json",
1789
+ "role": "blueprint",
1790
+ "mediaType": "application/json",
1791
+ "bytes": 1475,
1792
+ "sha256": "cae28357216e9f1fbd262785504b0991b49ef6b95a0e7d4f638c51182d84945c"
1793
+ }
1794
+ ],
1795
+ "license": {
1796
+ "spdx": "MIT",
1797
+ "attribution": "Skenora contributors."
1798
+ },
1799
+ "aggregateSha256": "a3ce8c961bdab293e249038e81b826604ff3dbc6aa226f1ecdb5002a91eeb750"
1800
+ },
1801
+ "sources": [
1802
+ {
1803
+ "path": "README.md",
1804
+ "mediaType": "text/markdown",
1805
+ "sha256": "4995459f08821fe17821a581c6afb4c1da96723b60d387c9cad3ed22f80ed68f",
1806
+ "contentBase64": "IyBTaGFyZWQgUEJSCgrmnIDlsI/nmoTmjIHkuYXljJYgYGJsdWVwcmludGAg56S65L6L77ya5LiA5Liq5YWx5Lqr55qE5YWs5YWxIFBCUiDmnZDotKjnu5HlrprliLDnkIPkvZPlkoznq4vmlrnkvZPjgIIKCuWug+eUqOS6jumqjOivgSBHYWxsZXJ5IOeahOino+aekOOAgee8luivkeOAgeaLieWPluOAgeWMhea2iOi0ueS4jua1j+iniOWZqOWKoOi9vemTvui3r++8jOS4jeS+nei1lue9kee7nOaIluWklumDqOi1hOS6p+OAguekuuS+i+S7hemAmui/hyBTa2Vub3JhIOWFrOWFseWlkee6puihqOi+vuWcuuaZr++8m0hvc3TvvIjmnI3liqHlrr/kuLvvvIzljbPlrp7pmYXliJvlu7ogUmVuZGVyZXIg5bm25o+Q5L6b6LWE5rqQ55qE5bqU55So77yJ5LuN6LSf6LSj6YCJ5oup55yf5a6e5omn6KGM5ZCO56uv44CCCg=="
1807
+ },
1808
+ {
1809
+ "path": "blueprint.json",
1810
+ "mediaType": "application/json",
1811
+ "sha256": "cae28357216e9f1fbd262785504b0991b49ef6b95a0e7d4f638c51182d84945c",
1812
+ "contentBase64": "ewogICJzY2hlbWEiOiAic2tlbm9yYS5zY2VuZS5ibHVlcHJpbnQiLAogICJ2ZXJzaW9uIjogMSwKICAic2NlbmUiOiB7ICJpZCI6ICJzaGFyZWQtcGJyIiwgIm5hbWUiOiAiU2hhcmVkIFBCUiIgfSwKICAiZW50aXRpZXMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJzcGhlcmUiLAogICAgICAia2luZCI6ICJwcmltaXRpdmUiLAogICAgICAicHJpbWl0aXZlIjogInNwaGVyZSIsCiAgICAgICJ0cmFuc2Zvcm0iOiB7ICJwb3NpdGlvbiI6IHsgIngiOiAtMC44LCAieSI6IDAuNSwgInoiOiAwIH0gfQogICAgfSwKICAgIHsKICAgICAgImlkIjogImJveCIsCiAgICAgICJraW5kIjogInByaW1pdGl2ZSIsCiAgICAgICJwcmltaXRpdmUiOiAiYm94IiwKICAgICAgInRyYW5zZm9ybSI6IHsgInBvc2l0aW9uIjogeyAieCI6IDAuOCwgInkiOiAwLjUsICJ6IjogMCB9IH0KICAgIH0KICBdLAogICJtYXRlcmlhbHMiOiBbCiAgICB7CiAgICAgICJpZCI6ICJjZXJhbWljIiwKICAgICAgImNyZWF0aW9uIjogeyAidmVyc2lvbiI6IDEsICJmYW1pbHkiOiAicGJyIiwgInNoYXJpbmciOiAic2hhcmVkIiB9LAogICAgICAiYmFzZUNvbG9yIjogeyAiciI6IDAuMDgsICJnIjogMC4zMiwgImIiOiAwLjU1IH0sCiAgICAgICJtZXRhbGxpYyI6IDAsCiAgICAgICJyb3VnaG5lc3MiOiAwLjM1CiAgICB9CiAgXSwKICAibWF0ZXJpYWxCaW5kaW5ncyI6IFsKICAgIHsgImlkIjogInNwaGVyZS1jZXJhbWljIiwgIm1hdGVyaWFsSWQiOiAiY2VyYW1pYyIsICJlbnRpdHlJZCI6ICJzcGhlcmUiIH0sCiAgICB7ICJpZCI6ICJib3gtY2VyYW1pYyIsICJtYXRlcmlhbElkIjogImNlcmFtaWMiLCAiZW50aXR5SWQiOiAiYm94IiB9CiAgXSwKICAiY2FtZXJhIjogewogICAgIm1vZGUiOiAib3JiaXQiLAogICAgInBvc2l0aW9uIjogeyAieCI6IDMsICJ5IjogMi40LCAieiI6IC01IH0sCiAgICAidGFyZ2V0IjogeyAieCI6IDAsICJ5IjogMC41LCAieiI6IDAgfQogIH0sCiAgImVudmlyb25tZW50IjogewogICAgImVuYWJsZWQiOiBmYWxzZSwKICAgICJiYWNrZ3JvdW5kIjogeyAibW9kZSI6ICJjb2xvciIsICJjb2xvciI6ICIjMjAyMTI0IiB9CiAgfSwKICAibGlnaHRzIjogWwogICAgewogICAgICAiaWQiOiAiZmlsbCIsCiAgICAgICJ0eXBlIjogImhlbWlzcGhlcmljIiwKICAgICAgImVuYWJsZWQiOiB0cnVlLAogICAgICAiaW50ZW5zaXR5IjogMSwKICAgICAgImNvbG9yIjogeyAiciI6IDEsICJnIjogMSwgImIiOiAxIH0sCiAgICAgICJyb3RhdGlvbiI6IHsgIngiOiAtMS41NzA3OTYzMjY3OTQ4OTY2LCAieSI6IDAsICJ6IjogMCB9CiAgICB9CiAgXSwKICAicG9zdFByb2Nlc3MiOiB7CiAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAiYW50aWFsaWFzaW5nIjogImZ4YWEiLAogICAgInRvbmVNYXBwaW5nRW5hYmxlZCI6IHRydWUsCiAgICAidG9uZU1hcHBpbmdUeXBlIjogImFjZXMiLAogICAgImV4cG9zdXJlIjogMQogIH0KfQo="
1813
+ }
1814
+ ]
1815
+ }
1816
+ ],
1817
+ "aggregateSha256": "a919b7755f3fafced0eceac175c74a9f59183489d5d877681ee0eb2db4138e77"
1818
+ }