@ryuenn3123/agentic-senior-core 3.0.36 → 3.0.38

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 (58) hide show
  1. package/.agent-context/prompts/bootstrap-design.md +109 -113
  2. package/.agent-context/rules/frontend-architecture.md +92 -104
  3. package/.agent-context/state/README.md +26 -0
  4. package/.cursor/mcp.json +10 -0
  5. package/.cursor/rules/agentic-senior-core.mdc +48 -0
  6. package/.cursorrules +22 -88
  7. package/.gemini/instructions.md +25 -16
  8. package/.github/copilot-instructions.md +25 -16
  9. package/.github/instructions/agentic-senior-core.instructions.md +47 -0
  10. package/.instructions.md +98 -207
  11. package/.windsurf/rules/agentic-senior-core.md +43 -0
  12. package/.windsurfrules +22 -88
  13. package/AGENTS.md +23 -26
  14. package/CLAUDE.md +43 -0
  15. package/CONTRIBUTING.md +5 -2
  16. package/GEMINI.md +43 -0
  17. package/README.md +24 -7
  18. package/lib/cli/backup.mjs +4 -4
  19. package/lib/cli/commands/init/project-context.mjs +101 -0
  20. package/lib/cli/commands/init/runtime-environment.mjs +59 -0
  21. package/lib/cli/commands/init/setup-decisions.mjs +83 -0
  22. package/lib/cli/commands/init.mjs +33 -250
  23. package/lib/cli/commands/optimize.mjs +1 -1
  24. package/lib/cli/commands/upgrade.mjs +32 -7
  25. package/lib/cli/compiler.mjs +59 -17
  26. package/lib/cli/constants.mjs +5 -0
  27. package/lib/cli/detector.mjs +4 -0
  28. package/lib/cli/preflight.mjs +3 -3
  29. package/lib/cli/project-scaffolder/design-contract/validation.mjs +789 -0
  30. package/lib/cli/project-scaffolder/design-contract.mjs +137 -861
  31. package/lib/cli/project-scaffolder/prompt-builders.mjs +73 -81
  32. package/lib/cli/utils/filesystem.mjs +79 -0
  33. package/lib/cli/utils/managed-surface.mjs +237 -0
  34. package/lib/cli/utils/prompting.mjs +44 -0
  35. package/lib/cli/utils.mjs +33 -335
  36. package/package.json +21 -2
  37. package/scripts/clean-local-artifacts.mjs +76 -0
  38. package/scripts/docs-quality-drift-report.mjs +5 -0
  39. package/scripts/frontend-usability-audit.mjs +23 -19
  40. package/scripts/governance-weekly-report.mjs +37 -15
  41. package/scripts/single-source-lazy-loading-audit.mjs +24 -0
  42. package/scripts/sync-thin-adapters.mjs +99 -129
  43. package/scripts/v3-purge-audit.mjs +5 -0
  44. package/scripts/validate/config.mjs +21 -0
  45. package/scripts/validate/coverage-checks.mjs +55 -0
  46. package/.agent-context/marketplace/trust-tiers.json +0 -114
  47. package/.agent-context/state/benchmark-analysis.json +0 -431
  48. package/.agent-context/state/benchmark-evidence-bundle.json +0 -1040
  49. package/.agent-context/state/benchmark-history.json +0 -75
  50. package/.agent-context/state/benchmark-trend-report.csv +0 -5
  51. package/.agent-context/state/benchmark-trend-report.json +0 -140
  52. package/.agent-context/state/benchmark-writer-judge-matrix.json +0 -462
  53. package/.agent-context/state/memory-continuity-benchmark.json +0 -132
  54. package/.agent-context/state/onboarding-report.json +0 -102
  55. package/.agent-context/state/quality-trend-report.json +0 -89
  56. package/.agent-context/state/token-optimization-benchmark.json +0 -130
  57. package/.agent-context/state/weekly-governance-report.json +0 -329
  58. package/lib/cli/compatibility.mjs +0 -124
@@ -0,0 +1,789 @@
1
+ import { DESIGN_REQUIRED_SECTIONS } from '../constants.mjs';
2
+
3
+ function hasNonEmptyString(value) {
4
+ return typeof value === 'string' && value.trim().length > 0;
5
+ }
6
+
7
+ export function validateDesignContractCompleteness(designIntentContract) {
8
+ const validationIssues = [];
9
+ const conceptualAnchor = designIntentContract?.conceptualAnchor;
10
+ const derivedTokenLogic = designIntentContract?.derivedTokenLogic;
11
+ const libraryDecisions = designIntentContract?.libraryDecisions;
12
+
13
+ const anchorReference = conceptualAnchor?.anchorReference || derivedTokenLogic?.anchorReference;
14
+ if (!hasNonEmptyString(anchorReference)) {
15
+ validationIssues.push('designIntent.conceptualAnchor.anchorReference must be a stable non-empty ID for deterministic validation.');
16
+ }
17
+
18
+ if (!derivedTokenLogic || typeof derivedTokenLogic !== 'object') {
19
+ validationIssues.push('designIntent.derivedTokenLogic must exist.');
20
+ } else {
21
+ if (derivedTokenLogic.anchorReference !== anchorReference) {
22
+ validationIssues.push('designIntent.derivedTokenLogic.anchorReference must exactly match designIntent.conceptualAnchor.anchorReference.');
23
+ }
24
+
25
+ for (const requiredFieldName of [
26
+ 'colorDerivationSource',
27
+ 'spacingDerivationSource',
28
+ 'typographyDerivationSource',
29
+ 'motionDerivationSource',
30
+ 'validationRule',
31
+ ]) {
32
+ if (!hasNonEmptyString(derivedTokenLogic[requiredFieldName])) {
33
+ validationIssues.push(`designIntent.derivedTokenLogic.${requiredFieldName} must be a non-empty string.`);
34
+ }
35
+ }
36
+
37
+ if (
38
+ hasNonEmptyString(derivedTokenLogic.validationRule)
39
+ && !derivedTokenLogic.validationRule.includes('anchorReference')
40
+ ) {
41
+ validationIssues.push('designIntent.derivedTokenLogic.validationRule must require traceability to anchorReference.');
42
+ }
43
+ }
44
+
45
+ if (!['verified', 'pending-verification', 'no-external-library-needed'].includes(designIntentContract?.libraryResearchStatus)) {
46
+ validationIssues.push('designIntent.libraryResearchStatus must be verified, pending-verification, or no-external-library-needed.');
47
+ }
48
+
49
+ if (!Array.isArray(libraryDecisions)) {
50
+ validationIssues.push('designIntent.libraryDecisions must be an array.');
51
+ } else {
52
+ for (const [libraryIndex, libraryDecision] of libraryDecisions.entries()) {
53
+ if (!libraryDecision || typeof libraryDecision !== 'object') {
54
+ validationIssues.push(`designIntent.libraryDecisions[${libraryIndex}] must be an object.`);
55
+ continue;
56
+ }
57
+
58
+ if (!hasNonEmptyString(libraryDecision.library)) {
59
+ validationIssues.push(`designIntent.libraryDecisions[${libraryIndex}].library must be a non-empty string.`);
60
+ }
61
+ if (!hasNonEmptyString(libraryDecision.purpose)) {
62
+ validationIssues.push(`designIntent.libraryDecisions[${libraryIndex}].purpose must be a non-empty string.`);
63
+ }
64
+
65
+ const hasVerification = hasNonEmptyString(libraryDecision.verifiedAt)
66
+ && hasNonEmptyString(libraryDecision.sourceUrl);
67
+ const hasFallback = hasNonEmptyString(libraryDecision.fallbackIfUnavailable);
68
+
69
+ if (!hasVerification && !hasFallback) {
70
+ validationIssues.push(`designIntent.libraryDecisions[${libraryIndex}] must either record verification source or provide fallbackIfUnavailable.`);
71
+ }
72
+ }
73
+ }
74
+
75
+ return validationIssues;
76
+ }
77
+
78
+ export function validateDesignIntentContract(designIntentContract) {
79
+ const validationErrors = [];
80
+
81
+ if (!designIntentContract || typeof designIntentContract !== 'object') {
82
+ return ['Design intent contract must be an object.'];
83
+ }
84
+
85
+ validationErrors.push(...validateDesignContractCompleteness(designIntentContract));
86
+
87
+ if (designIntentContract.mode !== 'dynamic') {
88
+ validationErrors.push('designIntent.mode must equal "dynamic".');
89
+ }
90
+
91
+ if (!designIntentContract.project || typeof designIntentContract.project !== 'object') {
92
+ validationErrors.push('designIntent.project must exist.');
93
+ }
94
+
95
+ if (!designIntentContract.designPhilosophy || typeof designIntentContract.designPhilosophy !== 'string') {
96
+ validationErrors.push('designIntent.designPhilosophy must be a non-empty string.');
97
+ }
98
+
99
+ if (!designIntentContract.externalResearchIntake || typeof designIntentContract.externalResearchIntake !== 'object') {
100
+ validationErrors.push('designIntent.externalResearchIntake must exist.');
101
+ } else {
102
+ if (designIntentContract.externalResearchIntake.userSuppliedResearchPolicy !== 'read-as-candidate-evidence-not-final-prescription') {
103
+ validationErrors.push('designIntent.externalResearchIntake.userSuppliedResearchPolicy must preserve user research as candidate evidence.');
104
+ }
105
+ if (designIntentContract.externalResearchIntake.requireOfficialDocsVerificationForTechnologyClaims !== true) {
106
+ validationErrors.push('designIntent.externalResearchIntake.requireOfficialDocsVerificationForTechnologyClaims must equal true.');
107
+ }
108
+ if (
109
+ !Array.isArray(designIntentContract.externalResearchIntake.candidateDomains)
110
+ || !designIntentContract.externalResearchIntake.candidateDomains.includes('motion-and-scroll')
111
+ ) {
112
+ validationErrors.push('designIntent.externalResearchIntake.candidateDomains must include motion-and-scroll.');
113
+ }
114
+ }
115
+
116
+ if (!designIntentContract.conceptualAnchor || typeof designIntentContract.conceptualAnchor !== 'object') {
117
+ validationErrors.push('designIntent.conceptualAnchor must exist.');
118
+ } else {
119
+ const conceptualAnchor = designIntentContract.conceptualAnchor;
120
+ if (conceptualAnchor.mode !== 'required-when-no-external-research') {
121
+ validationErrors.push('designIntent.conceptualAnchor.mode must equal "required-when-no-external-research".');
122
+ }
123
+ if (conceptualAnchor.seedMode !== 'selection-policy-only') {
124
+ validationErrors.push('designIntent.conceptualAnchor.seedMode must equal "selection-policy-only".');
125
+ }
126
+ if (conceptualAnchor.requiresAgentSelectionBeforeUiImplementation !== true) {
127
+ validationErrors.push('designIntent.conceptualAnchor.requiresAgentSelectionBeforeUiImplementation must equal true.');
128
+ }
129
+ if (!hasNonEmptyString(conceptualAnchor.anchorReference)) {
130
+ validationErrors.push('designIntent.conceptualAnchor.anchorReference must be a stable non-empty ID.');
131
+ }
132
+ const userResearchAbsencePolicy = conceptualAnchor.userResearchAbsencePolicy;
133
+ if (!userResearchAbsencePolicy || typeof userResearchAbsencePolicy !== 'object') {
134
+ validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy must exist.');
135
+ } else {
136
+ if (userResearchAbsencePolicy.userSuppliedResearchOnly !== true) {
137
+ validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.userSuppliedResearchOnly must equal true.');
138
+ }
139
+ if (userResearchAbsencePolicy.scaffoldSeedDoesNotCountAsResearch !== true) {
140
+ validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.scaffoldSeedDoesNotCountAsResearch must equal true.');
141
+ }
142
+ if (userResearchAbsencePolicy.priorUiDoesNotCountAsResearch !== true) {
143
+ validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.priorUiDoesNotCountAsResearch must equal true.');
144
+ }
145
+ if (userResearchAbsencePolicy.requireAgentLedResearchWhenAvailable !== true) {
146
+ validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.requireAgentLedResearchWhenAvailable must equal true.');
147
+ }
148
+ }
149
+ const candidateSelectionPolicy = conceptualAnchor.candidateSelectionPolicy;
150
+ if (!candidateSelectionPolicy || typeof candidateSelectionPolicy !== 'object') {
151
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy must exist.');
152
+ } else {
153
+ if (candidateSelectionPolicy.considerAtLeast < 3) {
154
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.considerAtLeast must be at least 3.');
155
+ }
156
+ if (candidateSelectionPolicy.discardObviousCandidateCount < 2) {
157
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.discardObviousCandidateCount must be at least 2.');
158
+ }
159
+ if (candidateSelectionPolicy.minimumCandidateDistance !== 'high') {
160
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.minimumCandidateDistance must equal "high".');
161
+ }
162
+ if (candidateSelectionPolicy.discardPredictableCandidates !== true) {
163
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.discardPredictableCandidates must equal true.');
164
+ }
165
+ if (candidateSelectionPolicy.preferDistinctiveOverSafe !== true) {
166
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.preferDistinctiveOverSafe must equal true.');
167
+ }
168
+ if (candidateSelectionPolicy.doNotRevealHiddenCandidateList !== true) {
169
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.doNotRevealHiddenCandidateList must equal true.');
170
+ }
171
+ if (candidateSelectionPolicy.outputOnlyChosenAnchor !== true) {
172
+ validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.outputOnlyChosenAnchor must equal true.');
173
+ }
174
+ }
175
+ const creativeCommitmentPolicy = conceptualAnchor.creativeCommitmentPolicy;
176
+ if (!creativeCommitmentPolicy || typeof creativeCommitmentPolicy !== 'object') {
177
+ validationErrors.push('designIntent.conceptualAnchor.creativeCommitmentPolicy must exist.');
178
+ } else {
179
+ if (creativeCommitmentPolicy.requiredBeforeComplianceReview !== true) {
180
+ validationErrors.push('designIntent.conceptualAnchor.creativeCommitmentPolicy.requiredBeforeComplianceReview must equal true.');
181
+ }
182
+ if (creativeCommitmentPolicy.recordInDesignDocs !== true) {
183
+ validationErrors.push('designIntent.conceptualAnchor.creativeCommitmentPolicy.recordInDesignDocs must equal true.');
184
+ }
185
+ if (
186
+ !Array.isArray(creativeCommitmentPolicy.requiredCommitmentFields)
187
+ || !creativeCommitmentPolicy.requiredCommitmentFields.includes('specificReferencePoint')
188
+ || !creativeCommitmentPolicy.requiredCommitmentFields.includes('signatureMotion')
189
+ || !creativeCommitmentPolicy.requiredCommitmentFields.includes('typographicDecision')
190
+ ) {
191
+ validationErrors.push('designIntent.conceptualAnchor.creativeCommitmentPolicy.requiredCommitmentFields must include specificReferencePoint, signatureMotion, and typographicDecision.');
192
+ }
193
+ if (creativeCommitmentPolicy.rejectGenericQualityWordsOnly !== true) {
194
+ validationErrors.push('designIntent.conceptualAnchor.creativeCommitmentPolicy.rejectGenericQualityWordsOnly must equal true.');
195
+ }
196
+ }
197
+ if (
198
+ !Array.isArray(conceptualAnchor.forbiddenFinalAnchorTerms)
199
+ || !conceptualAnchor.forbiddenFinalAnchorTerms.includes('dashboard')
200
+ || !conceptualAnchor.forbiddenFinalAnchorTerms.includes('cards')
201
+ || !conceptualAnchor.forbiddenFinalAnchorTerms.includes('safe-admin-layout')
202
+ ) {
203
+ validationErrors.push('designIntent.conceptualAnchor.forbiddenFinalAnchorTerms must reject basic UI labels.');
204
+ }
205
+ if (
206
+ !Array.isArray(conceptualAnchor.sourceDomains)
207
+ || conceptualAnchor.sourceDomains.length < 4
208
+ || !conceptualAnchor.sourceDomains.includes('complex-physical-engineering')
209
+ || !conceptualAnchor.sourceDomains.includes('cinematic-spatial-interface')
210
+ || !conceptualAnchor.sourceDomains.includes('premium-interactive-web-experiences')
211
+ ) {
212
+ validationErrors.push('designIntent.conceptualAnchor.sourceDomains must list broad non-template anchor domains.');
213
+ }
214
+ const visualRiskBudget = conceptualAnchor.visualRiskBudget;
215
+ if (!visualRiskBudget || typeof visualRiskBudget !== 'object') {
216
+ validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget must exist.');
217
+ } else {
218
+ if (visualRiskBudget.mode !== 'high-distinctiveness-with-accessibility-and-performance-guardrails') {
219
+ validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.mode must preserve high-distinctiveness guardrails.');
220
+ }
221
+ if (visualRiskBudget.allowRichMotionAndMicroInteraction !== true) {
222
+ validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.allowRichMotionAndMicroInteraction must equal true.');
223
+ }
224
+ if (visualRiskBudget.rejectTimidDefaultWhenAnchorSupportsExpressiveUi !== true) {
225
+ validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.rejectTimidDefaultWhenAnchorSupportsExpressiveUi must equal true.');
226
+ }
227
+ if (visualRiskBudget.requireReducedMotionFallback !== true) {
228
+ validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.requireReducedMotionFallback must equal true.');
229
+ }
230
+ }
231
+ if (
232
+ !Array.isArray(conceptualAnchor.requiredDerivedAxes)
233
+ || !conceptualAnchor.requiredDerivedAxes.includes('typography')
234
+ || !conceptualAnchor.requiredDerivedAxes.includes('responsive-composition')
235
+ ) {
236
+ validationErrors.push('designIntent.conceptualAnchor.requiredDerivedAxes must include typography and responsive-composition.');
237
+ }
238
+ const finalAnchorContract = conceptualAnchor.finalAnchorContract;
239
+ if (!finalAnchorContract || typeof finalAnchorContract !== 'object') {
240
+ validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract must exist.');
241
+ } else {
242
+ if (
243
+ !Array.isArray(finalAnchorContract.requiredFields)
244
+ || !finalAnchorContract.requiredFields.includes('anchorReference')
245
+ || !finalAnchorContract.requiredFields.includes('agentResearchMode')
246
+ || !finalAnchorContract.requiredFields.includes('specificReferencePoint')
247
+ || !finalAnchorContract.requiredFields.includes('signatureMotion')
248
+ || !finalAnchorContract.requiredFields.includes('typographicDecision')
249
+ || !finalAnchorContract.requiredFields.includes('derivedTokenLogic')
250
+ || !finalAnchorContract.requiredFields.includes('visualRiskBudget')
251
+ || !finalAnchorContract.requiredFields.includes('motionRiskBudget')
252
+ || !finalAnchorContract.requiredFields.includes('cohesionChecks')
253
+ ) {
254
+ validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.requiredFields must require anchorReference, agentResearchMode, specificReferencePoint, signatureMotion, typographicDecision, derivedTokenLogic, visualRiskBudget, motionRiskBudget, and cohesionChecks.');
255
+ }
256
+ if (
257
+ !Array.isArray(finalAnchorContract.derivedTokenLogicAxes)
258
+ || !finalAnchorContract.derivedTokenLogicAxes.includes('motion')
259
+ || !finalAnchorContract.derivedTokenLogicAxes.includes('morphology')
260
+ ) {
261
+ validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.derivedTokenLogicAxes must include motion and morphology.');
262
+ }
263
+ if (
264
+ !Array.isArray(finalAnchorContract.cohesionChecks)
265
+ || !finalAnchorContract.cohesionChecks.includes('no-dashboard-mental-model')
266
+ || !finalAnchorContract.cohesionChecks.includes('motion-derived-from-anchor')
267
+ ) {
268
+ validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.cohesionChecks must reject dashboard mental models and require motion derivation.');
269
+ }
270
+ }
271
+ }
272
+
273
+ if (!designIntentContract.mathSystems || typeof designIntentContract.mathSystems !== 'object') {
274
+ validationErrors.push('designIntent.mathSystems must exist.');
275
+ } else {
276
+ if (!String(designIntentContract.mathSystems.typographyScaleRatio || '').trim()) {
277
+ validationErrors.push('designIntent.mathSystems.typographyScaleRatio must describe the chosen or pending type scale decision.');
278
+ }
279
+ if (!String(designIntentContract.mathSystems.baseGridUnit || '').trim()) {
280
+ validationErrors.push('designIntent.mathSystems.baseGridUnit must describe the chosen or pending spacing grid decision.');
281
+ }
282
+ }
283
+
284
+ if (!designIntentContract.aiSafeUiAudit || typeof designIntentContract.aiSafeUiAudit !== 'object') {
285
+ validationErrors.push('designIntent.aiSafeUiAudit must exist.');
286
+ } else {
287
+ const aiSafeUiAudit = designIntentContract.aiSafeUiAudit;
288
+ if (aiSafeUiAudit.status !== 'agent-must-complete-before-ui-implementation') {
289
+ validationErrors.push('designIntent.aiSafeUiAudit.status must require completion before UI implementation.');
290
+ }
291
+ if (!String(aiSafeUiAudit.failureDefinition || '').includes('AI-safe')) {
292
+ validationErrors.push('designIntent.aiSafeUiAudit.failureDefinition must define AI-safe UI drift.');
293
+ }
294
+ if (!String(aiSafeUiAudit.interchangeabilityTest || '').includes('renamed')) {
295
+ validationErrors.push('designIntent.aiSafeUiAudit.interchangeabilityTest must include the rename/interchangeability test.');
296
+ }
297
+ if (!Array.isArray(aiSafeUiAudit.requiredProductSpecificSignals) || aiSafeUiAudit.requiredProductSpecificSignals.length < 3) {
298
+ validationErrors.push('designIntent.aiSafeUiAudit.requiredProductSpecificSignals must list at least three product-specific signals.');
299
+ }
300
+ if (!String(aiSafeUiAudit.paletteExplorationRule || '').trim()) {
301
+ validationErrors.push('designIntent.aiSafeUiAudit.paletteExplorationRule must be a non-empty string.');
302
+ }
303
+ if (!String(aiSafeUiAudit.backgroundPatternRule || '').trim()) {
304
+ validationErrors.push('designIntent.aiSafeUiAudit.backgroundPatternRule must be a non-empty string.');
305
+ }
306
+ if (!aiSafeUiAudit.aiColorAudit || typeof aiSafeUiAudit.aiColorAudit !== 'object') {
307
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit must exist.');
308
+ } else {
309
+ if (aiSafeUiAudit.aiColorAudit.status !== 'agent-must-complete-before-ui-implementation') {
310
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit.status must require completion before UI implementation.');
311
+ }
312
+ if (!String(aiSafeUiAudit.aiColorAudit.failureDefinition || '').includes('AI color')) {
313
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit.failureDefinition must define AI color drift.');
314
+ }
315
+ if (!Array.isArray(aiSafeUiAudit.aiColorAudit.autopilotRisks) || aiSafeUiAudit.aiColorAudit.autopilotRisks.length < 4) {
316
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit.autopilotRisks must list common autopilot palettes.');
317
+ }
318
+ if (!Array.isArray(aiSafeUiAudit.aiColorAudit.requiredEvidence) || aiSafeUiAudit.aiColorAudit.requiredEvidence.length < 3) {
319
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit.requiredEvidence must list color evidence requirements.');
320
+ }
321
+ if (!String(aiSafeUiAudit.aiColorAudit.reviewQuestion || '').trim()) {
322
+ validationErrors.push('designIntent.aiSafeUiAudit.aiColorAudit.reviewQuestion must be a non-empty string.');
323
+ }
324
+ }
325
+ if (!aiSafeUiAudit.motionSpatialCourageAudit || typeof aiSafeUiAudit.motionSpatialCourageAudit !== 'object') {
326
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit must exist.');
327
+ } else {
328
+ if (aiSafeUiAudit.motionSpatialCourageAudit.status !== 'agent-must-complete-before-ui-implementation') {
329
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit.status must require completion before UI implementation.');
330
+ }
331
+ if (!String(aiSafeUiAudit.motionSpatialCourageAudit.defaultStance || '').includes('first-class options')) {
332
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit.defaultStance must treat motion and spatial UI as first-class options.');
333
+ }
334
+ if (!Array.isArray(aiSafeUiAudit.motionSpatialCourageAudit.requiredDecisionFields) || aiSafeUiAudit.motionSpatialCourageAudit.requiredDecisionFields.length < 3) {
335
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit.requiredDecisionFields must list required motion/spatial decisions.');
336
+ }
337
+ if (!String(aiSafeUiAudit.motionSpatialCourageAudit.rejectionRule || '').includes('product reason')) {
338
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit.rejectionRule must require a product reason before omitting spatial UI.');
339
+ }
340
+ if (!String(aiSafeUiAudit.motionSpatialCourageAudit.reviewQuestion || '').trim()) {
341
+ validationErrors.push('designIntent.aiSafeUiAudit.motionSpatialCourageAudit.reviewQuestion must be a non-empty string.');
342
+ }
343
+ }
344
+ if (!String(aiSafeUiAudit.reviewQuestion || '').trim()) {
345
+ validationErrors.push('designIntent.aiSafeUiAudit.reviewQuestion must be a non-empty string.');
346
+ }
347
+ if (aiSafeUiAudit.blockingByDefault !== true) {
348
+ validationErrors.push('designIntent.aiSafeUiAudit.blockingByDefault must equal true.');
349
+ }
350
+ }
351
+
352
+ if (!designIntentContract.tokenSystem || typeof designIntentContract.tokenSystem !== 'object') {
353
+ validationErrors.push('designIntent.tokenSystem must exist.');
354
+ } else {
355
+ const taxonomyOrder = designIntentContract.tokenSystem.taxonomyOrder;
356
+ if (!Array.isArray(taxonomyOrder) || taxonomyOrder.join('|') !== 'primitive|semantic|component') {
357
+ validationErrors.push('designIntent.tokenSystem.taxonomyOrder must equal ["primitive","semantic","component"].');
358
+ }
359
+ if (designIntentContract.tokenSystem.primitiveColorSpace !== 'OKLCH') {
360
+ validationErrors.push('designIntent.tokenSystem.primitiveColorSpace must equal "OKLCH".');
361
+ }
362
+ if (designIntentContract.tokenSystem.requireSemanticAliases !== true) {
363
+ validationErrors.push('designIntent.tokenSystem.requireSemanticAliases must equal true.');
364
+ }
365
+ if (designIntentContract.tokenSystem.semanticAliasesMutableWithoutComponentRewrite !== true) {
366
+ validationErrors.push('designIntent.tokenSystem.semanticAliasesMutableWithoutComponentRewrite must equal true.');
367
+ }
368
+ if (designIntentContract.tokenSystem.componentTokensConsumeSemantic !== true) {
369
+ validationErrors.push('designIntent.tokenSystem.componentTokensConsumeSemantic must equal true.');
370
+ }
371
+ const fallbackPolicy = designIntentContract.tokenSystem.fallbackPolicy;
372
+ if (!fallbackPolicy || typeof fallbackPolicy !== 'object') {
373
+ validationErrors.push('designIntent.tokenSystem.fallbackPolicy must exist.');
374
+ } else {
375
+ if (fallbackPolicy.forbidRawHexOutsidePrimitives !== true) {
376
+ validationErrors.push('designIntent.tokenSystem.fallbackPolicy.forbidRawHexOutsidePrimitives must equal true.');
377
+ }
378
+ if (fallbackPolicy.forbidRawSpacingOutsidePrimitives !== true) {
379
+ validationErrors.push('designIntent.tokenSystem.fallbackPolicy.forbidRawSpacingOutsidePrimitives must equal true.');
380
+ }
381
+ if (fallbackPolicy.requireDocumentedExceptionForLegacyBypass !== true) {
382
+ validationErrors.push('designIntent.tokenSystem.fallbackPolicy.requireDocumentedExceptionForLegacyBypass must equal true.');
383
+ }
384
+ }
385
+ const namingConstraints = designIntentContract.tokenSystem.namingConstraints;
386
+ if (!namingConstraints || typeof namingConstraints !== 'object') {
387
+ validationErrors.push('designIntent.tokenSystem.namingConstraints must exist.');
388
+ } else {
389
+ if (namingConstraints.forbidCurlyBracesInNames !== true) {
390
+ validationErrors.push('designIntent.tokenSystem.namingConstraints.forbidCurlyBracesInNames must equal true.');
391
+ }
392
+ if (namingConstraints.forbidDotsInNames !== true) {
393
+ validationErrors.push('designIntent.tokenSystem.namingConstraints.forbidDotsInNames must equal true.');
394
+ }
395
+ if (namingConstraints.forbidSquareBracketsInNames !== true) {
396
+ validationErrors.push('designIntent.tokenSystem.namingConstraints.forbidSquareBracketsInNames must equal true.');
397
+ }
398
+ }
399
+ }
400
+
401
+ if (!designIntentContract.colorTruth || typeof designIntentContract.colorTruth !== 'object') {
402
+ validationErrors.push('designIntent.colorTruth must exist.');
403
+ } else {
404
+ if (designIntentContract.colorTruth.format !== 'OKLCH') {
405
+ validationErrors.push('designIntent.colorTruth.format must equal "OKLCH".');
406
+ }
407
+ if (designIntentContract.colorTruth.allowHexDerivatives !== true) {
408
+ validationErrors.push('designIntent.colorTruth.allowHexDerivatives must equal true.');
409
+ }
410
+ if (!String(designIntentContract.colorTruth.intent || '').trim()) {
411
+ validationErrors.push('designIntent.colorTruth.intent must be a non-empty string.');
412
+ }
413
+ const paletteRoles = designIntentContract.colorTruth.paletteRoles;
414
+ if (!Array.isArray(paletteRoles) || paletteRoles.length < 1) {
415
+ validationErrors.push('designIntent.colorTruth.paletteRoles must define or request agent-defined semantic palette roles.');
416
+ }
417
+ if (designIntentContract.colorTruth.rolesMustBeAgentDefined !== true) {
418
+ validationErrors.push('designIntent.colorTruth.rolesMustBeAgentDefined must equal true.');
419
+ }
420
+ }
421
+
422
+ if (!designIntentContract.crossViewportAdaptation || typeof designIntentContract.crossViewportAdaptation !== 'object') {
423
+ validationErrors.push('designIntent.crossViewportAdaptation must exist.');
424
+ } else {
425
+ const mutationRules = designIntentContract.crossViewportAdaptation.mutationRules;
426
+ if (!mutationRules || typeof mutationRules !== 'object') {
427
+ validationErrors.push('designIntent.crossViewportAdaptation.mutationRules must exist.');
428
+ } else {
429
+ for (const viewportKey of ['mobile', 'tablet', 'desktop']) {
430
+ if (!String(mutationRules[viewportKey] || '').trim()) {
431
+ validationErrors.push(`designIntent.crossViewportAdaptation.mutationRules.${viewportKey} must be a non-empty string.`);
432
+ }
433
+ }
434
+ }
435
+ }
436
+
437
+ if (!designIntentContract.motionSystem || typeof designIntentContract.motionSystem !== 'object') {
438
+ validationErrors.push('designIntent.motionSystem must exist.');
439
+ } else {
440
+ if (designIntentContract.motionSystem.allowMeaningfulMotion !== true) {
441
+ validationErrors.push('designIntent.motionSystem.allowMeaningfulMotion must equal true.');
442
+ }
443
+ if (!String(designIntentContract.motionSystem.purpose || '').trim()) {
444
+ validationErrors.push('designIntent.motionSystem.purpose must be a non-empty string.');
445
+ }
446
+ if (designIntentContract.motionSystem.respectReducedMotion !== true) {
447
+ validationErrors.push('designIntent.motionSystem.respectReducedMotion must equal true.');
448
+ }
449
+ }
450
+
451
+ if (!designIntentContract.componentMorphology || typeof designIntentContract.componentMorphology !== 'object') {
452
+ validationErrors.push('designIntent.componentMorphology must exist.');
453
+ } else {
454
+ if (designIntentContract.componentMorphology.requireStateBehaviorMatrix !== true) {
455
+ validationErrors.push('designIntent.componentMorphology.requireStateBehaviorMatrix must equal true.');
456
+ }
457
+ if (!Array.isArray(designIntentContract.componentMorphology.stateKeys) || designIntentContract.componentMorphology.stateKeys.length < 4) {
458
+ validationErrors.push('designIntent.componentMorphology.stateKeys must contain multiple interaction states.');
459
+ }
460
+ const viewportBehavior = designIntentContract.componentMorphology.viewportBehavior;
461
+ if (!viewportBehavior || typeof viewportBehavior !== 'object') {
462
+ validationErrors.push('designIntent.componentMorphology.viewportBehavior must exist.');
463
+ } else {
464
+ for (const viewportKey of ['mobile', 'tablet', 'desktop']) {
465
+ if (!String(viewportBehavior[viewportKey] || '').trim()) {
466
+ validationErrors.push(`designIntent.componentMorphology.viewportBehavior.${viewportKey} must be a non-empty string.`);
467
+ }
468
+ }
469
+ }
470
+ }
471
+
472
+ if (!designIntentContract.accessibilityPolicy || typeof designIntentContract.accessibilityPolicy !== 'object') {
473
+ validationErrors.push('designIntent.accessibilityPolicy must exist.');
474
+ } else {
475
+ if (designIntentContract.accessibilityPolicy.hardComplianceFloor !== 'WCAG-2.2-AA') {
476
+ validationErrors.push('designIntent.accessibilityPolicy.hardComplianceFloor must equal "WCAG-2.2-AA".');
477
+ }
478
+ if (designIntentContract.accessibilityPolicy.advisoryContrastModel !== 'APCA') {
479
+ validationErrors.push('designIntent.accessibilityPolicy.advisoryContrastModel must equal "APCA".');
480
+ }
481
+ if (designIntentContract.accessibilityPolicy.failOnHardViolations !== true) {
482
+ validationErrors.push('designIntent.accessibilityPolicy.failOnHardViolations must equal true.');
483
+ }
484
+ if (designIntentContract.accessibilityPolicy.advisoryFindingsDoNotBlockByDefault !== true) {
485
+ validationErrors.push('designIntent.accessibilityPolicy.advisoryFindingsDoNotBlockByDefault must equal true.');
486
+ }
487
+ const hardRequirements = designIntentContract.accessibilityPolicy.hardRequirements;
488
+ if (!hardRequirements || typeof hardRequirements !== 'object') {
489
+ validationErrors.push('designIntent.accessibilityPolicy.hardRequirements must exist.');
490
+ } else {
491
+ for (const requirementKey of [
492
+ 'textContrastMinimum',
493
+ 'nonTextContrast',
494
+ 'useOfColorOnlyProhibited',
495
+ 'focusVisible',
496
+ 'focusAppearance',
497
+ 'targetSizeMinimum',
498
+ 'keyboardAccess',
499
+ 'reflowRequired',
500
+ 'accessibleAuthenticationMinimum',
501
+ 'statusMessagesAndDynamicStateAccess',
502
+ ]) {
503
+ if (hardRequirements[requirementKey] !== true) {
504
+ validationErrors.push(`designIntent.accessibilityPolicy.hardRequirements.${requirementKey} must equal true.`);
505
+ }
506
+ }
507
+ }
508
+ const advisoryChecks = designIntentContract.accessibilityPolicy.advisoryChecks;
509
+ if (!advisoryChecks || typeof advisoryChecks !== 'object') {
510
+ validationErrors.push('designIntent.accessibilityPolicy.advisoryChecks must exist.');
511
+ } else {
512
+ for (const advisoryKey of [
513
+ 'perceptualContrastReview',
514
+ 'darkModeContrastTuning',
515
+ 'typographyReadabilityTuning',
516
+ ]) {
517
+ if (advisoryChecks[advisoryKey] !== true) {
518
+ validationErrors.push(`designIntent.accessibilityPolicy.advisoryChecks.${advisoryKey} must equal true.`);
519
+ }
520
+ }
521
+ }
522
+ }
523
+
524
+ if (!designIntentContract.contextHygiene || typeof designIntentContract.contextHygiene !== 'object') {
525
+ validationErrors.push('designIntent.contextHygiene must exist.');
526
+ } else {
527
+ if (designIntentContract.contextHygiene.continuityMode !== 'opt-in-only') {
528
+ validationErrors.push('designIntent.contextHygiene.continuityMode must equal "opt-in-only".');
529
+ }
530
+ if (designIntentContract.contextHygiene.repoEvidenceOverridesMemory !== true) {
531
+ validationErrors.push('designIntent.contextHygiene.repoEvidenceOverridesMemory must equal true.');
532
+ }
533
+ if (designIntentContract.contextHygiene.requireExplicitContinuityApproval !== true) {
534
+ validationErrors.push('designIntent.contextHygiene.requireExplicitContinuityApproval must equal true.');
535
+ }
536
+ if (designIntentContract.contextHygiene.forbidCarryoverWhenUnapproved !== true) {
537
+ validationErrors.push('designIntent.contextHygiene.forbidCarryoverWhenUnapproved must equal true.');
538
+ }
539
+ if (!Array.isArray(designIntentContract.contextHygiene.allowedSources) || designIntentContract.contextHygiene.allowedSources.length < 4) {
540
+ validationErrors.push('designIntent.contextHygiene.allowedSources must list the approved design evidence sources.');
541
+ }
542
+ if (!Array.isArray(designIntentContract.contextHygiene.taintedSources) || designIntentContract.contextHygiene.taintedSources.length < 3) {
543
+ validationErrors.push('designIntent.contextHygiene.taintedSources must list tainted carryover sources.');
544
+ }
545
+ if (!String(designIntentContract.contextHygiene.approvedExternalConstraintUsage || '').trim()) {
546
+ validationErrors.push('designIntent.contextHygiene.approvedExternalConstraintUsage must be a non-empty string.');
547
+ }
548
+ }
549
+
550
+ if (!designIntentContract.designExecutionPolicy || typeof designIntentContract.designExecutionPolicy !== 'object') {
551
+ validationErrors.push('designIntent.designExecutionPolicy must exist.');
552
+ } else {
553
+ if (designIntentContract.designExecutionPolicy.representationStrategy !== 'surface-plan-v1') {
554
+ validationErrors.push('designIntent.designExecutionPolicy.representationStrategy must equal "surface-plan-v1".');
555
+ }
556
+ for (const requiredFlagName of [
557
+ 'requireSurfacePlan',
558
+ 'requireComponentGraph',
559
+ 'requireViewportMutationPlan',
560
+ 'requireInteractionStateMatrix',
561
+ 'requireContentPriorityMap',
562
+ 'requireTaskFlowNarrative',
563
+ 'requireSignatureMoveRationale',
564
+ 'requireCreativeCommitmentGate',
565
+ 'requireStructuredHandoff',
566
+ 'requireRepoEvidenceAlignment',
567
+ 'forbidScreenshotDependency',
568
+ 'requirePerSurfaceMutationOps',
569
+ 'forbidUniformSiblingSurfaceTreatment',
570
+ 'zeroBasedRedesignResetsPriorVisualsWhenRequested',
571
+ ]) {
572
+ if (designIntentContract.designExecutionPolicy[requiredFlagName] !== true) {
573
+ validationErrors.push(`designIntent.designExecutionPolicy.${requiredFlagName} must equal true.`);
574
+ }
575
+ }
576
+ if (designIntentContract.designExecutionPolicy.handoffFormatVersion !== 'ui-handoff-v1') {
577
+ validationErrors.push('designIntent.designExecutionPolicy.handoffFormatVersion must equal "ui-handoff-v1".');
578
+ }
579
+ if (
580
+ !Array.isArray(designIntentContract.designExecutionPolicy.semanticReviewFocus)
581
+ || designIntentContract.designExecutionPolicy.semanticReviewFocus.length < 4
582
+ ) {
583
+ validationErrors.push('designIntent.designExecutionPolicy.semanticReviewFocus must list the required review dimensions.');
584
+ }
585
+ }
586
+
587
+ if (!designIntentContract.designExecutionHandoff || typeof designIntentContract.designExecutionHandoff !== 'object') {
588
+ validationErrors.push('designIntent.designExecutionHandoff must exist.');
589
+ } else {
590
+ if (designIntentContract.designExecutionHandoff.version !== 'ui-handoff-v1') {
591
+ validationErrors.push('designIntent.designExecutionHandoff.version must equal "ui-handoff-v1".');
592
+ }
593
+ if (designIntentContract.designExecutionHandoff.seedMode !== 'structure-first-scaffold') {
594
+ validationErrors.push('designIntent.designExecutionHandoff.seedMode must equal "structure-first-scaffold".');
595
+ }
596
+ if (designIntentContract.designExecutionHandoff.requiresTaskSpecificRefinement !== true) {
597
+ validationErrors.push('designIntent.designExecutionHandoff.requiresTaskSpecificRefinement must equal true.');
598
+ }
599
+ if (!String(designIntentContract.designExecutionHandoff.primaryExperienceGoal || '').trim()) {
600
+ validationErrors.push('designIntent.designExecutionHandoff.primaryExperienceGoal must be a non-empty string.');
601
+ }
602
+ if (!Array.isArray(designIntentContract.designExecutionHandoff.surfacePlan) || designIntentContract.designExecutionHandoff.surfacePlan.length < 1) {
603
+ validationErrors.push('designIntent.designExecutionHandoff.surfacePlan must define at least one planned surface.');
604
+ }
605
+ const componentGraph = designIntentContract.designExecutionHandoff.componentGraph;
606
+ if (!componentGraph || typeof componentGraph !== 'object') {
607
+ validationErrors.push('designIntent.designExecutionHandoff.componentGraph must exist.');
608
+ } else {
609
+ if (!Array.isArray(componentGraph.nodes) || componentGraph.nodes.length < 2) {
610
+ validationErrors.push('designIntent.designExecutionHandoff.componentGraph.nodes must list the primary execution nodes.');
611
+ }
612
+ if (!Array.isArray(componentGraph.edges) || componentGraph.edges.length < 1) {
613
+ validationErrors.push('designIntent.designExecutionHandoff.componentGraph.edges must define relationships between UI nodes.');
614
+ }
615
+ }
616
+ const contentPriorityMap = designIntentContract.designExecutionHandoff.contentPriorityMap;
617
+ if (!contentPriorityMap || typeof contentPriorityMap !== 'object') {
618
+ validationErrors.push('designIntent.designExecutionHandoff.contentPriorityMap must exist.');
619
+ } else {
620
+ for (const priorityBucket of ['primary', 'secondary', 'deferred']) {
621
+ if (!Array.isArray(contentPriorityMap[priorityBucket]) || contentPriorityMap[priorityBucket].length < 1) {
622
+ validationErrors.push(`designIntent.designExecutionHandoff.contentPriorityMap.${priorityBucket} must contain at least one item.`);
623
+ }
624
+ }
625
+ }
626
+ const viewportMutationPlan = designIntentContract.designExecutionHandoff.viewportMutationPlan;
627
+ if (!viewportMutationPlan || typeof viewportMutationPlan !== 'object') {
628
+ validationErrors.push('designIntent.designExecutionHandoff.viewportMutationPlan must exist.');
629
+ } else {
630
+ for (const viewportKey of ['mobile', 'tablet', 'desktop']) {
631
+ const viewportPlan = viewportMutationPlan[viewportKey];
632
+ if (!viewportPlan || typeof viewportPlan !== 'object') {
633
+ validationErrors.push(`designIntent.designExecutionHandoff.viewportMutationPlan.${viewportKey} must be an object.`);
634
+ continue;
635
+ }
636
+ if (!String(viewportPlan.primaryOperation || '').trim()) {
637
+ validationErrors.push(`designIntent.designExecutionHandoff.viewportMutationPlan.${viewportKey}.primaryOperation must be a non-empty string.`);
638
+ }
639
+ if (!Array.isArray(viewportPlan.requiredSurfaceActions) || viewportPlan.requiredSurfaceActions.length < 2) {
640
+ validationErrors.push(`designIntent.designExecutionHandoff.viewportMutationPlan.${viewportKey}.requiredSurfaceActions must contain at least two actions.`);
641
+ }
642
+ if (!Array.isArray(viewportPlan.forbiddenPatterns) || viewportPlan.forbiddenPatterns.length < 1) {
643
+ validationErrors.push(`designIntent.designExecutionHandoff.viewportMutationPlan.${viewportKey}.forbiddenPatterns must contain at least one anti-pattern.`);
644
+ }
645
+ if (!String(viewportPlan.rationale || '').trim()) {
646
+ validationErrors.push(`designIntent.designExecutionHandoff.viewportMutationPlan.${viewportKey}.rationale must be a non-empty string.`);
647
+ }
648
+ }
649
+ }
650
+ if (!Array.isArray(designIntentContract.designExecutionHandoff.interactionStateMatrix) || designIntentContract.designExecutionHandoff.interactionStateMatrix.length < 1) {
651
+ validationErrors.push('designIntent.designExecutionHandoff.interactionStateMatrix must list key component state expectations.');
652
+ }
653
+ if (!Array.isArray(designIntentContract.designExecutionHandoff.taskFlowNarrative) || designIntentContract.designExecutionHandoff.taskFlowNarrative.length < 2) {
654
+ validationErrors.push('designIntent.designExecutionHandoff.taskFlowNarrative must describe the key UI task flow in sequence.');
655
+ }
656
+ if (!String(designIntentContract.designExecutionHandoff.signatureMoveRationale || '').trim()) {
657
+ validationErrors.push('designIntent.designExecutionHandoff.signatureMoveRationale must explain the chosen authored move.');
658
+ }
659
+ const creativeCommitment = designIntentContract.designExecutionHandoff.creativeCommitment;
660
+ if (!creativeCommitment || typeof creativeCommitment !== 'object') {
661
+ validationErrors.push('designIntent.designExecutionHandoff.creativeCommitment must exist.');
662
+ } else {
663
+ if (creativeCommitment.status !== 'agent-must-complete-before-ui-implementation') {
664
+ validationErrors.push('designIntent.designExecutionHandoff.creativeCommitment.status must equal "agent-must-complete-before-ui-implementation".');
665
+ }
666
+ if (
667
+ !Array.isArray(creativeCommitment.requiredFields)
668
+ || !creativeCommitment.requiredFields.includes('specificReferencePoint')
669
+ || !creativeCommitment.requiredFields.includes('signatureMotion')
670
+ || !creativeCommitment.requiredFields.includes('typographicDecision')
671
+ ) {
672
+ validationErrors.push('designIntent.designExecutionHandoff.creativeCommitment.requiredFields must include specificReferencePoint, signatureMotion, and typographicDecision.');
673
+ }
674
+ if (!hasNonEmptyString(creativeCommitment.failureMode)) {
675
+ validationErrors.push('designIntent.designExecutionHandoff.creativeCommitment.failureMode must be a non-empty string.');
676
+ }
677
+ }
678
+ const implementationGuardrails = designIntentContract.designExecutionHandoff.implementationGuardrails;
679
+ if (!implementationGuardrails || typeof implementationGuardrails !== 'object') {
680
+ validationErrors.push('designIntent.designExecutionHandoff.implementationGuardrails must exist.');
681
+ } else {
682
+ for (const requiredFlagName of [
683
+ 'requireBuildFromHandoff',
684
+ 'requireGapNotesBeforeFallback',
685
+ 'forbidGenericLayoutFallbackWithoutReason',
686
+ ]) {
687
+ if (implementationGuardrails[requiredFlagName] !== true) {
688
+ validationErrors.push(`designIntent.designExecutionHandoff.implementationGuardrails.${requiredFlagName} must equal true.`);
689
+ }
690
+ }
691
+ }
692
+ }
693
+
694
+ if (!designIntentContract.reviewRubric || typeof designIntentContract.reviewRubric !== 'object') {
695
+ validationErrors.push('designIntent.reviewRubric must exist.');
696
+ } else {
697
+ if (designIntentContract.reviewRubric.version !== 'ui-rubric-v1') {
698
+ validationErrors.push('designIntent.reviewRubric.version must equal "ui-rubric-v1".');
699
+ }
700
+ if (designIntentContract.reviewRubric.genericityAutoFail !== true) {
701
+ validationErrors.push('designIntent.reviewRubric.genericityAutoFail must equal true.');
702
+ }
703
+ if (!Array.isArray(designIntentContract.reviewRubric.dimensions) || designIntentContract.reviewRubric.dimensions.length < 5) {
704
+ validationErrors.push('designIntent.reviewRubric.dimensions must define the required rubric dimensions.');
705
+ } else {
706
+ for (const requiredRubricKey of [
707
+ 'distinctiveness',
708
+ 'contractFidelity',
709
+ 'visualConsistency',
710
+ 'heuristicUxQuality',
711
+ 'motionDiscipline',
712
+ ]) {
713
+ if (!designIntentContract.reviewRubric.dimensions.some((dimension) => dimension?.key === requiredRubricKey)) {
714
+ validationErrors.push(`designIntent.reviewRubric.dimensions is missing "${requiredRubricKey}".`);
715
+ }
716
+ }
717
+ }
718
+ if (!Array.isArray(designIntentContract.reviewRubric.genericitySignals) || designIntentContract.reviewRubric.genericitySignals.length < 3) {
719
+ validationErrors.push('designIntent.reviewRubric.genericitySignals must list common genericity drift signals.');
720
+ } else {
721
+ for (const requiredSignal of [
722
+ 'ai-safe-ui-template-look',
723
+ 'ai-color-default-palette-without-product-role-behavior',
724
+ 'interchangeable-product-renaming-test-fails',
725
+ 'decorative-grid-or-glow-wallpaper-without-product-function',
726
+ 'motion-or-3d-omitted-from-fear-without-fit-analysis',
727
+ ]) {
728
+ if (!designIntentContract.reviewRubric.genericitySignals.includes(requiredSignal)) {
729
+ validationErrors.push(`designIntent.reviewRubric.genericitySignals must include "${requiredSignal}".`);
730
+ }
731
+ }
732
+ }
733
+ if (!Array.isArray(designIntentContract.reviewRubric.validBoldSignals) || designIntentContract.reviewRubric.validBoldSignals.length < 3) {
734
+ validationErrors.push('designIntent.reviewRubric.validBoldSignals must list legitimate authored signals.');
735
+ } else {
736
+ for (const requiredSignal of [
737
+ 'three-at-a-glance-product-specific-signals',
738
+ 'visually-exploratory-accessible-palette-derived-from-product',
739
+ 'audacious-accessible-palette-with-product-role-behavior',
740
+ 'motion-or-spatial-experience-derived-from-anchor',
741
+ ]) {
742
+ if (!designIntentContract.reviewRubric.validBoldSignals.includes(requiredSignal)) {
743
+ validationErrors.push(`designIntent.reviewRubric.validBoldSignals must include "${requiredSignal}".`);
744
+ }
745
+ }
746
+ }
747
+ if (!designIntentContract.reviewRubric.reportingRules || typeof designIntentContract.reviewRubric.reportingRules !== 'object') {
748
+ validationErrors.push('designIntent.reviewRubric.reportingRules must exist.');
749
+ } else {
750
+ for (const requiredFlagName of [
751
+ 'mustExplainGenericity',
752
+ 'mustSeparateTasteFromFailure',
753
+ 'contractFidelityOverridesPersonalTaste',
754
+ ]) {
755
+ if (designIntentContract.reviewRubric.reportingRules[requiredFlagName] !== true) {
756
+ validationErrors.push(`designIntent.reviewRubric.reportingRules.${requiredFlagName} must equal true.`);
757
+ }
758
+ }
759
+ }
760
+ }
761
+
762
+ if (!Array.isArray(designIntentContract.requiredDesignSections) || designIntentContract.requiredDesignSections.length !== DESIGN_REQUIRED_SECTIONS.length) {
763
+ validationErrors.push('designIntent.requiredDesignSections must match the required design contract sections.');
764
+ } else {
765
+ for (const requiredSectionName of DESIGN_REQUIRED_SECTIONS) {
766
+ if (!designIntentContract.requiredDesignSections.includes(requiredSectionName)) {
767
+ validationErrors.push(`designIntent.requiredDesignSections is missing "${requiredSectionName}".`);
768
+ }
769
+ }
770
+ }
771
+
772
+ if (!Array.isArray(designIntentContract.forbiddenPatterns) || designIntentContract.forbiddenPatterns.length < 4) {
773
+ validationErrors.push('designIntent.forbiddenPatterns must list concrete anti-generic patterns.');
774
+ } else {
775
+ for (const requiredPattern of [
776
+ 'ai-safe-ui-template-look',
777
+ 'ai-color-default-palette-without-product-role-behavior',
778
+ 'interchangeable-product-renaming-test-fails',
779
+ 'decorative-grid-or-glow-wallpaper-without-product-function',
780
+ 'motion-or-3d-omitted-from-fear-without-fit-analysis',
781
+ ]) {
782
+ if (!designIntentContract.forbiddenPatterns.includes(requiredPattern)) {
783
+ validationErrors.push(`designIntent.forbiddenPatterns must include "${requiredPattern}".`);
784
+ }
785
+ }
786
+ }
787
+
788
+ return validationErrors;
789
+ }