implements PLN-0081

This commit is contained in:
bQUARKz 2026-05-23 22:17:34 +01:00
parent e044fc15fc
commit ad2bfeb66f
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
5 changed files with 44 additions and 16 deletions

View File

@ -1,5 +1,5 @@
{"type":"meta","next_id":{"DSC":39,"AGD":42,"DEC":38,"PLN":87,"LSN":53,"CLSN":1}} {"type":"meta","next_id":{"DSC":39,"AGD":42,"DEC":38,"PLN":87,"LSN":53,"CLSN":1}}
{"type":"discussion","id":"DSC-0038","status":"open","ticket":"studio-packer-rgba8888-asset-pipeline","title":"Studio and Packer RGBA8888 Asset Pipeline Alignment","created_at":"2026-05-23","updated_at":"2026-05-23","tags":["studio","packer","assets","glyph-bank","palette","rgba8888","runtime-alignment"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23","ref_agenda":"AGD-0041"}],"plans":[{"id":"PLN-0081","file":"PLN-0081-rgba8888-packer-and-studio-spec-propagation.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0082","file":"PLN-0082-rgba8888-palette-model-and-argb-conversion.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0083","file":"PLN-0083-rgba8888-glyph-payload-emission-and-sizes.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0084","file":"PLN-0084-rgba8888-packer-projections-and-workspace-apis.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0085","file":"PLN-0085-rgba8888-tests-fixtures-and-conformance.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0086","file":"PLN-0086-rgba8888-final-integration-and-residue-removal.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]}],"lessons":[]} {"type":"discussion","id":"DSC-0038","status":"open","ticket":"studio-packer-rgba8888-asset-pipeline","title":"Studio and Packer RGBA8888 Asset Pipeline Alignment","created_at":"2026-05-23","updated_at":"2026-05-23","tags":["studio","packer","assets","glyph-bank","palette","rgba8888","runtime-alignment"],"agendas":[{"id":"AGD-0041","file":"AGD-0041-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23"}],"decisions":[{"id":"DEC-0037","file":"DEC-0037-studio-packer-rgba8888-asset-pipeline.md","status":"accepted","created_at":"2026-05-23","updated_at":"2026-05-23","ref_agenda":"AGD-0041"}],"plans":[{"id":"PLN-0081","file":"PLN-0081-rgba8888-packer-and-studio-spec-propagation.md","status":"done","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0082","file":"PLN-0082-rgba8888-palette-model-and-argb-conversion.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0083","file":"PLN-0083-rgba8888-glyph-payload-emission-and-sizes.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0084","file":"PLN-0084-rgba8888-packer-projections-and-workspace-apis.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0085","file":"PLN-0085-rgba8888-tests-fixtures-and-conformance.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]},{"id":"PLN-0086","file":"PLN-0086-rgba8888-final-integration-and-residue-removal.md","status":"review","created_at":"2026-05-23","updated_at":"2026-05-23","ref_decisions":["DEC-0037"]}],"lessons":[]}
{"type":"discussion","id":"DSC-0037","status":"done","ticket":"pbs-autocomplete-parameter-names","title":"PBS autocomplete parameter names for stdlib and method calls","created_at":"2026-05-08","updated_at":"2026-05-14","tags":["compiler-pbs","studio","lsp","autocomplete","signature-help","stdlib"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0052","file":"discussion/lessons/DSC-0037-pbs-autocomplete-parameter-names/LSN-0052-canonical-callable-parameter-names-through-pbs-editor-assistance.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]} {"type":"discussion","id":"DSC-0037","status":"done","ticket":"pbs-autocomplete-parameter-names","title":"PBS autocomplete parameter names for stdlib and method calls","created_at":"2026-05-08","updated_at":"2026-05-14","tags":["compiler-pbs","studio","lsp","autocomplete","signature-help","stdlib"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0052","file":"discussion/lessons/DSC-0037-pbs-autocomplete-parameter-names/LSN-0052-canonical-callable-parameter-names-through-pbs-editor-assistance.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]}
{"type":"discussion","id":"DSC-0036","status":"open","ticket":"pbs-symbol-documentation-and-hover-markdown","title":"Modelo de documentacao de simbolos em PBS e consumo markdown no hover","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["compiler","compiler-pbs","studio","lsp","vscode","editor","hover","documentation","markdown"],"agendas":[{"id":"AGD-0039","file":"AGD-0039-pbs-symbol-documentation-and-hover-markdown.md","status":"open","created_at":"2026-05-08","updated_at":"2026-05-08"}],"decisions":[],"plans":[],"lessons":[]} {"type":"discussion","id":"DSC-0036","status":"open","ticket":"pbs-symbol-documentation-and-hover-markdown","title":"Modelo de documentacao de simbolos em PBS e consumo markdown no hover","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["compiler","compiler-pbs","studio","lsp","vscode","editor","hover","documentation","markdown"],"agendas":[{"id":"AGD-0039","file":"AGD-0039-pbs-symbol-documentation-and-hover-markdown.md","status":"open","created_at":"2026-05-08","updated_at":"2026-05-08"}],"decisions":[],"plans":[],"lessons":[]}
{"type":"discussion","id":"DSC-0035","status":"done","ticket":"pbs-lsp-editor-assistance-wave-1","title":"Wave 1 de assistencia editorial via LSP para PBS no VS Code","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["studio","lsp","vscode","compiler","compiler-pbs","editor","completion","hover","signature-help"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0051","file":"discussion/lessons/DSC-0035-pbs-lsp-editor-assistance-wave-1/LSN-0051-compiler-backed-editor-assistance-for-pbs.md","status":"done","created_at":"2026-05-08","updated_at":"2026-05-08"}]} {"type":"discussion","id":"DSC-0035","status":"done","ticket":"pbs-lsp-editor-assistance-wave-1","title":"Wave 1 de assistencia editorial via LSP para PBS no VS Code","created_at":"2026-05-08","updated_at":"2026-05-08","tags":["studio","lsp","vscode","compiler","compiler-pbs","editor","completion","hover","signature-help"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0051","file":"discussion/lessons/DSC-0035-pbs-lsp-editor-assistance-wave-1/LSN-0051-compiler-backed-editor-assistance-for-pbs.md","status":"done","created_at":"2026-05-08","updated_at":"2026-05-08"}]}

View File

@ -2,9 +2,9 @@
id: PLN-0081 id: PLN-0081
ticket: studio-packer-rgba8888-asset-pipeline ticket: studio-packer-rgba8888-asset-pipeline
title: RGBA8888 Packer and Studio Spec Propagation title: RGBA8888 Packer and Studio Spec Propagation
status: review status: done
created: 2026-05-23 created: 2026-05-23
completed: completed: 2026-05-23
ref_decisions: ref_decisions:
- DEC-0037 - DEC-0037
tags: tags:
@ -116,12 +116,12 @@ semantics unchanged.
## Acceptance Criteria ## Acceptance Criteria
- [ ] Packer specs define `rgba8888` as the canonical palette field. - [x] Packer specs define `rgba8888` as the canonical palette field.
- [ ] `GLYPH/indexed_v1` remains named exactly that. - [x] `GLYPH/indexed_v1` remains named exactly that.
- [ ] Palette block formulas use `64 * 16 * 4 = 4096`. - [x] Palette block formulas use `64 * 16 * 4 = 4096`.
- [ ] Specs state palette index `0` is ordinary and all 16 entries are usable. - [x] Specs state palette index `0` is ordinary and all 16 entries are usable.
- [ ] Specs state partial alpha is valid and magenta color-key is removed. - [x] Specs state partial alpha is valid and magenta color-key is removed.
- [ ] Specs leave `DSC-0005` variable palette-count work out of scope. - [x] Specs leave `DSC-0005` variable palette-count work out of scope.
## Dependencies ## Dependencies

View File

@ -118,6 +118,9 @@ Rules:
- collections such as `output.pipeline.palettes` may remain JSON arrays for authoring ergonomics; - collections such as `output.pipeline.palettes` may remain JSON arrays for authoring ergonomics;
- when a collection member has runtime- or packing-relevant identity, each entry must carry an explicit `index`; - when a collection member has runtime- or packing-relevant identity, each entry must carry an explicit `index`;
- `output.pipeline.palettes` entries must use the shape `{ "index": <int>, "palette": { ... } }`; - `output.pipeline.palettes` entries must use the shape `{ "index": <int>, "palette": { ... } }`;
- glyph-bank palette payloads must expose canonical `rgba8888` color values in runtime RGBA channel order;
- ARGB values produced by host image APIs are import-side implementation details, not canonical declaration or projection fields;
- `convertedRgb565` is not part of the normal palette contract;
- the packer must sort such entries by numeric `index`, not by physical array position; - the packer must sort such entries by numeric `index`, not by physical array position;
- duplicate or malformed indices are structural errors; - duplicate or malformed indices are structural errors;
- missing or malformed `palette` payloads are structural errors; - missing or malformed `palette` payloads are structural errors;
@ -133,8 +136,7 @@ Example:
{ {
"index": 0, "index": 0,
"palette": { "palette": {
"originalArgb8888": [4294901760, 4278255360], "rgba8888": [4294901760, 16711935]
"convertedRgb565": [63488, 2016]
} }
} }
] ]
@ -143,6 +145,19 @@ Example:
} }
``` ```
For glyph-bank palettes, each `rgba8888` integer is interpreted as
`0xRRGGBBAA`.
Rules:
- palette index `0` is an ordinary palette slot;
- glyph palettes expose 16 usable colors;
- transparency and partial transparency are represented only by the alpha byte
in the RGBA8888 palette value;
- alpha values from `0` through `255` are valid;
- magenta color-key behavior is not supported as a normal declaration,
projection, or publication rule.
## Metadata Source Segmentation and Runtime Sink ## Metadata Source Segmentation and Runtime Sink
`asset.json` may keep metadata segmented by concern during authoring. `asset.json` may keep metadata segmented by concern during authoring.

View File

@ -178,10 +178,10 @@ Rules:
- the serialized payload for `GLYPH/indexed_v1` is: - the serialized payload for `GLYPH/indexed_v1` is:
1. one packed `u4` pixel plane for the full emitted sheet; 1. one packed `u4` pixel plane for the full emitted sheet;
2. one palette block of `64 * 16 * 2 = 2048` bytes; 2. one palette block of `64 * 16 * 4 = 4096` bytes;
- packed pixel bytes must be emitted by the packer, not inferred later by the runtime; - packed pixel bytes must be emitted by the packer, not inferred later by the runtime;
- the palette block is serialized as `RGB565` `u16` values; - the palette block is serialized as RGBA8888 values in runtime RGBA channel order;
- palette bytes must be emitted in little-endian order; - each palette entry is emitted as four bytes in `R`, `G`, `B`, `A` order;
- payload interpretation must not depend on incidental per-artifact boundaries. - payload interpretation must not depend on incidental per-artifact boundaries.
### Runtime Entry Derivation ### Runtime Entry Derivation
@ -198,8 +198,8 @@ Rules:
- `palette_count` - `palette_count`
- tile-bank v1 requires `palette_count = 64`; - tile-bank v1 requires `palette_count = 64`;
- tile-bank v1 size formulas are: - tile-bank v1 size formulas are:
- `size = ceil(width * height / 2) + 2048` - `size = ceil(width * height / 2) + 4096`
- `decoded_size = (width * height) + 2048` - `decoded_size = (width * height) + 4096`
### Palette Contract ### Palette Contract
@ -207,8 +207,13 @@ Rules:
- bank palettes are declared under `output.pipeline.palettes`; - bank palettes are declared under `output.pipeline.palettes`;
- each palette declaration uses the shape `{ "index": <int>, "palette": { ... } }`; - each palette declaration uses the shape `{ "index": <int>, "palette": { ... } }`;
- each palette payload uses canonical `rgba8888` entries interpreted as `0xRRGGBBAA`;
- palette ordering is ascending numeric `index`, never raw array position; - palette ordering is ascending numeric `index`, never raw array position;
- palette ids in the emitted glyph bank are the normalized declared palette indices; - palette ids in the emitted glyph bank are the normalized declared palette indices;
- palette index `0` is ordinary and may carry any RGBA8888 value;
- glyph palettes have 16 usable entries;
- transparency and partial transparency are encoded only by RGBA alpha;
- magenta color-key behavior is not part of the normal glyph-bank contract;
- any tile in the bank may be rendered with any palette in the bank at runtime; - any tile in the bank may be rendered with any palette in the bank at runtime;
- palette selection is a runtime draw concern, not a tile-payload embedding concern. - palette selection is a runtime draw concern, not a tile-payload embedding concern.

View File

@ -224,6 +224,10 @@ Rules:
- `output.format` - `output.format`
- `codec` - `codec`
- `preload` - `preload`
- Glyph-bank palette projections must use canonical `rgba8888` values when
palette data is shown.
- Studio-facing glyph palette views must not expose `convertedRgb565` as normal
runtime or tooling truth.
- Runtime-facing output information must not require raw JSON inspection. - Runtime-facing output information must not require raw JSON inspection.
### Inputs / Preview ### Inputs / Preview
@ -328,6 +332,10 @@ Rules:
- `glyph_asset_id` is derived from the glyph asset selected for the layer; - `glyph_asset_id` is derived from the glyph asset selected for the layer;
- `parallax_factor_x` and `parallax_factor_y` are layer-owned editorial fields in Studio; - `parallax_factor_x` and `parallax_factor_y` are layer-owned editorial fields in Studio;
- `palette_id` has a layer-owned default and may be overridden per tile when the supported editorial surface provides an explicit override; - `palette_id` has a layer-owned default and may be overridden per tile when the supported editorial surface provides an explicit override;
- `palette_id` remains an index into the referenced glyph palette and does not
imply a color format change in the scene request;
- referenced glyph palettes resolve to RGBA8888 entries, with palette index `0`
treated as an ordinary palette slot;
- layer `active` determines whether the layer participates in publication output; - layer `active` determines whether the layer participates in publication output;
- tile `active` determines whether the tile contributes an active tile record to the published request; - tile `active` determines whether the tile contributes an active tile record to the published request;
- canonical scene persistence must not depend on `TMX`, `TSX`, or any other external file format remaining present on disk. - canonical scene persistence must not depend on `TMX`, `TSX`, or any other external file format remaining present on disk.