@kieransimkin/dancemoves 3.0.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.
- package/LICENSE +338 -0
- package/README.md +893 -0
- package/RUDIMENTS-API.md +394 -0
- package/docs/README.md +73 -0
- package/docs/api/adapters.md +400 -0
- package/docs/api/downloads.md +158 -0
- package/docs/api/effects.md +463 -0
- package/docs/api/javascript.md +500 -0
- package/docs/api/paper-planes.md +167 -0
- package/docs/api/styling.md +292 -0
- package/docs/api/surface.json +446 -0
- package/docs/api/wordpress.md +365 -0
- package/docs/clay-transform-validation.md +84 -0
- package/docs/development.md +254 -0
- package/docs/guide.md +288 -0
- package/docs/javascript-api.md +292 -0
- package/docs/javascript-server.md +150 -0
- package/docs/react-next.md +185 -0
- package/docs/releasing-shared.md +162 -0
- package/docs/rudiments-source-integrity.md +80 -0
- package/docs/shared-feature-coverage.md +34 -0
- package/docs/shared-runtime-migration.md +111 -0
- package/docs/source-audit.md +120 -0
- package/docs/validation-setup.md +102 -0
- package/docs/wordpress-examples.md +206 -0
- package/docs/wordpress-shared-runtime.md +133 -0
- package/lib/admin.min.js +1 -0
- package/lib/assets/DanceRudiments-LICENSE +21 -0
- package/lib/assets/DanceRudiments-build-manifest.json +21 -0
- package/lib/assets/paper-dreams-plane-atlas.png +0 -0
- package/lib/build-manifest.json +117 -0
- package/lib/dancemoves.css +9 -0
- package/lib/dancemoves.min.js +5 -0
- package/lib/index.cjs +4802 -0
- package/lib/index.d.ts +71 -0
- package/lib/index.mjs +4780 -0
- package/lib/react.cjs +154 -0
- package/lib/react.d.ts +12 -0
- package/lib/react.mjs +135 -0
- package/lib/rudiments.d.ts +124 -0
- package/lib/server.cjs +411 -0
- package/lib/server.d.ts +11 -0
- package/lib/server.mjs +367 -0
- package/lib/styles/clay-stars-effects.css +1 -0
- package/lib/styles/clay-stars-rudiments.css +1 -0
- package/lib/styles/dance-moves-core.css +1 -0
- package/lib/styles/ks-epk-device-orientation.css +1 -0
- package/lib/styles/paper-dreams-flight.css +1 -0
- package/lib/wordpress.js +5 -0
- package/package.json +101 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Shared builds, CI and npm/GitHub publication
|
|
2
|
+
|
|
3
|
+
The same repository now produces:
|
|
4
|
+
|
|
5
|
+
| Distribution | Output |
|
|
6
|
+
|---|---|
|
|
7
|
+
| npm | `@kieransimkin/dancemoves` tarball, with ESM, CJS, React/Node entrypoints, declarations and styles |
|
|
8
|
+
| Plain browser | `DanceMoves-web-VERSION.zip` with minified `dancemoves.min.js`, styles and static assets |
|
|
9
|
+
| WordPress | `DanceMoves-VERSION.zip` preserving `kieran-epk-device-orientation/` |
|
|
10
|
+
|
|
11
|
+
The source candidate is 3.0.0. The already-published 2.9.0 tag and artifacts must
|
|
12
|
+
not be overwritten. Package publishing is not WordPress deployment.
|
|
13
|
+
|
|
14
|
+
## First checkout: dependency lock is required before a release
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm install --ignore-scripts
|
|
18
|
+
npm run build
|
|
19
|
+
npm test
|
|
20
|
+
npm run test:legacy
|
|
21
|
+
npm run demo:prepare
|
|
22
|
+
npx playwright-core install --with-deps chromium
|
|
23
|
+
npm run test:browser
|
|
24
|
+
npm run test:next
|
|
25
|
+
npm run test:next:smoke
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Commit the generated **package-lock.json** with the reviewed source. This patch
|
|
29
|
+
pins direct development dependencies, but does not invent registry integrity
|
|
30
|
+
values without fetching them. CI can bootstrap an unlocked pull request so its
|
|
31
|
+
resolved lockfile is inspectable; **tag/release builds fail closed without a
|
|
32
|
+
committed lockfile**. From then on use `npm ci --ignore-scripts`.
|
|
33
|
+
|
|
34
|
+
The lockfile and compiler versions are part of the build input. Minified assets
|
|
35
|
+
are ignored/generated, not hand-maintained alongside canonical sources. Never
|
|
36
|
+
edit `lib/` or `.build/wordpress/` as a way to fix a source bug.
|
|
37
|
+
|
|
38
|
+
## Local independent builds
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
npm run build:library
|
|
42
|
+
npm run package:web
|
|
43
|
+
npm run package:wordpress
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`build:library` creates shared outputs only. `build:wordpress` also stages the
|
|
47
|
+
WordPress adapter. `package:wordpress` builds/stages then uses the Python ZIP
|
|
48
|
+
packager; the retained `tools/package.ps1` delegates to that command. No private
|
|
49
|
+
`Z:` drive or migration-evidence directory is needed to build an archive.
|
|
50
|
+
|
|
51
|
+
`npm run build` builds all targets once. CI then packages the already-tested
|
|
52
|
+
staging tree, web files and npm package without rebuilding between artifacts.
|
|
53
|
+
Archives use sorted paths and fixed timestamps. WordPress output checks its
|
|
54
|
+
single-runtime invariant; every distribution has SHA-256 metadata.
|
|
55
|
+
|
|
56
|
+
For a local npm tarball after a successful build:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
npm pack
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Prepack checks the generated manifest against actual output bytes. Do not publish
|
|
63
|
+
a tarball from an earlier build under a newer source version.
|
|
64
|
+
|
|
65
|
+
## CI
|
|
66
|
+
|
|
67
|
+
`.github/workflows/ci.yml` runs on main pushes and pull requests. It builds/tests
|
|
68
|
+
on Ubuntu and Windows, with Node 22 and 24, PHP 8.3 and Python 3.12. Node/React
|
|
69
|
+
SSR tests, existing engine/PHP/harness tests, source integrity and packaging
|
|
70
|
+
checks remain gates. A browser job runs real Chromium/React and a production
|
|
71
|
+
Next build/route smoke test using canonical Arcadians assets.
|
|
72
|
+
|
|
73
|
+
Missing dependencies, source files, media or a blocked browser are failures, not
|
|
74
|
+
successful skipped tests. The CI workflows do not deploy the WordPress site.
|
|
75
|
+
Real Safari/phone measurements and application-specific accessibility checks
|
|
76
|
+
remain attended acceptance work.
|
|
77
|
+
|
|
78
|
+
## One-time npm setup
|
|
79
|
+
|
|
80
|
+
The workflow cannot register your npm account permissions through repository
|
|
81
|
+
source code. Before the first publication:
|
|
82
|
+
|
|
83
|
+
1. Ensure your npm account may publish public packages under `@kieransimkin`.
|
|
84
|
+
2. Create a GitHub environment named **npm**, optionally with required reviewers.
|
|
85
|
+
3. Register the package once if it does not exist. The release workflow supports
|
|
86
|
+
a narrowly scoped, short-lived **NPM_BOOTSTRAP_TOKEN** environment secret for
|
|
87
|
+
that first publish. Alternatively publish the exact tested CI tarball
|
|
88
|
+
interactively; do not rebuild different bytes for the same version.
|
|
89
|
+
4. On npm package Settings → Trusted Publisher, configure **GitHub Actions**:
|
|
90
|
+
owner `kieransimkin`, repository `DanceMoves`, filename `release.yml`,
|
|
91
|
+
environment `npm`. Permit **direct `npm publish`**, not stage-only publication.
|
|
92
|
+
5. Remove the bootstrap token after trusted publishing works. Keep permissions
|
|
93
|
+
and protection rules on release tags and the npm environment deliberate.
|
|
94
|
+
|
|
95
|
+
The job uses a GitHub-hosted runner, Node 24, npm 11.6.0 and `id-token: write`.
|
|
96
|
+
It publishes with provenance. New npm trusted publishers currently default to
|
|
97
|
+
stage publishing unless direct publishing is explicitly allowed; a stage-only
|
|
98
|
+
configuration will not make this direct-publish workflow succeed.
|
|
99
|
+
|
|
100
|
+
These requirements follow the official npm trusted-publishing documentation:
|
|
101
|
+
<https://docs.npmjs.com/trusted-publishers/>. npm requires at least CLI 11.5.1 and
|
|
102
|
+
Node 22.14 for this route. No package registration or publisher configuration is
|
|
103
|
+
claimed to have been performed by applying this patch.
|
|
104
|
+
|
|
105
|
+
## Release tags
|
|
106
|
+
|
|
107
|
+
After the migration, tests and setup are committed:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
git status --short
|
|
111
|
+
npm run check:release
|
|
112
|
+
git tag -a v3.0.0 -m "DanceMoves 3.0.0: shared JavaScript runtime"
|
|
113
|
+
git push origin HEAD
|
|
114
|
+
git push origin refs/tags/v3.0.0
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The release workflow triggers on `v*` tag pushes, also supports an existing
|
|
118
|
+
published GitHub release event, and has a manual retry input for an **existing**
|
|
119
|
+
tag. It verifies the tag, npm version, PHP header and runtime constant, then:
|
|
120
|
+
|
|
121
|
+
- runs build and release tests;
|
|
122
|
+
- creates the npm tarball, minified browser ZIP, WordPress ZIP, manifests and
|
|
123
|
+
`SHA256SUMS.txt` from that tested build;
|
|
124
|
+
- uploads them as an Actions artifact;
|
|
125
|
+
- publishes the exact tarball to npm using the protected npm job;
|
|
126
|
+
- attaches the same artifacts to the GitHub release and publishes it.
|
|
127
|
+
|
|
128
|
+
A prerelease version such as `3.0.1-rc.1` uses npm's **next** dist-tag and a GitHub
|
|
129
|
+
prerelease. Stable versions use **latest**. A tag alone cannot bypass a failed
|
|
130
|
+
test or incomplete setup. The three products are generated even if a later npm
|
|
131
|
+
authorization step fails; retrieve the tested Actions artifact while fixing the
|
|
132
|
+
publisher setup.
|
|
133
|
+
|
|
134
|
+
Re-running a job is safe only for identical outputs. Existing npm versions are
|
|
135
|
+
compared using SHA-512 integrity; different bytes fail. Existing GitHub assets
|
|
136
|
+
are compared by SHA-256 and are never uploaded with `--clobber`. A registry
|
|
137
|
+
network/server error is not treated as proof that a version is absent. There
|
|
138
|
+
is intentionally no operation that moves an existing tag or overwrites a
|
|
139
|
+
published package version.
|
|
140
|
+
|
|
141
|
+
## Updating the next version
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
npm version 3.0.1 --no-git-tag-version
|
|
145
|
+
npm run build
|
|
146
|
+
npm test
|
|
147
|
+
npm run test:legacy
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The version lifecycle synchronizes the PHP header/constant, current phone cache
|
|
151
|
+
keys and gallery version. Review and commit **all** resulting version changes,
|
|
152
|
+
including package-lock.json, before creating `v3.0.1`. Run browser/Next acceptance
|
|
153
|
+
again as appropriate to the changes. Native API/upstream dependency versions and
|
|
154
|
+
historical evidence are independent: do not globally replace their version text.
|
|
155
|
+
|
|
156
|
+
## Verify the result
|
|
157
|
+
|
|
158
|
+
On GitHub inspect the tag commit, build/test jobs, npm job, attached filenames and
|
|
159
|
+
checksums. Confirm the registry version and its provenance. For WordPress,
|
|
160
|
+
install the exact generated ZIP separately, retain rollback artifacts and check
|
|
161
|
+
public pages/caches. Publication does not set page metadata, migrate site data
|
|
162
|
+
or prove live rendering.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# DanceRudiments source integrity and Windows line endings
|
|
2
|
+
|
|
3
|
+
The native source identity in `vendor/dancerudiments/UPSTREAM.json` is the
|
|
4
|
+
upstream **Git blob SHA-1**, not a SHA-256 file checksum. Generated JavaScript
|
|
5
|
+
and compiled WebAssembly are separately checked against SHA-256 values in
|
|
6
|
+
`assets/vendor/dancerudiments/build-manifest.json`.
|
|
7
|
+
|
|
8
|
+
## A clean Windows checkout reports a different header hash
|
|
9
|
+
|
|
10
|
+
The DanceRudiments 0.1.3 pinned LF header has Git blob ID
|
|
11
|
+
`6414362b2720262c8dd01630d7750b2501fd0c14`. Converting **only** its 47 LF line
|
|
12
|
+
endings to CRLF produces `2376c476651fe506e8a92c9e3786f4775c1e9b38`.
|
|
13
|
+
The file grows from 1,734 to 1,781 bytes; its C++ text is unchanged.
|
|
14
|
+
|
|
15
|
+
Git may convert unspecified text paths according to `core.autocrlf`.
|
|
16
|
+
The repository previously specified LF for JavaScript and other formats, but
|
|
17
|
+
not C++ headers, C++ sources or extensionless `LICENSE` files. Explicit LF
|
|
18
|
+
attributes now cover those paths, including both copies of the MIT licence.
|
|
19
|
+
See the [Git attributes reference](https://git-scm.com/docs/gitattributes).
|
|
20
|
+
|
|
21
|
+
Existing working files may remain CRLF after changing attributes. No reset,
|
|
22
|
+
reclone, global Git setting change, manual re-encoding or pin update is needed.
|
|
23
|
+
|
|
24
|
+
## Verification rules
|
|
25
|
+
|
|
26
|
+
`node tools/verify-rudiments.cjs` checks each pinned upstream text file as follows:
|
|
27
|
+
|
|
28
|
+
1. Accept its exact bytes when its Git blob ID matches the existing pin.
|
|
29
|
+
2. Otherwise replace only CRLF byte pairs with LF **in memory**, and accept the
|
|
30
|
+
result only when that reconstructs the same existing Git blob ID.
|
|
31
|
+
3. Reject every other difference, with the filename, expected ID, raw ID and
|
|
32
|
+
canonical ID in the error. Working files and pins are never changed.
|
|
33
|
+
|
|
34
|
+
There is no Unicode decoding/re-encoding, whitespace trimming, BOM stripping,
|
|
35
|
+
blank-line removal or conversion of lone CR characters. Mixed LF/CRLF is
|
|
36
|
+
accepted only when CRLF-to-LF reconstructs the exact pin. Both licence copies
|
|
37
|
+
must independently match the licence pin; two identically damaged copies do
|
|
38
|
+
not pass. This tolerance applies **only to pinned upstream source/licence
|
|
39
|
+
text**, not generated JavaScript, WASM bytes, or package-manifest checksums.
|
|
40
|
+
|
|
41
|
+
The verifier still checks manifest/pin agreement, byte-exact generated JS,
|
|
42
|
+
WASM hashes, no host imports, ABI, catalogue periods, bounded finite values,
|
|
43
|
+
negative wrapping, sample count and invalid IDs. No source hashes, native
|
|
44
|
+
samples, runtime code, plugin version or release artifacts change in this fix.
|
|
45
|
+
|
|
46
|
+
## Native rebuilding
|
|
47
|
+
|
|
48
|
+
`python tools/build-rudiments.py --check` uses the same pinned-text rule. It
|
|
49
|
+
compiles verified source bytes staged into a temporary directory, not modified
|
|
50
|
+
working-tree files. The normal rebuild writes explicit UTF-8 bytes so Windows
|
|
51
|
+
cannot translate generated JS or manifest line endings, and writes the verified
|
|
52
|
+
upstream licence bytes. The rebuild still requires the documented compiler(s);
|
|
53
|
+
ordinary validation needs none.
|
|
54
|
+
|
|
55
|
+
A normal rebuild may produce different compiler-dependent WASM bytes and
|
|
56
|
+
updates its generated manifest as before. Those changes need review; this fix
|
|
57
|
+
does not regenerate the shipped backend or claim cross-compiler byte identity.
|
|
58
|
+
|
|
59
|
+
## Regression checks
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
node .\tools\verify-rudiments.cjs
|
|
63
|
+
node .\tests\rudiments-line-endings.test.cjs
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The regression suite uses temporary copies, reproduces the reported hashes,
|
|
67
|
+
checks the actual verifier and source-ownership test under LF and CRLF,
|
|
68
|
+
rejects substantive source/licence edits and JS/WASM tampering, verifies a
|
|
69
|
+
local Git checkout with `core.autocrlf=true`, and runs the Python builder's
|
|
70
|
+
matching tests. The existing Unit runner discovers the new `.test.cjs` file.
|
|
71
|
+
It requires Git and Python as well as Node, but no C++ compiler and no network.
|
|
72
|
+
|
|
73
|
+
An independently runnable Python check is:
|
|
74
|
+
|
|
75
|
+
```powershell
|
|
76
|
+
python -X utf8 .\tests\test-rudiments-line-endings.py
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
After the targeted checks, rerun the repository's complete Unit gate. A source
|
|
80
|
+
integrity pass is not a browser, WordPress deployment or release approval.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Feature coverage and execution boundaries
|
|
2
|
+
|
|
3
|
+
No original browser engine is reimplemented in WordPress or React. The shared
|
|
4
|
+
factory compiles the ten canonical engine/data files and retains the existing
|
|
5
|
+
CSS and admin source. This table is a feature map, not a claim that browser or
|
|
6
|
+
physical tests were executed in a restricted development environment.
|
|
7
|
+
|
|
8
|
+
| Feature | Shared entry/API | Demo/test coverage |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| BPM, ticks, duration quantization, boundaries | Main factory/core methods | Existing clock/scheduling/interval gallery; original core tests |
|
|
11
|
+
| CSS timing/control/lyric disclosure | Core properties + CSS | WordPress-style clock/shared timing demos; original CSS contracts |
|
|
12
|
+
| Named cues, intervals, DOM events, animation ownership | Core methods | React cue panel; original 23-page gallery and core contracts |
|
|
13
|
+
| Lyrics, clear entries, both look-aheads, master matching | Core + React useLyric | Canonical Arcadians player in both React apps; old lyrics/master demos |
|
|
14
|
+
| Pointer, playbackPulse, cueClass, cueTimeline, quality | `runtime.effects` | Five React panels, actual transformed-registry tests, original effects/timeline tests |
|
|
15
|
+
| Catalogue CSS adoption | `catalogue:true` | Original catalogue demo now imports the module; original source test |
|
|
16
|
+
| All nine named orientation adapters | `orientation.adapter`, orientationCore | All nine original gallery layouts retained; original adapter/scheduler tests |
|
|
17
|
+
| Generic orientation and recorder | `createOrientation`, `createRecorder` | React permission/capture panels; lifecycle/server tests; real-device permission still manual |
|
|
18
|
+
| Clay cover/lights/particles/quality/native background | `clay:true`, getClay/getClayRudiment | React Clay panel, original Clay contracts and native adapter tests |
|
|
19
|
+
| Paper planes | `effect:'paper-planes'` | React/Next plane panel using the shipped atlas; original flight tests |
|
|
20
|
+
| All 15 native patterns and custom render callbacks | `runtime.rudiments` | React 15-motion grid; original Canvas/clock demos; actual WASM tests |
|
|
21
|
+
| Diagnostic attribution and lifetime inspection | diagnostic sink, resources/on/destroy | Original diagnostic demo, React inspect/unmount controls, scope tests |
|
|
22
|
+
| Page metadata and validation/revisions | Config exports, PageMetadataEditor, memory store | React metadata panel; server config tests; PHP's original native storage kept |
|
|
23
|
+
| Timing upload validation | `/server.validateTimingFile` | Strict UTF-8/order/extension/clear-line tests; PHP validation retained |
|
|
24
|
+
| Signed MP3 downloads | `/server.createDownloadService` | Actual temp-file GET/HEAD/path/signature tests and Next route smoke |
|
|
25
|
+
| Private capture HTTP handling | `/server.createCaptureHandler` | Auth/origin/body/storage/rate tests, Next private-file route, original PHP posts retained |
|
|
26
|
+
| SSR/Strict Mode and independent roots | createScope + React hooks | ESM/CJS/React SSR tests, actual Chromium mount/unmount tests, focused resource tests |
|
|
27
|
+
| No duplicate WordPress frontend | PHP aliases + shared build | PHP queue test; ZIP builder's byte equality and two-JS invariant |
|
|
28
|
+
| npm/web/WordPress release pipeline | CI/release workflows | Version/lock/checksum gates and idempotent publisher scripts |
|
|
29
|
+
|
|
30
|
+
The React/Next gallery reuses one React implementation and one Arcadians media
|
|
31
|
+
set. The 23 original workbench pages remain separately addressable but now load
|
|
32
|
+
the module rather than raw plugin scripts. A simulated metadata/HTTP demo is
|
|
33
|
+
not evidence of real WordPress capabilities, and synthetic sensor data is not
|
|
34
|
+
physical-device performance evidence.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# DanceMoves 3: one source, three distributions
|
|
2
|
+
|
|
3
|
+
This is the 3.0.0 **source candidate**, based on DanceMoves 2.9.0 commit
|
|
4
|
+
`3a6e67652a1bf6968b9ac0715ee5d5eff1e74c98`. Applying the patch does not publish
|
|
5
|
+
anything or change an installed WordPress site. The npm package name is
|
|
6
|
+
`@kieransimkin/dancemoves`; package registration and trusted publishing require
|
|
7
|
+
maintainer action before the first publication.
|
|
8
|
+
|
|
9
|
+
## Repository architecture
|
|
10
|
+
|
|
11
|
+
| Location | Responsibility |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `assets/` | The single maintained implementation of the existing browser engines, CSS, editor frontend and native data. These are now shared-library source, not a second WordPress implementation. |
|
|
14
|
+
| `src/index.mjs`, `src/scope.mjs` | Explicit per-root mounting and ownership of browser resources. |
|
|
15
|
+
| `src/config.mjs` | Host-neutral metadata validation, WordPress metadata conversion and bounded revision-store abstraction. |
|
|
16
|
+
| `src/react.mjs` | Optional client-only React hooks, provider, rudiment component and metadata editor. |
|
|
17
|
+
| `src/server.mjs` | Node HTTP services for timing validation, signed MP3 attachments and private captures. |
|
|
18
|
+
| `src/wordpress.mjs`, `src/wordpress-config.mjs` | Thin adapter that imports the shared factory, reads WordPress's localized configuration and restores legacy globals. No animation implementation. |
|
|
19
|
+
| `kieran-epk-device-orientation.php`, `dance-moves-rudiments.php` | WordPress-native settings, media, metadata revisions, download/capture endpoints, page selection and enqueue aliases. |
|
|
20
|
+
| `tools/build-modules.mjs` | Deterministically compiles the existing engines into scoped ESM installer functions. No runtime eval, Function constructor, CDN or script injection. |
|
|
21
|
+
| `tools/build-shared.mjs` | Produces ESM/CommonJS, React/Node entrypoints, minified browser and WordPress library artifacts with esbuild. |
|
|
22
|
+
| `lib/` | Generated shared-library outputs; ignored by Git, included in npm. |
|
|
23
|
+
| `.build/wordpress/` | Separate WordPress staging tree; includes selected **byte-identical** `lib/` outputs, never raw engine sources. |
|
|
24
|
+
|
|
25
|
+
The compiler does not create a second definition of a movement, timing parser,
|
|
26
|
+
cue handler or adapter. It moves each canonical script's execution inside an
|
|
27
|
+
installer function and instruments resource ownership using a TypeScript AST.
|
|
28
|
+
The small checked source substitutions expose timing-file readiness and qualify
|
|
29
|
+
CSS owner identifiers. Unexpected source changes at those integration points
|
|
30
|
+
stop the build rather than silently emitting an incompatible wrapper.
|
|
31
|
+
|
|
32
|
+
Both distributions consume those same functions. The WordPress archive contains
|
|
33
|
+
`lib/wordpress.js` and `lib/admin.min.js` as its only JavaScript files; the former
|
|
34
|
+
bundles the shared module and its initialization adapter. It does **not** also
|
|
35
|
+
ship a second `assets/dance-moves-core.js`, a separate effect engine or separate
|
|
36
|
+
native-data script. Existing script handles are kept as WordPress dependency
|
|
37
|
+
aliases with `src=false`.
|
|
38
|
+
|
|
39
|
+
The native movement authority remains the pinned DanceRudiments 0.1.3 C++/WASM
|
|
40
|
+
sample bank. This patch does not import a newer atlas from a sibling checkout.
|
|
41
|
+
`tools/verify-rudiments.cjs` still checks its existing source, licence and native
|
|
42
|
+
hash contracts before building the library.
|
|
43
|
+
|
|
44
|
+
## Instance lifetime and compatibility
|
|
45
|
+
|
|
46
|
+
`createDanceMoves({root,...})` installs a runtime into one DOM subtree. Queries,
|
|
47
|
+
CSS timing properties, generated nodes and event dispatch are scoped to that
|
|
48
|
+
root. Separate, non-overlapping roots may use different BPMs and the same local
|
|
49
|
+
controller IDs. Overlapping mounts are rejected. Consumers must call `destroy()`
|
|
50
|
+
on route changes; the React hook does this automatically, including development
|
|
51
|
+
Strict Mode's setup/cleanup/remount cycle.
|
|
52
|
+
|
|
53
|
+
Mount-time listeners, timers, frames, observers, fetches and generated styles
|
|
54
|
+
are tracked. Disposal aborts outstanding internal fetches, suppresses late
|
|
55
|
+
promise callbacks, removes generated nodes and restores owned style/attribute
|
|
56
|
+
values when the host has not subsequently changed them. A retained destroyed
|
|
57
|
+
runtime is not a valid factory for more effects.
|
|
58
|
+
|
|
59
|
+
Consumer-owned callbacks that mutate other elements remain the consumer's
|
|
60
|
+
responsibility. Destroy your controllers and undo those writes in your effect
|
|
61
|
+
cleanup. The scope is resource ownership, not a security sandbox.
|
|
62
|
+
|
|
63
|
+
Normal JavaScript imports do not read or write browser globals. The WordPress
|
|
64
|
+
adapter deliberately enables `legacyGlobals`, preserving `window.DanceMoves`,
|
|
65
|
+
`window.KieranEpkMotion`, `window.DanceMovesEffects`, the native API and adapter
|
|
66
|
+
aliases for existing EPK page scripts. There should be only one legacy-global
|
|
67
|
+
mount per document. Do not run two copies of the WordPress bundle.
|
|
68
|
+
|
|
69
|
+
## Important boundaries
|
|
70
|
+
|
|
71
|
+
The new package includes JavaScript equivalents of the server features; it does
|
|
72
|
+
not run PHP in a browser or pretend a client-side object is a database. WordPress
|
|
73
|
+
continues using its own capabilities, nonces, Media Library, post metadata,
|
|
74
|
+
revision storage and private posts. Other applications provide authorization,
|
|
75
|
+
private persistence and production rate limiting to the Node APIs.
|
|
76
|
+
|
|
77
|
+
The browser API never contains the server download secret. Signed attachment
|
|
78
|
+
URLs are not a DRM/paywall: the ordinary playable MP3 remains a separate static
|
|
79
|
+
URL. Motion-capture client flags are reported observations, not server-attested
|
|
80
|
+
physical-device evidence.
|
|
81
|
+
|
|
82
|
+
Catalogue adoption is opt-in outside WordPress. In scoped mounts it adopts
|
|
83
|
+
computed durations and inline styles inside that root, without rewriting shared
|
|
84
|
+
stylesheet rules that other React roots may use. Legacy WordPress mode preserves
|
|
85
|
+
the existing global stylesheet-adoption behaviour. Both paths use the same
|
|
86
|
+
canonical catalogue implementation.
|
|
87
|
+
|
|
88
|
+
## WordPress migration
|
|
89
|
+
|
|
90
|
+
Build and install the new WordPress ZIP. Keep the existing plugin directory
|
|
91
|
+
`kieran-epk-device-orientation/` and its PHP entrypoint. No page IDs, timing
|
|
92
|
+
attachments or `_dance_moves_*` keys are renamed. The Clay legacy-plugin guard
|
|
93
|
+
and existing page-to-orientation mappings remain in PHP.
|
|
94
|
+
|
|
95
|
+
Scripts enqueued by handle continue to work. Hand-written URLs to old raw
|
|
96
|
+
`assets/*.js` files must be replaced with handle dependencies or the public npm
|
|
97
|
+
API. Raw source checkouts are not installable plugin ZIPs: build first. Cache
|
|
98
|
+
URLs now point into `lib/` and use the new plugin version.
|
|
99
|
+
|
|
100
|
+
For using a retained 2.9.x release, use that release's instructions; do not move
|
|
101
|
+
its published tag or replace its assets. The new release workflow is for tags
|
|
102
|
+
created after this migration is committed.
|
|
103
|
+
|
|
104
|
+
## Guides
|
|
105
|
+
|
|
106
|
+
- [JavaScript API](javascript-api.md)
|
|
107
|
+
- [React and Next.js](react-next.md)
|
|
108
|
+
- [Node services](javascript-server.md)
|
|
109
|
+
- [WordPress installation and metadata](wordpress-shared-runtime.md)
|
|
110
|
+
- [Builds, CI and publishing](releasing-shared.md)
|
|
111
|
+
- [Unchanged native API contract](../RUDIMENTS-API.md)
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Documentation source audit
|
|
2
|
+
|
|
3
|
+
[Documentation index](README.md) · [Machine-readable inventory](api/surface.json)
|
|
4
|
+
|
|
5
|
+
## Baseline and scope
|
|
6
|
+
|
|
7
|
+
This documentation describes **DanceMoves 2.8.0**, release tag `v2.8.0` at
|
|
8
|
+
`4cb6a71f60459b5579be87d7e55ac8b1426c578e`, whose commit message is
|
|
9
|
+
“Add shared cue timeline transport recovery” (28 September 2026). GitHub's latest
|
|
10
|
+
published release was rechecked on 29 September 2026. The default branch `main`
|
|
11
|
+
is not the current release baseline: it still points to 2.4.0.
|
|
12
|
+
|
|
13
|
+
The staging branch `timed-lyrics-staging-2026-09-20` at
|
|
14
|
+
`c95f24f326a5f5334e4fe63c1e705ec13b1d59d6` is one commit ahead. The comparison
|
|
15
|
+
changes only `migration/dance-moves-2.8.0-cue-timeline-staging-2026-09-28.md`
|
|
16
|
+
(publication evidence); no runtime or README delta is being silently omitted.
|
|
17
|
+
This reference and patch target the release and also match that staging revision.
|
|
18
|
+
No 2.9 feature is inferred from a recollection or an unverified local workspace.
|
|
19
|
+
|
|
20
|
+
The published release asset lists ZIP SHA-256
|
|
21
|
+
`599d6e377f142d8b56dfb735df96122993fb8ce1015fe582533f21e408f30e48`.
|
|
22
|
+
That is provenance from the release metadata, not a claim that this documentation
|
|
23
|
+
review independently downloaded/deployed that ZIP or verified a live WordPress
|
|
24
|
+
installation. This patch changes documentation only and supersedes the earlier
|
|
25
|
+
2.4.0 documentation patch rather than layering on top of it.
|
|
26
|
+
|
|
27
|
+
The reference covers the public timing object and alias, conditional catalogue
|
|
28
|
+
additions, orientation helper exports and diagnostic lifecycle handle, Clay/Stars
|
|
29
|
+
adapter, paper-plane API, all five shared effect factories and their returned
|
|
30
|
+
handles, all entrypoint PHP functions, metadata, registered hooks, enqueued
|
|
31
|
+
handles, signed-download HTTP API, REST capture, timing formats, events, CSS/DOM state and development
|
|
32
|
+
workflow. It does not promote internal local functions or test-only globals into
|
|
33
|
+
supported page APIs.
|
|
34
|
+
|
|
35
|
+
[api/surface.json](api/surface.json) records the reviewed source blob IDs and
|
|
36
|
+
export/function inventory, so the next documentation update can compare actual
|
|
37
|
+
exports rather than relying on release prose. A symbol appearing in that
|
|
38
|
+
inventory means it was documented; it is not an assertion that every code path
|
|
39
|
+
has an automated or physical-device test.
|
|
40
|
+
|
|
41
|
+
## Source-to-reference map
|
|
42
|
+
|
|
43
|
+
| Source | Reference coverage |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| [Plugin entrypoint](../kieran-epk-device-orientation.php) | [WordPress/PHP/REST](api/wordpress.md): constants, all PHP functions, metadata schemas and sanitisation, editor validation, capture permission/payload/errors, asset loading and legacy collision. |
|
|
46
|
+
| [Shared effects](../assets/dance-moves-effects.js) | [Effects API](api/effects.md): all factories, registry methods, return handles, options, payloads, restoration, accessibility and quality rules. |
|
|
47
|
+
| [Paper-plane JS](../assets/paper-dreams-flight.js), [CSS](../assets/paper-dreams-flight.css) | [Paper-plane API](api/paper-planes.md): metadata gate, config, DOM requirements, methods, snapshot, physics/clock distinction and lifecycle. |
|
|
48
|
+
| [Download helpers in PHP](../kieran-epk-device-orientation.php) | [Downloads](api/downloads.md): all eight functions, query vars, filtering scope, HMAC, GET/HEAD, headers, errors and security limits. |
|
|
49
|
+
| [Timing core](../assets/dance-moves-core.js) | [JavaScript](api/javascript.md): properties, all exported methods, types, clocks, scheduling, parsing, audio selection, ownership, events, diagnostics and limitations. |
|
|
50
|
+
| [Catalogue adopter](../assets/dance-moves-catalogue-timing.js) | [Adapters](api/adapters.md): conditional methods/aliases, root selection, conversion evidence and observer/ownership boundaries. |
|
|
51
|
+
| [Orientation core](../assets/ks-epk-device-orientation-core.js) | [Adapters](api/adapters.md): every exported helper, factory options, returned methods and snapshot/detail fields. |
|
|
52
|
+
| [Orientation runtime](../assets/ks-epk-device-orientation.js) | [Adapters](api/adapters.md): all nine page adapters, configuration, permission and lifecycle behavior; [styling](api/styling.md): state and release-local outputs. |
|
|
53
|
+
| [Clay/Stars runtime](../assets/clay-stars-effects.js) | [Adapters](api/adapters.md): parameters, methods, complete snapshot, lifecycle, adaptive performance configuration and recovery. |
|
|
54
|
+
| [Core CSS](../assets/dance-moves-core.css), [orientation CSS](../assets/ks-epk-device-orientation.css), [Clay/Stars CSS](../assets/clay-stars-effects.css) | [Styling](api/styling.md): timed variables, declarative starts, lyric structure, shared transitions, output attributes, performance/reduced-motion/forced-colours treatments. |
|
|
55
|
+
| [Admin selector](../assets/dance-moves-admin.js) | [Guide](guide.md) and [WordPress](api/wordpress.md): selection/clear UI, filename extension check and the stronger server-side save validation. |
|
|
56
|
+
| [Unit/package coordinator](../tools/validate.ps1), [packager](../tools/package.ps1) | [Development](development.md): exact invocation, side effects, package allowlist and warning-vs-gate distinction. |
|
|
57
|
+
| [Tests](../tests/) and [test plan](../TEST-PLAN.md) | [Development](development.md): focused contracts, planned versus implemented checks, acceptance evidence and physical-device limitations. |
|
|
58
|
+
|
|
59
|
+
## Corrections and details that matter to integrations
|
|
60
|
+
|
|
61
|
+
| Previous ambiguity or easy assumption | Source-accurate contract in this reference |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| Performance quality only steps down, using fixed 45/50 FPS cutoffs | The current runtime can recover, uses session-observed cadence-relative thresholds and defaults to three poor windows. In Clay/Stars, legacy fixed-FPS fields are read but no longer drive decisions; the generic quality primitive is a different algorithm. |
|
|
64
|
+
| The latest plugin must be whatever `main` says | Releases/tags establish 2.8.0; staging differs only in publication evidence. |
|
|
65
|
+
| Every lyric preview means the next LRC entry | `next*` includes blank clears; `nextVisible*` skips them. Both have timestamps and sentinel values. |
|
|
66
|
+
| Core and shared timelines use identical seek rules | Core queues one nearby cue by default; timeline landing callbacks are opt-in and not queued while paused. |
|
|
67
|
+
| A timeline snapshot `fired` list is an execution log | It also contains past cues marked consumed on rebuild; `active` holds half-open interval IDs. |
|
|
68
|
+
| All motion uses one scheduling model | Page scheduling can invoke synchronously at an immediate boundary; audio scheduling waits for playback. Interval subscriptions and duration quantisation use different tick rounding rules. |
|
|
69
|
+
| `currentTick({clock:"audio"})` freezes while paused | Without usable playing audio, it returns the page clock. Playback-bound schedulers separately wait for playback. |
|
|
70
|
+
| A file called `.cue` accepts standard CD cuesheets | The plugin consumes bracketed LRC-style timestamped labels, not `TRACK`/`INDEX` syntax. |
|
|
71
|
+
| Upload validation, editor selection and REST updates are equivalent | Upload checks are limited, editor selection validates file content/order, and REST attachment metadata only sanitises the ID. Trusted integrations must explicitly use the full attachment validator. |
|
|
72
|
+
| Pop-up opt-in makes lyrics into a generic design preset | The component is neutral and visual-only. A release-specific treatment and accessible full lyric section are required. |
|
|
73
|
+
| `onLyric()` reports every playback state | It reports indexed lyric changes/re-indexing. Pause/end hide the built-in layer but do not emit an empty lyric event. |
|
|
74
|
+
| No layer can exist without valid lyrics | Initial creation checks the entry list, but a later bound-audio tick can create an empty idle layer when pop-ups are enabled. Layer existence is not successful-load evidence. |
|
|
75
|
+
| Lyric overrides belong under `.ks-epk` | The renderer appends the layer to `body`, outside the EPK root. Override the component using a release-specific ancestor/page selector. |
|
|
76
|
+
| Cue callbacks contain all parser fields | The dispatched cue detail omits `normalisedLabel`, although parsed cue entries include it. |
|
|
77
|
+
| Repeating intervals are fully seek-aware | Forward jumps skip old boundaries; backward seeks can retain the old boundary. Remove/re-register where immediate rebasing is needed. |
|
|
78
|
+
| All matching audio players share one independent clock per effect | Cue/lyric detection binds per player, but interval helpers follow the latest active player and the visual lyric layer is shared. Avoid simultaneous playback. |
|
|
79
|
+
| `discoverAudio()` supplies automatic dynamic observation | It is an explicit discovery pass; call it after inserting new audio. Existing bound elements are not fully revalidated when their source changes. |
|
|
80
|
+
| Catalogue ownership is a complete CSS isolation boundary | Selectors and referenced variable definitions can also match outside the release. Broad/mixed selectors still require an ownership review. |
|
|
81
|
+
| Every orientation transition is compositor-only | The existing Light Will Win hero transitions `background-position`; device performance remains an empirical acceptance check. |
|
|
82
|
+
| All public JavaScript has a global destroy/reconfigure API | The core has no global destroy or dynamic BPM setter. Each registration owns its remover, and some adapter teardowns leave CSS or registered scopes. |
|
|
83
|
+
| Motion capture is authenticated by a private deployment secret | The legacy capture token is fixed in public source, with no user-capability check on that route. Origin checking is conditional on a supplied origin. Treat it as a restricted legacy diagnostic interface, not a strong authentication design. |
|
|
84
|
+
| Unit success means every EPK has passed pre-live validation | The California full-page scaffold failure is a warning in the current coordinator. Browser, release and physical-device evidence remain separate gates. |
|
|
85
|
+
| Shared quality equals the Clay performance adapter | Different sample metrics, limits, cooldowns and preference-initialization behaviour are explicitly documented. |
|
|
86
|
+
| Signed MP3 URLs authenticate individual users or expire | They sign a path with the WordPress auth salt; they are shareable, non-expiring and do not make source media private. |
|
|
87
|
+
| Paper planes are fully beat-quantized and audio-seekable | Page-clock ambient phase and frame-delta physical simulation are different from cue-timeline playback. |
|
|
88
|
+
| A paper snapshot version is the plugin version | Adapter snapshot is 2.6.3 inside DanceMoves 2.8.0. |
|
|
89
|
+
| Paper static mode guarantees three visible reduced-motion sprites | Final reduced-motion CSS hides all planes. Forced colours hides the stage without itself stopping JS. |
|
|
90
|
+
| A docs directory will automatically be included in the plugin ZIP | The packager includes only the PHP entrypoint, root README and assets. This patch keeps full reference docs in the source repository and leaves packaging unchanged. |
|
|
91
|
+
|
|
92
|
+
These are documentation corrections or exposed implementation constraints, not
|
|
93
|
+
runtime fixes. The patch does not change authentication, parser validation,
|
|
94
|
+
scheduler semantics, CSS ownership, tests, release assets or packaging code.
|
|
95
|
+
Security or lifecycle changes should be reviewed and tested separately rather
|
|
96
|
+
than silently described as already implemented.
|
|
97
|
+
|
|
98
|
+
## Maintaining the reference
|
|
99
|
+
|
|
100
|
+
On a later source update, compare the core object literal, catalogue additions,
|
|
101
|
+
orientation factory exports, shared effects and returned handles, paper-plane and
|
|
102
|
+
Clay/Stars object literals, PHP function declarations,
|
|
103
|
+
metadata registration, route registration, configuration reads, event dispatches
|
|
104
|
+
and generated CSS/DOM state against `surface.json`. Update examples, defaults,
|
|
105
|
+
return types, failure behavior and cleanup semantics together.
|
|
106
|
+
|
|
107
|
+
Run documentation link/encoding/example checks and the repository's unit
|
|
108
|
+
coordinator in a suitable checkout. Verify any changed examples against the
|
|
109
|
+
actual runtime. Mark physical/browser/WordPress checks as `NOT RUN` until they
|
|
110
|
+
have been performed against the exact candidate. Preserve dated QA evidence;
|
|
111
|
+
do not rewrite old results to imply a new build was tested.
|
|
112
|
+
|
|
113
|
+
## Troubleshooting cleanup
|
|
114
|
+
|
|
115
|
+
The root README now keeps current, actionable integration checks. The duplicate
|
|
116
|
+
early incident section, long one-off error diary and dated performance incident
|
|
117
|
+
register were removed, not relocated into a new archive document. Current API
|
|
118
|
+
limitations, performance guidance and publication gates remain documented.
|
|
119
|
+
The original complete 89,530-byte README was materialized from GitHub and verified
|
|
120
|
+
against blob `5b58348ff8f1a2b7ace30c3e8cae389dc7061c62` before generating the patch.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Validation from a clean checkout
|
|
2
|
+
|
|
3
|
+
[Release guide](../RELEASING.md)
|
|
4
|
+
|
|
5
|
+
Run the usual command from a complete DanceMoves checkout:
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\validate.ps1 -Mode Unit
|
|
9
|
+
if ($LASTEXITCODE -ne 0) { throw "Validation failed; do not release" }
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The coordinator now prepares the ignored unit HTML before any adapter test
|
|
13
|
+
tries to read it. No external song workspace, `Z:` drive, browser, network
|
|
14
|
+
request, audio download, C++ compiler or WordPress installation is required for
|
|
15
|
+
that preparation. Node, PHP and Python are still required by the test suite.
|
|
16
|
+
|
|
17
|
+
## Inputs and outputs
|
|
18
|
+
|
|
19
|
+
| Harness | Tracked input | Generated unit output |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| California | `tests/fixtures/california-screamin-unit.html` (synthetic DOM contract) | `qa/california-screamin-unit-candidate.html` |
|
|
22
|
+
| Clay | `qa/prelive/clay-stars/canonical-live-2.3.2.html` (existing pinned signed-out snapshot) | `qa/clay-stars-unit-candidate.html` |
|
|
23
|
+
|
|
24
|
+
The Clay source must match SHA-256
|
|
25
|
+
`2F3EC40E763E712CCFD5F94C818E0D651F9F98EF8CA925FEB05A9F39D464B038`.
|
|
26
|
+
The builder checks its title, single release root, single player, five chapter
|
|
27
|
+
controls and absence of the WordPress admin bar. It removes old plugin assets
|
|
28
|
+
and injects current local assets, including the effects and rudiments modules.
|
|
29
|
+
The current PHP header and `DANCE_MOVES_VERSION` must agree. Existing production
|
|
30
|
+
asset hashes in the harness manifests are still checked, not regenerated to
|
|
31
|
+
make tests pass.
|
|
32
|
+
|
|
33
|
+
California's fixture tests the expected adapter DOM and local asset wiring. It
|
|
34
|
+
is explicitly **not** the production page's layout, imagery, audio or complete
|
|
35
|
+
motion stack. Tests of native sensor mapping and lifecycle continue to run
|
|
36
|
+
against the actual production JavaScript elsewhere in the existing suite.
|
|
37
|
+
|
|
38
|
+
The generator writes only `*-unit-candidate.html`; existing
|
|
39
|
+
`*-harness-candidate.html` full-page QA files are not overwritten. Repeat runs
|
|
40
|
+
leave identical generated bytes and timestamps alone. Unit HTML is already
|
|
41
|
+
ignored by `qa/*.html` and remains excluded from the WordPress ZIP.
|
|
42
|
+
|
|
43
|
+
Preparation can also be invoked separately for diagnosis:
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
node .\tools\prepare-test-harnesses.cjs
|
|
47
|
+
node .\tests\california-adapter.test.cjs
|
|
48
|
+
node .\tests\clay-adapter.test.cjs
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Both adapter tests prepare their own unit input when invoked directly. Do not
|
|
52
|
+
create an empty missing HTML file or comment out a failing assertion.
|
|
53
|
+
|
|
54
|
+
## Why the old command failed
|
|
55
|
+
|
|
56
|
+
The old California adapter test unconditionally opened an ignored generated
|
|
57
|
+
file, but the Unit coordinator never generated it. The old preview builder
|
|
58
|
+
also assumed a private path under `Z:\My Songs\Releases\California Screamin'`.
|
|
59
|
+
Clay's test had the same unprepared-output dependency. Those private/generated
|
|
60
|
+
prerequisites are now outside the normal Unit path.
|
|
61
|
+
|
|
62
|
+
The historical preview builders are not called by Unit and have not been
|
|
63
|
+
silently repurposed as production evidence. Their full-page workflows still
|
|
64
|
+
need a verified source payload and appropriate live/browser review.
|
|
65
|
+
|
|
66
|
+
## Unit versus pre-live acceptance
|
|
67
|
+
|
|
68
|
+
The coordinator supplies `--candidate-file` to the existing Python scaffold
|
|
69
|
+
validator. It changes the candidate input for **that invocation only**, not the
|
|
70
|
+
manifest or its full-page path. All existing manifest, production-hash, CSS-risk
|
|
71
|
+
and encoding checks continue to run. A failure in either unit scaffold is fatal;
|
|
72
|
+
the California unit audit is no longer hidden behind a broad warning.
|
|
73
|
+
|
|
74
|
+
The generated HTML has:
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<meta name="dance-moves-fixture" content="unit-only">
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The Python validator reports this limitation during scaffold checks and rejects
|
|
81
|
+
it in `--mode prelive`. Pre-live mode also rejects `--candidate-file`, even when
|
|
82
|
+
called as a Python function instead of through the CLI. It still uses the
|
|
83
|
+
manifest's full-page candidate and requires the existing browser, screenshot and
|
|
84
|
+
physical-device evidence. A passing Unit run does not approve deployment.
|
|
85
|
+
|
|
86
|
+
## Missing or changed tracked input
|
|
87
|
+
|
|
88
|
+
A missing Clay source, wrong source hash, missing runtime asset, invalid release
|
|
89
|
+
identity or mismatched plugin version is a hard error before candidate writes.
|
|
90
|
+
Check `git status` and restore only the affected tracked input from the intended
|
|
91
|
+
revision after preserving deliberate local edits. Do not automatically update
|
|
92
|
+
hashes, copy an unrelated EPK or recreate a private drive to get past the error.
|
|
93
|
+
|
|
94
|
+
Regression checks added for this setup:
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
node .\tests\harness-preparation.test.cjs
|
|
98
|
+
python .\tests\test-harness-candidate-selection.py
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
No plugin runtime, page metadata, release version or packaging behavior changes
|
|
102
|
+
as part of this validation-setup repair.
|