@ryuenn3123/agentic-senior-core 3.0.22 → 3.0.25
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.
- package/.agent-context/prompts/bootstrap-design.md +18 -0
- package/.agent-context/rules/frontend-architecture.md +8 -0
- package/.agent-context/state/memory-continuity-benchmark.json +1 -1
- package/.cursorrules +1 -1
- package/.windsurfrules +1 -1
- package/README.md +20 -5
- package/lib/cli/project-scaffolder/design-contract.mjs +255 -94
- package/lib/cli/project-scaffolder/prompt-builders.mjs +6 -1
- package/package.json +1 -1
|
@@ -27,6 +27,22 @@ The agent must summarize what it used from that research, discard what does not
|
|
|
27
27
|
|
|
28
28
|
User-supplied research may influence the candidate set for motion, scroll, UI primitives, canvas/3D, charts, icons, typography, and interaction patterns, but the final choice must still be project-fit, accessible, performant, and maintainable.
|
|
29
29
|
|
|
30
|
+
## Dynamic Avant-Garde Anchor Engine
|
|
31
|
+
|
|
32
|
+
If the user requests UI work but provides no user-supplied research, design reference, screenshot study, or library note, do not start coding immediately. This is not permission to fall back to the scaffold, prior UI, or generic software metaphors. First synthesize one advanced conceptual anchor that will unify the interface.
|
|
33
|
+
|
|
34
|
+
User-supplied research means current-task evidence from the user. The scaffold seed, this repo's offline examples, old design docs, and prior UI do not count as research. If live research is available, perform agent-led research into current official docs for any technology choices and current premium interaction/design patterns before selecting the anchor. If live research is unavailable, state that limitation in the design docs and synthesize from product context plus broad design knowledge without pretending the seed was research.
|
|
35
|
+
|
|
36
|
+
Do not use basic software UI labels as the final anchor, including "dashboard", "portal", "cards", "admin panel", "SaaS shell", "web app shell", or "minimalist interface".
|
|
37
|
+
|
|
38
|
+
The agent must internally consider at least three substantially different, high-variance candidate anchors, discard the two most obvious, safest, or easiest-to-predict options, and record only the surviving anchor and concise rationale. Do not expose hidden deliberation or the rejected candidate list.
|
|
39
|
+
|
|
40
|
+
The final anchor must come from broad non-template domains such as complex physical engineering, high-end industrial design, cinematic spatial interfaces, experimental editorial structure, advanced architecture, scientific instrumentation, advanced data visualization, exhibition/wayfinding systems, or premium interactive web experiences. These are search domains, not style presets.
|
|
41
|
+
|
|
42
|
+
Write the chosen anchor into `docs/design-intent.json` as `conceptualAnchor`, including agentResearchMode, sourceDomain, rationale, derivedTokenLogic, visualRiskBudget, motionRiskBudget, and cohesionChecks. Typography, spacing, density, color behavior, morphology, motion, and responsive composition must logically derive from that single anchor. If a later design choice does not follow from the anchor, revise the contract before coding.
|
|
43
|
+
|
|
44
|
+
Motion is not a garnish. The agent may use rich animation, fluid transitions, spatial reveals, scroll choreography, micro-interactions, and modern motion libraries when they support the anchor, remain performant, and include reduced-motion fallbacks. Do not suppress motion merely to look safe.
|
|
45
|
+
|
|
30
46
|
## Zero-Based Redesign Protocol
|
|
31
47
|
|
|
32
48
|
If the user says "redesign from zero", "redesain dari 0", "ulang dari 0", "research ulang", or equivalent reset language, activate reset mode.
|
|
@@ -89,6 +105,7 @@ For every UI task, define how major surfaces change across mobile, tablet, and d
|
|
|
89
105
|
The JSON must stay machine-readable and project-specific. It should record:
|
|
90
106
|
- the confirmed project context and assumptions to validate
|
|
91
107
|
- agent-chosen visual direction, not scaffold-chosen direction
|
|
108
|
+
- `conceptualAnchor` and how typography, spacing, morphology, motion, and responsive composition derive from it when no external research was provided
|
|
92
109
|
- agent-chosen semantic color roles, typography system, spacing rhythm, and motion approach
|
|
93
110
|
- token layering with primitive, semantic, and component tokens
|
|
94
111
|
- viewport mutation rules for mobile, tablet, and desktop
|
|
@@ -107,6 +124,7 @@ The review must block or flag:
|
|
|
107
124
|
- scale-only responsive behavior
|
|
108
125
|
- unresearched dependency choices
|
|
109
126
|
- default component-kit styling without product rationale
|
|
127
|
+
- missing or disconnected `conceptualAnchor` when no external design research was provided
|
|
110
128
|
- visual direction copied from unrelated memory or external references
|
|
111
129
|
- genericity findings that cannot name the exact drift signal
|
|
112
130
|
|
|
@@ -52,6 +52,14 @@ Do not use this file to teach generic frontend basics the model already knows.
|
|
|
52
52
|
- Do not let heading, body, and data/meta roles collapse into one safe typographic family without explicit rationale.
|
|
53
53
|
- At least one visual, interaction, content, motion, or state behavior must read as project-specific at a glance.
|
|
54
54
|
|
|
55
|
+
## Dynamic Avant-Garde Anchor Boundary
|
|
56
|
+
|
|
57
|
+
- If the user gives no current-task visual research or reference, the scaffold, old UI, and existing design docs do not count as research.
|
|
58
|
+
- Before UI code, choose one agent-synthesized conceptual anchor from high-variance non-software domains and record only the final anchor in `docs/design-intent.json`.
|
|
59
|
+
- Internally reject the safest dashboard, portal, card-grid, admin-shell, or minimalist-web-app mental model before writing CSS.
|
|
60
|
+
- Typography, spacing, morphology, motion, and responsive recomposition must derive from the chosen anchor, not from framework defaults.
|
|
61
|
+
- Rich motion, spatial transitions, and micro-interactions are allowed when they support the anchor and include reduced-motion and performance safeguards.
|
|
62
|
+
|
|
55
63
|
## Responsive Mutation Requirements
|
|
56
64
|
|
|
57
65
|
- Responsive quality is not allowed to be scale-only. At least one surface must materially change position, grouping, priority, or disclosure strategy between mobile and desktop.
|
package/.cursorrules
CHANGED
package/.windsurfrules
CHANGED
package/README.md
CHANGED
|
@@ -10,12 +10,13 @@
|
|
|
10
10
|
**Production-grade Rules Engine (Governance Engine) for AI coding agents.**
|
|
11
11
|
Works with Cursor, Windsurf, GitHub Copilot, Claude Code, Gemini, and other LLM-powered IDE workflows.
|
|
12
12
|
|
|
13
|
-
Latest release: 3.0.
|
|
13
|
+
Latest release: 3.0.25 (2026-04-25).
|
|
14
14
|
|
|
15
|
-
Highlights in 3.0.
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
15
|
+
Highlights in 3.0.25:
|
|
16
|
+
- UI design bootstrap now forces a dynamic conceptual anchor when no current-task visual research is provided.
|
|
17
|
+
- Agents must use live/current-year research for ecosystem, framework, dependency, Docker, and modern UI/library claims instead of offline repository guesses.
|
|
18
|
+
- Frontend guidance now rejects safe dashboard/admin-panel defaults, requires responsive recomposition, and allows rich modern motion when it supports the chosen concept.
|
|
19
|
+
- Generated design-intent seeds are more compact, leaving the LLM room to synthesize project-specific visual direction instead of inheriting verbose scaffold bias.
|
|
19
20
|
|
|
20
21
|
</div>
|
|
21
22
|
|
|
@@ -37,6 +38,20 @@ One command to initialize rules, checklists, and strict AI coding guidelines con
|
|
|
37
38
|
|
|
38
39
|
---
|
|
39
40
|
|
|
41
|
+
## Design Direction
|
|
42
|
+
|
|
43
|
+
For UI, UX, layout, screen, Tailwind, frontend, or redesign work, the pack routes agents through the design bootstrap and frontend architecture rules before code changes.
|
|
44
|
+
|
|
45
|
+
The intended behavior is agent-led, not offline-template-led:
|
|
46
|
+
|
|
47
|
+
- Existing projects: read the real repository, docs, UI surface, and current user brief before changing design.
|
|
48
|
+
- Fresh projects: ask the LLM agent to recommend the stack and design approach from current evidence instead of silently choosing a hardcoded framework.
|
|
49
|
+
- No visual reference provided: synthesize one modern conceptual anchor first, then derive typography, spacing, morphology, motion, and responsive behavior from that anchor.
|
|
50
|
+
- Modern UI claims: research current-year libraries and patterns when relevant; 2026 work should use 2026 evidence, and future years should update automatically through agent research.
|
|
51
|
+
- Anti-generic rule: avoid safe dashboard shells, admin panels, card grids, scale-only mobile layouts, and static no-motion interfaces unless the product context explicitly justifies them.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
40
55
|
## MCP Quick Setup (VS Code)
|
|
41
56
|
|
|
42
57
|
1. Generate workspace MCP config:
|
|
@@ -51,8 +51,6 @@ function buildStructureFirstSeedSignals({
|
|
|
51
51
|
|
|
52
52
|
return {
|
|
53
53
|
designPhilosophy: `Use ${evidenceSourceLabel} to synthesize the design system for ${projectName || 'this project'}. This seed is only a decision scaffold: the LLM must choose the visual language, libraries, color system, typography, spacing, and interaction model from ${projectContextLabel}, current repo evidence, and live official documentation when a technology claim is needed.`,
|
|
54
|
-
brandAdjectives: ['agent-synthesized-from-current-context'],
|
|
55
|
-
antiAdjectives: ['offline-prescribed-style', 'template-by-default', 'scale-only-responsive', 'unresearched-library-choice'],
|
|
56
54
|
typographyScaleRatio: 'agent-calibrated-from-content-platform-and-readability',
|
|
57
55
|
baseGridUnit: 'agent-calibrated-from-platform-density-and-implementation-stack',
|
|
58
56
|
spacingPattern: 'agent-defined-from-task-flow-and-viewport-needs',
|
|
@@ -60,16 +58,9 @@ function buildStructureFirstSeedSignals({
|
|
|
60
58
|
colorIntent: `Choose semantic palette roles from ${projectContextLabel}, current repo evidence, and accessibility needs. Do not inherit fixed palettes or generic SaaS color defaults from this scaffold.`,
|
|
61
59
|
paletteRoles: ['agent-defined-semantic-roles'],
|
|
62
60
|
distinctiveMoves: [
|
|
63
|
-
'
|
|
64
|
-
'Define at least one recognizable design move from the product task, audience, content, and repo evidence before implementation.',
|
|
65
|
-
'Document why the chosen move belongs to this project and which common LLM bad habit it intentionally avoids.',
|
|
61
|
+
'Choose one recognizable design move from product task, audience, content, repo evidence, and current docs; do not inherit a scaffold preset.',
|
|
66
62
|
],
|
|
67
63
|
motionPurpose: 'Use modern motion when it improves hierarchy, continuity, feedback, memorability, or perceived product quality. If implementation needs a motion library, the LLM must choose a current compatible option from official docs instead of relying on an offline default.',
|
|
68
|
-
motionChoreography: 'Define choreography from the product experience and implementation stack. Keep it performant and reduced-motion-safe; do not suppress rich interaction by default.',
|
|
69
|
-
motionDurations: {
|
|
70
|
-
desktop: 'agent-calibrated',
|
|
71
|
-
mobile: 'agent-calibrated',
|
|
72
|
-
},
|
|
73
64
|
componentMorphology: {
|
|
74
65
|
mobile: 'Recompose the experience for touch, task priority, and constrained attention. Mobile should be a deliberate mobile design, not a shrunken desktop.',
|
|
75
66
|
tablet: 'Regroup surfaces for medium-width use, preserving task clarity without cloning either desktop or mobile blindly.',
|
|
@@ -121,8 +112,6 @@ function buildDesignIntentContractObject({
|
|
|
121
112
|
: toTitleCase(initContext.blueprintFileName),
|
|
122
113
|
},
|
|
123
114
|
designPhilosophy: inferredKeywords.designPhilosophy,
|
|
124
|
-
brandAdjectives: inferredKeywords.brandAdjectives,
|
|
125
|
-
antiAdjectives: inferredKeywords.antiAdjectives,
|
|
126
115
|
visualDirection: {
|
|
127
116
|
seedMode: 'scaffold-only',
|
|
128
117
|
requiresProjectSpecificSynthesis: true,
|
|
@@ -139,14 +128,78 @@ function buildDesignIntentContractObject({
|
|
|
139
128
|
candidateDomains: [
|
|
140
129
|
'visual-direction',
|
|
141
130
|
'motion-and-scroll',
|
|
142
|
-
'ui-primitives',
|
|
143
|
-
'
|
|
144
|
-
'charts-and-data-visualization',
|
|
145
|
-
'icons-and-illustration',
|
|
146
|
-
'typography-and-interaction-patterns',
|
|
131
|
+
'ui-primitives-or-rich-media',
|
|
132
|
+
'typography-and-interaction',
|
|
147
133
|
],
|
|
148
134
|
finalDecisionAuthority: 'agent-llm-from-project-fit-accessibility-performance-maintainability-and-current-official-docs',
|
|
149
135
|
},
|
|
136
|
+
conceptualAnchor: {
|
|
137
|
+
mode: 'required-when-no-external-research',
|
|
138
|
+
seedMode: 'selection-policy-only',
|
|
139
|
+
requiresAgentSelectionBeforeUiImplementation: true,
|
|
140
|
+
userResearchAbsencePolicy: {
|
|
141
|
+
userSuppliedResearchOnly: true,
|
|
142
|
+
scaffoldSeedDoesNotCountAsResearch: true,
|
|
143
|
+
priorUiDoesNotCountAsResearch: true,
|
|
144
|
+
requireAgentLedResearchWhenAvailable: true,
|
|
145
|
+
},
|
|
146
|
+
candidateSelectionPolicy: {
|
|
147
|
+
considerAtLeast: 3,
|
|
148
|
+
discardObviousCandidateCount: 2,
|
|
149
|
+
minimumCandidateDistance: 'high',
|
|
150
|
+
discardPredictableCandidates: true,
|
|
151
|
+
preferDistinctiveOverSafe: true,
|
|
152
|
+
doNotRevealHiddenCandidateList: true,
|
|
153
|
+
outputOnlyChosenAnchor: true,
|
|
154
|
+
},
|
|
155
|
+
forbiddenFinalAnchorTerms: [
|
|
156
|
+
'dashboard',
|
|
157
|
+
'cards',
|
|
158
|
+
'admin-panel',
|
|
159
|
+
'saas-shell',
|
|
160
|
+
'minimalist-interface',
|
|
161
|
+
'safe-admin-layout',
|
|
162
|
+
],
|
|
163
|
+
sourceDomains: [
|
|
164
|
+
'complex-physical-engineering',
|
|
165
|
+
'cinematic-spatial-interface',
|
|
166
|
+
'experimental-editorial-structure',
|
|
167
|
+
'scientific-instrumentation',
|
|
168
|
+
'premium-interactive-web-experiences',
|
|
169
|
+
],
|
|
170
|
+
visualRiskBudget: {
|
|
171
|
+
mode: 'high-distinctiveness-with-accessibility-and-performance-guardrails',
|
|
172
|
+
allowRichMotionAndMicroInteraction: true,
|
|
173
|
+
rejectTimidDefaultWhenAnchorSupportsExpressiveUi: true,
|
|
174
|
+
requireReducedMotionFallback: true,
|
|
175
|
+
},
|
|
176
|
+
requiredDerivedAxes: [
|
|
177
|
+
'typography',
|
|
178
|
+
'morphology',
|
|
179
|
+
'motion',
|
|
180
|
+
'responsive-composition',
|
|
181
|
+
],
|
|
182
|
+
finalAnchorContract: {
|
|
183
|
+
requiredFields: [
|
|
184
|
+
'name',
|
|
185
|
+
'agentResearchMode',
|
|
186
|
+
'sourceDomain',
|
|
187
|
+
'rationale',
|
|
188
|
+
'derivedTokenLogic',
|
|
189
|
+
'visualRiskBudget',
|
|
190
|
+
'motionRiskBudget',
|
|
191
|
+
'cohesionChecks',
|
|
192
|
+
],
|
|
193
|
+
derivedTokenLogicAxes: [
|
|
194
|
+
'morphology',
|
|
195
|
+
'motion',
|
|
196
|
+
],
|
|
197
|
+
cohesionChecks: [
|
|
198
|
+
'no-dashboard-mental-model',
|
|
199
|
+
'motion-derived-from-anchor',
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
},
|
|
150
203
|
mathSystems: {
|
|
151
204
|
typographyScaleRatio: inferredKeywords.typographyScaleRatio,
|
|
152
205
|
baseGridUnit: inferredKeywords.baseGridUnit,
|
|
@@ -163,7 +216,6 @@ function buildDesignIntentContractObject({
|
|
|
163
216
|
componentTokensConsumeSemantic: true,
|
|
164
217
|
forbidDirectComponentPrimitiveBypass: true,
|
|
165
218
|
aliasReferenceStyle: 'brace-reference',
|
|
166
|
-
aliasingStrategy: 'Primitive tokens hold raw values, semantic tokens carry intent, and component tokens consume semantic aliases instead of raw values.',
|
|
167
219
|
fallbackPolicy: {
|
|
168
220
|
forbidRawHexOutsidePrimitives: true,
|
|
169
221
|
forbidRawSpacingOutsidePrimitives: true,
|
|
@@ -174,12 +226,6 @@ function buildDesignIntentContractObject({
|
|
|
174
226
|
forbidDotsInNames: true,
|
|
175
227
|
forbidSquareBracketsInNames: true,
|
|
176
228
|
},
|
|
177
|
-
tokenLayerRoles: {
|
|
178
|
-
primitive: 'Raw values such as colors, spacing, radius, typography, and motion primitives.',
|
|
179
|
-
semantic: 'Contextual intent tokens such as primary action, muted surface, emphasis text, or critical state.',
|
|
180
|
-
component: 'Component-scoped tokens that consume semantic aliases and preserve local consistency without redefining the system.',
|
|
181
|
-
},
|
|
182
|
-
platformOutputs: ['json-contract', 'css-variables'],
|
|
183
229
|
},
|
|
184
230
|
colorTruth: {
|
|
185
231
|
format: 'OKLCH',
|
|
@@ -199,19 +245,14 @@ function buildDesignIntentContractObject({
|
|
|
199
245
|
motionSystem: {
|
|
200
246
|
allowMeaningfulMotion: true,
|
|
201
247
|
purpose: inferredKeywords.motionPurpose,
|
|
202
|
-
choreography: inferredKeywords.motionChoreography,
|
|
203
|
-
desktopDurationMs: inferredKeywords.motionDurations.desktop,
|
|
204
|
-
mobileDurationMs: inferredKeywords.motionDurations.mobile,
|
|
205
248
|
seedToneLocked: false,
|
|
206
249
|
respectReducedMotion: true,
|
|
207
|
-
preferTransformAndOpacity: true,
|
|
208
|
-
avoidDecorativeMotionForItsOwnSake: true,
|
|
209
250
|
},
|
|
210
251
|
componentMorphology: {
|
|
211
252
|
requireStateBehaviorMatrix: true,
|
|
212
253
|
preserveIdentityAcrossViewports: true,
|
|
213
254
|
seedBehaviorsRequireRefinement: true,
|
|
214
|
-
stateKeys: ['default', '
|
|
255
|
+
stateKeys: ['default', 'focus', 'loading', 'error'],
|
|
215
256
|
viewportBehavior: inferredKeywords.componentMorphology,
|
|
216
257
|
},
|
|
217
258
|
accessibilityPolicy: {
|
|
@@ -268,45 +309,33 @@ function buildDesignIntentContractObject({
|
|
|
268
309
|
status: 'seed-needs-refinement',
|
|
269
310
|
seedMode: 'structure-first-scaffold',
|
|
270
311
|
requiresTaskSpecificRefinement: true,
|
|
271
|
-
primaryExperienceGoal: `
|
|
312
|
+
primaryExperienceGoal: `Define the main ${String(primaryDomain || 'product').toLowerCase()} journey for ${projectName} from repo evidence, the brief, and current docs. The seed must not prescribe final layout.`,
|
|
272
313
|
surfacePlan: [
|
|
273
314
|
{
|
|
274
315
|
surfaceId: 'agent-defined-primary-experience',
|
|
275
|
-
role: '
|
|
276
|
-
goal:
|
|
277
|
-
|
|
278
|
-
supportingModules: ['agent-defined-from-current-context'],
|
|
279
|
-
layoutAntiPatternToAvoid: 'template-default-without-product-rationale',
|
|
280
|
-
signatureMoveHint: 'Choose and document one project-specific visual, interaction, or content move. Do not inherit it from this scaffold.',
|
|
281
|
-
},
|
|
282
|
-
{
|
|
283
|
-
surfaceId: 'agent-defined-supporting-experience',
|
|
284
|
-
role: 'llm-synthesized-supporting-context',
|
|
285
|
-
goal: 'Define supporting, proof, utility, or recovery surfaces from actual user needs instead of cloning generic cards or rails.',
|
|
286
|
-
primaryAction: 'The LLM must decide what belongs beside, below, hidden behind disclosure, or removed based on task priority.',
|
|
287
|
-
supportingModules: ['agent-defined-from-current-context'],
|
|
288
|
-
layoutAntiPatternToAvoid: 'scale-only-responsive-layout',
|
|
289
|
-
signatureMoveHint: 'Explain how supporting content changes across viewports and why the change improves the experience.',
|
|
316
|
+
role: 'primary-context-synthesized-by-agent',
|
|
317
|
+
goal: 'Choose the first task or reading path from product evidence and reject template shells.',
|
|
318
|
+
antiPatterns: ['dashboard-default', 'scale-only-responsive-layout'],
|
|
290
319
|
},
|
|
291
320
|
],
|
|
292
321
|
componentGraph: {
|
|
293
322
|
nodes: [
|
|
294
323
|
{
|
|
295
|
-
id: '
|
|
296
|
-
role: '
|
|
324
|
+
id: 'primary-experience',
|
|
325
|
+
role: 'agent-defined-primary',
|
|
297
326
|
priority: 'high',
|
|
298
327
|
},
|
|
299
328
|
{
|
|
300
|
-
id: '
|
|
301
|
-
role: '
|
|
329
|
+
id: 'supporting-context',
|
|
330
|
+
role: 'agent-defined-support',
|
|
302
331
|
priority: 'medium',
|
|
303
332
|
},
|
|
304
333
|
],
|
|
305
334
|
edges: [
|
|
306
335
|
{
|
|
307
|
-
from: '
|
|
308
|
-
to: '
|
|
309
|
-
relationship: '
|
|
336
|
+
from: 'primary-experience',
|
|
337
|
+
to: 'supporting-context',
|
|
338
|
+
relationship: 'task-priority-support',
|
|
310
339
|
},
|
|
311
340
|
],
|
|
312
341
|
},
|
|
@@ -325,25 +354,21 @@ function buildDesignIntentContractObject({
|
|
|
325
354
|
mobile: {
|
|
326
355
|
primaryOperation: 'agent-defined-mobile-recomposition',
|
|
327
356
|
requiredSurfaceActions: [
|
|
328
|
-
'choose-mobile-
|
|
329
|
-
'
|
|
330
|
-
'adapt-interaction-model-for-touch',
|
|
357
|
+
'choose-mobile-task-order',
|
|
358
|
+
'disclose-or-remove-low-priority-content',
|
|
331
359
|
],
|
|
332
360
|
forbiddenPatterns: [
|
|
333
361
|
'scale-only-shrink',
|
|
334
|
-
'desktop-order-preserved-without-priority-shift',
|
|
335
362
|
],
|
|
336
363
|
rationale: inferredKeywords.mutationRules.mobile,
|
|
337
364
|
},
|
|
338
365
|
tablet: {
|
|
339
366
|
primaryOperation: 'agent-defined-tablet-regrouping',
|
|
340
367
|
requiredSurfaceActions: [
|
|
341
|
-
'define-medium-width-
|
|
342
|
-
'avoid-cloning-desktop-by-width-only',
|
|
368
|
+
'define-medium-width-grouping',
|
|
343
369
|
'preserve-task-clarity',
|
|
344
370
|
],
|
|
345
371
|
forbiddenPatterns: [
|
|
346
|
-
'desktop-layout-reduced-by-width-only',
|
|
347
372
|
'uniform-module-grid-without-role-change',
|
|
348
373
|
],
|
|
349
374
|
rationale: inferredKeywords.mutationRules.tablet,
|
|
@@ -352,11 +377,9 @@ function buildDesignIntentContractObject({
|
|
|
352
377
|
primaryOperation: 'agent-defined-desktop-composition',
|
|
353
378
|
requiredSurfaceActions: [
|
|
354
379
|
'use-space-to-improve-hierarchy',
|
|
355
|
-
'define-scan-pattern-and-action-priority',
|
|
356
380
|
'avoid-equalizing-unrelated-content',
|
|
357
381
|
],
|
|
358
382
|
forbiddenPatterns: [
|
|
359
|
-
'template-shell-without-product-rationale',
|
|
360
383
|
'interchangeable-dashboard-or-landing-chrome',
|
|
361
384
|
],
|
|
362
385
|
rationale: inferredKeywords.mutationRules.desktop,
|
|
@@ -364,33 +387,25 @@ function buildDesignIntentContractObject({
|
|
|
364
387
|
},
|
|
365
388
|
interactionStateMatrix: [
|
|
366
389
|
{
|
|
367
|
-
componentId: 'primary-
|
|
368
|
-
states: ['default', 'hover', 'focus', 'loading', '
|
|
369
|
-
notes: 'Refine
|
|
370
|
-
},
|
|
371
|
-
{
|
|
372
|
-
componentId: 'primary-content-module',
|
|
373
|
-
states: ['default', 'focus', 'expanded', 'loading', 'error'],
|
|
374
|
-
notes: 'Refine this module so it preserves hierarchy and progressive disclosure without collapsing into anonymous cards or safe default dashboard panels.',
|
|
390
|
+
componentId: 'primary-interaction',
|
|
391
|
+
states: ['default', 'hover', 'focus', 'loading', 'error'],
|
|
392
|
+
notes: 'Refine states from project language and the conceptual anchor; do not use anonymous default panels.',
|
|
375
393
|
},
|
|
376
394
|
],
|
|
377
395
|
taskFlowNarrative: [
|
|
378
|
-
`Entry:
|
|
379
|
-
'
|
|
380
|
-
'Resolution: the LLM must define feedback, recovery, and next-useful-action behavior without defaulting to leftover template chrome.',
|
|
396
|
+
`Entry: define how ${projectName} starts the journey from real evidence, not a generic opener.`,
|
|
397
|
+
'Resolution: define proof, feedback, recovery, and next action without leftover template chrome.',
|
|
381
398
|
],
|
|
382
399
|
visualResetStrategy: {
|
|
383
400
|
activatesWhenUserRequests: [
|
|
384
401
|
'redesign from zero',
|
|
385
402
|
'redesain dari 0',
|
|
386
|
-
'ulang dari 0',
|
|
387
|
-
'research ulang',
|
|
388
403
|
],
|
|
389
|
-
existingUiAllowedAs: ['content-evidence', 'behavior-evidence', '
|
|
390
|
-
existingUiForbiddenAs: ['palette-source', '
|
|
391
|
-
requiredResetAxes: ['composition', 'hierarchy', '
|
|
404
|
+
existingUiAllowedAs: ['content-evidence', 'behavior-evidence', 'asset-source-evidence'],
|
|
405
|
+
existingUiForbiddenAs: ['palette-source', 'layout-source', 'motion-source'],
|
|
406
|
+
requiredResetAxes: ['composition', 'hierarchy', 'motion-or-interaction', 'responsive-information-architecture'],
|
|
392
407
|
},
|
|
393
|
-
signatureMoveRationale: '
|
|
408
|
+
signatureMoveRationale: 'Agent must choose one project-specific visual, motion, typographic, or interaction move and explain why generic fallback weakens it.',
|
|
394
409
|
implementationGuardrails: {
|
|
395
410
|
requireBuildFromHandoff: true,
|
|
396
411
|
requireGapNotesBeforeFallback: true,
|
|
@@ -430,20 +445,20 @@ function buildDesignIntentContractObject({
|
|
|
430
445
|
genericitySignals: [
|
|
431
446
|
'offline-prescribed-style-used-as-final-direction',
|
|
432
447
|
'unresearched-library-or-framework-choice',
|
|
433
|
-
'
|
|
448
|
+
'missing-conceptual-anchor-without-external-research',
|
|
449
|
+
'visual-decisions-not-derived-from-conceptual-anchor',
|
|
450
|
+
'timid-anchor-that-renames-dashboard-or-admin-shell',
|
|
451
|
+
'motion-suppressed-without-accessibility-or-performance-reason',
|
|
434
452
|
'scale-only-responsive-layout',
|
|
435
|
-
'template-shell-without-product-rationale',
|
|
436
453
|
'zero-based-redesign-kept-prior-visual-dna',
|
|
437
454
|
'restyle-instead-of-recomposition',
|
|
438
|
-
'inaccessible-or-decorative-motion',
|
|
439
455
|
],
|
|
440
456
|
validBoldSignals: [
|
|
457
|
+
'single-cohesive-conceptual-anchor',
|
|
458
|
+
'high-variance-candidate-selection',
|
|
441
459
|
'context-derived-visual-direction',
|
|
442
|
-
'official-docs-backed-library-choice',
|
|
443
460
|
'responsive-recomposition-by-task-priority',
|
|
444
461
|
'purposeful-motion-with-reduced-motion-path',
|
|
445
|
-
'documented-design-rationale-before-code',
|
|
446
|
-
'clean-component-and-token-architecture',
|
|
447
462
|
],
|
|
448
463
|
reportingRules: {
|
|
449
464
|
mustExplainGenericity: true,
|
|
@@ -471,10 +486,7 @@ function buildDesignIntentContractObject({
|
|
|
471
486
|
approvedExternalConstraintUsage: 'Convert explicit user-supplied external constraints into current-project rules without comparing against or imitating the source surface.',
|
|
472
487
|
driftSignals: [
|
|
473
488
|
'palette-reused-without-brief-support',
|
|
474
|
-
'motion-signature-reused-without-approval',
|
|
475
|
-
'layout-shape-matches-unrelated-project-memory',
|
|
476
489
|
'prior-ui-visual-dna-carried-into-reset-request',
|
|
477
|
-
'existing-design-doc-treated-as-style-continuity-during-zero-based-redesign',
|
|
478
490
|
],
|
|
479
491
|
},
|
|
480
492
|
experiencePrinciples: [
|
|
@@ -482,17 +494,17 @@ function buildDesignIntentContractObject({
|
|
|
482
494
|
'Major interface decisions must be explainable in product and user terms.',
|
|
483
495
|
'Accessibility, responsiveness, and implementation realism are non-negotiable.',
|
|
484
496
|
'Cross-viewport behavior must reorganize tasks and navigation, not just scale the desktop layout down.',
|
|
485
|
-
'
|
|
486
|
-
'
|
|
487
|
-
'At least one visual, interaction, content, or motion decision must be recognizable at a glance and justified from context.',
|
|
497
|
+
'A single agent-chosen conceptual anchor must unify typography, spacing, morphology, motion, and responsive composition when user research is absent.',
|
|
498
|
+
'Expressive motion and spatial interaction are allowed when they support the anchor and remain accessible and performant.',
|
|
488
499
|
'When the user asks for a zero-based redesign, existing UI becomes content and behavior evidence only; prior visual DNA must be discarded unless explicitly approved.',
|
|
489
500
|
],
|
|
490
501
|
forbiddenPatterns: [
|
|
491
502
|
'offline-prescribed-style-used-as-final-direction',
|
|
492
|
-
'
|
|
493
|
-
'
|
|
503
|
+
'missing-conceptual-anchor-without-external-research',
|
|
504
|
+
'visual-decisions-not-derived-from-conceptual-anchor',
|
|
505
|
+
'timid-anchor-that-renames-dashboard-or-admin-shell',
|
|
506
|
+
'motion-suppressed-without-accessibility-or-performance-reason',
|
|
494
507
|
'scale-only-responsive-layout',
|
|
495
|
-
'template-shell-without-product-rationale',
|
|
496
508
|
'zero-based-redesign-kept-prior-visual-dna',
|
|
497
509
|
'restyle-instead-of-recomposition',
|
|
498
510
|
'single-safe-typographic-family-without-role-contrast-or-rationale',
|
|
@@ -511,6 +523,9 @@ function buildDesignIntentContractObject({
|
|
|
511
523
|
requireStructuredDesignExecutionPolicy: true,
|
|
512
524
|
requireStructuredDesignHandoff: true,
|
|
513
525
|
requireVisualResetStrategyWhenZeroBasedRedesignRequested: true,
|
|
526
|
+
requireConceptualAnchorWhenNoExternalResearch: true,
|
|
527
|
+
requireAgentLedAnchorResearchWhenUserResearchMissing: true,
|
|
528
|
+
rejectTimidDashboardAnchor: true,
|
|
514
529
|
requireReviewRubric: true,
|
|
515
530
|
requireGenericityExplanation: true,
|
|
516
531
|
genericityAutoFail: true,
|
|
@@ -526,6 +541,7 @@ function buildDesignIntentContractObject({
|
|
|
526
541
|
requireViewportMutationRules: true,
|
|
527
542
|
requirePurposefulMotionGuidelines: true,
|
|
528
543
|
requireRecognizableVisualBet: true,
|
|
544
|
+
requireConceptualAnchor: true,
|
|
529
545
|
bootstrapPrompt: '.agent-context/prompts/bootstrap-design.md',
|
|
530
546
|
autoLoadedRuleFiles: [
|
|
531
547
|
'.agent-context/prompts/bootstrap-design.md',
|
|
@@ -560,6 +576,151 @@ export function validateDesignIntentContract(designIntentContract) {
|
|
|
560
576
|
validationErrors.push('designIntent.designPhilosophy must be a non-empty string.');
|
|
561
577
|
}
|
|
562
578
|
|
|
579
|
+
if (!designIntentContract.externalResearchIntake || typeof designIntentContract.externalResearchIntake !== 'object') {
|
|
580
|
+
validationErrors.push('designIntent.externalResearchIntake must exist.');
|
|
581
|
+
} else {
|
|
582
|
+
if (designIntentContract.externalResearchIntake.userSuppliedResearchPolicy !== 'read-as-candidate-evidence-not-final-prescription') {
|
|
583
|
+
validationErrors.push('designIntent.externalResearchIntake.userSuppliedResearchPolicy must preserve user research as candidate evidence.');
|
|
584
|
+
}
|
|
585
|
+
if (designIntentContract.externalResearchIntake.requireOfficialDocsVerificationForTechnologyClaims !== true) {
|
|
586
|
+
validationErrors.push('designIntent.externalResearchIntake.requireOfficialDocsVerificationForTechnologyClaims must equal true.');
|
|
587
|
+
}
|
|
588
|
+
if (
|
|
589
|
+
!Array.isArray(designIntentContract.externalResearchIntake.candidateDomains)
|
|
590
|
+
|| !designIntentContract.externalResearchIntake.candidateDomains.includes('motion-and-scroll')
|
|
591
|
+
) {
|
|
592
|
+
validationErrors.push('designIntent.externalResearchIntake.candidateDomains must include motion-and-scroll.');
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if (!designIntentContract.conceptualAnchor || typeof designIntentContract.conceptualAnchor !== 'object') {
|
|
597
|
+
validationErrors.push('designIntent.conceptualAnchor must exist.');
|
|
598
|
+
} else {
|
|
599
|
+
const conceptualAnchor = designIntentContract.conceptualAnchor;
|
|
600
|
+
if (conceptualAnchor.mode !== 'required-when-no-external-research') {
|
|
601
|
+
validationErrors.push('designIntent.conceptualAnchor.mode must equal "required-when-no-external-research".');
|
|
602
|
+
}
|
|
603
|
+
if (conceptualAnchor.seedMode !== 'selection-policy-only') {
|
|
604
|
+
validationErrors.push('designIntent.conceptualAnchor.seedMode must equal "selection-policy-only".');
|
|
605
|
+
}
|
|
606
|
+
if (conceptualAnchor.requiresAgentSelectionBeforeUiImplementation !== true) {
|
|
607
|
+
validationErrors.push('designIntent.conceptualAnchor.requiresAgentSelectionBeforeUiImplementation must equal true.');
|
|
608
|
+
}
|
|
609
|
+
const userResearchAbsencePolicy = conceptualAnchor.userResearchAbsencePolicy;
|
|
610
|
+
if (!userResearchAbsencePolicy || typeof userResearchAbsencePolicy !== 'object') {
|
|
611
|
+
validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy must exist.');
|
|
612
|
+
} else {
|
|
613
|
+
if (userResearchAbsencePolicy.userSuppliedResearchOnly !== true) {
|
|
614
|
+
validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.userSuppliedResearchOnly must equal true.');
|
|
615
|
+
}
|
|
616
|
+
if (userResearchAbsencePolicy.scaffoldSeedDoesNotCountAsResearch !== true) {
|
|
617
|
+
validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.scaffoldSeedDoesNotCountAsResearch must equal true.');
|
|
618
|
+
}
|
|
619
|
+
if (userResearchAbsencePolicy.priorUiDoesNotCountAsResearch !== true) {
|
|
620
|
+
validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.priorUiDoesNotCountAsResearch must equal true.');
|
|
621
|
+
}
|
|
622
|
+
if (userResearchAbsencePolicy.requireAgentLedResearchWhenAvailable !== true) {
|
|
623
|
+
validationErrors.push('designIntent.conceptualAnchor.userResearchAbsencePolicy.requireAgentLedResearchWhenAvailable must equal true.');
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
const candidateSelectionPolicy = conceptualAnchor.candidateSelectionPolicy;
|
|
627
|
+
if (!candidateSelectionPolicy || typeof candidateSelectionPolicy !== 'object') {
|
|
628
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy must exist.');
|
|
629
|
+
} else {
|
|
630
|
+
if (candidateSelectionPolicy.considerAtLeast < 3) {
|
|
631
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.considerAtLeast must be at least 3.');
|
|
632
|
+
}
|
|
633
|
+
if (candidateSelectionPolicy.discardObviousCandidateCount < 2) {
|
|
634
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.discardObviousCandidateCount must be at least 2.');
|
|
635
|
+
}
|
|
636
|
+
if (candidateSelectionPolicy.minimumCandidateDistance !== 'high') {
|
|
637
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.minimumCandidateDistance must equal "high".');
|
|
638
|
+
}
|
|
639
|
+
if (candidateSelectionPolicy.discardPredictableCandidates !== true) {
|
|
640
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.discardPredictableCandidates must equal true.');
|
|
641
|
+
}
|
|
642
|
+
if (candidateSelectionPolicy.preferDistinctiveOverSafe !== true) {
|
|
643
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.preferDistinctiveOverSafe must equal true.');
|
|
644
|
+
}
|
|
645
|
+
if (candidateSelectionPolicy.doNotRevealHiddenCandidateList !== true) {
|
|
646
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.doNotRevealHiddenCandidateList must equal true.');
|
|
647
|
+
}
|
|
648
|
+
if (candidateSelectionPolicy.outputOnlyChosenAnchor !== true) {
|
|
649
|
+
validationErrors.push('designIntent.conceptualAnchor.candidateSelectionPolicy.outputOnlyChosenAnchor must equal true.');
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
if (
|
|
653
|
+
!Array.isArray(conceptualAnchor.forbiddenFinalAnchorTerms)
|
|
654
|
+
|| !conceptualAnchor.forbiddenFinalAnchorTerms.includes('dashboard')
|
|
655
|
+
|| !conceptualAnchor.forbiddenFinalAnchorTerms.includes('cards')
|
|
656
|
+
|| !conceptualAnchor.forbiddenFinalAnchorTerms.includes('safe-admin-layout')
|
|
657
|
+
) {
|
|
658
|
+
validationErrors.push('designIntent.conceptualAnchor.forbiddenFinalAnchorTerms must reject basic UI labels.');
|
|
659
|
+
}
|
|
660
|
+
if (
|
|
661
|
+
!Array.isArray(conceptualAnchor.sourceDomains)
|
|
662
|
+
|| conceptualAnchor.sourceDomains.length < 4
|
|
663
|
+
|| !conceptualAnchor.sourceDomains.includes('complex-physical-engineering')
|
|
664
|
+
|| !conceptualAnchor.sourceDomains.includes('cinematic-spatial-interface')
|
|
665
|
+
|| !conceptualAnchor.sourceDomains.includes('premium-interactive-web-experiences')
|
|
666
|
+
) {
|
|
667
|
+
validationErrors.push('designIntent.conceptualAnchor.sourceDomains must list broad non-template anchor domains.');
|
|
668
|
+
}
|
|
669
|
+
const visualRiskBudget = conceptualAnchor.visualRiskBudget;
|
|
670
|
+
if (!visualRiskBudget || typeof visualRiskBudget !== 'object') {
|
|
671
|
+
validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget must exist.');
|
|
672
|
+
} else {
|
|
673
|
+
if (visualRiskBudget.mode !== 'high-distinctiveness-with-accessibility-and-performance-guardrails') {
|
|
674
|
+
validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.mode must preserve high-distinctiveness guardrails.');
|
|
675
|
+
}
|
|
676
|
+
if (visualRiskBudget.allowRichMotionAndMicroInteraction !== true) {
|
|
677
|
+
validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.allowRichMotionAndMicroInteraction must equal true.');
|
|
678
|
+
}
|
|
679
|
+
if (visualRiskBudget.rejectTimidDefaultWhenAnchorSupportsExpressiveUi !== true) {
|
|
680
|
+
validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.rejectTimidDefaultWhenAnchorSupportsExpressiveUi must equal true.');
|
|
681
|
+
}
|
|
682
|
+
if (visualRiskBudget.requireReducedMotionFallback !== true) {
|
|
683
|
+
validationErrors.push('designIntent.conceptualAnchor.visualRiskBudget.requireReducedMotionFallback must equal true.');
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
if (
|
|
687
|
+
!Array.isArray(conceptualAnchor.requiredDerivedAxes)
|
|
688
|
+
|| !conceptualAnchor.requiredDerivedAxes.includes('typography')
|
|
689
|
+
|| !conceptualAnchor.requiredDerivedAxes.includes('responsive-composition')
|
|
690
|
+
) {
|
|
691
|
+
validationErrors.push('designIntent.conceptualAnchor.requiredDerivedAxes must include typography and responsive-composition.');
|
|
692
|
+
}
|
|
693
|
+
const finalAnchorContract = conceptualAnchor.finalAnchorContract;
|
|
694
|
+
if (!finalAnchorContract || typeof finalAnchorContract !== 'object') {
|
|
695
|
+
validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract must exist.');
|
|
696
|
+
} else {
|
|
697
|
+
if (
|
|
698
|
+
!Array.isArray(finalAnchorContract.requiredFields)
|
|
699
|
+
|| !finalAnchorContract.requiredFields.includes('agentResearchMode')
|
|
700
|
+
|| !finalAnchorContract.requiredFields.includes('derivedTokenLogic')
|
|
701
|
+
|| !finalAnchorContract.requiredFields.includes('visualRiskBudget')
|
|
702
|
+
|| !finalAnchorContract.requiredFields.includes('motionRiskBudget')
|
|
703
|
+
|| !finalAnchorContract.requiredFields.includes('cohesionChecks')
|
|
704
|
+
) {
|
|
705
|
+
validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.requiredFields must require agentResearchMode, derivedTokenLogic, visualRiskBudget, motionRiskBudget, and cohesionChecks.');
|
|
706
|
+
}
|
|
707
|
+
if (
|
|
708
|
+
!Array.isArray(finalAnchorContract.derivedTokenLogicAxes)
|
|
709
|
+
|| !finalAnchorContract.derivedTokenLogicAxes.includes('motion')
|
|
710
|
+
|| !finalAnchorContract.derivedTokenLogicAxes.includes('morphology')
|
|
711
|
+
) {
|
|
712
|
+
validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.derivedTokenLogicAxes must include motion and morphology.');
|
|
713
|
+
}
|
|
714
|
+
if (
|
|
715
|
+
!Array.isArray(finalAnchorContract.cohesionChecks)
|
|
716
|
+
|| !finalAnchorContract.cohesionChecks.includes('no-dashboard-mental-model')
|
|
717
|
+
|| !finalAnchorContract.cohesionChecks.includes('motion-derived-from-anchor')
|
|
718
|
+
) {
|
|
719
|
+
validationErrors.push('designIntent.conceptualAnchor.finalAnchorContract.cohesionChecks must reject dashboard mental models and require motion derivation.');
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
563
724
|
if (!designIntentContract.mathSystems || typeof designIntentContract.mathSystems !== 'object') {
|
|
564
725
|
validationErrors.push('designIntent.mathSystems must exist.');
|
|
565
726
|
} else {
|
|
@@ -176,6 +176,9 @@ export function buildDesignBootstrapPrompt({
|
|
|
176
176
|
'30. In zero-based redesign mode, the new contract must name the discarded prior visual DNA and materially reset composition, hierarchy, palette/typography, motion or interaction, and responsive information architecture.',
|
|
177
177
|
'31. If modern UI, animation, scroll, 3D, canvas, chart, or icon libraries are useful, choose them from current official docs and record source URL, fetched date, reason, risk, and accessibility fallback.',
|
|
178
178
|
'32. If the user supplies research files, library lists, screenshots, articles, or benchmark notes, read them as candidate evidence, summarize the useful signals, filter by project fit, and verify technology claims against current official docs before implementation.',
|
|
179
|
+
'33. If no user-supplied research or reference is supplied for UI work, activate the Dynamic Avant-Garde Anchor Engine before coding. User-supplied research means current-task evidence from the user; this scaffold, prior UI, and old design docs do not count as research.',
|
|
180
|
+
'34. In Dynamic Avant-Garde mode, perform agent-led research when available, then internally consider at least three high-variance conceptual anchors, discard the two safest or most predictable options, output only the chosen anchor and rationale, and forbid final anchors named dashboard, portal, cards, admin panel, SaaS shell, web app shell, or minimalist interface.',
|
|
181
|
+
'35. The chosen anchor must drive typography, spacing, density, color behavior, morphology, motion, and responsive composition. If expressive motion, spatial transitions, micro-interactions, or modern animation libraries support the anchor, use them with performance notes and reduced-motion fallbacks instead of suppressing motion to look safe.',
|
|
179
182
|
'',
|
|
180
183
|
'## Project Inputs',
|
|
181
184
|
`- Project name: ${discoveryAnswers.projectName}`,
|
|
@@ -205,7 +208,9 @@ export function buildDesignBootstrapPrompt({
|
|
|
205
208
|
'11. Ensure both files stay project-specific, dynamic, and practical for implementation and review. The seed may guide structure, but it must not decide style offline.',
|
|
206
209
|
'12. Keep visualResetStrategy in the machine-readable handoff so reset-language tasks cannot quietly become restyles of the previous UI.',
|
|
207
210
|
'13. Preserve externalResearchIntake so user-provided research becomes reviewed evidence without turning into an offline style or dependency preset.',
|
|
208
|
-
'14.
|
|
211
|
+
'14. Preserve conceptualAnchor so prompt-only UI work has one cohesive non-template concept instead of a mixed collection of bold but unrelated visual decisions.',
|
|
212
|
+
'15. Record conceptualAnchor.agentResearchMode, visualRiskBudget, motionRiskBudget, and cohesionChecks so the final UI cannot quietly fall back to a timid dashboard/admin mental model.',
|
|
213
|
+
'16. After the contract exists, use it as a first-class source for future UI tasks.',
|
|
209
214
|
'',
|
|
210
215
|
].join('\n');
|
|
211
216
|
}
|