stylegallery 0.1.0 → 0.1.1

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 (230) hide show
  1. package/AGENTS.md +4 -1
  2. package/DOMAINS.md +2 -6
  3. package/GOVERNANCE.md +10 -9
  4. package/README.md +23 -127
  5. package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
  6. package/consumer-reference/agent-native/v2/material-registry.json +1 -0
  7. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
  8. package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
  10. package/consumer-reference/contract.md +1 -1
  11. package/consumer-reference/index.md +5 -3
  12. package/layout/index.md +124 -0
  13. package/log.md +51 -0
  14. package/package.json +181 -22
  15. package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
  16. package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
  17. package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
  18. package/scripts/agent-native/v2/material-admission.mjs +295 -0
  19. package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
  20. package/scripts/agent-native/v2/material-context.mjs +251 -0
  21. package/scripts/agent-native/v2/material-identity.mjs +71 -0
  22. package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
  23. package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
  24. package/scripts/agent-native/v2/material-queries.mjs +398 -0
  25. package/scripts/agent-native/v2/material-registry.mjs +319 -0
  26. package/scripts/sg-material-mcp.mjs +98 -0
  27. package/scripts/sg-material.mjs +27 -0
  28. package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
  29. package/consumer-reference/baselines/calibration.json +0 -260
  30. package/consumer-reference/baselines/manifest.json +0 -21
  31. package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
  32. package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
  33. package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
  34. package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
  35. package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
  36. package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
  37. package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
  38. package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
  39. package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
  40. package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
  41. package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
  42. package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
  43. package/consumer-reference/fixtures/promotion/manifest.json +0 -15
  44. package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
  45. package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
  46. package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
  47. package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
  48. package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
  49. package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
  50. package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
  51. package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
  52. package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
  53. package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
  54. package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
  55. package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
  56. package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
  57. package/consumer-reference/fixtures/valid-deprecated.json +0 -21
  58. package/consumer-reference/fixtures/valid-experimental.json +0 -19
  59. package/consumer-reference/generated/manifest.json +0 -40
  60. package/consumer-reference/generated/tokens.css +0 -12
  61. package/consumer-reference/policies/shared-experimental.json +0 -37
  62. package/consumer-reference/schema/ax-evidence.schema.json +0 -30
  63. package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
  64. package/consumer-reference/schema/calibration-record.schema.json +0 -190
  65. package/consumer-reference/schema/capture-session.schema.json +0 -161
  66. package/consumer-reference/schema/component-state.schema.json +0 -150
  67. package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
  68. package/consumer-reference/schema/dom-evidence.schema.json +0 -38
  69. package/consumer-reference/schema/evidence-record.schema.json +0 -81
  70. package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
  71. package/consumer-reference/schema/item.schema.json +0 -188
  72. package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
  73. package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
  74. package/consumer-reference/schema/portable-tokens.schema.json +0 -104
  75. package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
  76. package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
  77. package/consumer-reference/schema/visual-evidence.schema.json +0 -31
  78. package/design-engineering/consumer-migration-readiness.md +0 -124
  79. package/design-engineering/interface-craft.md +0 -107
  80. package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
  81. package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
  82. package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
  83. package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
  84. package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
  85. package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
  86. package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
  87. package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
  88. package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
  89. package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
  90. package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
  91. package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
  92. package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
  93. package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
  94. package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
  95. package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
  96. package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
  97. package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
  98. package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
  99. package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
  100. package/game-ui/classification.md +0 -82
  101. package/game-ui/reference-record.md +0 -62
  102. package/game-ui/screen-hierarchy.md +0 -107
  103. package/game-ui/unity/architecture.md +0 -166
  104. package/game-ui/unity/cli-loop.md +0 -84
  105. package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
  106. package/game-ui/unity/org-wiki.md +0 -146
  107. package/game-ui/unity/repository-map.md +0 -102
  108. package/game-ui/unity/ui-systems.md +0 -85
  109. package/motion/practice-reference.md +0 -145
  110. package/motion/review-workflow.md +0 -86
  111. package/motion/vocabulary.md +0 -82
  112. package/platform-guides/apple-interaction.md +0 -89
  113. package/scripts/agent-native/events.mjs +0 -113
  114. package/scripts/agent-native/immutable-store.mjs +0 -102
  115. package/scripts/artifact-metadata.mjs +0 -20
  116. package/scripts/audit-evidence-freshness.mjs +0 -308
  117. package/scripts/baseline-contract.mjs +0 -189
  118. package/scripts/baseline-schema-parity.mjs +0 -40
  119. package/scripts/build-reference-artifacts.mjs +0 -127
  120. package/scripts/calibration-raw-contract.mjs +0 -172
  121. package/scripts/capture-session-contract.mjs +0 -187
  122. package/scripts/component-state-artifact-fixture.mjs +0 -44
  123. package/scripts/component-state-contract.mjs +0 -99
  124. package/scripts/component-state-semantics.mjs +0 -128
  125. package/scripts/component-state-workflow-contract.mjs +0 -67
  126. package/scripts/component-state-workflow-negative-cases.mjs +0 -64
  127. package/scripts/consumer-conformance-contract.mjs +0 -198
  128. package/scripts/consumer-evidence-governance-contract.mjs +0 -210
  129. package/scripts/consumer-reference-case-runner.mjs +0 -93
  130. package/scripts/consumer-reference-schema.mjs +0 -155
  131. package/scripts/create-component-state-session.mjs +0 -100
  132. package/scripts/create-page-evidence-session.mjs +0 -139
  133. package/scripts/domain-document-boundaries.mjs +0 -40
  134. package/scripts/domain-validation-checks.mjs +0 -141
  135. package/scripts/evidence-artifact-contract.mjs +0 -191
  136. package/scripts/finalize-component-state-evidence.mjs +0 -165
  137. package/scripts/finalize-page-evidence.mjs +0 -197
  138. package/scripts/generate-consumer-reference-evidence.mjs +0 -154
  139. package/scripts/generate-patterns.mjs +0 -218
  140. package/scripts/governance-matrix-contract.mjs +0 -73
  141. package/scripts/governance-matrix-negative-cases.mjs +0 -114
  142. package/scripts/governance-policy-contract.mjs +0 -49
  143. package/scripts/governance-test-fixture.mjs +0 -321
  144. package/scripts/governance-workflow-negative-cases.mjs +0 -241
  145. package/scripts/governed-profile-registry.mjs +0 -125
  146. package/scripts/json-schema-formats.mjs +0 -31
  147. package/scripts/markdown-structure.mjs +0 -45
  148. package/scripts/page-artifact-metadata.mjs +0 -124
  149. package/scripts/page-evidence-contract.mjs +0 -297
  150. package/scripts/page-evidence-fixture.mjs +0 -271
  151. package/scripts/pattern-data.mjs +0 -325
  152. package/scripts/profile-record-contract.mjs +0 -140
  153. package/scripts/promotion-attestation-contract.mjs +0 -91
  154. package/scripts/promotion-boundary-test-contract.mjs +0 -92
  155. package/scripts/promotion-fixture-inventory.mjs +0 -109
  156. package/scripts/promotion-governance-contract.mjs +0 -28
  157. package/scripts/reference-artifact-path-contract.mjs +0 -28
  158. package/scripts/reference-profile-contract.mjs +0 -114
  159. package/scripts/reference-token-contract.mjs +0 -156
  160. package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
  161. package/scripts/summarize-sentinel-calibration.mjs +0 -98
  162. package/scripts/test-agent-adapter-conformance.mjs +0 -250
  163. package/scripts/test-agent-conformance-receipt.mjs +0 -106
  164. package/scripts/test-agent-events.mjs +0 -81
  165. package/scripts/test-agent-execution-effects.mjs +0 -114
  166. package/scripts/test-agent-execution-fixtures.mjs +0 -140
  167. package/scripts/test-agent-execution-kernel.mjs +0 -39
  168. package/scripts/test-agent-execution-learning.mjs +0 -130
  169. package/scripts/test-agent-execution-lifecycle.mjs +0 -143
  170. package/scripts/test-agent-execution-safety.mjs +0 -158
  171. package/scripts/test-agent-execution-views.mjs +0 -117
  172. package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
  173. package/scripts/test-agent-knowledge-kernel.mjs +0 -183
  174. package/scripts/test-agent-learning.mjs +0 -246
  175. package/scripts/test-agent-mcp.mjs +0 -246
  176. package/scripts/test-agent-native-schemas.mjs +0 -215
  177. package/scripts/test-agent-projections.mjs +0 -249
  178. package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
  179. package/scripts/test-agent-registry-mutations.mjs +0 -110
  180. package/scripts/test-audit-evidence-freshness.mjs +0 -177
  181. package/scripts/test-component-state-sentinel.mjs +0 -35
  182. package/scripts/test-component-state-source-contract.mjs +0 -83
  183. package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
  184. package/scripts/test-consumer-reference-sentinel.mjs +0 -31
  185. package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
  186. package/scripts/test-json-cli-output.mjs +0 -151
  187. package/scripts/test-json-schema-formats.mjs +0 -40
  188. package/scripts/test-reference-adapters.mjs +0 -199
  189. package/scripts/test-renderer-purity.mjs +0 -34
  190. package/scripts/test-sg-cli.mjs +0 -129
  191. package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
  192. package/scripts/test-validate-baseline-manifest.mjs +0 -234
  193. package/scripts/test-validate-component-state-artifacts.mjs +0 -243
  194. package/scripts/test-validate-component-state.mjs +0 -106
  195. package/scripts/test-validate-consumer-conformance.mjs +0 -427
  196. package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
  197. package/scripts/test-validate-consumer-reference.mjs +0 -263
  198. package/scripts/test-validate-domains.mjs +0 -357
  199. package/scripts/test-validate-governance.mjs +0 -292
  200. package/scripts/test-validate-ia.mjs +0 -262
  201. package/scripts/test-validate-okf.mjs +0 -73
  202. package/scripts/test-validate-page-evidence.mjs +0 -302
  203. package/scripts/test-validate-patterns.mjs +0 -157
  204. package/scripts/test-validate-promotion-rfc.mjs +0 -250
  205. package/scripts/test-validate-reference-profiles.mjs +0 -170
  206. package/scripts/test-validate-unity-org-wiki.mjs +0 -57
  207. package/scripts/test-validate-unity-source-contracts.mjs +0 -67
  208. package/scripts/test-validate-vocabulary.mjs +0 -174
  209. package/scripts/test-validate-webpage-workflow.mjs +0 -293
  210. package/scripts/validate-baseline-manifest.mjs +0 -44
  211. package/scripts/validate-catalog.mjs +0 -65
  212. package/scripts/validate-component-state.mjs +0 -141
  213. package/scripts/validate-consumer-conformance.mjs +0 -477
  214. package/scripts/validate-consumer-reference.mjs +0 -288
  215. package/scripts/validate-domains.mjs +0 -237
  216. package/scripts/validate-governance.mjs +0 -248
  217. package/scripts/validate-ia.mjs +0 -136
  218. package/scripts/validate-links.mjs +0 -66
  219. package/scripts/validate-okf.mjs +0 -104
  220. package/scripts/validate-page-evidence.mjs +0 -191
  221. package/scripts/validate-patterns.mjs +0 -246
  222. package/scripts/validate-promotion-rfc.mjs +0 -224
  223. package/scripts/validate-reference-artifacts.mjs +0 -125
  224. package/scripts/validate-renderer-purity.mjs +0 -56
  225. package/scripts/validate-unity-org-wiki.mjs +0 -146
  226. package/scripts/validate-unity-source-contracts.mjs +0 -107
  227. package/scripts/validate-vocabulary.mjs +0 -115
  228. package/scripts/validate-webpage-workflow.mjs +0 -254
  229. package/scripts/visual-expectation-contract.mjs +0 -20
  230. package/scripts/workflow-action-contract.mjs +0 -163
@@ -1,321 +0,0 @@
1
- import { sentinelProvenanceClauses } from "./governance-policy-contract.mjs";
2
-
3
- export const generatedWarning = "<!-- Generated from `scripts/generate-patterns.mjs` and `scripts/pattern-data.mjs`. Do not hand-edit generated catalog or pattern docs; edit the source files and regenerate. -->";
4
- export { sentinelProvenanceClauses };
5
-
6
- export const files = {
7
- "AGENTS.md": "# Agent Instructions\n\nSee [Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md) and [StyleGallery Domains](DOMAINS.md).\n",
8
- "README.md": "# StyleGallery\n\n- [Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md)\n- [StyleGallery Domains](DOMAINS.md)\n",
9
- "index.md": "# StyleGallery\n\n- [Governance, lifecycle, and docs-as-code](GOVERNANCE.md)\n- [StyleGallery Domains](DOMAINS.md)\n",
10
- "DOMAINS.md": "# StyleGallery Domains\n\n### Consumer Reference Promotion\n\nPromotion records are JSON-only.\n",
11
- "consumer-reference/contract.md": `They are not accepted or promoted RFCs.\nReview truth uses one enum; boolean aliases are invalid.\n${sentinelProvenanceClauses.join("\n")}\n`,
12
- "consumer-reference/index.md": "[Promotion RFC schema](schema/promotion-rfc.schema.json)\n[Shared-experimental promotion policy](policies/shared-experimental.json)\n",
13
- "consumer-reference/fixtures/promotion/manifest.json": '{"id": "promotion-fixture-inventory"}\n',
14
- "consumer-reference/policies/shared-experimental.json": '{"review_independence": "single_account", "promotion_occurred": false, "adopter_attestations": 0, "stable_numeric_threshold": null}\n',
15
- "CATALOG.md": `# Layout Pattern Catalog\n\n${generatedWarning}\n`,
16
- "patterns/index.md": `# Pattern Categories\n\n${generatedWarning}\n`,
17
- "patterns/stacking/index.md": `# Stacking\n\n${generatedWarning}\n`,
18
- "patterns/stacking/stack.md": [
19
- "---",
20
- "lifecycle: generated",
21
- "generated_from: scripts/generate-patterns.mjs, scripts/pattern-data.mjs",
22
- "---",
23
- "",
24
- "# stack",
25
- "",
26
- generatedWarning,
27
- "",
28
- ].join("\n"),
29
- "quality/evidence/executable-evidence.md": [
30
- "| Claim | Validator or test | CI command | Positive evidence | Negative evidence | Evidence boundary |",
31
- "| Governance, lifecycle, generated-file, ownership, and stale-content policy remain discoverable and CI-enforced. | `scripts/validate-governance.mjs` and `scripts/test-validate-governance.mjs` | `node scripts/validate-governance.mjs --json`; `node scripts/test-validate-governance.mjs --json` | `GOVERNANCE.md`, `.github/CODEOWNERS`, generated warnings, generated metadata, root links, lifecycle states, stale-audit decision, and CI wiring are present. | Missing governance file, generated warning, generated metadata, CODEOWNERS coverage, or stale policy fixtures must fail. | Proves governance policy is present and linked, not that CODEOWNERS users have verified repository write access. |",
32
- "| Domain topology, metadata, provenance, scope boundaries, and root routes remain enforced. | `scripts/validate-domains.mjs` and `scripts/test-validate-domains.mjs` | `node scripts/validate-domains.mjs --json`; `node scripts/test-validate-domains.mjs` | Five governed domains and their declared leaves are reachable and attributed. | Domain metadata, immutable provenance, scope boundaries, and root-route fixtures must fail. | A full SHA proves content identity syntax, not publisher authenticity or local quality. |",
33
- "Consumer-reference handoffs, schema/runtime parity, and containment remain enforced; repository handoff omissions must fail.",
34
- "Promotion governance remains a closed JSON-only, invariant-scoped, deferred example contract.",
35
- "Synthetic validation does not authenticate adoption, organizations, owners, support capacity, provenance, or a promotion decision.",
36
- "The proposed Chromium sentinel preserves canonical card-grid geometry and truth-derived calibration evidence.",
37
- "Governed-local button states retain source-bound visual, DOM, and accessibility-tree evidence across both example profiles.",
38
- "one clean capture session binds the browser artifacts to the governed source inventory",
39
- "It does not prove product suitability, independent adoption, full accessibility, cross-browser behavior, or owner approval",
40
- "Explicit evidence deadlines are audited weekly without inventing a repository-wide maximum age.",
41
- "Malformed records and auditor failures remain blocking even though due-date findings are advisory.",
42
- "Linux/amd64 20-run calibration and `baseline_owner_approval` remain pending.",
43
- ...sentinelProvenanceClauses,
44
- "",
45
- ].join("\n"),
46
- ".github/CODEOWNERS": [
47
- "* @changeroa",
48
- "/GOVERNANCE.md @changeroa",
49
- "/README.md @changeroa",
50
- "/index.md @changeroa",
51
- "/AGENTS.md @changeroa",
52
- "/DOMAINS.md @changeroa",
53
- "/GUIDE.md @changeroa",
54
- "/guides/ @changeroa",
55
- "/recipes/ @changeroa",
56
- "/quality/ @changeroa",
57
- "/layout/ @changeroa",
58
- "/motion/ @changeroa",
59
- "/design-engineering/ @changeroa",
60
- "/game-ui/ @changeroa",
61
- "/platform-guides/ @changeroa",
62
- "/consumer-reference/ @changeroa",
63
- "/consumer-reference/baselines/ @changeroa",
64
- "/consumer-reference/policies/ @changeroa",
65
- "/consumer-reference/fixtures/promotion/ @changeroa",
66
- "/consumer-reference/schema/promotion-rfc.schema.json @changeroa",
67
- "/tests/ @changeroa",
68
- "/playwright.config.mjs @changeroa",
69
- "/scripts/pattern-data.mjs @changeroa",
70
- "/scripts/generate-patterns.mjs @changeroa",
71
- "/patterns/ @changeroa",
72
- "/CATALOG.md @changeroa",
73
- "/.github/workflows/validate.yml @changeroa",
74
- "/.github/ @changeroa",
75
- "/scripts/ @changeroa",
76
- "/scripts/validate-*.mjs @changeroa",
77
- "/scripts/test-validate-*.mjs @changeroa",
78
- "",
79
- ].join("\n"),
80
- ".github/workflows/validate.yml": [
81
- "jobs:",
82
- " validate:",
83
- " steps:",
84
- " - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4",
85
- " with:",
86
- " persist-credentials: false",
87
- " - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4",
88
- " - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4",
89
- " - run: |",
90
- "node -c scripts/component-state-workflow-contract.mjs",
91
- "node -c scripts/consumer-evidence-governance-contract.mjs",
92
- "node -c scripts/promotion-fixture-inventory.mjs",
93
- "node -c scripts/promotion-boundary-test-contract.mjs",
94
- "node -c scripts/validate-governance.mjs",
95
- "node -c scripts/test-validate-governance.mjs",
96
- "node scripts/validate-governance.mjs --json",
97
- "node scripts/test-validate-governance.mjs --json",
98
- "node -c scripts/validate-domains.mjs",
99
- "node -c scripts/test-validate-domains.mjs",
100
- "node scripts/validate-domains.mjs --json",
101
- "node scripts/test-validate-domains.mjs",
102
- "node scripts/validate-webpage-workflow.mjs --json",
103
- "node scripts/test-validate-webpage-workflow.mjs --json",
104
- "node -c scripts/validate-consumer-reference.mjs",
105
- "node -c scripts/test-validate-consumer-reference.mjs",
106
- "node -c scripts/consumer-reference-case-runner.mjs",
107
- "node -c scripts/governed-profile-registry.mjs",
108
- "node -c scripts/promotion-attestation-contract.mjs",
109
- "node -c scripts/validate-promotion-rfc.mjs",
110
- "node -c scripts/test-validate-promotion-rfc.mjs",
111
- "node -c scripts/json-schema-formats.mjs",
112
- "node -c scripts/consumer-conformance-contract.mjs",
113
- "node -c scripts/validate-consumer-conformance.mjs",
114
- "node -c scripts/test-validate-consumer-conformance.mjs",
115
- "node -c consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs",
116
- "node -c scripts/page-evidence-contract.mjs",
117
- "node -c scripts/page-evidence-fixture.mjs",
118
- "node -c scripts/create-page-evidence-session.mjs",
119
- "node -c scripts/finalize-page-evidence.mjs",
120
- "node -c scripts/validate-page-evidence.mjs",
121
- "node -c scripts/test-validate-page-evidence.mjs",
122
- "node -c scripts/audit-evidence-freshness.mjs",
123
- "node -c scripts/test-audit-evidence-freshness.mjs",
124
- "node -c tests/fixtures/consumer-conformance-scenarios.mjs",
125
- "node -c tests/helpers/render-consumer-conformance.mjs",
126
- "node -c tests/consumer-conformance.spec.mjs",
127
- "node -c scripts/test-consumer-conformance-sentinel.mjs",
128
- "node scripts/validate-consumer-reference.mjs --json",
129
- "node scripts/test-validate-consumer-reference.mjs --json",
130
- "node scripts/validate-promotion-rfc.mjs --json",
131
- "node scripts/test-validate-promotion-rfc.mjs --json",
132
- "node scripts/test-validate-consumer-conformance.mjs --case valid-runtime-proof --json",
133
- "node scripts/test-validate-consumer-conformance.mjs --json",
134
- "node scripts/test-validate-page-evidence.mjs --json",
135
- "node scripts/test-audit-evidence-freshness.mjs --json",
136
- `node -e 'JSON.parse(require("fs").readFileSync("consumer-reference/schema/consumer-conformance-record.schema.json"))'`,
137
- `node -e 'JSON.parse(require("fs").readFileSync("consumer-reference/schema/page-evidence-session.schema.json"))'`,
138
- `node -e 'JSON.parse(require("fs").readFileSync("consumer-reference/schema/page-evidence-manifest.schema.json"))'`,
139
- "consumer-reference/schema/promotion-rfc.schema.json",
140
- "consumer-reference/policies/shared-experimental.json",
141
- "node scripts/test-consumer-reference-sentinel.mjs",
142
- "node -c scripts/baseline-schema-parity.mjs",
143
- "node -c scripts/test-component-state-source-contract.mjs",
144
- "node scripts/test-component-state-source-contract.mjs",
145
- "consumer-reference/schema/visual-evidence.schema.json",
146
- " component-state-evidence:",
147
- " env:",
148
- " STATE_EVIDENCE_ROOT: .tmp/consumer-reference-state",
149
- " SENTINEL_CONTAINER_IMAGE: mcr.microsoft.com/playwright:v1.61.0-noble@sha256:57b65fdc9ceabe0ef613124c7bbe2babcf9362c4d85e382fe3b03604e84b428a",
150
- " container:",
151
- " image: mcr.microsoft.com/playwright:v1.61.0-noble@sha256:57b65fdc9ceabe0ef613124c7bbe2babcf9362c4d85e382fe3b03604e84b428a",
152
- " steps:",
153
- " - name: Run artifact harness",
154
- " run: node scripts/test-validate-component-state-artifacts.mjs",
155
- " - name: Capture evidence",
156
- " run: |",
157
- " node scripts/create-component-state-session.mjs \\",
158
- " --output \"$STATE_EVIDENCE_ROOT/capture-session.json\" \\",
159
- " --json",
160
- " STATE_ARTIFACT_DIR=\"$STATE_EVIDENCE_ROOT/runtime\" \\",
161
- " STATE_SESSION_RECEIPT=\"$STATE_EVIDENCE_ROOT/capture-session.json\" \\",
162
- " npm run test:component-state:runtime -- --reporter=line",
163
- " node scripts/finalize-component-state-evidence.mjs \\",
164
- " --artifact-root \"$STATE_EVIDENCE_ROOT\" \\",
165
- " --output \"$STATE_EVIDENCE_ROOT/runtime-manifest.json\" \\",
166
- " --json",
167
- " node scripts/validate-component-state.mjs \\",
168
- " --artifact-root \"$STATE_EVIDENCE_ROOT\" \\",
169
- " --runtime-manifest \"$STATE_EVIDENCE_ROOT/runtime-manifest.json\" \\",
170
- " --json",
171
- " - name: Upload evidence",
172
- " with:",
173
- " path: ${{ env.STATE_EVIDENCE_ROOT }}/",
174
- " chromium-sentinel:",
175
- " steps:",
176
- " - run: node scripts/test-consumer-reference-sentinel.mjs",
177
- " chromium-calibration:",
178
- " consumer-conformance:",
179
- " name: Consumer conformance Chromium matrix",
180
- " container:",
181
- " image: mcr.microsoft.com/playwright:v1.61.0-noble@sha256:57b65fdc9ceabe0ef613124c7bbe2babcf9362c4d85e382fe3b03604e84b428a",
182
- " steps:",
183
- " - run: npx playwright test tests/consumer-conformance.spec.mjs --project=chromium --reporter=line",
184
- " - run: node scripts/test-consumer-conformance-sentinel.mjs --json",
185
- " consumer-page-evidence:",
186
- " name: Consumer page-evidence raster capture (nonblocking)",
187
- " continue-on-error: true",
188
- " env:",
189
- " CONSUMER_CONFORMANCE_CAPTURE_DIR: .tmp/consumer-page-evidence",
190
- " steps:",
191
- " - run: node scripts/create-page-evidence-session.mjs --json",
192
- " - run: npx playwright test tests/consumer-conformance.spec.mjs --project=chromium --reporter=line",
193
- " - run: node scripts/finalize-page-evidence.mjs --json",
194
- " - run: node scripts/validate-page-evidence.mjs --json",
195
- " - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4",
196
- " with:",
197
- " name: consumer-page-evidence-${{ github.run_id }}-${{ github.sha }}",
198
- " retention-days: 14",
199
- "node scripts/validate-baseline-manifest.mjs --json",
200
- "node scripts/test-validate-baseline-manifest.mjs --json",
201
- "node scripts/test-summarize-sentinel-calibration.mjs",
202
- "node scripts/validate-renderer-purity.mjs --json",
203
- "checkout_sha=\"$(git -c safe.directory=\"$GITHUB_WORKSPACE\" rev-parse HEAD)\"",
204
- "--repository \"changeroa/StyleGallery\" \\",
205
- "--execution-repository \"$GITHUB_REPOSITORY\" \\",
206
- "\"repository\":\"%s\",\"execution_repository\":\"%s\"",
207
- "\"changeroa/StyleGallery\" \"$GITHUB_REPOSITORY\" \"$GITHUB_RUN_ID\"",
208
- "permissions:",
209
- " contents: read",
210
- "",
211
- ].map((line, index, lines) => {
212
- const commandStart = lines.indexOf("node -c scripts/component-state-workflow-contract.mjs");
213
- const commandEnd = lines.indexOf("consumer-reference/policies/shared-experimental.json");
214
- return index >= commandStart && index <= commandEnd ? ` ${line}` : line;
215
- }).join("\n"),
216
- ".github/workflows/evidence-freshness.yml": [
217
- "name: Audit explicit evidence deadlines",
218
- "on:",
219
- " workflow_dispatch:",
220
- " schedule:",
221
- " - cron: '0 5 * * 1'",
222
- "permissions:",
223
- " contents: read",
224
- "jobs:",
225
- " evidence-freshness:",
226
- " runs-on: ubuntu-latest",
227
- " steps:",
228
- " - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4",
229
- " with:",
230
- " persist-credentials: false",
231
- " - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4",
232
- " - run: npm ci --ignore-scripts --no-audit --no-fund",
233
- " - run: |",
234
- " node scripts/audit-evidence-freshness.mjs --record consumer-reference/baselines/calibration.json --as-of \"$as_of\" --mode advisory --json > evidence-freshness-report.json",
235
- " console.log(`::warning file=${warning.source_path}::${warning.code}: ${warning.message}`);",
236
- " - if: always()",
237
- " uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4",
238
- " with:",
239
- " name: evidence-freshness-${{ github.run_id }}",
240
- " path: evidence-freshness-report.json",
241
- " retention-days: 14",
242
- "",
243
- ].join("\n"),
244
- "GOVERNANCE.md": [
245
- "---",
246
- "scheduled_stale_audit: deferred",
247
- "scheduled_evidence_audit: active_advisory",
248
- "---",
249
- "",
250
- "# Governance, Lifecycle, And Docs-As-Code",
251
- "",
252
- "| Doc family | Source of truth | Generator | Generated artifacts | Lifecycle state | Stale trigger | Validator | Review owner |",
253
- "| Root repository guide | `README.md` | Manual | None | `stable` | Source-of-truth route changes, broken root links, or ownership changes. | `scripts/validate-okf.mjs` | Repository governance owner |",
254
- "| OKF bundle map | `index.md` | Manual | None | `scripts/validate-okf.mjs` | Repository governance owner |",
255
- "| Agent editing rules | `AGENTS.md` | Manual | None | `scripts/validate-links.mjs` | Repository governance owner |",
256
- "| Planning guides | `GUIDE.md`, `guides/*.md` | Manual | None | `scripts/validate-okf.mjs` | Planning-doc owner |",
257
- "| Layout recipes | `recipes/*.md` | Manual | None | `scripts/validate-okf.mjs` | Recipe owner |",
258
- "| Quality gates and evidence | `quality/**/*.md` | Manual | None | `scripts/validate-okf.mjs` | Quality owner |",
259
- "| Consumer reference contract | `consumer-reference/contract.md` | Manual | None | `stable` | Receiver changes. | `scripts/validate-consumer-reference.mjs` | Validation owner |",
260
- "| Governed local reference profiles | `design-engineering/reference-profiles/governed-local/editorial/profile.json`, `design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json`, `design-engineering/reference-profiles/governed-local/editorial/local-foundations.json`, `design-engineering/reference-profiles/governed-local/terminal/profile.json`, `design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json`, `design-engineering/reference-profiles/governed-local/terminal/local-foundations.json` | Manual | None | `experimental`, `example_only`, non-default related fixtures | Profile source changes. | `scripts/validate-consumer-reference.mjs` | Validation owner |",
261
- "| Component-state evidence matrices | Each profile's declared `components/*.component.json`, `states/*.states.json`, `fixtures/*.fixture.json`, and `evidence/*.evidence.json` records | `scripts/generate-consumer-reference-evidence.mjs` | `design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md`, `design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md`, `design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md`, `design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md`, `design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md`, `design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md` | `generated` | Source or generator changes. | `scripts/validate-component-state.mjs` | Validation owner |",
262
- "| Consumer migration conformance | `consumer-reference/schema/consumer-conformance-record.schema.json`, `design-engineering/consumer-migration-readiness.md` | Manual | Consumer-owned conformance records | `experimental` method | Method, dimension, scenario, mapping, or ownership changes. | `scripts/validate-consumer-conformance.mjs`, `scripts/test-validate-consumer-conformance.mjs` | Design Engineering owner with Validation owner |",
263
- "| Consumer page-evidence lifecycle | `consumer-reference/schema/page-evidence-session.schema.json`, `consumer-reference/schema/page-evidence-manifest.schema.json` | Browser/session tooling | Consumer-owned session, runner, manifest, and raster artifacts | `experimental` evidence protocol | Source, revision, session, run, scenario, review deadline, or artifact integrity changes. | `scripts/test-validate-page-evidence.mjs`, deterministic Chromium consumer-conformance job | Validation owner with consumer owner |",
264
- "| Explicit evidence freshness schedule | Evidence records that declare `expires_at` or `review_by` | `.github/workflows/evidence-freshness.yml` | Advisory JSON audit artifact | `stable` narrow schedule | Explicit deadline, auditor, schedule, or inventory changes. | `scripts/audit-evidence-freshness.mjs`, `scripts/test-audit-evidence-freshness.mjs` | Validation owner |",
265
- "| Deterministic consumer browser conformance | `tests/consumer-conformance.spec.mjs`, `tests/fixtures/consumer-conformance-scenarios.mjs`, `tests/helpers/render-consumer-conformance.mjs` | Playwright `1.61.0` in the digest-pinned `linux/amd64` image | Optional page-evidence raster artifact | `experimental` contract with blocking semantic gate and nonblocking raster capture | Viewport, container, content, state, overlay, page-scale, focus, overflow, contrast, semantics, or runtime-error changes. | Playwright matrix and `scripts/test-consumer-conformance-sentinel.mjs` | Validation owner with Design Engineering owner |",
266
- "| Shared promotion policy | Promotion policy | Manual | None | stable | Policy changes. | promotion validator | Validation owner |",
267
- "| Proposed Chromium sentinel | `tests/helpers/render-consumer-reference.mjs`, `consumer-reference/schema/calibration-record.schema.json`, `consumer-reference/baselines/*.json` | Playwright | Snapshot and raw calibration evidence | `experimental` | Renderer or baseline changes. | `scripts/validate-baseline-manifest.mjs` | Validation owner |",
268
- "| Domain manifest and scope decision | `DOMAINS.md`, `quality/claim-records/stylegallery-multidomain-scope.md` | Manual | None | `stable` | Domain membership, repository-scope, or provenance-policy changes. | `scripts/validate-domains.mjs`, `scripts/validate-governance.mjs` | Repository governance owner |",
269
- "| Layout domain hub | `layout/index.md` | Manual | None | `stable` | Layout route or ownership changes. | `scripts/validate-domains.mjs`, `scripts/validate-ia.mjs` | Pattern-data owner |",
270
- "| Motion domain guidance | `motion/*.md` | Manual | None | `experimental` | Upstream revision, evidence boundary, or guidance changes. | `scripts/validate-domains.mjs` | Motion domain owner |",
271
- "| Design Engineering domain guidance | `design-engineering/*.md` | Manual | None | `experimental` | Upstream revision, evidence boundary, or guidance changes. | `scripts/validate-domains.mjs` | Design Engineering domain owner |",
272
- "| Game UI domain guidance | `game-ui/**/*.md` | Manual | None | `experimental` | Classification, hierarchy, engine implementation, evidence boundary, or route changes. | `scripts/validate-domains.mjs` | Game UI domain owner |",
273
- "| Platform Guides domain guidance | `platform-guides/*.md` | Manual | None | `experimental` | Platform version, upstream revision, evidence boundary, or guidance changes. | `scripts/validate-domains.mjs` | Platform Guides domain owner |",
274
- "| Pattern data and examples | `scripts/pattern-data.mjs` | Manual data source | `patterns/**/*.md` | `generated` output from `stable` source | Source-lineage URL changes, generated drift, category changes, or pattern count changes. | `scripts/validate-patterns.mjs`, `scripts/validate-catalog.mjs`, `scripts/validate-governance.mjs` | Pattern-data owner |",
275
- "| Pattern generator | `scripts/generate-patterns.mjs` | Manual code source | `patterns/**/*.md` | `stable` generator, `generated` output | Generated structure changes, generated-warning changes, or generated metadata changes. | `node -c scripts/generate-patterns.mjs` | Pattern-data owner |",
276
- "| Validation scripts | `scripts/validate-*.mjs`, `scripts/test-validate-*.mjs` | Manual code source | CI validation output | `node -c` | Validation owner |",
277
- "| CI workflow | `.github/workflows/validate.yml` | Manual | GitHub Actions run | GitHub Actions | Repository governance owner |",
278
- "",
279
- "## Generated Artifact Policy",
280
- "Do not hand-edit generated artifacts.",
281
- "`scripts/pattern-data.mjs`",
282
- "`scripts/generate-patterns.mjs`",
283
- "`scripts/generate-consumer-reference-evidence.mjs`",
284
- "Browser state evidence begins with `scripts/create-component-state-session.mjs`",
285
- "Receipt creation rejects dirty relevant sources.",
286
- "browser-authored visual sidecars bind the same session, scenario, capture time, source digest, PNG bytes, dimensions, and hash",
287
- "exactly 30 channel passes over the closed 40-file runtime set",
288
- "Validation uses the receipt and completed manifest interval, not a wall-clock maximum age",
289
- "design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md",
290
- "design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md",
291
- "design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md",
292
- "design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md",
293
- "design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md",
294
- "design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md",
295
- "",
296
- "## Lifecycle States",
297
- "`draft` `stable` `deprecated` `experimental` `generated`",
298
- "",
299
- "## Review Ownership",
300
- "CODEOWNERS",
301
- "owner.enforcement: \"placeholder\"",
302
- "review_independence: \"single_account\"",
303
- "The StyleGallery-local `>=2` independent-consumer gateway applies only to consumer-local → shared-experimental invariant eligibility.",
304
- "Shared stable has no numeric adoption threshold.",
305
- "Normative correctness may waive adoption count only.",
306
- "Synthetic examples have zero durable adopter attestations and record no promotion.",
307
- "A stable contract must never be silently relabeled shared-experimental.",
308
- "",
309
- "## Staleness Control",
310
- "Decision: run a weekly advisory audit only for evidence records that already declare `expires_at` or `review_by`.",
311
- "No repository-wide maximum age or inferred time-to-live applies.",
312
- "Malformed records and auditor failures remain blocking even though due-date findings are advisory.",
313
- ".github/workflows/evidence-freshness.yml",
314
- "Monday at 05:00 UTC",
315
- "Audit trigger:",
316
- "node scripts/validate-links.mjs --json",
317
- "node scripts/test-consumer-reference-sentinel.mjs",
318
- ...sentinelProvenanceClauses,
319
- "",
320
- ].join("\n"),
321
- };
@@ -1,241 +0,0 @@
1
- export function workflowSafetyCases(workflow) {
2
- return [
3
- {
4
- name: "floating_action_ref",
5
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4", "uses: actions/checkout@v4") },
6
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref uses: actions/checkout@v4",
7
- },
8
- {
9
- name: "checkout_credentials_persisted",
10
- mutate: { ".github/workflows/validate.yml": workflow.replace(" persist-credentials: false\n", "") },
11
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
12
- },
13
- {
14
- name: "mixed_case_checkout_credentials_missing",
15
- mutate: { ".github/workflows/validate.yml": workflow.replace(" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", " - uses: Actions/Checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4") },
16
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
17
- },
18
- {
19
- name: "mixed_case_checkout_credentials_true",
20
- mutate: { ".github/workflows/validate.yml": workflow.replace(" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", " - uses: Actions/Checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n with:\n persist-credentials: true\n - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4") },
21
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
22
- },
23
- {
24
- name: "mixed_case_checkout_credentials_false",
25
- mutate: { ".github/workflows/validate.yml": workflow.replace(" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", " - uses: Actions/Checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n with:\n persist-credentials: false\n - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4") },
26
- },
27
- {
28
- name: "third_party_floating_action_ref",
29
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "uses: attacker/action@main") },
30
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref uses: attacker/action@main",
31
- },
32
- {
33
- name: "docker_action_ref",
34
- mutate: { ".github/workflows/validate.yml": workflow.replace(" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", " - uses: docker://alpine:latest\n - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4") },
35
- expect: ".github/workflows/validate.yml: docker action refs are forbidden uses: docker://alpine:latest",
36
- },
37
- {
38
- name: "repository_local_action_ref",
39
- mutate: { ".github/workflows/validate.yml": workflow.replace(" - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", " - uses: ./.github/actions/local\n - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4") },
40
- },
41
- {
42
- name: "checkout_true_with_later_env_false",
43
- mutate: { ".github/workflows/validate.yml": workflow.replace(" persist-credentials: false\n", " persist-credentials: true\n env:\n persist-credentials: false\n") },
44
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
45
- },
46
- {
47
- name: "checkout_true_with_block_scalar_false",
48
- mutate: { ".github/workflows/validate.yml": workflow.replace(" persist-credentials: false\n", " sparse-checkout: |\n persist-credentials: false\n persist-credentials: true\n") },
49
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
50
- },
51
- {
52
- name: "checkout_duplicate_credentials",
53
- mutate: { ".github/workflows/validate.yml": workflow.replace(" persist-credentials: false\n", " persist-credentials: false\n persist-credentials: false\n") },
54
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
55
- },
56
- {
57
- name: "extra_top_level_permission",
58
- mutate: { ".github/workflows/validate.yml": workflow.replace(" contents: read\n", " contents: read\n issues: read\n") },
59
- expect: ".github/workflows/validate.yml: top-level permissions must be exactly contents: read",
60
- },
61
- {
62
- name: "write_top_level_permission",
63
- mutate: { ".github/workflows/validate.yml": workflow.replace(" contents: read\n", " contents: write\n") },
64
- expect: ".github/workflows/validate.yml: top-level permissions must be exactly contents: read",
65
- },
66
- {
67
- name: "job_level_permission_override",
68
- mutate: { ".github/workflows/validate.yml": workflow.replace(" validate:\n", " validate:\n permissions:\n contents: read\n") },
69
- expect: ".github/workflows/validate.yml: job-level permissions overrides are forbidden",
70
- },
71
- {
72
- name: "single_quoted_third_party_floating_action_ref",
73
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "'uses': attacker/action@main") },
74
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref 'uses': attacker/action@main",
75
- },
76
- {
77
- name: "double_quoted_third_party_floating_action_ref",
78
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "\"uses\": attacker/action@main") },
79
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref \"uses\": attacker/action@main",
80
- },
81
- {
82
- name: "single_quoted_checkout_floating_ref",
83
- mutate: { ".github/workflows/validate.yml": quotedCheckout(workflow, "'") },
84
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref 'uses': actions/checkout@v4",
85
- },
86
- {
87
- name: "single_quoted_checkout_credentials_persisted",
88
- mutate: { ".github/workflows/validate.yml": quotedCheckout(workflow, "'") },
89
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
90
- },
91
- {
92
- name: "double_quoted_checkout_floating_ref",
93
- mutate: { ".github/workflows/validate.yml": quotedCheckout(workflow, "\"") },
94
- expect: ".github/workflows/validate.yml: floating or unlabeled action ref \"uses\": actions/checkout@v4",
95
- },
96
- {
97
- name: "double_quoted_checkout_credentials_persisted",
98
- mutate: { ".github/workflows/validate.yml": quotedCheckout(workflow, "\"") },
99
- expect: ".github/workflows/validate.yml: every actions/checkout step must set persist-credentials: false",
100
- },
101
- {
102
- name: "single_quoted_job_level_permission_override",
103
- mutate: { ".github/workflows/validate.yml": workflow.replace(" validate:\n", " validate:\n 'permissions':\n contents: read\n") },
104
- expect: ".github/workflows/validate.yml: job-level permissions overrides are forbidden",
105
- },
106
- {
107
- name: "double_quoted_job_level_permission_override",
108
- mutate: { ".github/workflows/validate.yml": workflow.replace(" validate:\n", " validate:\n \"permissions\":\n contents: read\n") },
109
- expect: ".github/workflows/validate.yml: job-level permissions overrides are forbidden",
110
- },
111
- {
112
- name: "flow_sequence_action_mapping",
113
- mutate: { ".github/workflows/validate.yml": workflow.replace("- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "- { uses: attacker/action@main }") },
114
- expect: ".github/workflows/validate.yml: flow-style sequence mappings are forbidden",
115
- },
116
- {
117
- name: "flow_sequence_checkout_with_inline_map",
118
- mutate: { ".github/workflows/validate.yml": flowCheckout(workflow) },
119
- expect: ".github/workflows/validate.yml: flow-style sequence mappings are forbidden",
120
- },
121
- {
122
- name: "flow_collection_mapping_value",
123
- mutate: { ".github/workflows/validate.yml": workflow.replace(" steps:\n", " steps: [{ uses: attacker/action@main }]\n") },
124
- expect: ".github/workflows/validate.yml: flow-style collection values are forbidden",
125
- },
126
- {
127
- name: "flow_collection_continuation_value",
128
- mutate: { ".github/workflows/validate.yml": workflow.replace(" steps:\n", " steps:\n [{ uses: attacker/action@main }]\n") },
129
- expect: ".github/workflows/validate.yml: flow-style collection values are forbidden",
130
- },
131
- {
132
- name: "double_quoted_escaped_action_key",
133
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "\"u\\u0073es\": attacker/action@main") },
134
- expect: ".github/workflows/validate.yml: escape sequences in double-quoted mapping keys are forbidden",
135
- },
136
- {
137
- name: "double_quoted_escaped_permission_key",
138
- mutate: { ".github/workflows/validate.yml": workflow.replace(" validate:\n", " validate:\n \"permi\\u0073sions\":\n contents: write\n") },
139
- expect: ".github/workflows/validate.yml: escape sequences in double-quoted mapping keys are forbidden",
140
- },
141
- {
142
- name: "explicit_action_mapping_key",
143
- mutate: { ".github/workflows/validate.yml": replaceSetupNode(workflow, " ? uses\n : attacker/action@main") },
144
- expect: ".github/workflows/validate.yml: explicit mapping keys are forbidden",
145
- },
146
- {
147
- name: "explicit_checkout_mapping_key",
148
- mutate: { ".github/workflows/validate.yml": replaceCheckout(workflow, " - ? uses\n : actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n with:\n persist-credentials: true") },
149
- expect: ".github/workflows/validate.yml: explicit mapping keys are forbidden",
150
- },
151
- {
152
- name: "explicit_permissions_mapping_key",
153
- mutate: { ".github/workflows/validate.yml": workflow.replace("permissions:\n contents: read", "? permissions\n:\n contents: write") },
154
- expect: ".github/workflows/validate.yml: explicit mapping keys are forbidden",
155
- },
156
- {
157
- name: "explicit_duplicate_checkout_credentials_key",
158
- mutate: { ".github/workflows/validate.yml": workflow.replace(" persist-credentials: false\n", " ? persist-credentials\n : false\n persist-credentials: true\n") },
159
- expect: ".github/workflows/validate.yml: explicit mapping keys are forbidden",
160
- },
161
- {
162
- name: "tagged_action_key",
163
- mutate: { ".github/workflows/validate.yml": replaceCheckout(workflow, " - name: Checkout\n !!str uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5") },
164
- expect: ".github/workflows/validate.yml: YAML tags are forbidden",
165
- },
166
- {
167
- name: "anchored_action_key",
168
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "&name uses: attacker/action@main") },
169
- expect: ".github/workflows/validate.yml: YAML anchors and aliases are forbidden",
170
- },
171
- {
172
- name: "aliased_action_value",
173
- mutate: { ".github/workflows/validate.yml": workflow.replace("name: Validate StyleGallery", "x-action: &action attacker/action@main\nname: Validate StyleGallery").replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "uses: *action") },
174
- expect: ".github/workflows/validate.yml: YAML anchors and aliases are forbidden",
175
- },
176
- {
177
- name: "merged_checkout_step",
178
- mutate: { ".github/workflows/validate.yml": workflow.replace("name: Validate StyleGallery", "x-checkout: &checkout\n uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n with:\n persist-credentials: false\nname: Validate StyleGallery").replace(" with:\n persist-credentials: false", " <<: *checkout\n with:\n persist-credentials: true") },
179
- expect: ".github/workflows/validate.yml: YAML merge keys are forbidden",
180
- },
181
- {
182
- name: "literal_block_scalar_action_ref",
183
- mutate: { ".github/workflows/validate.yml": workflow.replace("uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4", "uses: |-\n attacker/action@main") },
184
- expect: ".github/workflows/validate.yml: block scalar action refs are forbidden",
185
- },
186
- {
187
- name: "folded_block_scalar_checkout_ref",
188
- mutate: { ".github/workflows/validate.yml": replaceCheckout(workflow, " - name: Checkout\n uses: >-\n actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5\n with:\n persist-credentials: true") },
189
- expect: ".github/workflows/validate.yml: block scalar action refs are forbidden",
190
- },
191
- {
192
- name: "yaml_directive",
193
- mutate: { ".github/workflows/validate.yml": `%YAML 1.2\n---\n${workflow}` },
194
- expect: ".github/workflows/validate.yml: YAML directives are forbidden",
195
- },
196
- {
197
- name: "yaml_tag_directive",
198
- mutate: { ".github/workflows/validate.yml": `%TAG !e! tag:example.com,2026:\n---\n${workflow}` },
199
- expect: ".github/workflows/validate.yml: YAML directives are forbidden",
200
- },
201
- {
202
- name: "yaml_document_start_marker",
203
- mutate: { ".github/workflows/validate.yml": `---\n${workflow}` },
204
- expect: ".github/workflows/validate.yml: YAML document markers are forbidden",
205
- },
206
- {
207
- name: "yaml_document_end_marker",
208
- mutate: { ".github/workflows/validate.yml": `${workflow}\n...\n` },
209
- expect: ".github/workflows/validate.yml: YAML document markers are forbidden",
210
- },
211
- {
212
- name: "block_scalar_body_structural_notation_ignored",
213
- mutate: { ".github/workflows/validate.yml": workflow.replace(" run: |\n node scripts/create-component-state-session.mjs", " run: |\n ? uses\n : attacker/action@main\n !!str uses: attacker/action@main\n &action uses: attacker/action@main\n <<: *action\n uses: |\n attacker/action@main\n steps: [{ uses: attacker/action@main }]\n ---\n node scripts/create-component-state-session.mjs") },
214
- },
215
- ];
216
- }
217
-
218
- function quotedCheckout(workflow, quote) {
219
- return workflow
220
- .replace("uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4", `${quote}uses${quote}: actions/checkout@v4`)
221
- .replace(" with:\n persist-credentials: false", ` ${quote}with${quote}:\n ${quote}persist-credentials${quote}: true`);
222
- }
223
-
224
- function flowCheckout(workflow) {
225
- return replaceCheckout(
226
- workflow,
227
- " - { uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5, with: { persist-credentials: false } }",
228
- );
229
- }
230
-
231
- function replaceCheckout(workflow, replacement) {
232
- const named = " - name: Checkout\n uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n with:\n persist-credentials: false";
233
- const unnamed = " - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n with:\n persist-credentials: false";
234
- return workflow.includes(named) ? workflow.replace(named, replacement) : workflow.replace(unnamed, replacement);
235
- }
236
-
237
- function replaceSetupNode(workflow, replacement) {
238
- const named = " - name: Setup Node\n uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4";
239
- const unnamed = " - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4";
240
- return workflow.includes(named) ? workflow.replace(named, ` - name: Setup Node\n${replacement}`) : workflow.replace(unnamed, ` - ${replacement.trimStart()}`);
241
- }