|
| 1 | +# PR_26156_142-147 Asset Roles and Storage Stacked Report |
| 2 | + |
| 3 | +Generated: 2026-06-05 |
| 4 | + |
| 5 | +## Scope |
| 6 | + |
| 7 | +Stacked PRs: |
| 8 | +- `PR_26156_142-asset-roles-reference-audit` |
| 9 | +- `PR_26156_143-asset-storage-contract` |
| 10 | +- `PR_26156_144-asset-role-library-model` |
| 11 | +- `PR_26156_145-asset-upload-workflow` |
| 12 | +- `PR_26156_146-asset-project-storage-integration` |
| 13 | +- `PR_26156_147-asset-validation-playwright` |
| 14 | + |
| 15 | +Read `docs_build/dev/PROJECT_INSTRUCTIONS.md` first. Continued from `PR_26156_136-141`. |
| 16 | + |
| 17 | +Archive reference use: |
| 18 | +- Read `archive/v1-v2/tools/old_asset-manager-v2/README.md`. |
| 19 | +- Read `archive/v1-v2/tools/old_asset-manager-v2/js/assetManagerMetadata.js`. |
| 20 | +- Read `archive/v1-v2/tools/old_asset-manager-v2/js/assetPreviewHelpers.js`. |
| 21 | +- Read `archive/v1-v2/tools/old_asset-manager-v2/js/services/AssetSchemaValidator.js`. |
| 22 | +- Read `archive/v1-v2/tools/old_asset-manager-v2/js/controls/AssetFormControl.js`. |
| 23 | +- Used archive material only to identify behavior expectations. No archive code was copied. No archived V1/V2 files were modified. |
| 24 | + |
| 25 | +No new CSS was added. No `start_of_day` folders were modified. |
| 26 | + |
| 27 | +## PR_26156_142 Role Audit |
| 28 | + |
| 29 | +| Role | Supported file types | Expected preview behavior | Validation needs | DB fields | |
| 30 | +| --- | --- | --- | --- | --- | |
| 31 | +| Audio | `.mp3`, `.wav`, `.ogg`, `.m4a`; audio MIME types | Browser audio metadata preview | MIME/extension match, non-zero size, project storage path | id, projectId, ownerProjectId, assetRole, originalName, storedPath, mimeType, size, checksum, createdAt, updatedAt | |
| 32 | +| Color | `.json` palette metadata | Swatch metadata preview | Hex/name metadata, deferred upload ownership | same uploaded metadata fields when implemented | |
| 33 | +| Data | `.json`, `.csv`, `.txt` | Text metadata preview | Format/schema declaration, deferred upload ownership | same uploaded metadata fields when implemented | |
| 34 | +| Font | `.woff`, `.woff2`, `.ttf`, `.otf` | Font sample preview | Font format validation, deferred upload ownership | same uploaded metadata fields when implemented | |
| 35 | +| Image | `.png`, `.jpg`, `.jpeg`, `.webp`, `.gif`, `.svg`; image MIME types | Image metadata preview | MIME/extension match, non-zero size, project storage path | id, projectId, ownerProjectId, assetRole, originalName, storedPath, mimeType, size, checksum, createdAt, updatedAt | |
| 36 | +| Localization | `.json`, `.po`, `.pot`, `.xliff`, `.xlf` | Localization key summary preview | Locale/format metadata, deferred upload ownership | same uploaded metadata fields when implemented | |
| 37 | +| Shader | `.glsl`, `.vert`, `.frag`, `.wgsl` | Shader source metadata preview | Stage metadata and render ownership, deferred upload ownership | same uploaded metadata fields when implemented | |
| 38 | +| Video | `.mp4`, `.webm`, `.mov`; video MIME types | Browser video metadata preview | MIME/extension match, non-zero size, project storage path | id, projectId, ownerProjectId, assetRole, originalName, storedPath, mimeType, size, checksum, createdAt, updatedAt | |
| 39 | + |
| 40 | +## PR_26156_143 Storage Contract |
| 41 | + |
| 42 | +Project-owned upload storage is represented by generated metadata paths: |
| 43 | + |
| 44 | +`assets/projects/<projectId>/<assetRole>/<fileName>` |
| 45 | + |
| 46 | +Examples: |
| 47 | +- `assets/projects/demo-project/image/player.png` |
| 48 | +- `assets/projects/demo-project/video/intro.mp4` |
| 49 | +- `assets/projects/demo-project/audio/theme.mp3` |
| 50 | + |
| 51 | +User/project uploads are separated from: |
| 52 | +- `assets/theme-v2` |
| 53 | +- public site images |
| 54 | +- app chrome and Theme V2 assets |
| 55 | + |
| 56 | +The mock repository stores metadata only. It does not persist file bytes, cloud state, auth state, or real database records. |
| 57 | + |
| 58 | +## PR_26156_144 Role Library Model |
| 59 | + |
| 60 | +Implemented in `toolbox/assets/assets-mock-repository.js`: |
| 61 | +- `ASSET_ROLE_DEFINITIONS` covers all eight roles. |
| 62 | +- `asset_role_definitions` table represents role metadata. |
| 63 | +- `asset_library_items` stores project asset records. |
| 64 | +- `asset_storage_objects` stores generated project storage metadata. |
| 65 | +- `asset_import_events` stores upload/import events. |
| 66 | +- `asset_validation_items` stores actionable validation findings. |
| 67 | + |
| 68 | +Implemented visible diagnostics in `toolbox/assets/index.html` and `toolbox/assets/assets.js`: |
| 69 | +- Asset Role Coverage table lists every role. |
| 70 | +- Role diagnostics list reports missing/invalid metadata or ready state. |
| 71 | +- DB Metadata panel shows original name, stored path, role, MIME type, size, checksum, and owner project. |
| 72 | + |
| 73 | +## PR_26156_145 Upload Workflow |
| 74 | + |
| 75 | +Implemented upload workflow first for: |
| 76 | +- Image |
| 77 | +- Video |
| 78 | +- Audio |
| 79 | + |
| 80 | +Upload validation checks: |
| 81 | +- active project and ready Game Configuration handoff |
| 82 | +- asset role |
| 83 | +- usage |
| 84 | +- file name |
| 85 | +- extension |
| 86 | +- MIME type |
| 87 | +- non-zero size |
| 88 | +- max size |
| 89 | +- generated storage path under the project-owned storage root |
| 90 | + |
| 91 | +Non-upload roles remain represented but fail visibly as planned when uploaded: |
| 92 | +- Color |
| 93 | +- Data |
| 94 | +- Font |
| 95 | +- Localization |
| 96 | +- Shader |
| 97 | + |
| 98 | +## PR_26156_146 Project Workspace Integration |
| 99 | + |
| 100 | +The Asset Tool requires active project context through the existing Game Configuration handoff. Missing or invalid project/configuration context: |
| 101 | +- hides the upload form |
| 102 | +- shows the missing-requirements overlay |
| 103 | +- keeps the library blocked |
| 104 | +- does not create a silent fallback project |
| 105 | +- does not write a global/site asset path |
| 106 | + |
| 107 | +Project Workspace lane was run because project-owned storage depends on active project context. |
| 108 | + |
| 109 | +## PR_26156_147 Targeted Playwright |
| 110 | + |
| 111 | +Updated `tests/playwright/tools/AssetToolMockRepository.spec.mjs` to cover: |
| 112 | +- SQL-shaped role/storage/metadata tables |
| 113 | +- all eight role definitions |
| 114 | +- visible role listing and diagnostics |
| 115 | +- active project handoff |
| 116 | +- Image upload metadata and preview |
| 117 | +- Video upload metadata and preview |
| 118 | +- Audio upload metadata and preview |
| 119 | +- no raw JSON output |
| 120 | +- no embedded data URL contract field in repository tables |
| 121 | +- visible extension/MIME validation failures |
| 122 | +- planned-role upload failure for Color |
| 123 | +- project-required upload overlay and hidden form |
| 124 | + |
| 125 | +## Validation |
| 126 | + |
| 127 | +Impacted lanes: |
| 128 | +- `asset-tool` |
| 129 | +- `project-workspace` |
| 130 | + |
| 131 | +Executed: |
| 132 | +- `node --check toolbox/assets/assets-mock-repository.js` |
| 133 | +- `node --check toolbox/assets/assets.js` |
| 134 | +- `node --check tests/playwright/tools/AssetToolMockRepository.spec.mjs` |
| 135 | +- `node ./scripts/run-targeted-test-lanes.mjs --lane asset-tool --lane project-workspace` |
| 136 | +- `git diff --check` |
| 137 | + |
| 138 | +Results: |
| 139 | +- Project Workspace lane: PASS, 8 tests. |
| 140 | +- Asset Tool lane: PASS, 4 tests. |
| 141 | +- `git diff --check`: PASS. Git reported line-ending warnings only for edited files. |
| 142 | + |
| 143 | +Skipped lanes: |
| 144 | +- Full samples smoke skipped because no sample JSON, sample loader, or sample runtime framework behavior changed. |
| 145 | +- Game Design, Game Configuration, Build Path, Tools Progress, tool navigation, tool images, tool runtime, engine, integration, games, and samples lanes skipped because this stack only changed the Asset Tool page/repository/test and its Project Workspace handoff validation. |
| 146 | + |
| 147 | +Theme V2 gaps: |
| 148 | +- None. Existing Theme V2 tables, cards, panels, buttons, status, and form table classes were sufficient. |
0 commit comments