@plasius/gpu-demo-viewer 0.1.4 → 0.1.6
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.
- package/CHANGELOG.md +50 -0
- package/NFR.md +4 -0
- package/README.md +40 -0
- package/docs/adrs/adr-0002-hosted-oidc-package-publication.md +53 -0
- package/docs/adrs/adr-0003-reviewed-model-library.md +13 -0
- package/docs/adrs/adr-0004-model-quality-controls.md +13 -0
- package/docs/adrs/index.md +3 -0
- package/docs/model-inspection-uhd.md +11 -0
- package/docs/model-library-review.md +38 -0
- package/docs/model-review-release.md +11 -0
- package/model-library/acquire.js +54 -0
- package/model-library/catalogue.json +991 -0
- package/model-library/controller.js +45 -0
- package/model-library/index.html +35 -0
- package/model-library/main.js +76 -0
- package/model-library/styles.css +9 -0
- package/model-library/vite.config.js +12 -0
- package/package.json +14 -6
- package/scripts/acquire-model-library.mjs +8 -0
- package/viewer-manifest.js +15 -0
package/CHANGELOG.md
CHANGED
|
@@ -18,6 +18,54 @@ The format is based on Keep a Changelog and this project adheres to SemVer.
|
|
|
18
18
|
- **Security**
|
|
19
19
|
- (placeholder)
|
|
20
20
|
|
|
21
|
+
## [0.1.6] - 2026-10-14
|
|
22
|
+
|
|
23
|
+
- Bind fixed progressive/UHD model review to published renderer and shared inspection APIs; retain experimental adaptive controls in their qualification branch.
|
|
24
|
+
|
|
25
|
+
- Add exact Full HD, QHD and 4K UHD model-review presets, one-sample inspection and aspect-preserving canvas presentation.
|
|
26
|
+
|
|
27
|
+
- Model-library sample target, bounce, resolution and denoising controls with progressive still-camera refinement and completed-sample progress.
|
|
28
|
+
|
|
29
|
+
- **Added**
|
|
30
|
+
- Local model-library review with eleven acquired fixtures, including the manually supplied Medieval house GLB, source credits, integrity manifests, shared camera inspection and explicit visual-defect/deferred states.
|
|
31
|
+
|
|
32
|
+
- **Changed**
|
|
33
|
+
- Refreshed compatible @plasius/* lockfile resolutions to the latest published releases.
|
|
34
|
+
- Routed trusted validation through the organization-owned quarantined
|
|
35
|
+
self-hosted runner group while continuing to reject fork pull-request code.
|
|
36
|
+
- (placeholder)
|
|
37
|
+
|
|
38
|
+
- **Fixed**
|
|
39
|
+
- (placeholder)
|
|
40
|
+
|
|
41
|
+
- **Security**
|
|
42
|
+
- (placeholder)
|
|
43
|
+
|
|
44
|
+
## [0.1.5] - 2026-08-31
|
|
45
|
+
|
|
46
|
+
- **Added**
|
|
47
|
+
- (placeholder)
|
|
48
|
+
|
|
49
|
+
- **Changed**
|
|
50
|
+
- Restored exact-main npm publication on a GitHub-hosted runner through
|
|
51
|
+
short-lived OIDC, with an enforced Node/npm runtime and no long-lived
|
|
52
|
+
write-token fallback.
|
|
53
|
+
- Routed pull-request validation to isolated GitHub-hosted capacity while
|
|
54
|
+
retaining exact-main push validation on fixed self-hosted Linux runners.
|
|
55
|
+
- Refreshed GPU runtime dependencies to the currently published renderer,
|
|
56
|
+
shared-contract, and XR package versions so clean release installs remain
|
|
57
|
+
reproducible.
|
|
58
|
+
- Made cross-repository manifest validation compare against a committed GPU
|
|
59
|
+
demo target inventory in canonical checkouts, worktrees, and hosted CI.
|
|
60
|
+
- (placeholder)
|
|
61
|
+
|
|
62
|
+
- **Fixed**
|
|
63
|
+
- Peeled existing annotated release tags to their target commits before
|
|
64
|
+
exact-main recovery comparisons.
|
|
65
|
+
|
|
66
|
+
- **Security**
|
|
67
|
+
- (placeholder)
|
|
68
|
+
|
|
21
69
|
## [0.1.4] - 2026-08-30
|
|
22
70
|
|
|
23
71
|
- **Added**
|
|
@@ -137,3 +185,5 @@ The format is based on Keep a Changelog and this project adheres to SemVer.
|
|
|
137
185
|
[0.1.2]: https://github.com/Plasius-LTD/gpu-demo-viewer/releases/tag/v0.1.2
|
|
138
186
|
[0.1.3]: https://github.com/Plasius-LTD/gpu-demo-viewer/releases/tag/v0.1.3
|
|
139
187
|
[0.1.4]: https://github.com/Plasius-LTD/gpu-demo-viewer/releases/tag/v0.1.4
|
|
188
|
+
[0.1.5]: https://github.com/Plasius-LTD/gpu-demo-viewer/releases/tag/v0.1.5
|
|
189
|
+
[0.1.6]: https://github.com/Plasius-LTD/gpu-demo-viewer/releases/tag/v0.1.6
|
package/NFR.md
CHANGED
|
@@ -30,3 +30,7 @@ entry surfaces.
|
|
|
30
30
|
- This viewer is intentionally non-user-facing runtime infrastructure.
|
|
31
31
|
- Baseline operations are governed by the parent feature flag:
|
|
32
32
|
`platform.repo-hardening-sweep.enabled`.
|
|
33
|
+
|
|
34
|
+
## Model library review
|
|
35
|
+
|
|
36
|
+
Inherits `gpu-demo.scene-fidelity.enabled` with a localhost-only fixture override. Model changes abort prior work and release its GPU resources. Downloads use trusted reviewed hosts, no redirects, strict byte/hash limits and bounded concurrency. Preserve source licences. Keep missing downloads and renderer defects visible. Keyboard, touch, reduced-motion and 320px layouts must remain usable.
|
package/README.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @plasius/gpu-demo-viewer
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@plasius/gpu-demo-viewer)
|
|
4
|
+
[](https://github.com/Plasius-LTD/gpu-demo-viewer/actions/workflows/ci.yml)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](./CODE_OF_CONDUCT.md)
|
|
7
|
+
[](./SECURITY.md)
|
|
8
|
+
[](./CHANGELOG.md)
|
|
9
|
+
|
|
3
10
|
Static root-level launcher for validating the `gpu-*` package demos from one place.
|
|
4
11
|
|
|
5
12
|
## Purpose
|
|
@@ -126,3 +133,36 @@ npm test
|
|
|
126
133
|
- Delivery workflow: [`WORKFLOW.md`](./WORKFLOW.md)
|
|
127
134
|
- Feature flags and capabilities: [`FLAGS_AND_CAPABILITIES.md`](./FLAGS_AND_CAPABILITIES.md)
|
|
128
135
|
- Architectural decision log: [`docs/adrs/index.md`](./docs/adrs/index.md)
|
|
136
|
+
<!-- BEGIN PLASIUS RELEASE INTEGRITY -->
|
|
137
|
+
## Release integrity
|
|
138
|
+
|
|
139
|
+
Production package publication runs only from `.github/workflows/cd.yml` on
|
|
140
|
+
protected `main`. The job verifies that the prepared commit is still the
|
|
141
|
+
current main commit and has an exact successful `ci.yml` push result before it
|
|
142
|
+
mutates release state. Same-repository pull requests and exact-main pushes use
|
|
143
|
+
the organization-owned `Public CI - Quarantined` runner group with fixed
|
|
144
|
+
self-hosted Linux labels; fork code is not admitted to that trusted runner
|
|
145
|
+
boundary. npm publication runs on
|
|
146
|
+
GitHub-hosted Node.js 24 with
|
|
147
|
+
npm 11.5.1 or newer, uses the protected `production` environment and
|
|
148
|
+
short-lived npm OIDC with provenance, and has no long-lived npm write-token
|
|
149
|
+
fallback. Rollback disables CD; it never rewrites published package history.
|
|
150
|
+
<!-- END PLASIUS RELEASE INTEGRITY -->
|
|
151
|
+
|
|
152
|
+
## Model library review
|
|
153
|
+
|
|
154
|
+
`npm run models:download` installs the ten reviewed, freely licensed Poly Haven and Khronos fixtures from `model-library/catalogue.json`, including all buffer/image dependencies. Downloads are bounded and SHA-256 checked; binaries are ignored by Git and npm. `npm run models:dev` opens the localhost server on port 5291. Visit `http://127.0.0.1:5291/?review=first-twelve`. The Medieval house is a manually supplied eleventh asset; only Gem remains deferred. Source links, creators and licences are available beside each model.
|
|
155
|
+
|
|
156
|
+
For Medieval house, obtain the original GLB from its credited Sketchfab source and place it at `model-library/assets/sf-house/medieval_house.glb`, then run `npm run models:download` to verify its pinned size and SHA-256 and write its credits. This command never downloads manual assets; a missing file produces an explicit placement message. The catalogue stores no private local paths.
|
|
157
|
+
|
|
158
|
+
This page consumes the shared model-inspection package entrypoint. While its upstream release is pending, development testing can set `PLASIUS_SHARED_INSPECTION_SOURCE` to an absolute path to the reviewed sibling `src/model-inspection.js`; this explicit source override is for localhost development only, not a released dependency or production deployment.
|
|
159
|
+
|
|
160
|
+
Mouse/touch/keyboard inspection reuses the material-study camera. The view progressively refines while the camera is still, stopping at the selected sample target. `Home` restores framing and `?` displays a brief gesture reminder. Resizing updates resolution while preserving the camera. Fox is static here; its Survey, Walk and Run clips remain in the original download. Amber currently exposes a visible transmission/volume rendering defect. See `docs/model-library-review.md` for the initial findings; none of these fixtures is implicitly approved for the production showcase.
|
|
161
|
+
|
|
162
|
+
Render-quality controls select 8–256 total samples, 2–12 light bounces, 480/800/1280px render width and denoising. Defaults are 64/6/800/on. The first pass is one sample; idle refinement adds up to four samples per batch. Camera and quality changes restart history. Hidden tabs pause further work; the progress bar reports completed samples and actual dimensions. Settings do not reload the source model.
|
|
163
|
+
|
|
164
|
+
During upstream progressive-renderer development, also set `PLASIUS_RENDERER_SOURCE` to an absolute reviewed `src/index.js` or built `dist/index.js`. Both source overrides are development-only; PRs remain dependency-blocked until approved package CD and final released-version validation. To use another local port: `npm run models:dev -- --port 5292`.
|
|
165
|
+
|
|
166
|
+
The model review includes native 1920 × 1080, 2560 × 1440 and 3840 × 2160 quality presets. These trace the exact selected pixel dimensions independently of viewport size; the canvas contains the image without stretching. A one-sample target supports quick full-resolution checks. See [UHD inspection design](docs/model-inspection-uhd.md).
|
|
167
|
+
|
|
168
|
+
The released model review uses fixed progressive sampling with native UHD sizes and requires renderer0.2.49/shared1.1.7 or newer. Adaptive controls remain in a separate qualification branch. See [release scope](docs/model-review-release.md); the local inspection catalogue explicitly retains unresolved visual findings.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# ADR-0002: Hosted OIDC package publication
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2026-08-09
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
npm trusted publishing accepts GitHub Actions only from GitHub-hosted runners.
|
|
9
|
+
The previous `gpu-demo-viewer` release job selected self-hosted infrastructure and
|
|
10
|
+
required a long-lived npm write token. That prevented the package from using
|
|
11
|
+
its configured trusted-publisher binding and left release availability coupled
|
|
12
|
+
to a reusable credential.
|
|
13
|
+
|
|
14
|
+
The parent rollout control is
|
|
15
|
+
`platform.public-artifact-integrity.enabled`. It governs staged release
|
|
16
|
+
restoration but cannot bypass source, CI, package, or publication integrity
|
|
17
|
+
checks. No product capability is introduced.
|
|
18
|
+
|
|
19
|
+
## Decision
|
|
20
|
+
|
|
21
|
+
Publication is phase-isolated: dependency installation, package validation, SBOM generation, and immutable tarball packing run in `validate_and_pack` without the `production` environment or OIDC permission. The final hosted `publish` job downloads only that sealed artifact, explicitly installs npm 11.6.2, runs no repository dependency code, and publishes the tarball with lifecycle scripts disabled. It re-fetches current `main` immediately before the first release mutation and again immediately before npm publication. `.npmrc` contains no registry-auth placeholder, and release preparation returns the reviewed current `main` HEAD rather than package-file history.
|
|
22
|
+
|
|
23
|
+
The final npm publication job in `.github/workflows/cd.yml`:
|
|
24
|
+
|
|
25
|
+
1. runs on the literal `ubuntu-latest` GitHub-hosted runner;
|
|
26
|
+
2. remains bound to protected `main` and the GitHub `production`
|
|
27
|
+
environment;
|
|
28
|
+
3. verifies that the prepared commit still equals remote `main` and that an
|
|
29
|
+
exact-SHA `ci.yml` push run completed successfully;
|
|
30
|
+
4. verifies Node.js 24 and npm 11.5.1 or newer before publication;
|
|
31
|
+
5. receives least-privilege `id-token: write` and publishes only through npm
|
|
32
|
+
OIDC with provenance; and
|
|
33
|
+
6. has no `NPM_TOKEN`, `NODE_AUTH_TOKEN`, or long-lived write-token
|
|
34
|
+
fallback.
|
|
35
|
+
|
|
36
|
+
The external npm trusted publisher is bound exactly to organization
|
|
37
|
+
`Plasius-LTD`, repository `gpu-demo-viewer`, workflow `cd.yml`, environment
|
|
38
|
+
`production`, and action `npm publish`.
|
|
39
|
+
|
|
40
|
+
## Consequences
|
|
41
|
+
|
|
42
|
+
- A moved main branch, absent exact-SHA CI result, unsupported runtime, missing
|
|
43
|
+
trusted-publisher binding, or OIDC failure stops publication before npm
|
|
44
|
+
mutation.
|
|
45
|
+
- Same-repository pull-request and exact-main push validation use the
|
|
46
|
+
organization-owned `Public CI - Quarantined` runner group with fixed
|
|
47
|
+
self-hosted Linux labels and no caller-controlled runner selection. Fork code
|
|
48
|
+
is rejected before that boundary. The narrow npm publication boundary remains
|
|
49
|
+
hosted.
|
|
50
|
+
- Releases use short-lived workflow identity and retain npm provenance without
|
|
51
|
+
a reusable write credential.
|
|
52
|
+
- Rollback disables `cd.yml` or the release-integrity flag. Published package
|
|
53
|
+
history, tags, and registry versions are never rewritten or deleted.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# ADR 0003: Reviewed model library
|
|
2
|
+
|
|
3
|
+
Status: Accepted for local inspection.
|
|
4
|
+
|
|
5
|
+
The viewer acquires the exact first-twelve shortlist with pinned provenance, file sizes and SHA-256 hashes. Eleven are available: ten automatic downloads and the user-supplied Medieval house GLB. Gem remains deferred. Asset binaries remain outside Git and npm. `models:download` retrieves only the reviewed Poly Haven and pinned Khronos URLs, with two workers, sixty-second requests, no redirects and a 200 MiB aggregate budget. Existing files must match the manifest. Credits travel with each installed model.
|
|
6
|
+
|
|
7
|
+
Manual files have `acquisition: "manual"` and no download URL in the file record. Acquisition verifies their installed bytes and checksum exactly as it does automatic downloads; a missing manual file produces an actionable local destination message without a network request. User download paths are never stored in the catalogue. This supports supplied files without expanding the approved remote-source allowlist or attempting authenticated downloads.
|
|
8
|
+
|
|
9
|
+
Rendering, glTF decoding, material projection and input gestures belong to the shared `model-inspection` package entry. The viewer owns selection, cancellation, readable errors, credits and review observations. It does not replace missing assets or apply the chest-specific ageing system indiscriminately. Only one model is active. Resize remounts a bounded render target; hidden/missing assets have explicit states.
|
|
10
|
+
|
|
11
|
+
The parent control is `gpu-demo.scene-fidelity.enabled`. This validation surface uses the explicit localhost-only `?review=first-twelve` override. It adds no production route or entitlement. Product integration must use the remote flag and existing route capabilities. Rollback: omit the query override, stop the local server, or revert the viewer entry.
|
|
12
|
+
|
|
13
|
+
Tests cover acquisition rejection/integrity, rapid selection races, cleanup, missing assets, source credits, static-animation caveats and disabled state. Browser screenshots and review notes distinguish files loaded from visual fidelity achieved.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# ADR 0004: Model-library quality controls
|
|
2
|
+
|
|
3
|
+
Accepted for implementation, 2026-10-14. Parent Feature Plasius-LTD/plasius-ltd-site#1170, Story #2303, viewer Task #58. Inherited flag `gpu-demo.scene-fidelity.enabled`; the existing localhost review override remains the only exposure in this delivery.
|
|
4
|
+
|
|
5
|
+
The viewer supplies semantic native controls for sample target, bounce depth, render width and denoising. gpu-shared owns camera/renderer lifecycle and idle scheduling; gpu-renderer accumulates linear samples before presentation. No duplicate rendering implementation lives here. The sample counter reflects GPU-completed work and the progress element has an accessible label. Controls reflow at 320px and inherit native keyboard/touch behavior. Quality changes retain the current camera and model; document visibility pauses refinement.
|
|
6
|
+
|
|
7
|
+
Default: 64 samples, six bounces, 800px width and denoising. Width options 480/800/1280 preserve the visible canvas aspect ratio within the shared 1440px dimension bound. GPU work stops at the selected target. Source credits, deferred assets and known defects remain visible.
|
|
8
|
+
|
|
9
|
+
`PLASIUS_RENDERER_SOURCE` permits an explicit absolute development entrypoint alongside the shared source override, only on the localhost development server. Published dependencies must replace both overrides after approved upstream CD. No production route or capability is added. Rollback removes the review query/overrides or disables the inherited remote flag in public hosts.
|
|
10
|
+
|
|
11
|
+
## UHD extension (2026-10-14)
|
|
12
|
+
|
|
13
|
+
Add exact HD/QHD/UHD presets alongside viewport-shaped widths. Fixed presets do not change on viewport resize. Use contained presentation to avoid stretching and retain exact traced dimensions in the progress label. Shared admission caps the total at UHD pixels. See [design](../model-inspection-uhd.md).
|
package/docs/adrs/index.md
CHANGED
|
@@ -3,3 +3,6 @@
|
|
|
3
3
|
## Scene and Governance ADRs
|
|
4
4
|
|
|
5
5
|
- [ADR 0001: Define static viewer governance baseline and build checks](./adr-0001-gpu-demo-viewer-governance-baseline.md)
|
|
6
|
+
- [ADR-0002: Hosted OIDC Package Publication](./adr-0002-hosted-oidc-package-publication.md)
|
|
7
|
+
|
|
8
|
+
- [ADR 0003: Reviewed model library](adr-0003-reviewed-model-library.md)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Model inspection at UHD resolution
|
|
2
|
+
|
|
3
|
+
Parent Feature: Plasius-LTD/plasius-ltd-site#1170; Story #2303; shared Task #143; viewer Task #58. Inherited flag `gpu-demo.scene-fidelity.enabled`; explicit localhost review override only.
|
|
4
|
+
|
|
5
|
+
Add exact 1920×1080, 2560×1440 and 3840×2160 render targets alongside existing viewport-shaped quick sizes. UHD is actual traced pixels, independent of browser DPR or CSS size. Preserve aspect using contained canvas presentation. Shared quality admission accepts dimensions up to 3840 with a total cap of 3840×2160 pixels. Reject oversized inputs before resource allocation; do not silently downscale. Existing renderer adapter/storage admission remains authoritative. At UHD, progressive float32 history is 132,710,400 bytes plus a 16-byte count uniform, below the default 128 MiB binding limit; other textures and scene resources are additional.
|
|
6
|
+
|
|
7
|
+
Preserve single-flight scheduling, camera state, visible GPU errors, cancellation and cleanup. Expose a one-sample option for expensive full-resolution inspection. Test native dimensions, viewport independence of fixed presets, aspect-preserving display, pixel-budget admission and reset/cleanup. Validate a real 4K frame and changed-source LCOV before delivery.
|
|
8
|
+
|
|
9
|
+
Adaptive per-pixel integration depends on renderer Task #173 (canonical configuration/statistics API), shared Task #118 (forwarding contract) and the experimental runtime in renderer PR #216. The current native adaptive runner is a diagnostic harness that intercepts GPU resource creation; the public compute renderer has no adaptive option. Do not import this test harness into the showcase, label uniform batches as per-pixel adaptive sampling, or enable the default-off `renderer.sampling.adaptivePerPixel.enabled` flag. Qualification and API integration remain open in the adaptive workstream; this resolution change is independent. Existing fixed SPP progressive rendering remains the available mode.
|
|
10
|
+
|
|
11
|
+
Validation: requirements-first tests failed on the old size bounds/preset parsing and on redundant history resets. The corrected runtime preserves completed history when identical settings are reapplied (including fixed-preset viewport changes). Physical browser validation completed one and eight samples at actual canvas size 3840×2160, six bounces, denoising on; 320px layout retained native dimensions with no horizontal overflow. This is output/interaction validation, not a 60 Hz or image-quality qualification. No production rollout or upstream package release is claimed.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# First model review — 13 October 2026
|
|
2
|
+
|
|
3
|
+
Eleven original assets are installed with 56 verified files (70,599,653 bytes, about 67.3 MiB). The first-twelve shortlist remains intact; the user supplied Medieval house after the initial ten-model review. Only Gem remains deferred. Files and credits remain in `model-library/assets/`; `catalogue.json` records their source URLs, exact sizes and SHA-256 checksums. Source files have not been altered.
|
|
4
|
+
|
|
5
|
+
The initial review used the Plasius wavefront renderer at eight samples per pixel and six bounces, with shared glTF import and camera gestures. Geometry is uniformly normalized to the inspection frame. It has no model-specific ageing or environment staging. “Rendered” is not a visual-fidelity approval.
|
|
6
|
+
|
|
7
|
+
| Model | Rendered triangles | Result / next improvement |
|
|
8
|
+
|---|---:|---|
|
|
9
|
+
| Large Castle Door | 12,640 | Geometry and weathered textures render. Improve separation of iron and wood under varied lighting. |
|
|
10
|
+
| Medieval house | 83,046 | User-supplied original GLB renders with six mesh primitives and five materials. Roof, timber and stone textures are present; dark recesses and sampling noise need a lighting pass. Attribution to Vanuartw and CC BY 4.0 are retained. |
|
|
11
|
+
| Fern 02 | 6,232 | Four clumps render. Source materials are opaque; this fixture alone does not prove alpha-mask support. Inspect backlighting and small-leaf shading. |
|
|
12
|
+
| Quiver Tree 01 | 150,124 | Trunk and foliage render; the heaviest geometry in this pass. Review LOD selection, fine-leaf shading and responsiveness. |
|
|
13
|
+
| Rock Moss Set 01 | 63,127 | Six rock primitives render. Need per-rock framing and ground-contact lighting for presentation. |
|
|
14
|
+
| Garden Gloves 01 | 6,822 | Fabric/rubber colour and detail render. No fibre groom is authored; region masks and cloth shading need a later pass. |
|
|
15
|
+
| Wooden Crate 02 | 5,176 | Wood and rope detail render. The original chest’s wear/fray masks are deliberately not applied to a different mesh. |
|
|
16
|
+
| Bronze Whale Statue | 3,816 | Geometry and patina render, but metal reads too flat under this lighting. Needs reference comparisons and better reflected surroundings. |
|
|
17
|
+
| Antique Ceramic Vase 01 | 9,408 | Pattern and silhouette render; glaze appearance and visible sampling noise need improvement. |
|
|
18
|
+
| Mosquito In Amber | 14,349 | **Visual defect:** almost-black surface and horizontal bands. Investigate transmission, volume scaling and the renderer path before public use. |
|
|
19
|
+
| Fox | 576 | Static textured mesh renders. Survey, Walk and Run clips are retained but not played by this importer. |
|
|
20
|
+
|
|
21
|
+
## Priorities exposed
|
|
22
|
+
|
|
23
|
+
1. Amber transmission/volume correctness and banding. Use this unchanged fixture as a regression case; do not replace its material to hide the defect.
|
|
24
|
+
2. Cleaner sampling and controlled environment/reflection lighting. Noise and low material contrast are visible across several models.
|
|
25
|
+
3. Skinning and source-animation playback for Fox; bone transforms must be verified before motion can be claimed.
|
|
26
|
+
4. Per-object framing for sets, grounded presentation and model-specific ageing/fibre masks.
|
|
27
|
+
|
|
28
|
+
## Validation and limits
|
|
29
|
+
|
|
30
|
+
All eleven were selected and visually inspected in the local browser. Desktop, 320px reflow, visible load/deferred states and keyboard inspection are checked. Shared camera unit coverage exercises mouse and multitouch handling; physical touchscreen hardware and screen-reader speech were not tested. This is not a WCAG or visual-quality certification. Browser captures are retained with the local review output.
|
|
31
|
+
|
|
32
|
+
Local validation passed: 33 viewer tests, 100% changed-source line coverage (97.7% overall measured branches), lint/type checks, build, package checks and a dependency audit with zero reported vulnerabilities. The shared runtime passed 177 tests; its two added source modules have 100% line coverage. The package dry run excludes downloaded asset binaries. Keyboard orbit, approach and Home reset were visually checked; the final browser error log was empty.
|
|
33
|
+
|
|
34
|
+
No production route or entitlement was changed. The shared-package release and consumer final dependency pin remain blocked while the organisational runners are offline. The consumer PR must stay draft until the upstream package is published, its dependency is updated and the published runtime is revalidated. See ADR 0003 for the local-only rollout and rollback controls.
|
|
35
|
+
|
|
36
|
+
## Progressive quality review (2026-10-14)
|
|
37
|
+
|
|
38
|
+
The preview now defaults to a 64-sample target, six bounces, 800px width and denoising. Quality controls adjust all four, retain the camera and restart accumulation. It refines unfiltered linear radiance in bounded GPU batches while still and pauses when hidden. Existing model findings above describe the initial eight-sample review; higher sampling does not resolve importer, material or animation defects automatically. Upstream renderer/shared releases and final package-pin validation are still required before publication.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Fixed progressive model review release
|
|
2
|
+
|
|
3
|
+
Task #58 / Story Plasius-LTD/plasius-ltd-site#2303 / Feature #1170. Release the existing reviewed acquisition catalogue, static-model inspection journey and fixed quality controls (samples, bounces, denoising, native UHD). Use published renderer0.2.49 and shared1.1.7; no local source aliases are part of the package dependency contract.
|
|
4
|
+
|
|
5
|
+
The localhost `?review=first-twelve` opt-in remains limited to local development. The website uses its separate server-side rollout and capability projection; the local viewer is not a production access-control mechanism. Adaptive controls from draftPR59 remain unreleased pending renderer qualification. This staged release does not close those open requirements.
|
|
6
|
+
|
|
7
|
+
The catalogue retains eleven acquired assets and one deferred Gem with exact source/licence/hash records; binaries remain acquired separately and are excluded from npm. Known visual findings remain visible, including amber transport banding and static-only Fox. Do not label the local review catalogue a visual approval. Validate tests/coverage, changed-source LCOV, syntax/build/package integrity, exact-head CI and approved main/production CD before publication.
|
|
8
|
+
|
|
9
|
+
## Acquisition review
|
|
10
|
+
|
|
11
|
+
CodeQL alert 3 (`js/file-access-to-http`) traces the checked-in `model-library/catalogue.json` URL into the fixture downloader. This is intentional inbound asset acquisition, not transmission of local asset contents: the request is a GET without a body or file-derived headers, its HTTPS host is checked against `dl.polyhaven.org` and `raw.githubusercontent.com`, and redirects are rejected. Existing file contents are used only for local size/SHA-256 verification; manual assets never make network requests. The catalogue is public package content and contains reviewed source URLs, not credentials. Existing acquisition regressions cover rejected hosts/protocols, destination traversal, byte/hash bounds and manual-file network exclusion. The alert therefore does not demonstrate information disclosure. No scan rule or security gate is disabled.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { resolve, relative, isAbsolute } from 'node:path';
|
|
4
|
+
|
|
5
|
+
export function acquisitionPlan(assets, root) {
|
|
6
|
+
const plan=[];let total=0;
|
|
7
|
+
for(const asset of assets) {
|
|
8
|
+
if(!asset.entry) continue;
|
|
9
|
+
for(const file of asset.files) {
|
|
10
|
+
if(file.acquisition==='manual') {
|
|
11
|
+
if(file.url!==undefined)throw new Error('Manual asset must not specify a download URL.');
|
|
12
|
+
} else {
|
|
13
|
+
const url=new URL(file.url);
|
|
14
|
+
if(url.protocol!=='https:' || !['dl.polyhaven.org','raw.githubusercontent.com'].includes(url.hostname)) throw new Error('Unapproved asset source.');
|
|
15
|
+
}
|
|
16
|
+
const path=resolve(root,asset.key,file.path),rel=relative(resolve(root),path);
|
|
17
|
+
if(!rel || rel.startsWith('..') || isAbsolute(rel)) throw new Error('Unsafe asset destination.');
|
|
18
|
+
if(!Number.isSafeInteger(file.bytes)||file.bytes<1||file.bytes>100*1048576||!/^[a-f0-9]{64}$/.test(file.sha256)) throw new Error('Invalid asset bounds or hash.');
|
|
19
|
+
total+=file.bytes;
|
|
20
|
+
if(total>200*1048576) throw new Error('Fixture set exceeds the download budget.');
|
|
21
|
+
plan.push({...file,path,asset});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return plan;
|
|
25
|
+
}
|
|
26
|
+
export async function acquireFixtures({assets,root,fetch:request=globalThis.fetch}) {
|
|
27
|
+
const plan=acquisitionPlan(assets,root);
|
|
28
|
+
const verify=(file,data)=>data.length===file.bytes && createHash('sha256').update(data).digest('hex')===file.sha256;
|
|
29
|
+
// Two sequential workers keep network and memory use bounded.
|
|
30
|
+
let cursor=0;
|
|
31
|
+
async function worker() {
|
|
32
|
+
while(cursor<plan.length) {
|
|
33
|
+
const file=plan[cursor++];let existing;
|
|
34
|
+
try{existing=await readFile(file.path);}catch(error){if(error.code!=='ENOENT')throw error;}
|
|
35
|
+
if(existing){if(!verify(file,existing))throw new Error(`Existing file failed integrity: ${file.asset.key}`);continue;}
|
|
36
|
+
if(file.acquisition==='manual')throw new Error(`Manual asset required: ${file.asset.key}. Place the reviewed file at ${file.path} and retry.`);
|
|
37
|
+
const response=await request(file.url,{redirect:'error',signal:AbortSignal.timeout(60000),headers:{'User-Agent':'Plasius-Renderer-Asset-Research/1.0 (https://plasius.co.uk)'}});
|
|
38
|
+
if(!response.ok)throw new Error(`Asset download failed: ${response.status}`);
|
|
39
|
+
const reader=response.body.getReader(),chunks=[];let length=0;
|
|
40
|
+
try{while(true){const {done,value}=await reader.read();if(done)break;length+=value.length;
|
|
41
|
+
if(length>file.bytes)throw new Error('Downloaded file exceeds its reviewed byte size.');chunks.push(value);}}
|
|
42
|
+
finally{await reader.cancel();}
|
|
43
|
+
const data=Buffer.concat(chunks);
|
|
44
|
+
if(!verify(file,data))throw new Error(`Downloaded file failed integrity: ${file.asset.key}`);
|
|
45
|
+
await mkdir(resolve(file.path,'..'),{recursive:true});await writeFile(file.path,data,{flag:'wx'});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const results=await Promise.allSettled([worker(),worker()]);
|
|
49
|
+
const failure=results.find(r=>r.status==='rejected');if(failure)throw failure.reason;
|
|
50
|
+
for(const asset of assets.filter(a=>a.entry)) {
|
|
51
|
+
await writeFile(resolve(root,asset.key,'CREDITS.txt'),`${asset.name} — ${asset.authors}\n${asset.source_url}\n${asset.licence}\n${asset.licence_url}\nSource files unchanged; runtime framing only.\n`);
|
|
52
|
+
}
|
|
53
|
+
return {models:assets.filter(a=>a.entry).length,files:plan.length,bytes:plan.reduce((n,f)=>n+f.bytes,0)};
|
|
54
|
+
}
|