SRE-942: Fix broken Petrinaut CSS by moving postcss resolutions to 8.5.26 - #9196
Conversation
postcss 8.5.25 makes Panda CSS silently drop 627 colour custom
properties from the generated stylesheet — every numeric colour ramp
(--colors-{blue,green,neutral,...}-{s,a}00..125 and the status-*
ramps) plus the utilities built on them. Semantic tokens still
reference them via var(), so the Petrinaut editor and ds-components
render without their palette.
postcss 8.5.26 is upstream's fix. Both root `resolutions` entries move
8.5.25 -> 8.5.26, and the lockfile is deduped so no 8.5.25 copy
remains anywhere in the tree.
The built stylesheet goes from 1377 to 2004 custom properties
(1,563,308 -> 1,623,529 bytes), byte-identical to the last known-good
build.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9196 +/- ##
=======================================
Coverage 59.63% 59.63%
=======================================
Files 1420 1420
Lines 138767 138767
Branches 6555 6555
=======================================
Hits 82754 82754
Misses 54949 54949
Partials 1064 1064 Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
PR SummaryLow Risk Overview
Reviewed by Cursor Bugbot for commit a635feb. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Pull request overview
Updates PostCSS to 8.5.26 to restore Petrinaut’s generated CSS color properties.
Changes:
- Updates both root PostCSS resolutions.
- Regenerates dependency resolutions, including Nano ID 3.3.18.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
package.json |
Pins PostCSS 8.5.26 for Next.js and PandaCSS. |
yarn.lock |
Records updated PostCSS and Nano ID resolutions. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Benchmark results
|
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 2002 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 1002 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 3314 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 1527 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 2078 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 1033 | Flame Graph |
policy_resolution_medium
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 102 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 52 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 269 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 108 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 133 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 63 | Flame Graph |
policy_resolution_none
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 2 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 2 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 8 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 3 | Flame Graph |
policy_resolution_small
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| resolve_policies_for_actor | user: empty, selectivity: high, policies: 52 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: empty, selectivity: medium, policies: 26 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: high, policies: 94 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: seeded, selectivity: medium, policies: 27 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: high, policies: 66 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: low, policies: 1 | Flame Graph | |
| resolve_policies_for_actor | user: system, selectivity: medium, policies: 29 | Flame Graph |
read_scaling_complete
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id;one_depth | 1 entities | Flame Graph | |
| entity_by_id;one_depth | 10 entities | Flame Graph | |
| entity_by_id;one_depth | 25 entities | Flame Graph | |
| entity_by_id;one_depth | 5 entities | Flame Graph | |
| entity_by_id;one_depth | 50 entities | Flame Graph | |
| entity_by_id;two_depth | 1 entities | Flame Graph | |
| entity_by_id;two_depth | 10 entities | Flame Graph | |
| entity_by_id;two_depth | 25 entities | Flame Graph | |
| entity_by_id;two_depth | 5 entities | Flame Graph | |
| entity_by_id;two_depth | 50 entities | Flame Graph | |
| entity_by_id;zero_depth | 1 entities | Flame Graph | |
| entity_by_id;zero_depth | 10 entities | Flame Graph | |
| entity_by_id;zero_depth | 25 entities | Flame Graph | |
| entity_by_id;zero_depth | 5 entities | Flame Graph | |
| entity_by_id;zero_depth | 50 entities | Flame Graph |
read_scaling_linkless
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id | 1 entities | Flame Graph | |
| entity_by_id | 10 entities | Flame Graph | |
| entity_by_id | 100 entities | Flame Graph | |
| entity_by_id | 1000 entities | Flame Graph | |
| entity_by_id | 10000 entities | Flame Graph |
representative_read_entity
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/block/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/book/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/building/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/organization/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/page/v/2
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/person/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/playlist/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/song/v/1
|
Flame Graph | |
| entity_by_id | entity type ID: https://blockprotocol.org/@alice/types/entity-type/uk-address/v/1
|
Flame Graph |
representative_read_entity_type
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| get_entity_type_by_id | Account ID: bf5a9ef5-dc3b-43cf-a291-6210c0321eba
|
Flame Graph |
representative_read_multiple_entities
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| entity_by_property | traversal_paths=0 | 0 | |
| entity_by_property | traversal_paths=255 | 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true | |
| entity_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=0 | 0 | |
| link_by_source_by_property | traversal_paths=255 | 1,resolve_depths=inherit:1;values:255;properties:255;links:127;link_dests:126;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:0;link_dests:0;type:false | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:0;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:0;properties:2;links:1;link_dests:0;type:true | |
| link_by_source_by_property | traversal_paths=2 | 1,resolve_depths=inherit:0;values:2;properties:2;links:1;link_dests:0;type:true |
scenarios
| Function | Value | Mean | Flame graphs |
|---|---|---|---|
| full_test | query-limited | Flame Graph | |
| full_test | query-unlimited | Flame Graph | |
| linked_queries | query-limited | Flame Graph | |
| linked_queries | query-unlimited | Flame Graph |
Requested by Chris Feijoo, Alex Leon · Slack thread
🌟 What is the purpose of this PR?
Fixes the broken CSS on demo.petrinaut.org.
Before: the Petrinaut editor and the ds-components render without their colour palette. 627 colour custom properties are missing from the built stylesheet — every numeric colour ramp (
--colors-{blue,green,neutral,orange,pink,purple,red,yellow,status-*}-{s,a}00…125) and the utilities built on top of them. The semantic tokens that survive still point at those ramps throughvar(), so they resolve to nothing: in the broken build--colors-blue-s10is referenced 8 times and defined 0 times.After: the stylesheet contains all 2004 custom properties again, and is byte-identical to the last known-good build.
Why: postcss
8.5.25makes Panda drop those declarations while generating the stylesheet. postcss8.5.26(published 2026-08-06) is upstream's own fix for that regression.8.5.25reached the tree through #9182, which repointed the root postcss resolution onto it.Measured on the Petrinaut website build (
turbo build --filter='@apps/petrinaut-website', thevercel-build.shpath):main)index-YH_CDGgr.cssindex-Bom45vxT.cssThe asset hash matches the last known-good build, so the output is byte-identical to it.
--colors-blue-s10and--colors-status-error-a50are both defined again.🔗 Related links
8.5.25came from (merge commit8ea40279b)🚫 Blocked by
🔍 What does this change?
Both root postcss
resolutionsentries move from8.5.25to8.5.26, and the lockfile is regenerated so the tree stays on a single shared copy of postcss.package.json—next/postcss8.5.25→8.5.26package.json—postcss@npm:8.5.148.5.25→8.5.26yarn.lock— regenerated. The postcss stanza moves to8.5.26and, afteryarn dedupe --strategy highest, is a single shared entry again; no8.5.25copy remains anywhere in the lockfile. postcss 8.5.26 requiresnanoid ^3.3.17rather than^3.3.16, sonanoid@^3.0.0/^3.3.17dedupe onto3.3.18— required to keep the lockfile deduplicated, not incidental.The resolution is keyed
postcss@npm:8.5.14rather than plainpostcssbecause@pandacss/{postcss,node,core,generator}each declare a bare exact"postcss": "8.5.14", and the key targets that exact pin. #9182 also de-duplicated postcss — the lockfile went from two copies (8.5.18nested for Panda,8.5.22hoisted) down to one shared stanza — which is why a single bad release now reaches Panda at all, where previously Panda had a copy of its own. Both entries are bumped rather than just the Panda one:8.5.25is known-bad, so leaving Next on it would be arbitrary.No source files are touched.
Pre-Merge Checklist 🚀
🚢 Has this modified a publishable library?
This PR:
📜 Does this require a change to the docs?
The changes in this PR:
🕸️ Does this require a change to the Turbo Graph?
The changes in this PR:
🛡 What tests cover this?
No automated test covers the generated stylesheet's token count, which is why this regression shipped silently. Verification here was the build-and-measure comparison in the table above.
yarn constraints,yarn dedupe --strategy highest --checkandyarn install --immutableall exit 0 on this branch.A regression test asserting a floor on the emitted custom-property count would catch this class of bug, but that felt out of scope here.
❓ How to test this?
yarn install.turbo build --filter='@apps/petrinaut-website' --env-mode=loose.apps/petrinaut-website/dist/assets/index-*.cssisindex-Bom45vxT.cssat 1,623,529 bytes.--colors-blue-s10:and--colors-status-error-a50:are present as definitions, not just asvar()references.Generated by Claude Code