Advance M7 workflows and release operations
This commit is contained in:
69
docs/web/operations-diagnostics.json
Normal file
69
docs/web/operations-diagnostics.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"product": "Web Blender Modeler V1",
|
||||
"entries": [
|
||||
{
|
||||
"id": "OPS-MIME",
|
||||
"domain": "mime",
|
||||
"signals": ["DEPLOYMENT_MIME_MISMATCH", "WebAssembly.instantiateStreaming failed", "module script refused"],
|
||||
"checks": ["HEAD the failing URL and record Content-Type", "compare the extension with deployment-contract.json mimeTypes"],
|
||||
"expected": [".wasm application/wasm", ".js text/javascript; charset=utf-8", ".json application/json; charset=utf-8"],
|
||||
"recovery": ["fix the server MIME map", "restart or reload proxy configuration", "repeat HEAD before refreshing Chromium"],
|
||||
"dataSafety": "Do not clear OPFS or IndexedDB; MIME failures occur before project bytes need mutation."
|
||||
},
|
||||
{
|
||||
"id": "OPS-RANGE",
|
||||
"domain": "range",
|
||||
"signals": ["DEPLOYMENT_RANGE_INVALID", "HTTP 416", "partial resource resume failed"],
|
||||
"checks": ["GET the resource with Range: bytes=0-15", "record status, Accept-Ranges, Content-Range, Content-Length and ETag", "repeat with matching and mismatching If-Range"],
|
||||
"expected": ["valid single range returns 206", "invalid or unsatisfied range returns 416", "If-Range mismatch returns full 200"],
|
||||
"recovery": ["enable single byte ranges without compression rewriting", "preserve strong ETag validators", "discard partial bytes from a different ETag before retry"],
|
||||
"dataSafety": "Never append bytes across different ETags; retain the last verified OPFS asset and project commit."
|
||||
},
|
||||
{
|
||||
"id": "OPS-ISOLATION",
|
||||
"domain": "isolation",
|
||||
"signals": ["PLATFORM_CAPABILITY_UNAVAILABLE", "crossOriginIsolated false", "SharedArrayBuffer unavailable"],
|
||||
"checks": ["confirm HTTPS or explicit http://127.0.0.1 loopback", "HEAD the document and error routes", "evaluate window.isSecureContext and window.crossOriginIsolated"],
|
||||
"expected": ["Cross-Origin-Opener-Policy same-origin", "Cross-Origin-Embedder-Policy require-corp", "Cross-Origin-Resource-Policy same-origin"],
|
||||
"recovery": ["restore the three headers on every response", "remove cross-origin runtime assets", "use the single variant only when the pthread capability gate is BLOCKED"],
|
||||
"dataSafety": "Do not open a pending project through a blocked pthread path; correcting headers does not require storage deletion."
|
||||
},
|
||||
{
|
||||
"id": "OPS-HASH",
|
||||
"domain": "hash",
|
||||
"signals": ["ENGINE_VARIANT_INTEGRITY_FAILED", "ENGINE_VARIANT_RESOURCE_HASH_MISMATCH", "manifest rejected"],
|
||||
"checks": ["fetch engine-manifest.json with no-cache", "hash the exact JS, WASM and pthread Worker response bytes", "compare releaseId and every declared SHA-256"],
|
||||
"expected": ["one releaseId binds both variants", "resource SHA-256 equals the manifest", "integrity failure performs no fallback and no project open"],
|
||||
"recovery": ["restore one complete immutable release", "purge only the corrupt HTTP cache entry", "reload the document and revalidate the manifest"],
|
||||
"dataSafety": "Keep the project unopened until all resource hashes pass; never repair integrity by editing project data."
|
||||
},
|
||||
{
|
||||
"id": "OPS-QUOTA",
|
||||
"domain": "quota",
|
||||
"signals": ["STORAGE_QUOTA", "QuotaExceededError", "OPFS staging write failed"],
|
||||
"checks": ["record navigator.storage.estimate usage and quota", "compare the committed project revision and SHA-256", "inspect staging and cache categories without deleting the committed blend"],
|
||||
"expected": ["old committed revision remains readable", "failed staging is not promoted", "Worker restart reports the same committed SHA-256"],
|
||||
"recovery": ["export the committed project", "remove explicitly selected disposable caches", "request persistent storage or free origin quota before retry"],
|
||||
"dataSafety": "Never delete scene.blend, its verified manifest or all site data as a quota recovery shortcut."
|
||||
},
|
||||
{
|
||||
"id": "OPS-WORKER",
|
||||
"domain": "worker",
|
||||
"signals": ["WORKER_TERMINATED", "Worker script load failed", "pending request aborted"],
|
||||
"checks": ["HEAD the content-hashed Worker URL", "confirm JavaScript MIME and immutable cache", "compare Worker assets with release-metadata.json", "capture pending request and resource counters"],
|
||||
"expected": ["all Workers belong to the current release", "terminated Worker publishes no late result", "restart rediscovers the committed project"],
|
||||
"recovery": ["reload to one complete current release", "restart the affected Worker", "reopen the last verified project revision"],
|
||||
"dataSafety": "Do not promote late Worker output or remove OPFS while recovering a Worker."
|
||||
},
|
||||
{
|
||||
"id": "OPS-GPU",
|
||||
"domain": "gpu",
|
||||
"signals": ["GPU_DEVICE_LOST", "GPU_TEXTURE_BUDGET_EXCEEDED", "NANOVDB_GPU_BUDGET_EXCEEDED"],
|
||||
"checks": ["record WebGL context loss or WebGPU device.lost reason", "record adapter limits and requested resident bytes", "confirm CPU, WASM and OPFS project revision did not change"],
|
||||
"expected": ["GPU resources release once", "bounded recovery recreates the viewport", "persistent project SHA-256 remains stable"],
|
||||
"recovery": ["reduce texture or NanoVDB resident budget", "recreate the viewport after device recovery", "reload the current release if bounded recovery fails"],
|
||||
"dataSafety": "GPU recovery may discard viewport resources only; it must not rewrite Main or the committed project."
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user