@bongos/core 1.19.414 → 1.19.415

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.
Files changed (44) hide show
  1. package/.bongos-core.json +166 -21
  2. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg +0 -0
  3. package/docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json +13 -0
  4. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg +0 -0
  5. package/docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json +13 -0
  6. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg +0 -0
  7. package/docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json +13 -0
  8. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg +0 -0
  9. package/docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json +13 -0
  10. package/docs/design/mocks/hub/planets.html +127 -3
  11. package/docs/design/projects-hub-direction-v2.md +10 -0
  12. package/docs/module-api-changelog.md +2 -0
  13. package/modules/platform-identity/migrations/platform_identity_013_project_template_materials.sql +31 -0
  14. package/modules/platform-identity/platform-identity.js +18 -5
  15. package/modules/platform-identity/routes/projects.js +3 -2
  16. package/modules/platform-identity/tests/platform-identity.mjs +23 -12
  17. package/modules/ui-design/kit/fixtures/featured.json +1 -1
  18. package/package-lock.json +2 -2
  19. package/package.json +1 -1
  20. package/public-landing/assets/cosmos.css +47 -1
  21. package/public-landing/assets/world/r3-frost-bead-cut.webp +0 -0
  22. package/public-landing/assets/world/r3-frost-bead-cut.webp.json +15 -0
  23. package/public-landing/assets/world/r3-frost-blob-cut.webp +0 -0
  24. package/public-landing/assets/world/r3-frost-blob-cut.webp.json +15 -0
  25. package/public-landing/assets/world/r3-frost-pair-cut.webp +0 -0
  26. package/public-landing/assets/world/r3-frost-pair-cut.webp.json +15 -0
  27. package/public-landing/assets/world/r3-gold-bead-cut.webp +0 -0
  28. package/public-landing/assets/world/r3-gold-bead-cut.webp.json +15 -0
  29. package/public-landing/assets/world/r3-gold-blob-cut.webp +0 -0
  30. package/public-landing/assets/world/r3-gold-blob-cut.webp.json +15 -0
  31. package/public-landing/assets/world/r3-gold-pair-cut.webp +0 -0
  32. package/public-landing/assets/world/r3-gold-pair-cut.webp.json +15 -0
  33. package/public-landing/assets/world/r3-obsidian-bead-cut.webp +0 -0
  34. package/public-landing/assets/world/r3-obsidian-bead-cut.webp.json +15 -0
  35. package/public-landing/assets/world/r3-obsidian-blob-cut.webp +0 -0
  36. package/public-landing/assets/world/r3-obsidian-blob-cut.webp.json +15 -0
  37. package/public-landing/assets/world/r3-obsidian-pair-cut.webp +0 -0
  38. package/public-landing/assets/world/r3-obsidian-pair-cut.webp.json +15 -0
  39. package/public-landing/assets/world/r3-space-nebula.jpg +0 -0
  40. package/public-landing/assets/world/r3-space-nebula.jpg.json +13 -0
  41. package/public-landing/projects.html +23 -14
  42. package/public-landing/projects.states.json +1 -1
  43. package/src/module-api.js +1 -1
  44. package/tests/projects_hub.mjs +68 -18
package/.bongos-core.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.414",
6
- "core_contract": "1.19.414",
7
- "source_commit": "bf02216b3497eb7540e382dd5c4189a70fbb8cbc",
5
+ "core_version": "1.19.415",
6
+ "core_contract": "1.19.415",
7
+ "source_commit": "6e1130920b6477c117c5b10a7f2754db87ef558a",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-29T15:34:28.312Z",
9
+ "built_at": "2026-08-29T16:12:53.136Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 355,
13
13
  "agent_docs_stubbed": 23,
14
- "functional_verbatim": 1669,
14
+ "functional_verbatim": 1698,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2047,
20
- "tree_sha256": "3ddb8a1e6c1997334734b740a0d435c770fc0bc811945f456e9ee7d61a046ed5",
19
+ "file_count": 2076,
20
+ "tree_sha256": "992018f989d8c0b69b801d98f5bae82fb871101fb97f42f1dd43c3b4a63548cf",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -1609,6 +1609,46 @@
1609
1609
  "mode": "0000644",
1610
1610
  "sha256": "c77dbf2152c6109b6ce925e2badf6dfaa74f74c2d0cb7eb76fa1101eec7b3310"
1611
1611
  },
1612
+ {
1613
+ "path": "docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg",
1614
+ "mode": "0000644",
1615
+ "sha256": "e71d93b80bbad4dc603a7536f549d4e676d907a955b56f04e351c29aebe85383"
1616
+ },
1617
+ {
1618
+ "path": "docs/design/mocks/hub/assets/r3-space-deepfield-half.jpg.json",
1619
+ "mode": "0000644",
1620
+ "sha256": "a3b4363ceded0fa82a8def87a582e06c16085f30e983bf13f09b7764c4db4276"
1621
+ },
1622
+ {
1623
+ "path": "docs/design/mocks/hub/assets/r3-space-dust-half.jpg",
1624
+ "mode": "0000644",
1625
+ "sha256": "9961ed377857436697342797e5edb37d703d38afc3d6a1a0907f01cf7f63ae65"
1626
+ },
1627
+ {
1628
+ "path": "docs/design/mocks/hub/assets/r3-space-dust-half.jpg.json",
1629
+ "mode": "0000644",
1630
+ "sha256": "91a5ce1f09294c5e0b871744f2b48411fff91efa1c204f9bded23d6098132238"
1631
+ },
1632
+ {
1633
+ "path": "docs/design/mocks/hub/assets/r3-space-nebula-half.jpg",
1634
+ "mode": "0000644",
1635
+ "sha256": "86d568153e1067a90cd80781b5a69a06f17aec17ce00722cbb5ecee46731bbaa"
1636
+ },
1637
+ {
1638
+ "path": "docs/design/mocks/hub/assets/r3-space-nebula-half.jpg.json",
1639
+ "mode": "0000644",
1640
+ "sha256": "a40d8f172a8e4cebea966e6b241ca972b200345874f65fe56eacf0777d3f66fb"
1641
+ },
1642
+ {
1643
+ "path": "docs/design/mocks/hub/assets/r3-space-starfield-half.jpg",
1644
+ "mode": "0000644",
1645
+ "sha256": "1b6f8ec5b0901330261bd87bfaacffcb0f7c2347c11936cbc5ca3375908671cd"
1646
+ },
1647
+ {
1648
+ "path": "docs/design/mocks/hub/assets/r3-space-starfield-half.jpg.json",
1649
+ "mode": "0000644",
1650
+ "sha256": "388a176e498d336119f144abddf7a4ebe12a816509938ffae0f11a374b04e552"
1651
+ },
1612
1652
  {
1613
1653
  "path": "docs/design/mocks/hub/hub-sheet.html",
1614
1654
  "mode": "0000644",
@@ -1617,7 +1657,7 @@
1617
1657
  {
1618
1658
  "path": "docs/design/mocks/hub/planets.html",
1619
1659
  "mode": "0000644",
1620
- "sha256": "f6588907896fed45fa541f65e6a2bb3b55f986367360f335f5b30b2a77f90aa7"
1660
+ "sha256": "6315757db4385da41ee78199a31cc312736e074676d47a3876f7707c86785962"
1621
1661
  },
1622
1662
  {
1623
1663
  "path": "docs/design/mocks/hub/v1.html",
@@ -1812,7 +1852,7 @@
1812
1852
  {
1813
1853
  "path": "docs/design/projects-hub-direction-v2.md",
1814
1854
  "mode": "0000644",
1815
- "sha256": "30e3f767670141d142a3fc3608eb37745847d011c4659d61b20f67c10ef9e75a"
1855
+ "sha256": "591cc1d627cc64240c02bee54ef1cce0dd9c68207a52365e8423e7630af7c483"
1816
1856
  },
1817
1857
  {
1818
1858
  "path": "docs/design/projects-hub-direction.md",
@@ -1872,7 +1912,7 @@
1872
1912
  {
1873
1913
  "path": "docs/module-api-changelog.md",
1874
1914
  "mode": "0000644",
1875
- "sha256": "6eda8322f061bd29596304e3f51444eb69ba89d6e30da19b3a07fcf55fc900b2"
1915
+ "sha256": "728e49741b202322cb1e86147fd1a063e9421d094e6fa39ebbf11afa216ab23e"
1876
1916
  },
1877
1917
  {
1878
1918
  "path": "docs/modules-contract.md",
@@ -4789,6 +4829,11 @@
4789
4829
  "mode": "0000644",
4790
4830
  "sha256": "297c6a01f7de133dd9b97daa082ed64465c32349d90ef6ddc6cbfacfac034da3"
4791
4831
  },
4832
+ {
4833
+ "path": "modules/platform-identity/migrations/platform_identity_013_project_template_materials.sql",
4834
+ "mode": "0000644",
4835
+ "sha256": "50b993d4cdad3981b4ace6c60c4f9ee350076a2ee9b205b7fc7d80de255f492e"
4836
+ },
4792
4837
  {
4793
4838
  "path": "modules/platform-identity/module.json",
4794
4839
  "mode": "0000644",
@@ -4797,7 +4842,7 @@
4797
4842
  {
4798
4843
  "path": "modules/platform-identity/platform-identity.js",
4799
4844
  "mode": "0000644",
4800
- "sha256": "b3a8ecce278904a12caa0fbebbcabd3cd122aab6753e026b1b5719547497302d"
4845
+ "sha256": "b1b610069c8cc4db794b0a766f7cd608cffd0129c19f6548da86d75ffaa57687"
4801
4846
  },
4802
4847
  {
4803
4848
  "path": "modules/platform-identity/pollers/code-sweep.js",
@@ -4822,7 +4867,7 @@
4822
4867
  {
4823
4868
  "path": "modules/platform-identity/routes/projects.js",
4824
4869
  "mode": "0000644",
4825
- "sha256": "28663a3945f415c9b9ab092c776cf92fc4134d0b8afd8bb302dd65ca7ce9fb3a"
4870
+ "sha256": "cad8af2040afe189f2a5964af66b872bb1897d4259f73cab24765671a295493d"
4826
4871
  },
4827
4872
  {
4828
4873
  "path": "modules/platform-identity/routes/public-profile.js",
@@ -4842,7 +4887,7 @@
4842
4887
  {
4843
4888
  "path": "modules/platform-identity/tests/platform-identity.mjs",
4844
4889
  "mode": "0000644",
4845
- "sha256": "5f1f05910d01d4a83e2134149311a9333aef8d93561cb37bcee1566fb2cfc1c7"
4890
+ "sha256": "aeeda004820071e63bce92d60a21fa831f72ee8ba449a41d93c6a108e19571e9"
4846
4891
  },
4847
4892
  {
4848
4893
  "path": "modules/platform-identity/ui/.gitkeep",
@@ -5282,7 +5327,7 @@
5282
5327
  {
5283
5328
  "path": "modules/ui-design/kit/fixtures/featured.json",
5284
5329
  "mode": "0000644",
5285
- "sha256": "c9eca47c15c2450c38d1c452faa313926e1fe0c4b1b3afa6cb533048b4249755"
5330
+ "sha256": "3fe95d4cc3a31c92b2b02040141dac487ac543a8e4551695883ae3cdf905e7c1"
5286
5331
  },
5287
5332
  {
5288
5333
  "path": "modules/ui-design/kit/fixtures/leaderboard.json",
@@ -5377,12 +5422,12 @@
5377
5422
  {
5378
5423
  "path": "package-lock.json",
5379
5424
  "mode": "0000644",
5380
- "sha256": "e7dc4f709fce538cf1f3eb7aa8e3ca2e68dbe66defc8f3f4ceb4bd2b95f76271"
5425
+ "sha256": "5d5bd36ca85d6db8f0d37e036f6660c525eb07e49335f76d3fc23f33a4b56fe5"
5381
5426
  },
5382
5427
  {
5383
5428
  "path": "package.json",
5384
5429
  "mode": "0000644",
5385
- "sha256": "0e5ef83c47bd5bf9019c0110780af60d34cd5e01fb7d0a2f1a4354b2b371f93d"
5430
+ "sha256": "b1bf9ff0d5e9155030c651fa5eea3e1ce81a683394b7090c5d48b1a87fc79ada"
5386
5431
  },
5387
5432
  {
5388
5433
  "path": "public-docs/index.html",
@@ -5622,7 +5667,7 @@
5622
5667
  {
5623
5668
  "path": "public-landing/assets/cosmos.css",
5624
5669
  "mode": "0000644",
5625
- "sha256": "7e8e7a9bc2797d0bc6be5c2de46639307813047a60bd5904c60e1bded49bdef2"
5670
+ "sha256": "d65178a447cd76e5d2a7e7ecc675ddf94ad24c9badb3a19112f0c3802462572f"
5626
5671
  },
5627
5672
  {
5628
5673
  "path": "public-landing/assets/verro-medallion.png",
@@ -5699,6 +5744,106 @@
5699
5744
  "mode": "0000644",
5700
5745
  "sha256": "2a5f75efe5cbb8181852f662b70c820a1d55aaef5be5ec6ae304e75c22a929d5"
5701
5746
  },
5747
+ {
5748
+ "path": "public-landing/assets/world/r3-frost-bead-cut.webp",
5749
+ "mode": "0000644",
5750
+ "sha256": "9b5206027f9fe933a1a8c19f0ea2862def07934be3dfe8e75420ac25233677be"
5751
+ },
5752
+ {
5753
+ "path": "public-landing/assets/world/r3-frost-bead-cut.webp.json",
5754
+ "mode": "0000644",
5755
+ "sha256": "889a52596b7eb5dda8efd55b40876cecca7b375b48b63f9bfe6fcde712b9b4ed"
5756
+ },
5757
+ {
5758
+ "path": "public-landing/assets/world/r3-frost-blob-cut.webp",
5759
+ "mode": "0000644",
5760
+ "sha256": "b91be7ab3e5c10a57cac17357e988eac5c65d548109ff5d6b9e0421c8a2ba0fb"
5761
+ },
5762
+ {
5763
+ "path": "public-landing/assets/world/r3-frost-blob-cut.webp.json",
5764
+ "mode": "0000644",
5765
+ "sha256": "2bad6189937cc4411f38f97c76b6e3763bd1ea4316f6ca15fb6f5cf37b2c143d"
5766
+ },
5767
+ {
5768
+ "path": "public-landing/assets/world/r3-frost-pair-cut.webp",
5769
+ "mode": "0000644",
5770
+ "sha256": "9a5b56345ae6ff65865dac295170f8a4d3f7ee826f90e8f033528a487b3efff1"
5771
+ },
5772
+ {
5773
+ "path": "public-landing/assets/world/r3-frost-pair-cut.webp.json",
5774
+ "mode": "0000644",
5775
+ "sha256": "fb8fe4e6e634b576c137671a530fe768ba6fd9b692c4a64f193b7354d3f6a068"
5776
+ },
5777
+ {
5778
+ "path": "public-landing/assets/world/r3-gold-bead-cut.webp",
5779
+ "mode": "0000644",
5780
+ "sha256": "b88e17e1f073518c148134a4b59c0b6c5243c23e6d216881dddb044c2eeb7408"
5781
+ },
5782
+ {
5783
+ "path": "public-landing/assets/world/r3-gold-bead-cut.webp.json",
5784
+ "mode": "0000644",
5785
+ "sha256": "8148b61264d4f4472bdddd452c424422601f4934b1d70fa2c290b153099fef9d"
5786
+ },
5787
+ {
5788
+ "path": "public-landing/assets/world/r3-gold-blob-cut.webp",
5789
+ "mode": "0000644",
5790
+ "sha256": "6dcad0d34964faa11b281de9fbf5c18019f3958cfe917c556f37295305acc2dd"
5791
+ },
5792
+ {
5793
+ "path": "public-landing/assets/world/r3-gold-blob-cut.webp.json",
5794
+ "mode": "0000644",
5795
+ "sha256": "da5219518adfe28c4648e35c5205d3b8a933c06e6199068bf96887149eb41461"
5796
+ },
5797
+ {
5798
+ "path": "public-landing/assets/world/r3-gold-pair-cut.webp",
5799
+ "mode": "0000644",
5800
+ "sha256": "969326c7530012f5d3150ad771c01d4767ab2223f308d15fe2c425a599169996"
5801
+ },
5802
+ {
5803
+ "path": "public-landing/assets/world/r3-gold-pair-cut.webp.json",
5804
+ "mode": "0000644",
5805
+ "sha256": "a5317bb1b0d1dadd3d0ad2d8b51514709a28dbf592ea710e00ce328b0e0863f7"
5806
+ },
5807
+ {
5808
+ "path": "public-landing/assets/world/r3-obsidian-bead-cut.webp",
5809
+ "mode": "0000644",
5810
+ "sha256": "b49b1f2ea25babd30a5a3715c6411805db78f7fae9a4a052c2a9c7d301d21892"
5811
+ },
5812
+ {
5813
+ "path": "public-landing/assets/world/r3-obsidian-bead-cut.webp.json",
5814
+ "mode": "0000644",
5815
+ "sha256": "c376cc186c82a40de977ffa828d2d65bb3db6d61c2e17c0bcaa72b81086a49a2"
5816
+ },
5817
+ {
5818
+ "path": "public-landing/assets/world/r3-obsidian-blob-cut.webp",
5819
+ "mode": "0000644",
5820
+ "sha256": "e0ea04cfa3fe5a1308db88379d568066552e2d50be7730033c3a51885439232c"
5821
+ },
5822
+ {
5823
+ "path": "public-landing/assets/world/r3-obsidian-blob-cut.webp.json",
5824
+ "mode": "0000644",
5825
+ "sha256": "19a5e7ff35c6d783327a5d02874ff8febd53744b091e25f38c6254e506952b4f"
5826
+ },
5827
+ {
5828
+ "path": "public-landing/assets/world/r3-obsidian-pair-cut.webp",
5829
+ "mode": "0000644",
5830
+ "sha256": "49e77b7f924a2863d05c1f5dfe82c2bd984032adda8953af1ae0d63668f5b8d0"
5831
+ },
5832
+ {
5833
+ "path": "public-landing/assets/world/r3-obsidian-pair-cut.webp.json",
5834
+ "mode": "0000644",
5835
+ "sha256": "fdc7788dabb01b574f105526b99d2a72d1d49086baee85c1745dfaa6606f3356"
5836
+ },
5837
+ {
5838
+ "path": "public-landing/assets/world/r3-space-nebula.jpg",
5839
+ "mode": "0000644",
5840
+ "sha256": "fb185588f5afcbd6067f68ed951b60f19b3634af0d10e3b11bda8c8c25d1cab6"
5841
+ },
5842
+ {
5843
+ "path": "public-landing/assets/world/r3-space-nebula.jpg.json",
5844
+ "mode": "0000644",
5845
+ "sha256": "3608a9d822e343e81a91e1e40eca05726a0569ae2b9daa1a074c3352fbbe4e5c"
5846
+ },
5702
5847
  {
5703
5848
  "path": "public-landing/buddha.png",
5704
5849
  "mode": "0000644",
@@ -5732,7 +5877,7 @@
5732
5877
  {
5733
5878
  "path": "public-landing/projects.html",
5734
5879
  "mode": "0000644",
5735
- "sha256": "5587b1f04ecf15c2b6a6a931bde87311414a995d83d18018f8a7162b423b7d24"
5880
+ "sha256": "6d67e17827d007228c41e7d2dc7d823a5c33a81cb904f1a7e4b0849daf290974"
5736
5881
  },
5737
5882
  {
5738
5883
  "path": "public-landing/projects.probes.json",
@@ -5742,7 +5887,7 @@
5742
5887
  {
5743
5888
  "path": "public-landing/projects.states.json",
5744
5889
  "mode": "0000644",
5745
- "sha256": "54d54a1fab92aa72ab8c09e9643d0e42524001d54c06d9d996f20958f6e3fa02"
5890
+ "sha256": "3c771c4f139b543c187620f7542970ca0e03c96668716c986ea24385c7090cab"
5746
5891
  },
5747
5892
  {
5748
5893
  "path": "public-landing/terms.html",
@@ -7397,7 +7542,7 @@
7397
7542
  {
7398
7543
  "path": "src/module-api.js",
7399
7544
  "mode": "0000644",
7400
- "sha256": "46d6abde6c291f8fa9168dfbe98b2dabfcd7c04dea6901a2df4fa343dc8764de"
7545
+ "sha256": "85ade7dd85598993897af78be6cee56b8476a8bb1762866b3e6fc9586bad3694"
7401
7546
  },
7402
7547
  {
7403
7548
  "path": "src/module-loader/catalog.js",
@@ -9417,7 +9562,7 @@
9417
9562
  {
9418
9563
  "path": "tests/projects_hub.mjs",
9419
9564
  "mode": "0000644",
9420
- "sha256": "5da44f27ff5f930077237722957eabe02f5965602a8fed0927e0311f278273d0"
9565
+ "sha256": "16d5ed7e9d6c24b8743996e8de44674297ef1355605f90b60783cd6fba419ea0"
9421
9566
  },
9422
9567
  {
9423
9568
  "path": "tests/projects_hub_pre_uat.mjs",
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "backdrop",
3
+ "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
+ "aspect_ratio": "16:9",
5
+ "resolution": "2k",
6
+ "generated": "2026-08-29T15:37Z",
7
+ "round": 3,
8
+ "task": 1003337,
9
+ "prompt": "Deep-space photograph on a pure black ground: almost entirely black with a barely-there violet-to-blue gradient in the upper left corner and a handful of pin-sharp stars, maximal emptiness, no nebula, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black everywhere but the faint corner.",
10
+ "source": ".impeccable/mocks/world-assets/r3-space-deepfield.jpg",
11
+ "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
+ "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "backdrop",
3
+ "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
+ "aspect_ratio": "16:9",
5
+ "resolution": "2k",
6
+ "generated": "2026-08-29T15:37Z",
7
+ "round": 3,
8
+ "task": 1003337,
9
+ "prompt": "Deep-space photograph on a pure black ground: thin drifting cosmic dust filaments in bronze and cool blue crossing the frame diagonally, sparse pin-sharp stars, one soft distant glow low right, generous empty black, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
+ "source": ".impeccable/mocks/world-assets/r3-space-dust.jpg",
11
+ "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
+ "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "backdrop",
3
+ "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
+ "aspect_ratio": "16:9",
5
+ "resolution": "2k",
6
+ "generated": "2026-08-29T15:37Z",
7
+ "round": 3,
8
+ "task": 1003337,
9
+ "prompt": "Deep-space photograph on a pure black ground: a faint wide nebula wash in muted violet and deep blue with a soft bronze warmth along one edge, very sparse pin-sharp stars of varied brightness and size, gentle depth, most of the frame near-black, nothing else, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
+ "source": ".impeccable/mocks/world-assets/r3-space-nebula.jpg",
11
+ "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
+ "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "backdrop",
3
+ "model": "nano_banana_2 (requested as nano_banana_pro; the catalog served nano_banana_2)",
4
+ "aspect_ratio": "16:9",
5
+ "resolution": "2k",
6
+ "generated": "2026-08-29T15:37Z",
7
+ "round": 3,
8
+ "task": 1003337,
9
+ "prompt": "Deep-space photograph on a pure black ground: a fine field of pin-sharp stars in three depths (a few bright, many mid, a faint dust of tiny ones), a barely visible cool haze band drifting across the lower third, no nebula colour, no planets, no ground plane, no horizon, no lens flare, no text, no watermark. Pure black dominates.",
10
+ "source": ".impeccable/mocks/world-assets/r3-space-starfield.jpg",
11
+ "encoded": "ffmpeg JPEG -q:v 5 at 1376px (the sheet's candidate; docs/ is served raw by the kit's stub)",
12
+ "use": "docs/design/mocks/hub/planets.html ?state=backdrops"
13
+ }
@@ -126,7 +126,32 @@ body{
126
126
  section[data-state]{display:none;}
127
127
  body[data-state="sheet"] section[data-state="sheet"],
128
128
  body[data-state="void"] section[data-state="void"],
129
- body[data-state="grid"] section[data-state="grid"]{display:block;}
129
+ body[data-state="grid"] section[data-state="grid"],
130
+ body[data-state="backdrops"] section[data-state="backdrops"],
131
+ body[data-state="materials"] section[data-state="materials"]{display:block;}
132
+ /* round 3 (task 1003337): the materials' crops, byte-equal to cosmos.css (patch-checked), on
133
+ the generic attribute pair so the sheet's .planet and the field's .worldOrb share them;
134
+ the candidate backdrops as the field's ground (half-size copies, served raw from docs/) */
135
+ [data-style="plain"]{--tpl-ink:transparent;--tpl-blend:normal;}
136
+ [data-material="frost"][data-shape="blob"]{--tpl-src:var(--plate-frost-blob-cut);--tpl-ar:1.25629;--tpl-zoom:1.46135;--tpl-px:-.22359;--tpl-py:-.34269;}
137
+ [data-material="frost"][data-shape="pair"]{--tpl-src:var(--plate-frost-pair-cut);--tpl-ar:1.91273;--tpl-zoom:1.09673;--tpl-px:-.04837;--tpl-py:-.28669;}
138
+ [data-material="frost"][data-shape="bead"]{--tpl-src:var(--plate-frost-bead-cut);--tpl-ar:.98831;--tpl-zoom:1.49678;--tpl-px:-.22976;--tpl-py:-.23769;}
139
+ [data-material="gold"][data-shape="blob"]{--tpl-src:var(--plate-gold-blob-cut);--tpl-ar:.91864;--tpl-zoom:1.31406;--tpl-px:-.1477;--tpl-py:-.11629;}
140
+ [data-material="gold"][data-shape="pair"]{--tpl-src:var(--plate-gold-pair-cut);--tpl-ar:1.86206;--tpl-zoom:1.08625;--tpl-px:-.04367;--tpl-py:-.28123;}
141
+ [data-material="gold"][data-shape="bead"]{--tpl-src:var(--plate-gold-bead-cut);--tpl-ar:1.00479;--tpl-zoom:1.08272;--tpl-px:-.04244;--tpl-py:-.04244;}
142
+ [data-material="obsidian"][data-shape="blob"]{--tpl-src:var(--plate-obsidian-blob-cut);--tpl-ar:.794;--tpl-zoom:1.55448;--tpl-px:-.2697;--tpl-py:-.15965;}
143
+ [data-material="obsidian"][data-shape="pair"]{--tpl-src:var(--plate-obsidian-pair-cut);--tpl-ar:2.23705;--tpl-zoom:1.0248;--tpl-px:-.01015;--tpl-py:-.30191;}
144
+ [data-material="obsidian"][data-shape="bead"]{--tpl-src:var(--plate-obsidian-bead-cut);--tpl-ar:1.0027;--tpl-zoom:1.34698;--tpl-px:-.17053;--tpl-py:-.17255;}
145
+ .mock .field[data-backdrop] .ground{background:var(--sky-bg) var(--cand) center/cover no-repeat;}
146
+ .mock .field[data-backdrop="nebula"]{--cand:url(assets/r3-space-nebula-half.jpg);}
147
+ .mock .field[data-backdrop="starfield"]{--cand:url(assets/r3-space-starfield-half.jpg);}
148
+ .mock .field[data-backdrop="dust"]{--cand:url(assets/r3-space-dust-half.jpg);}
149
+ .mock .field[data-backdrop="deepfield"]{--cand:url(assets/r3-space-deepfield-half.jpg);}
150
+ .mock section[data-state="backdrops"] .field{height:min(62vh,640px);}
151
+ .mock section[data-state="backdrops"] .rowLabel{padding:22px var(--gutter) 10px;}
152
+ .matrix.walk{grid-template-columns:repeat(12,1fr);}
153
+ .sheet .cell .nm{white-space:normal;text-align:center;line-height:1.35;max-width:100%;}
154
+ @media (max-width:900px){.matrix.walk{grid-template-columns:repeat(3,1fr);}}
130
155
  .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
131
156
  .skip{position:absolute;left:12px;top:-60px;background:var(--bg-card);color:var(--ink);padding:11px 18px;border-radius:999px;}
132
157
  .skip:focus{top:12px;}
@@ -139,6 +164,8 @@ body[data-state="grid"] section[data-state="grid"]{display:block;}
139
164
  ?state=sheet the nine templates at the five accents, and the blend candidates
140
165
  ?state=void field treatment A: the void — nothing drawn, the objects carry the depth
141
166
  ?state=grid field treatment B: the sheet — one hairline grid inside the camera
167
+ ?state=backdrops round 3 (task 1003337): the four rendered space candidates as the field's ground
168
+ ?state=materials round 3: the twelve-step walk, then frost / gold / obsidian at the five accents
142
169
  ?mode=dark|light
143
170
  -->
144
171
  <a class="skip" href="#main">Skip to content</a>
@@ -189,14 +216,73 @@ body[data-state="grid"] section[data-state="grid"]{display:block;}
189
216
  <div class="hintbar"><span><kbd>drag</kbd> pan</span><span><kbd>scroll</kbd> zoom</span><span><kbd>click a project</kbd> open it</span></div>
190
217
  </div></div>
191
218
  </section>
219
+
220
+ <section data-state="backdrops">
221
+ <div class="rowLabel">the nebula wash: a faint violet-and-bronze wash, sparse stars (the builder's recommendation; shipped as --field-plate)</div>
222
+ <div class="fieldWrap"><div class="field" data-backdrop="nebula">
223
+ <div class="ground"></div>
224
+ <div class="skyCam">
225
+ <a class="worldOrb" href="#" data-rel="owner" data-shape="pair" data-material="chrome" data-style="chrome" style="--acc:var(--accent);--d:140px;left:50%;top:44%"><span class="badge">yours</span><span class="disc"></span><span class="nm">Cloud Bongos</span><span class="sub">this platform</span></a>
226
+ <a class="worldOrb" href="#" data-rel="none" data-shape="blob" data-material="frost" data-style="wash" style="--acc:var(--terracotta);--d:92px;left:22%;top:30%"><span class="disc"></span><span class="nm">Demo</span></a>
227
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="bead" data-material="gold" data-style="tint" style="--acc:var(--gold-soft);--d:75px;left:78%;top:66%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Off the Boats</span></a>
228
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="pair" data-material="obsidian" data-style="tint" style="--acc:var(--sea);--d:70px;left:33%;top:74%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Emersonian Circles</span></a>
229
+ <a class="worldOrb" href="#" data-rel="none" data-shape="bead" data-material="chrome" data-style="chrome" style="--acc:var(--sun-lit);--d:80px;left:70%;top:26%"><span class="disc"></span><span class="nm">Mercury</span></a>
230
+ </div>
231
+ <div class="hintbar"><span><kbd>drag</kbd> pan</span><span><kbd>scroll</kbd> zoom</span><span><kbd>click a project</kbd> open it</span></div>
232
+ </div></div>
233
+ <div class="rowLabel">the starfield: three depths of pin-sharp stars, a cool haze band</div>
234
+ <div class="fieldWrap"><div class="field" data-backdrop="starfield">
235
+ <div class="ground"></div>
236
+ <div class="skyCam">
237
+ <a class="worldOrb" href="#" data-rel="owner" data-shape="pair" data-material="chrome" data-style="chrome" style="--acc:var(--accent);--d:140px;left:50%;top:44%"><span class="badge">yours</span><span class="disc"></span><span class="nm">Cloud Bongos</span><span class="sub">this platform</span></a>
238
+ <a class="worldOrb" href="#" data-rel="none" data-shape="blob" data-material="frost" data-style="wash" style="--acc:var(--terracotta);--d:92px;left:22%;top:30%"><span class="disc"></span><span class="nm">Demo</span></a>
239
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="bead" data-material="gold" data-style="tint" style="--acc:var(--gold-soft);--d:75px;left:78%;top:66%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Off the Boats</span></a>
240
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="pair" data-material="obsidian" data-style="tint" style="--acc:var(--sea);--d:70px;left:33%;top:74%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Emersonian Circles</span></a>
241
+ <a class="worldOrb" href="#" data-rel="none" data-shape="bead" data-material="chrome" data-style="chrome" style="--acc:var(--sun-lit);--d:80px;left:70%;top:26%"><span class="disc"></span><span class="nm">Mercury</span></a>
242
+ </div>
243
+ <div class="hintbar"><span><kbd>drag</kbd> pan</span><span><kbd>scroll</kbd> zoom</span><span><kbd>click a project</kbd> open it</span></div>
244
+ </div></div>
245
+ <div class="rowLabel">the dust: bronze-and-blue filaments, one distant glow</div>
246
+ <div class="fieldWrap"><div class="field" data-backdrop="dust">
247
+ <div class="ground"></div>
248
+ <div class="skyCam">
249
+ <a class="worldOrb" href="#" data-rel="owner" data-shape="pair" data-material="chrome" data-style="chrome" style="--acc:var(--accent);--d:140px;left:50%;top:44%"><span class="badge">yours</span><span class="disc"></span><span class="nm">Cloud Bongos</span><span class="sub">this platform</span></a>
250
+ <a class="worldOrb" href="#" data-rel="none" data-shape="blob" data-material="frost" data-style="wash" style="--acc:var(--terracotta);--d:92px;left:22%;top:30%"><span class="disc"></span><span class="nm">Demo</span></a>
251
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="bead" data-material="gold" data-style="tint" style="--acc:var(--gold-soft);--d:75px;left:78%;top:66%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Off the Boats</span></a>
252
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="pair" data-material="obsidian" data-style="tint" style="--acc:var(--sea);--d:70px;left:33%;top:74%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Emersonian Circles</span></a>
253
+ <a class="worldOrb" href="#" data-rel="none" data-shape="bead" data-material="chrome" data-style="chrome" style="--acc:var(--sun-lit);--d:80px;left:70%;top:26%"><span class="disc"></span><span class="nm">Mercury</span></a>
254
+ </div>
255
+ <div class="hintbar"><span><kbd>drag</kbd> pan</span><span><kbd>scroll</kbd> zoom</span><span><kbd>click a project</kbd> open it</span></div>
256
+ </div></div>
257
+ <div class="rowLabel">the deep field: near-empty, a violet corner</div>
258
+ <div class="fieldWrap"><div class="field" data-backdrop="deepfield">
259
+ <div class="ground"></div>
260
+ <div class="skyCam">
261
+ <a class="worldOrb" href="#" data-rel="owner" data-shape="pair" data-material="chrome" data-style="chrome" style="--acc:var(--accent);--d:140px;left:50%;top:44%"><span class="badge">yours</span><span class="disc"></span><span class="nm">Cloud Bongos</span><span class="sub">this platform</span></a>
262
+ <a class="worldOrb" href="#" data-rel="none" data-shape="blob" data-material="frost" data-style="wash" style="--acc:var(--terracotta);--d:92px;left:22%;top:30%"><span class="disc"></span><span class="nm">Demo</span></a>
263
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="bead" data-material="gold" data-style="tint" style="--acc:var(--gold-soft);--d:75px;left:78%;top:66%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Off the Boats</span></a>
264
+ <a class="worldOrb" href="#" data-rel="builder" data-shape="pair" data-material="obsidian" data-style="tint" style="--acc:var(--sea);--d:70px;left:33%;top:74%"><span class="badge">you build here</span><span class="disc"></span><span class="nm">Emersonian Circles</span></a>
265
+ <a class="worldOrb" href="#" data-rel="none" data-shape="bead" data-material="chrome" data-style="chrome" style="--acc:var(--sun-lit);--d:80px;left:70%;top:26%"><span class="disc"></span><span class="nm">Mercury</span></a>
266
+ </div>
267
+ <div class="hintbar"><span><kbd>drag</kbd> pan</span><span><kbd>scroll</kbd> zoom</span><span><kbd>click a project</kbd> open it</span></div>
268
+ </div></div>
269
+ </section>
270
+
271
+ <section data-state="materials" class="sheet">
272
+ <h2>Three materials, five accents</h2>
273
+ <p>Round 3: the same three whole objects rendered in frosted glass, brushed gold and polished obsidian, cut out and cropped from their own alpha, on the same masked colour layer. A template is now shape, material and style; the walk changes all three each step.</p>
274
+ <div class="rowLabel">the walk, twelve steps (the hub's default order)</div>
275
+ <div class="matrix walk" id="walk"></div>
276
+ <div id="matrix2"></div>
277
+ </section>
192
278
  </main>
193
- <footer class="foot">A composition sheet for task 1003319. Nothing here is served.</footer>
279
+ <footer class="foot">A composition sheet for tasks 1003319 and 1003337. Nothing here is served.</footer>
194
280
  <script>
195
281
  /* The mock's state contract: read ?state= once, apply one state (sheet | void | grid). The
196
282
  matrix is built with createElement + textContent. No motion in script. */
197
283
  (function () {
198
284
  var state = new URLSearchParams(location.search || location.hash.slice(1) || (window.__Q || '')).get('state') || 'sheet';
199
- if (state !== 'sheet' && state !== 'void' && state !== 'grid') state = 'sheet';
285
+ if (['sheet', 'void', 'grid', 'backdrops', 'materials'].indexOf(state) === -1) state = 'sheet';
200
286
  document.body.setAttribute('data-state', state);
201
287
  var ACCENTS = [['sea', 'var(--sea)'], ['terracotta', 'var(--terracotta)'], ['gold-soft', 'var(--gold-soft)'], ['sun-lit', 'var(--sun-lit)'], ['accent', 'var(--accent)']];
202
288
  var TEMPLATES = ['blob-tint', 'pair-wash', 'bead-chrome', 'blob-wash', 'pair-chrome', 'bead-tint', 'blob-chrome', 'pair-tint', 'bead-wash'];
@@ -226,6 +312,44 @@ body[data-state="grid"] section[data-state="grid"]{display:block;}
226
312
  });
227
313
  host.appendChild(row);
228
314
  });
315
+ /* round 3: the walk and the materials matrix, the same cell grammar */
316
+ var WALK = ['blob-tint', 'pair-gold-wash', 'bead-obsidian-plain', 'blob-frost-wash', 'pair-chrome', 'bead-gold-tint', 'blob-obsidian-wash', 'pair-frost-tint', 'bead-wash', 'blob-gold-plain', 'pair-obsidian-tint', 'bead-frost-wash'];
317
+ function cellFor(t, acc) {
318
+ var parts = t.split('-'), shape = parts[0], material = parts.length === 3 ? parts[1] : 'chrome', style = parts[parts.length - 1];
319
+ var cell = document.createElement('div');
320
+ cell.className = 'cell';
321
+ var p = document.createElement('span');
322
+ p.className = 'planet';
323
+ p.setAttribute('data-shape', shape);
324
+ p.setAttribute('data-material', material);
325
+ p.setAttribute('data-style', style);
326
+ p.style.setProperty('--acc', acc);
327
+ var n = document.createElement('span');
328
+ n.className = 'nm';
329
+ n.textContent = t;
330
+ cell.appendChild(p);
331
+ cell.appendChild(n);
332
+ return cell;
333
+ }
334
+ var walkHost = document.getElementById('walk');
335
+ if (walkHost) WALK.forEach(function (t, i) { walkHost.appendChild(cellFor(t, ACCENTS[i % ACCENTS.length][1])); });
336
+ var host2 = document.getElementById('matrix2');
337
+ if (host2) {
338
+ ['frost', 'gold', 'obsidian'].forEach(function (m) {
339
+ ACCENTS.forEach(function (a) {
340
+ var label = document.createElement('div');
341
+ label.className = 'rowLabel';
342
+ label.textContent = m + ', the ' + a[0] + ' accent';
343
+ host2.appendChild(label);
344
+ var row = document.createElement('div');
345
+ row.className = 'matrix';
346
+ ['blob', 'pair', 'bead'].forEach(function (s) {
347
+ ['tint', 'wash', 'plain'].forEach(function (y) { row.appendChild(cellFor(s + '-' + m + '-' + y, a[1])); });
348
+ });
349
+ host2.appendChild(row);
350
+ });
351
+ });
352
+ }
229
353
  })();
230
354
  </script>
231
355
  </body>
@@ -174,3 +174,13 @@ Three mastheads, rendered dark and light at 1440 / 390 / 320 (ALL CLEAN) and mea
174
174
  ## 12. Dark only (task 1003336)
175
175
 
176
176
  **Date:** 2026-08-28 (decided), 2026-08-29 (built) · the owner's call on the planets review (§11): the apex renders dark only and the light/dark switch is the builders' hall's alone — [ADR 0204](../adr/<redacted>.md). On `/projects`: `data-mode="dark"` is fixed on `<html>`, the pre-paint script is gone, the `#modeToggle` glyph and its `resolvedMode` / `paintModeToggle` wiring leave the bar (Projects, then the chip), the `.modeBtn` rules and the icon-swap twins leave `cosmos.css`, the mode-toggle probe leaves `projects.probes.json`, and `projects.states.json` declares `"modes": ["dark"]` so the kit renders the hub's twelve states at three widths in one mode (48 shots, ALL CLEAN; probes 31/31). The light tier of `cosmos.css` stays until its own removal. Why first: the space backdrop for the field (task 1003337) is a black-ground plate; one mode is what lets the field commit to it.
177
+
178
+ ## 13. The space and the materials (task 1003337)
179
+
180
+ **Date:** 2026-08-29 · the owner's ask on the planets review (§11): "use higgsfield for some further ideas colors, styles, and inspiration … we could invest into a cool space themed backdrop for the blobs", and the pick of the FULL material round the same day.
181
+
182
+ **The round.** Higgsfield (`nano_banana_pro`, served as `nano_banana_2`, 2k; 15 generations + 9 cutouts, ~37 credits): four text-free deep-space plates on pure black (`r3-space-nebula` — a faint violet-and-bronze wash with sparse stars; `-starfield` — three depths of pin-sharp stars and a cool haze band; `-dust` — bronze-and-blue filaments with one distant glow; `-deepfield` — near-empty with a violet corner), and the world's three whole objects in three new materials — **frosted glass**, **brushed gold**, **polished obsidian** — one whole object per 1:1 plate (the first frost blob ran off the frame and was retaken), each cut out with `remove_background` and its alpha verified with ffmpeg (min 0, max 255). The sheet: `docs/design/mocks/hub/planets.html` gains `?state=backdrops` (the four candidates as the field with the real orbs over them) and `?state=materials` (the twelve-step walk, then every material at the five accents).
183
+
184
+ **What was built.** The template grammar grows from shape × style to shape × **material** × style: `<shape>-<style>` stays the chrome material's name (nine rows keep their meaning), `<shape>-<material>-<style>` names a new material with style `tint` / `wash` / `plain` — thirty-six names in migration `<redacted>`, `PROJECT_TEMPLATES` (every valid name, the `POST /projects` enum) and `PROJECT_TEMPLATE_WALK` (the hub's twelve-step default, each step changing shape, material and style — `ORB_WALK` in `projects.html`, `ORB_TEMPLATES` the full set). `cosmos.css` carries a plate token per material × shape, a two-attribute crop rule per plate measured from the cutout's alpha box (pinned by `tests/projects_hub.mjs`, which recomputes every rule from the boxes), and `[data-style="plain"]`. The orb carries `data-material` beside `data-shape` and `data-style`. The field's ground is `--field-plate` at `cover` under the page ground, drifting 2–3% over 90 s by transform (dead under reduced motion) — one token, so the pick is one line.
185
+
186
+ **The pick, open.** The owner was not in the session, so the backdrop shipped on the builder's recommendation — the nebula wash (its violet and bronze are the chrome's own colours; the dust plate's glow competes with the orbs; the starfield is plain; the deepfield's corner is heavier than asked) — with the other three beside it in `.impeccable/mocks/world-assets/` and on the sheet. Swapping is one token (`--field-plate`) plus a copy into `assets/world/`. The materials are not a pick: they ship as templates, and a curated `template` chooses one per project.
@@ -1265,5 +1265,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
1265
1265
  landed since 1.19.412 with no explicit bump. run 33259477562. (task 1002620)
1266
1266
  1.19.414 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1267
1267
  landed since 1.19.413 with no explicit bump. run 33260596712. (task 1002620)
1268
+ 1.19.415 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
1269
+ landed since 1.19.414 with no explicit bump. run 33262322596. (task 1002620)
1268
1270
  ---------------------------------------------------------------------------
1269
1271
  ```
@@ -0,0 +1,31 @@
1
+ -- platform_identity_013_project_template_materials.sql — the planet templates grow from
2
+ -- shape × style to shape × MATERIAL × style (task 1003337).
3
+ --
4
+ -- Round 3 rendered the world's three whole objects (blob / pair / bead) in three new
5
+ -- materials — frosted glass, brushed gold, polished obsidian — beside the first round's
6
+ -- chrome. A template name is `<shape>-<style>` for chrome (the first round's names, kept
7
+ -- verbatim so every stored row stays valid) or `<shape>-<material>-<style>` for a new
8
+ -- material, where style is tint / wash / plain (plain = the material as rendered; the
9
+ -- chrome material's plain is spelled `chrome`). Thirty-six names; the hub's default walk
10
+ -- (PROJECT_TEMPLATE_WALK) uses twelve of them, each step changing shape, material and style.
11
+ --
12
+ -- Additive + platform_identity_-namespaced (ADR 0083 §5): the CHECK from migration 012 is
13
+ -- re-stated with the wider set; the column, its nullability and the curation route are
14
+ -- unchanged. Idempotent: safe to re-run.
15
+
16
+ BEGIN;
17
+
18
+ ALTER TABLE platform_identity_projects DROP CONSTRAINT IF EXISTS platform_identity_projects_template_check;
19
+ ALTER TABLE platform_identity_projects ADD CONSTRAINT platform_identity_projects_template_check
20
+ CHECK (template IS NULL OR template IN (
21
+ -- chrome, the first round (migration 012), names kept verbatim
22
+ 'blob-tint', 'blob-wash', 'blob-chrome',
23
+ 'pair-tint', 'pair-wash', 'pair-chrome',
24
+ 'bead-tint', 'bead-wash', 'bead-chrome',
25
+ -- the materials round
26
+ 'blob-frost-tint', 'blob-frost-wash', 'blob-frost-plain', 'blob-gold-tint', 'blob-gold-wash', 'blob-gold-plain', 'blob-obsidian-tint', 'blob-obsidian-wash', 'blob-obsidian-plain',
27
+ 'pair-frost-tint', 'pair-frost-wash', 'pair-frost-plain', 'pair-gold-tint', 'pair-gold-wash', 'pair-gold-plain', 'pair-obsidian-tint', 'pair-obsidian-wash', 'pair-obsidian-plain',
28
+ 'bead-frost-tint', 'bead-frost-wash', 'bead-frost-plain', 'bead-gold-tint', 'bead-gold-wash', 'bead-gold-plain', 'bead-obsidian-tint', 'bead-obsidian-wash', 'bead-obsidian-plain'
29
+ ));
30
+
31
+ COMMIT;