Skip to content

Commit f062ca2

Browse files
author
DavidQ
committed
PR 8.5: Workspace manifest palette linking
- Added explicit palette linkage to workspace.manifest - Enforced single-source-of-truth rule
1 parent 1ba544a commit f062ca2

5 files changed

Lines changed: 267 additions & 14 deletions

File tree

docs/dev/codex_commands.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ MODEL: GPT-5.3-codex
22
REASONING: medium
33

44
TASK:
5-
- Update palette.schema.json:
6-
- entries → swatches
7-
- enforce single-character symbol
8-
- enforce hex format
9-
- Migrate existing/generated palettes:
10-
- entries → swatches
11-
- s001 → single char symbols
12-
- Ensure uniqueness of symbol per palette
13-
- Preserve ordering
14-
- Do NOT add validators
5+
- Update workspace.manifest.json:
6+
- Add palette field to each sample that has a palette
7+
- Ensure:
8+
- All palette files are referenced
9+
- No duplicate references
10+
- No orphan palette files
11+
- Do NOT add validation utilities
1512
- Do NOT modify runtime
13+
- Do NOT modify start_of_day

docs/dev/commit_comment.txt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
PR 8.4: Palette schema swatches + symbol
1+
PR 8.5: Workspace manifest palette linking
22

3-
- Replaced entries with swatches
4-
- Added single-character symbol constraint
5-
- Normalized hex field
3+
- Added explicit palette linkage to workspace.manifest
4+
- Enforced single-source-of-truth rule
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# PR 8.5 — Workspace Manifest Palette Linking
2+
3+
## Purpose
4+
Make workspace.manifest explicitly link palettes to samples.
5+
6+
## Changes
7+
8+
### workspace.manifest.json (schema expectation)
9+
Each sample entry MUST declare:
10+
11+
```json
12+
{
13+
"sampleId": "0305",
14+
"tool": "vector-map-editor",
15+
"palette": "samples/phase-03/0305/sample.palette.json"
16+
}
17+
```
18+
19+
### Rules
20+
- Palette path REQUIRED when palette exists
21+
- Path must be relative repo path
22+
- No implicit palette discovery allowed
23+
- workspace.manifest is the ONLY source of truth
24+
25+
### Validation Expectations
26+
- Every palette file must be referenced by exactly one sample
27+
- No orphan palettes
28+
- No duplicate palette references
29+
30+
## Non-Goals
31+
- No runtime logic
32+
- No validators
33+
- No schema engine changes
34+
35+
## Acceptance
36+
- workspace.manifest fully links all palettes
37+
- No palette exists without manifest reference

docs/pr/manifest_palette_rules.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Manifest Palette Rules
2+
3+
## Source of Truth
4+
workspace.manifest.json defines:
5+
- sample ownership
6+
- tool mapping
7+
- palette linkage
8+
9+
## Required Fields
10+
- sampleId
11+
- tool
12+
- palette (when applicable)
13+
14+
## Do Not
15+
- Do not scan filesystem at runtime
16+
- Do not infer palettes
17+
- Do not allow missing palette references

workspace.manifest.json

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
{
2+
"documentKind": "workspace-manifest",
3+
"schema": "html-js-gaming.workspace-manifest.palette-links/1",
4+
"version": 1,
5+
"samples": [
6+
{
7+
"sampleId": "0207",
8+
"phase": "phase-02",
9+
"tool": "sprite-editor",
10+
"tools": [
11+
"sprite-editor"
12+
],
13+
"palette": "samples/phase-02/0207/sample.palette.json"
14+
},
15+
{
16+
"sampleId": "0213",
17+
"phase": "phase-02",
18+
"tool": "palette-browser",
19+
"tools": [
20+
"palette-browser",
21+
"sprite-editor"
22+
],
23+
"palette": "samples/phase-02/0213/sample.palette.json"
24+
},
25+
{
26+
"sampleId": "0214",
27+
"phase": "phase-02",
28+
"tool": "sprite-editor",
29+
"tools": [
30+
"sprite-editor"
31+
],
32+
"palette": "samples/phase-02/0214/sample.palette.json"
33+
},
34+
{
35+
"sampleId": "0219",
36+
"phase": "phase-02",
37+
"tool": "sprite-editor",
38+
"tools": [
39+
"sprite-editor"
40+
],
41+
"palette": "samples/phase-02/0219/sample.palette.json"
42+
},
43+
{
44+
"sampleId": "0221",
45+
"phase": "phase-02",
46+
"tool": "3d-json-payload-normalizer",
47+
"tools": [
48+
"3d-json-payload-normalizer",
49+
"tile-map-editor",
50+
"tile-model-converter"
51+
],
52+
"palette": "samples/phase-02/0221/sample.palette.json"
53+
},
54+
{
55+
"sampleId": "0224",
56+
"phase": "phase-02",
57+
"tool": "sprite-editor",
58+
"tools": [
59+
"sprite-editor",
60+
"tile-map-editor"
61+
],
62+
"palette": "samples/phase-02/0224/sample.palette.json"
63+
},
64+
{
65+
"sampleId": "0301",
66+
"phase": "phase-03",
67+
"tool": "sprite-editor",
68+
"tools": [
69+
"sprite-editor"
70+
],
71+
"palette": "samples/phase-03/0301/sample.palette.json"
72+
},
73+
{
74+
"sampleId": "0302",
75+
"phase": "phase-03",
76+
"tool": "sprite-editor",
77+
"tools": [
78+
"sprite-editor"
79+
],
80+
"palette": "samples/phase-03/0302/sample.palette.json"
81+
},
82+
{
83+
"sampleId": "0305",
84+
"phase": "phase-03",
85+
"tool": "3d-json-payload-normalizer",
86+
"tools": [
87+
"3d-json-payload-normalizer",
88+
"tile-map-editor",
89+
"tile-model-converter"
90+
],
91+
"palette": "samples/phase-03/0305/sample.palette.json"
92+
},
93+
{
94+
"sampleId": "0308",
95+
"phase": "phase-03",
96+
"tool": "palette-browser",
97+
"tools": [
98+
"palette-browser"
99+
],
100+
"palette": "samples/phase-03/0308/sample.palette.json"
101+
},
102+
{
103+
"sampleId": "0313",
104+
"phase": "phase-03",
105+
"tool": "palette-browser",
106+
"tools": [
107+
"palette-browser"
108+
],
109+
"palette": "samples/phase-03/0313/sample.palette.json"
110+
},
111+
{
112+
"sampleId": "0901",
113+
"phase": "phase-09",
114+
"tool": "vector-asset-studio",
115+
"tools": [
116+
"vector-asset-studio",
117+
"vector-map-editor"
118+
],
119+
"palette": "samples/phase-09/0901/sample.palette.json"
120+
},
121+
{
122+
"sampleId": "0905",
123+
"phase": "phase-09",
124+
"tool": "sprite-editor",
125+
"tools": [
126+
"sprite-editor"
127+
],
128+
"palette": "samples/phase-09/0905/sample.palette.json"
129+
},
130+
{
131+
"sampleId": "1204",
132+
"phase": "phase-12",
133+
"tool": "parallax-editor",
134+
"tools": [
135+
"parallax-editor",
136+
"vector-asset-studio",
137+
"vector-map-editor"
138+
],
139+
"palette": "samples/phase-12/1204/sample.palette.json"
140+
},
141+
{
142+
"sampleId": "1205",
143+
"phase": "phase-12",
144+
"tool": "parallax-editor",
145+
"tools": [
146+
"parallax-editor",
147+
"vector-map-editor"
148+
],
149+
"palette": "samples/phase-12/1205/sample.palette.json"
150+
},
151+
{
152+
"sampleId": "1208",
153+
"phase": "phase-12",
154+
"tool": "3d-asset-viewer",
155+
"tools": [
156+
"3d-asset-viewer",
157+
"3d-json-payload-normalizer",
158+
"parallax-editor",
159+
"tile-map-editor",
160+
"vector-asset-studio"
161+
],
162+
"palette": "samples/phase-12/1208/sample.palette.json"
163+
},
164+
{
165+
"sampleId": "1209",
166+
"phase": "phase-12",
167+
"tool": "tile-map-editor",
168+
"tools": [
169+
"tile-map-editor",
170+
"tile-model-converter"
171+
],
172+
"palette": "samples/phase-12/1209/sample.palette.json"
173+
},
174+
{
175+
"sampleId": "1210",
176+
"phase": "phase-12",
177+
"tool": "tile-map-editor",
178+
"tools": [
179+
"tile-map-editor"
180+
],
181+
"palette": "samples/phase-12/1210/sample.palette.json"
182+
},
183+
{
184+
"sampleId": "1211",
185+
"phase": "phase-12",
186+
"tool": "tile-map-editor",
187+
"tools": [
188+
"tile-map-editor"
189+
],
190+
"palette": "samples/phase-12/1211/sample.palette.json"
191+
},
192+
{
193+
"sampleId": "1414",
194+
"phase": "phase-14",
195+
"tool": "sprite-editor",
196+
"tools": [
197+
"sprite-editor"
198+
],
199+
"palette": "samples/phase-14/1414/sample.palette.json"
200+
}
201+
]
202+
}

0 commit comments

Comments
 (0)