@ryuenn3123/agentic-senior-core 3.0.16 → 3.0.17
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 +21 -3
- package/.agent-context/rules/frontend-architecture.md +26 -0
- package/.agent-context/state/memory-continuity-benchmark.json +1 -1
- package/.cursorrules +1 -1
- package/.gemini/instructions.md +7 -1
- package/.github/copilot-instructions.md +7 -1
- package/.instructions.md +3 -0
- package/.windsurfrules +1 -1
- package/AGENTS.md +13 -1
- package/lib/cli/commands/init.mjs +2 -2
- package/lib/cli/memory-continuity.mjs +2 -1
- package/lib/cli/project-scaffolder/constants.mjs +1 -0
- package/lib/cli/project-scaffolder/design-contract.mjs +303 -0
- package/lib/cli/project-scaffolder/prompt-builders.mjs +29 -12
- package/package.json +1 -1
- package/scripts/documentation-boundary-audit.mjs +5 -2
- package/scripts/frontend-usability-audit.mjs +23 -0
- package/scripts/release-gate.mjs +22 -0
- package/scripts/sync-thin-adapters.mjs +24 -0
- package/scripts/ui-design-judge.mjs +365 -7
- package/scripts/validate/config.mjs +45 -0
|
@@ -30,6 +30,13 @@ The agent must:
|
|
|
30
30
|
14. Do not reuse a color palette, component skin, or motion signature from prior chats, memories, or unrelated projects unless current repo evidence or the active brand brief explicitly asks for that continuity.
|
|
31
31
|
15. Treat prior website memory, old portfolio styles, and remembered screenshots as tainted context unless the user explicitly asks to continue or evolve that specific visual system.
|
|
32
32
|
16. Do not default to balanced card grids, soft startup gradients, safe centered heroes, or neutral dashboard chrome unless the product context explicitly justifies them.
|
|
33
|
+
17. For design work, only these count as valid style context by default: current repo evidence, the current user brief, current project docs, and explicitly approved reference systems.
|
|
34
|
+
18. Design continuity is opt-in. If the user does not explicitly ask for continuity with an older system, prefer fresh synthesis from the current repo and brief.
|
|
35
|
+
19. Accessibility must be split into a hard compliance floor and an advisory readability layer. Use WCAG 2.2 AA as the blocking baseline, and use APCA only as advisory perceptual tuning. APCA must never waive a WCAG failure.
|
|
36
|
+
20. Accessibility planning must cover more than color contrast. It must explicitly address focus visibility, focus appearance, target size, keyboard access, accessible authentication, and dynamic state/status access.
|
|
37
|
+
21. Hybrid visual QA must stay deterministic-first. Define screenshot baseline expectations, dynamic-content masking rules, stability thresholds, viewport coverage, and long-page capture strategy before escalating any visual drift to a semantic judge.
|
|
38
|
+
22. Do not assume one screenshot is enough for a long page. Require above-fold capture, full-page capture when stable, and anchor-based section or tiled-scroll captures when deep content would otherwise be missed.
|
|
39
|
+
23. Deterministic visual QA must distinguish rendering noise from meaningful layout or styling drift. If a semantic judge is used later, it should only review diffs that already exceeded the deterministic threshold or lost required coverage.
|
|
33
40
|
|
|
34
41
|
Required `docs/DESIGN.md` sections:
|
|
35
42
|
1. Design Intent and Product Personality
|
|
@@ -42,9 +49,10 @@ Required `docs/DESIGN.md` sections:
|
|
|
42
49
|
8. Responsive Strategy and Cross-Viewport Adaptation Matrix
|
|
43
50
|
9. Interaction, Motion, and Feedback Rules
|
|
44
51
|
10. Component Language, Morphology, and Shared Patterns
|
|
45
|
-
11.
|
|
46
|
-
12.
|
|
47
|
-
13.
|
|
52
|
+
11. Context Hygiene and Approved Reference Boundaries
|
|
53
|
+
12. Accessibility Non-Negotiables
|
|
54
|
+
13. Anti-Patterns to Avoid
|
|
55
|
+
14. Implementation Notes for Future UI Tasks
|
|
48
56
|
|
|
49
57
|
Required `docs/design-intent.json` fields:
|
|
50
58
|
- `mode`
|
|
@@ -60,6 +68,9 @@ Required `docs/design-intent.json` fields:
|
|
|
60
68
|
- `crossViewportAdaptation`
|
|
61
69
|
- `motionSystem`
|
|
62
70
|
- `componentMorphology`
|
|
71
|
+
- `accessibilityPolicy`
|
|
72
|
+
- `visualQaPolicy`
|
|
73
|
+
- `contextHygiene`
|
|
63
74
|
- `experiencePrinciples`
|
|
64
75
|
- `forbiddenPatterns`
|
|
65
76
|
- `validationHints`
|
|
@@ -73,13 +84,20 @@ Output:
|
|
|
73
84
|
- `docs/design-intent.json` must define a real token system, not just loose style notes. Include primitive, semantic, and component layers plus aliasing rules and naming constraints.
|
|
74
85
|
- `docs/design-intent.json` must include deterministic fields for `colorTruth.format`, `colorTruth.allowHexDerivatives`, and `crossViewportAdaptation.mutationRules.mobile/tablet/desktop`.
|
|
75
86
|
- `docs/design-intent.json` must also include `motionSystem` and `componentMorphology` so future UI work preserves state behavior and purposeful motion without collapsing into generic static output.
|
|
87
|
+
- `docs/design-intent.json` must also include `accessibilityPolicy` so the hard compliance floor, advisory contrast model, and blocking-vs-advisory checks stay machine-readable.
|
|
88
|
+
- `docs/design-intent.json` must also include `visualQaPolicy` so deterministic screenshot expectations, masking rules, viewport coverage, long-page capture strategy, stability thresholds, and semantic-escalation boundaries stay machine-readable.
|
|
89
|
+
- `docs/design-intent.json` must include `contextHygiene` so valid design sources, tainted carryover sources, and continuity rules are machine-readable.
|
|
76
90
|
- If onboarding or detector evidence exists, preserve it under `repoEvidence.designEvidenceSummary` instead of throwing away the machine-readable snapshot of the current UI system.
|
|
77
91
|
- Token intent must stay structure-first: primitive tokens hold raw values, semantic tokens carry purpose, and component tokens consume semantic tokens instead of bypassing them with raw values.
|
|
78
92
|
- Color intent must be defined in a perceptual or relational color model first. Hex values may appear only as implementation derivatives.
|
|
79
93
|
- The contract must encode viewport mutation rules, not just breakpoint names.
|
|
80
94
|
- Motion guidance must preserve creativity: allow meaningful animation, define reduced-motion behavior, and optimize choreography instead of suppressing it by default.
|
|
95
|
+
- Accessibility guidance must split hard compliance from advisory tuning: treat WCAG 2.2 AA as the minimum blocking floor and APCA as advisory perceptual guidance for readability nuance, especially in typography and dark mode.
|
|
96
|
+
- Accessibility scope must include focus visibility, focus appearance, target size, accessible authentication, keyboard access, use-of-color-only failures, and dynamic status/state access.
|
|
97
|
+
- Visual QA guidance must define deterministic-first screenshot review, noise thresholds, dynamic masking categories, mobile/tablet/desktop coverage, long-page capture strategy, and when semantic review is allowed to intervene.
|
|
81
98
|
- Color direction must come from the current project context. Similarity to prior unrelated projects is drift unless the brief or repo evidence explicitly supports it.
|
|
82
99
|
- If no approved reference system exists, synthesize the design from zero using current product context, constraints, and content only.
|
|
100
|
+
- Explicitly record which sources are allowed to shape the visual language and which sources are tainted unless the user opts into continuity.
|
|
83
101
|
- The resulting system should feel authored and recognizable in screenshots, not politely interchangeable with common template kits.
|
|
84
102
|
- Use practical, modern, accessible language grounded in the project, not generic SaaS defaults or copycat brand systems.
|
|
85
103
|
- Wait for user approval before generating Figma or code assets.
|
|
@@ -17,6 +17,32 @@ Mandatory behavior when triggered:
|
|
|
17
17
|
- reject template-only repetitive outputs and force a distinct layout direction
|
|
18
18
|
- treat prior website memory or old-project visual carryover as invalid evidence unless the user explicitly requests continuity with that exact system
|
|
19
19
|
- do not flatten ambitious visual or motion ideas by default; keep them when they are optimized, intentional, and accessible
|
|
20
|
+
- let current repo evidence, the active brief, current project docs, and explicitly approved reference systems outrank remembered style residue every time
|
|
21
|
+
|
|
22
|
+
## Context Hygiene and Reference Boundaries (Mandatory)
|
|
23
|
+
|
|
24
|
+
- Valid visual-context sources are limited to the current repo evidence, the current user brief, current project docs, and explicitly approved reference systems.
|
|
25
|
+
- Design continuity is opt-in. If the user does not request continuity with a prior visual system, synthesize from the current project context instead.
|
|
26
|
+
- Old project screenshots, remembered website styles, and cross-chat visual residue are tainted context unless the user explicitly authorizes them.
|
|
27
|
+
- When repo evidence and memory residue conflict, repo evidence wins.
|
|
28
|
+
- If a reference system is approved, adapt its reasoning and constraints. Do not copy its surface 1:1.
|
|
29
|
+
|
|
30
|
+
## Accessibility Split (Mandatory)
|
|
31
|
+
|
|
32
|
+
- Treat WCAG 2.2 AA as the hard compliance floor for release-blocking accessibility issues.
|
|
33
|
+
- Treat APCA as an advisory readability model for perceptual tuning, especially for typography, dark mode, and nuanced contrast review.
|
|
34
|
+
- Advisory APCA findings must never waive a WCAG hard failure.
|
|
35
|
+
- Hard accessibility checks must cover more than contrast alone. They must include focus visibility, focus appearance, target size, keyboard access, use-of-color-only failures, accessible authentication, and status or dynamic state access.
|
|
36
|
+
- Keep accessibility compatible with expressive design. Fix the violation without flattening the interface into generic low-risk layouts unless that is the only safe option.
|
|
37
|
+
|
|
38
|
+
## Hybrid Visual QA Boundaries (Mandatory)
|
|
39
|
+
|
|
40
|
+
- Visual QA must be deterministic-first. Run screenshot or pixel-diff style checks before escalating to any semantic judge.
|
|
41
|
+
- Treat dynamic masking as explicit policy, not ad hoc cleanup. Time, randomized content, live counters, streaming media, and other unstable regions must be masked deliberately and documented.
|
|
42
|
+
- Define stability thresholds so the system can separate tiny rendering noise from meaningful layout or styling drift.
|
|
43
|
+
- Required visual coverage must include mobile, tablet, and desktop unless the product scope explicitly excludes one of those surfaces.
|
|
44
|
+
- Escalate to semantic review only when deterministic evidence shows meaningful drift, missing required viewport coverage, or another contract-critical visual failure.
|
|
45
|
+
- Do not use semantic review to invent aesthetic problems when deterministic evidence says the surface is stable.
|
|
20
46
|
|
|
21
47
|
## UI Consistency Guardrails (Mandatory)
|
|
22
48
|
|
package/.cursorrules
CHANGED
package/.gemini/instructions.md
CHANGED
|
@@ -2,10 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: ee64f53171dcf88e10c6f6aae98d75cc541e13880255f0e519fc82736a4af5f4
|
|
6
6
|
|
|
7
7
|
Canonical policy source: [.instructions.md](../.instructions.md).
|
|
8
8
|
|
|
9
|
+
If your host stops at this file, follow this minimum floor:
|
|
10
|
+
- Read `.agent-instructions.md` next when it exists.
|
|
11
|
+
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
12
|
+
- If UI scope and `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize them before UI implementation.
|
|
13
|
+
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
|
14
|
+
|
|
9
15
|
## Bootstrap Sequence
|
|
10
16
|
|
|
11
17
|
1. Load [.instructions.md](../.instructions.md) first as the canonical baseline.
|
|
@@ -2,10 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: ee64f53171dcf88e10c6f6aae98d75cc541e13880255f0e519fc82736a4af5f4
|
|
6
6
|
|
|
7
7
|
The canonical policy source for this repository is [.instructions.md](../.instructions.md).
|
|
8
8
|
|
|
9
|
+
If your host stops at this file, follow this minimum floor:
|
|
10
|
+
- Read `.agent-instructions.md` next when it exists.
|
|
11
|
+
- For UI or redesign requests, load [.agent-context/prompts/bootstrap-design.md](../.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](../.agent-context/rules/frontend-architecture.md) before coding.
|
|
12
|
+
- If UI scope and `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize them before UI implementation.
|
|
13
|
+
- Memory continuity is host-dependent project memory and does not replace bootstrap loading.
|
|
14
|
+
|
|
9
15
|
## Required Load Order
|
|
10
16
|
|
|
11
17
|
1. Read [.instructions.md](../.instructions.md) first as the canonical baseline.
|
package/.instructions.md
CHANGED
|
@@ -134,6 +134,9 @@ Meta-prompts that provide complete workflows for common scenarios:
|
|
|
134
134
|
|
|
135
135
|
**What to do**: When user request matches a trigger, load the full prompt to understand the workflow.
|
|
136
136
|
For UI-only requests, keep context isolated: load `bootstrap-design.md` and `frontend-architecture.md` first, and do not eagerly load unrelated backend-only rules such as `database-design.md`, `docker-runtime.md`, or `microservices.md` unless the request explicitly crosses those boundaries.
|
|
137
|
+
For design work, treat only the current repo evidence, the current brief, current project docs, and explicitly approved reference systems as valid style context. Do not let prior-chat or unrelated-project visual memory steer the result unless the user explicitly asks for continuity.
|
|
138
|
+
For accessibility in UI work, treat WCAG 2.2 AA as the hard compliance floor and APCA as advisory perceptual tuning only.
|
|
139
|
+
For visual QA in UI work, treat deterministic screenshot or diff evidence as the first layer, then escalate only meaningful visual drift to a semantic judge.
|
|
137
140
|
|
|
138
141
|
---
|
|
139
142
|
|
package/.windsurfrules
CHANGED
package/AGENTS.md
CHANGED
|
@@ -2,11 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
Adapter Mode: thin
|
|
4
4
|
Adapter Source: .instructions.md
|
|
5
|
-
Canonical Snapshot SHA256:
|
|
5
|
+
Canonical Snapshot SHA256: ee64f53171dcf88e10c6f6aae98d75cc541e13880255f0e519fc82736a4af5f4
|
|
6
6
|
|
|
7
7
|
This file is an adapter entrypoint for agent discovery.
|
|
8
8
|
The canonical policy source is [.instructions.md](.instructions.md).
|
|
9
9
|
|
|
10
|
+
If your host stops at this file instead of following the full chain, obey the Critical Bootstrap Floor below before coding.
|
|
11
|
+
|
|
12
|
+
## Critical Bootstrap Floor
|
|
13
|
+
|
|
14
|
+
- If `.agent-instructions.md` exists, prefer it immediately after this file because it is the compiled project-specific snapshot.
|
|
15
|
+
- Memory continuity does not replace bootstrap loading. It is host-dependent project memory, not a guarantee that instructions were reloaded for this session.
|
|
16
|
+
- For UI, UX, layout, screen, tailwind, frontend, or redesign requests: load [.agent-context/prompts/bootstrap-design.md](.agent-context/prompts/bootstrap-design.md) and [.agent-context/rules/frontend-architecture.md](.agent-context/rules/frontend-architecture.md) before editing code.
|
|
17
|
+
- For UI scope: if `docs/DESIGN.md` or `docs/design-intent.json` is missing, materialize or refine them before implementing UI changes.
|
|
18
|
+
- For refactor, improve, clean up, or fix requests: inspect the active rules and propose a plan before editing.
|
|
19
|
+
- For new project or module requests: propose architecture before generating code.
|
|
20
|
+
- For ecosystem, framework, dependency, or Docker claims: perform live web research instead of relying on stale local heuristics.
|
|
21
|
+
|
|
10
22
|
## Mandatory Bootstrap Chain
|
|
11
23
|
|
|
12
24
|
1. Load [.instructions.md](.instructions.md) first as the canonical baseline.
|
|
@@ -651,7 +651,7 @@ export async function runInitCommand(targetDirectoryArgument, initOptions = {})
|
|
|
651
651
|
});
|
|
652
652
|
|
|
653
653
|
await writeMemoryContinuityState(resolvedTargetDirectoryPath, memoryContinuityState);
|
|
654
|
-
console.log(`
|
|
654
|
+
console.log(`Project memory continuity metadata enabled (${memoryContinuityState.hydrationMode}, host-supported).`);
|
|
655
655
|
}
|
|
656
656
|
|
|
657
657
|
let tokenOptimizationState = null;
|
|
@@ -844,7 +844,7 @@ export async function runInitCommand(targetDirectoryArgument, initOptions = {})
|
|
|
844
844
|
console.log(`- Repository workflows copied: no (workflows remain source-repo assets)`);
|
|
845
845
|
console.log(`- MCP configuration: ${shouldIncludeMcpTemplate ? 'auto-configured for your IDEs (VS Code, Cursor, Zed, Gemini)' : 'disabled (--no-mcp-template)'}`);
|
|
846
846
|
if (isMemoryContinuityEnabled) {
|
|
847
|
-
console.log('- Memory continuity policy: enabled (index + selective hydration)');
|
|
847
|
+
console.log('- Memory continuity policy: enabled (index + selective hydration; host support required)');
|
|
848
848
|
} else {
|
|
849
849
|
console.log('- Memory continuity policy: disabled (--no-memory-continuity)');
|
|
850
850
|
}
|
|
@@ -379,7 +379,7 @@ export function buildMemoryContinuityGuidanceBlock(memoryContinuityState) {
|
|
|
379
379
|
: 2;
|
|
380
380
|
|
|
381
381
|
return [
|
|
382
|
-
'
|
|
382
|
+
'Project memory continuity mode is enabled.',
|
|
383
383
|
'Hydration mode: progressive-disclosure.',
|
|
384
384
|
adapterGuidanceLine,
|
|
385
385
|
'',
|
|
@@ -389,6 +389,7 @@ export function buildMemoryContinuityGuidanceBlock(memoryContinuityState) {
|
|
|
389
389
|
'- Always redact sensitive text before persistence (<private> blocks and inline secret-like fields).',
|
|
390
390
|
'',
|
|
391
391
|
'Host compatibility scope:',
|
|
392
|
+
'- This memory layer does not replace reading bootstrap instruction files at the start of a session.',
|
|
392
393
|
'- Works for local IDE, CLI, and cloud IDE chat hosts that implement the memory adapter contract or MCP retrieval path.',
|
|
393
394
|
'- Generic web chat sessions without repository tools cannot auto-hydrate runtime memory and should rely on manual summary export/import.',
|
|
394
395
|
].join('\n');
|
|
@@ -61,6 +61,7 @@ export const DESIGN_REQUIRED_SECTIONS = [
|
|
|
61
61
|
'Responsive Strategy and Cross-Viewport Adaptation Matrix',
|
|
62
62
|
'Interaction, Motion, and Feedback Rules',
|
|
63
63
|
'Component Language, Morphology, and Shared Patterns',
|
|
64
|
+
'Context Hygiene and Approved Reference Boundaries',
|
|
64
65
|
'Accessibility Non-Negotiables',
|
|
65
66
|
'Anti-Patterns to Avoid',
|
|
66
67
|
'Implementation Notes for Future UI Tasks',
|
|
@@ -304,6 +304,100 @@ function buildDesignIntentContractObject({
|
|
|
304
304
|
stateKeys: ['default', 'hover', 'focus', 'active', 'disabled', 'loading', 'error'],
|
|
305
305
|
viewportBehavior: inferredKeywords.componentMorphology,
|
|
306
306
|
},
|
|
307
|
+
accessibilityPolicy: {
|
|
308
|
+
hardComplianceFloor: 'WCAG-2.2-AA',
|
|
309
|
+
advisoryContrastModel: 'APCA',
|
|
310
|
+
failOnHardViolations: true,
|
|
311
|
+
advisoryFindingsDoNotBlockByDefault: true,
|
|
312
|
+
hardRequirements: {
|
|
313
|
+
textContrastMinimum: true,
|
|
314
|
+
nonTextContrast: true,
|
|
315
|
+
useOfColorOnlyProhibited: true,
|
|
316
|
+
focusVisible: true,
|
|
317
|
+
focusAppearance: true,
|
|
318
|
+
targetSizeMinimum: true,
|
|
319
|
+
keyboardAccess: true,
|
|
320
|
+
reflowRequired: true,
|
|
321
|
+
accessibleAuthenticationMinimum: true,
|
|
322
|
+
statusMessagesAndDynamicStateAccess: true,
|
|
323
|
+
},
|
|
324
|
+
advisoryChecks: {
|
|
325
|
+
perceptualContrastReview: true,
|
|
326
|
+
darkModeContrastTuning: true,
|
|
327
|
+
typographyReadabilityTuning: true,
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
visualQaPolicy: {
|
|
331
|
+
deterministicFirst: true,
|
|
332
|
+
baselineStrategy: 'deterministic-screenshots',
|
|
333
|
+
reportVersion: 'hybrid-visual-diff-v1',
|
|
334
|
+
requiredViewports: ['mobile', 'tablet', 'desktop'],
|
|
335
|
+
capturePlan: {
|
|
336
|
+
requireAboveFoldCapture: true,
|
|
337
|
+
requireFullPageCapture: true,
|
|
338
|
+
requireSectionCapturesForLongPages: true,
|
|
339
|
+
longPageStrategy: 'anchor-plus-tiles',
|
|
340
|
+
minimumSectionCaptureCount: 3,
|
|
341
|
+
maxViewportHeightsPerTile: 3,
|
|
342
|
+
tileOverlapRatio: 0.15,
|
|
343
|
+
requiredSectionTypes: [
|
|
344
|
+
'hero-or-primary-action',
|
|
345
|
+
'midpage-proof-or-content',
|
|
346
|
+
'footer-or-terminal-state',
|
|
347
|
+
],
|
|
348
|
+
},
|
|
349
|
+
masking: {
|
|
350
|
+
requireDynamicContentMasks: true,
|
|
351
|
+
requireMaskReasonAnnotations: true,
|
|
352
|
+
allowedDynamicMaskCategories: [
|
|
353
|
+
'time-based-content',
|
|
354
|
+
'randomized-content',
|
|
355
|
+
'live-counters',
|
|
356
|
+
'streaming-media',
|
|
357
|
+
'user-specific-personalization',
|
|
358
|
+
],
|
|
359
|
+
},
|
|
360
|
+
stability: {
|
|
361
|
+
maxUnmaskedDiffRatio: 0.005,
|
|
362
|
+
maxMaskedDiffRatio: 0.02,
|
|
363
|
+
requireConsistentRenderingEnvironment: true,
|
|
364
|
+
},
|
|
365
|
+
semanticEscalation: {
|
|
366
|
+
requireMeaningfulDiffForEscalation: true,
|
|
367
|
+
escalateWhenViewportCoverageIncomplete: true,
|
|
368
|
+
skipSemanticJudgeWhenDeterministicClean: true,
|
|
369
|
+
meaningfulDiffRatioThreshold: 0.01,
|
|
370
|
+
},
|
|
371
|
+
artifactContract: {
|
|
372
|
+
requireMachineReadableDiffBundle: true,
|
|
373
|
+
requireViewportResults: true,
|
|
374
|
+
mergeDeterministicAndSemanticVerdicts: true,
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
contextHygiene: {
|
|
378
|
+
continuityMode: 'opt-in-only',
|
|
379
|
+
allowedSources: [
|
|
380
|
+
'current-repo-evidence',
|
|
381
|
+
'current-user-brief',
|
|
382
|
+
'current-project-docs',
|
|
383
|
+
'explicitly-approved-reference-systems',
|
|
384
|
+
],
|
|
385
|
+
taintedSources: [
|
|
386
|
+
'prior-chat-visual-memory',
|
|
387
|
+
'unrelated-project-aesthetics',
|
|
388
|
+
'remembered-screenshots-without-current-approval',
|
|
389
|
+
'generic-template-recall',
|
|
390
|
+
],
|
|
391
|
+
repoEvidenceOverridesMemory: true,
|
|
392
|
+
requireExplicitContinuityApproval: true,
|
|
393
|
+
forbidCarryoverWhenUnapproved: true,
|
|
394
|
+
approvedReferenceUsage: 'Adapt reasoning and constraints from approved references without copying the surface 1:1.',
|
|
395
|
+
driftSignals: [
|
|
396
|
+
'palette-reused-without-brief-support',
|
|
397
|
+
'motion-signature-reused-without-approval',
|
|
398
|
+
'layout-shape-matches-unrelated-project-memory',
|
|
399
|
+
],
|
|
400
|
+
},
|
|
307
401
|
experiencePrinciples: [
|
|
308
402
|
'Design must feel project-specific, not interchangeable with generic SaaS templates.',
|
|
309
403
|
'Major interface decisions must be explainable in product and user terms.',
|
|
@@ -328,6 +422,9 @@ function buildDesignIntentContractObject({
|
|
|
328
422
|
allowHexDerivatives: true,
|
|
329
423
|
requireMotionRationale: true,
|
|
330
424
|
requireStateMorphology: true,
|
|
425
|
+
requireAccessibilitySplit: true,
|
|
426
|
+
requireWcagHardFloor: true,
|
|
427
|
+
requireHybridVisualQaPolicy: true,
|
|
331
428
|
requireSignatureMove: true,
|
|
332
429
|
rejectTemplateNeutralLayout: true,
|
|
333
430
|
},
|
|
@@ -495,6 +592,212 @@ export function validateDesignIntentContract(designIntentContract) {
|
|
|
495
592
|
}
|
|
496
593
|
}
|
|
497
594
|
|
|
595
|
+
if (!designIntentContract.accessibilityPolicy || typeof designIntentContract.accessibilityPolicy !== 'object') {
|
|
596
|
+
validationErrors.push('designIntent.accessibilityPolicy must exist.');
|
|
597
|
+
} else {
|
|
598
|
+
if (designIntentContract.accessibilityPolicy.hardComplianceFloor !== 'WCAG-2.2-AA') {
|
|
599
|
+
validationErrors.push('designIntent.accessibilityPolicy.hardComplianceFloor must equal "WCAG-2.2-AA".');
|
|
600
|
+
}
|
|
601
|
+
if (designIntentContract.accessibilityPolicy.advisoryContrastModel !== 'APCA') {
|
|
602
|
+
validationErrors.push('designIntent.accessibilityPolicy.advisoryContrastModel must equal "APCA".');
|
|
603
|
+
}
|
|
604
|
+
if (designIntentContract.accessibilityPolicy.failOnHardViolations !== true) {
|
|
605
|
+
validationErrors.push('designIntent.accessibilityPolicy.failOnHardViolations must equal true.');
|
|
606
|
+
}
|
|
607
|
+
if (designIntentContract.accessibilityPolicy.advisoryFindingsDoNotBlockByDefault !== true) {
|
|
608
|
+
validationErrors.push('designIntent.accessibilityPolicy.advisoryFindingsDoNotBlockByDefault must equal true.');
|
|
609
|
+
}
|
|
610
|
+
const hardRequirements = designIntentContract.accessibilityPolicy.hardRequirements;
|
|
611
|
+
if (!hardRequirements || typeof hardRequirements !== 'object') {
|
|
612
|
+
validationErrors.push('designIntent.accessibilityPolicy.hardRequirements must exist.');
|
|
613
|
+
} else {
|
|
614
|
+
for (const requirementKey of [
|
|
615
|
+
'textContrastMinimum',
|
|
616
|
+
'nonTextContrast',
|
|
617
|
+
'useOfColorOnlyProhibited',
|
|
618
|
+
'focusVisible',
|
|
619
|
+
'focusAppearance',
|
|
620
|
+
'targetSizeMinimum',
|
|
621
|
+
'keyboardAccess',
|
|
622
|
+
'reflowRequired',
|
|
623
|
+
'accessibleAuthenticationMinimum',
|
|
624
|
+
'statusMessagesAndDynamicStateAccess',
|
|
625
|
+
]) {
|
|
626
|
+
if (hardRequirements[requirementKey] !== true) {
|
|
627
|
+
validationErrors.push(`designIntent.accessibilityPolicy.hardRequirements.${requirementKey} must equal true.`);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
const advisoryChecks = designIntentContract.accessibilityPolicy.advisoryChecks;
|
|
632
|
+
if (!advisoryChecks || typeof advisoryChecks !== 'object') {
|
|
633
|
+
validationErrors.push('designIntent.accessibilityPolicy.advisoryChecks must exist.');
|
|
634
|
+
} else {
|
|
635
|
+
for (const advisoryKey of [
|
|
636
|
+
'perceptualContrastReview',
|
|
637
|
+
'darkModeContrastTuning',
|
|
638
|
+
'typographyReadabilityTuning',
|
|
639
|
+
]) {
|
|
640
|
+
if (advisoryChecks[advisoryKey] !== true) {
|
|
641
|
+
validationErrors.push(`designIntent.accessibilityPolicy.advisoryChecks.${advisoryKey} must equal true.`);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
if (!designIntentContract.contextHygiene || typeof designIntentContract.contextHygiene !== 'object') {
|
|
648
|
+
validationErrors.push('designIntent.contextHygiene must exist.');
|
|
649
|
+
} else {
|
|
650
|
+
if (designIntentContract.contextHygiene.continuityMode !== 'opt-in-only') {
|
|
651
|
+
validationErrors.push('designIntent.contextHygiene.continuityMode must equal "opt-in-only".');
|
|
652
|
+
}
|
|
653
|
+
if (designIntentContract.contextHygiene.repoEvidenceOverridesMemory !== true) {
|
|
654
|
+
validationErrors.push('designIntent.contextHygiene.repoEvidenceOverridesMemory must equal true.');
|
|
655
|
+
}
|
|
656
|
+
if (designIntentContract.contextHygiene.requireExplicitContinuityApproval !== true) {
|
|
657
|
+
validationErrors.push('designIntent.contextHygiene.requireExplicitContinuityApproval must equal true.');
|
|
658
|
+
}
|
|
659
|
+
if (designIntentContract.contextHygiene.forbidCarryoverWhenUnapproved !== true) {
|
|
660
|
+
validationErrors.push('designIntent.contextHygiene.forbidCarryoverWhenUnapproved must equal true.');
|
|
661
|
+
}
|
|
662
|
+
if (!Array.isArray(designIntentContract.contextHygiene.allowedSources) || designIntentContract.contextHygiene.allowedSources.length < 4) {
|
|
663
|
+
validationErrors.push('designIntent.contextHygiene.allowedSources must list the approved design evidence sources.');
|
|
664
|
+
}
|
|
665
|
+
if (!Array.isArray(designIntentContract.contextHygiene.taintedSources) || designIntentContract.contextHygiene.taintedSources.length < 3) {
|
|
666
|
+
validationErrors.push('designIntent.contextHygiene.taintedSources must list tainted carryover sources.');
|
|
667
|
+
}
|
|
668
|
+
if (!String(designIntentContract.contextHygiene.approvedReferenceUsage || '').trim()) {
|
|
669
|
+
validationErrors.push('designIntent.contextHygiene.approvedReferenceUsage must be a non-empty string.');
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
if (!designIntentContract.visualQaPolicy || typeof designIntentContract.visualQaPolicy !== 'object') {
|
|
674
|
+
validationErrors.push('designIntent.visualQaPolicy must exist.');
|
|
675
|
+
} else {
|
|
676
|
+
if (designIntentContract.visualQaPolicy.deterministicFirst !== true) {
|
|
677
|
+
validationErrors.push('designIntent.visualQaPolicy.deterministicFirst must equal true.');
|
|
678
|
+
}
|
|
679
|
+
if (designIntentContract.visualQaPolicy.baselineStrategy !== 'deterministic-screenshots') {
|
|
680
|
+
validationErrors.push('designIntent.visualQaPolicy.baselineStrategy must equal "deterministic-screenshots".');
|
|
681
|
+
}
|
|
682
|
+
if (designIntentContract.visualQaPolicy.reportVersion !== 'hybrid-visual-diff-v1') {
|
|
683
|
+
validationErrors.push('designIntent.visualQaPolicy.reportVersion must equal "hybrid-visual-diff-v1".');
|
|
684
|
+
}
|
|
685
|
+
if (!Array.isArray(designIntentContract.visualQaPolicy.requiredViewports) || designIntentContract.visualQaPolicy.requiredViewports.join('|') !== 'mobile|tablet|desktop') {
|
|
686
|
+
validationErrors.push('designIntent.visualQaPolicy.requiredViewports must equal ["mobile","tablet","desktop"].');
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
const capturePlan = designIntentContract.visualQaPolicy.capturePlan;
|
|
690
|
+
if (!capturePlan || typeof capturePlan !== 'object') {
|
|
691
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan must exist.');
|
|
692
|
+
} else {
|
|
693
|
+
if (capturePlan.requireAboveFoldCapture !== true) {
|
|
694
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.requireAboveFoldCapture must equal true.');
|
|
695
|
+
}
|
|
696
|
+
if (capturePlan.requireFullPageCapture !== true) {
|
|
697
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.requireFullPageCapture must equal true.');
|
|
698
|
+
}
|
|
699
|
+
if (capturePlan.requireSectionCapturesForLongPages !== true) {
|
|
700
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.requireSectionCapturesForLongPages must equal true.');
|
|
701
|
+
}
|
|
702
|
+
if (capturePlan.longPageStrategy !== 'anchor-plus-tiles') {
|
|
703
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.longPageStrategy must equal "anchor-plus-tiles".');
|
|
704
|
+
}
|
|
705
|
+
if (
|
|
706
|
+
typeof capturePlan.minimumSectionCaptureCount !== 'number'
|
|
707
|
+
|| capturePlan.minimumSectionCaptureCount < 3
|
|
708
|
+
) {
|
|
709
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.minimumSectionCaptureCount must be a number greater than or equal to 3.');
|
|
710
|
+
}
|
|
711
|
+
if (
|
|
712
|
+
typeof capturePlan.maxViewportHeightsPerTile !== 'number'
|
|
713
|
+
|| capturePlan.maxViewportHeightsPerTile < 2
|
|
714
|
+
|| capturePlan.maxViewportHeightsPerTile > 6
|
|
715
|
+
) {
|
|
716
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.maxViewportHeightsPerTile must be a number between 2 and 6.');
|
|
717
|
+
}
|
|
718
|
+
if (
|
|
719
|
+
typeof capturePlan.tileOverlapRatio !== 'number'
|
|
720
|
+
|| capturePlan.tileOverlapRatio <= 0
|
|
721
|
+
|| capturePlan.tileOverlapRatio >= 0.5
|
|
722
|
+
) {
|
|
723
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.tileOverlapRatio must be a number between 0 and 0.5.');
|
|
724
|
+
}
|
|
725
|
+
if (!Array.isArray(capturePlan.requiredSectionTypes) || capturePlan.requiredSectionTypes.length < 3) {
|
|
726
|
+
validationErrors.push('designIntent.visualQaPolicy.capturePlan.requiredSectionTypes must list the required section capture types.');
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
const maskingPolicy = designIntentContract.visualQaPolicy.masking;
|
|
731
|
+
if (!maskingPolicy || typeof maskingPolicy !== 'object') {
|
|
732
|
+
validationErrors.push('designIntent.visualQaPolicy.masking must exist.');
|
|
733
|
+
} else {
|
|
734
|
+
if (maskingPolicy.requireDynamicContentMasks !== true) {
|
|
735
|
+
validationErrors.push('designIntent.visualQaPolicy.masking.requireDynamicContentMasks must equal true.');
|
|
736
|
+
}
|
|
737
|
+
if (maskingPolicy.requireMaskReasonAnnotations !== true) {
|
|
738
|
+
validationErrors.push('designIntent.visualQaPolicy.masking.requireMaskReasonAnnotations must equal true.');
|
|
739
|
+
}
|
|
740
|
+
if (!Array.isArray(maskingPolicy.allowedDynamicMaskCategories) || maskingPolicy.allowedDynamicMaskCategories.length < 4) {
|
|
741
|
+
validationErrors.push('designIntent.visualQaPolicy.masking.allowedDynamicMaskCategories must list the approved masking categories.');
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
const stabilityPolicy = designIntentContract.visualQaPolicy.stability;
|
|
746
|
+
if (!stabilityPolicy || typeof stabilityPolicy !== 'object') {
|
|
747
|
+
validationErrors.push('designIntent.visualQaPolicy.stability must exist.');
|
|
748
|
+
} else {
|
|
749
|
+
if (typeof stabilityPolicy.maxUnmaskedDiffRatio !== 'number' || stabilityPolicy.maxUnmaskedDiffRatio <= 0 || stabilityPolicy.maxUnmaskedDiffRatio >= 0.1) {
|
|
750
|
+
validationErrors.push('designIntent.visualQaPolicy.stability.maxUnmaskedDiffRatio must be a number between 0 and 0.1.');
|
|
751
|
+
}
|
|
752
|
+
if (typeof stabilityPolicy.maxMaskedDiffRatio !== 'number' || stabilityPolicy.maxMaskedDiffRatio <= 0 || stabilityPolicy.maxMaskedDiffRatio >= 0.1) {
|
|
753
|
+
validationErrors.push('designIntent.visualQaPolicy.stability.maxMaskedDiffRatio must be a number between 0 and 0.1.');
|
|
754
|
+
}
|
|
755
|
+
if (stabilityPolicy.maxMaskedDiffRatio < stabilityPolicy.maxUnmaskedDiffRatio) {
|
|
756
|
+
validationErrors.push('designIntent.visualQaPolicy.stability.maxMaskedDiffRatio must be greater than or equal to maxUnmaskedDiffRatio.');
|
|
757
|
+
}
|
|
758
|
+
if (stabilityPolicy.requireConsistentRenderingEnvironment !== true) {
|
|
759
|
+
validationErrors.push('designIntent.visualQaPolicy.stability.requireConsistentRenderingEnvironment must equal true.');
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
const semanticEscalationPolicy = designIntentContract.visualQaPolicy.semanticEscalation;
|
|
764
|
+
if (!semanticEscalationPolicy || typeof semanticEscalationPolicy !== 'object') {
|
|
765
|
+
validationErrors.push('designIntent.visualQaPolicy.semanticEscalation must exist.');
|
|
766
|
+
} else {
|
|
767
|
+
if (semanticEscalationPolicy.requireMeaningfulDiffForEscalation !== true) {
|
|
768
|
+
validationErrors.push('designIntent.visualQaPolicy.semanticEscalation.requireMeaningfulDiffForEscalation must equal true.');
|
|
769
|
+
}
|
|
770
|
+
if (semanticEscalationPolicy.escalateWhenViewportCoverageIncomplete !== true) {
|
|
771
|
+
validationErrors.push('designIntent.visualQaPolicy.semanticEscalation.escalateWhenViewportCoverageIncomplete must equal true.');
|
|
772
|
+
}
|
|
773
|
+
if (semanticEscalationPolicy.skipSemanticJudgeWhenDeterministicClean !== true) {
|
|
774
|
+
validationErrors.push('designIntent.visualQaPolicy.semanticEscalation.skipSemanticJudgeWhenDeterministicClean must equal true.');
|
|
775
|
+
}
|
|
776
|
+
if (
|
|
777
|
+
typeof semanticEscalationPolicy.meaningfulDiffRatioThreshold !== 'number'
|
|
778
|
+
|| semanticEscalationPolicy.meaningfulDiffRatioThreshold <= 0
|
|
779
|
+
|| semanticEscalationPolicy.meaningfulDiffRatioThreshold >= 0.2
|
|
780
|
+
) {
|
|
781
|
+
validationErrors.push('designIntent.visualQaPolicy.semanticEscalation.meaningfulDiffRatioThreshold must be a number between 0 and 0.2.');
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
const artifactContract = designIntentContract.visualQaPolicy.artifactContract;
|
|
786
|
+
if (!artifactContract || typeof artifactContract !== 'object') {
|
|
787
|
+
validationErrors.push('designIntent.visualQaPolicy.artifactContract must exist.');
|
|
788
|
+
} else {
|
|
789
|
+
if (artifactContract.requireMachineReadableDiffBundle !== true) {
|
|
790
|
+
validationErrors.push('designIntent.visualQaPolicy.artifactContract.requireMachineReadableDiffBundle must equal true.');
|
|
791
|
+
}
|
|
792
|
+
if (artifactContract.requireViewportResults !== true) {
|
|
793
|
+
validationErrors.push('designIntent.visualQaPolicy.artifactContract.requireViewportResults must equal true.');
|
|
794
|
+
}
|
|
795
|
+
if (artifactContract.mergeDeterministicAndSemanticVerdicts !== true) {
|
|
796
|
+
validationErrors.push('designIntent.visualQaPolicy.artifactContract.mergeDeterministicAndSemanticVerdicts must equal true.');
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
498
801
|
if (!Array.isArray(designIntentContract.requiredDesignSections) || designIntentContract.requiredDesignSections.length !== DESIGN_REQUIRED_SECTIONS.length) {
|
|
499
802
|
validationErrors.push('designIntent.requiredDesignSections must match the required design contract sections.');
|
|
500
803
|
} else {
|
|
@@ -133,9 +133,10 @@ export function buildDesignBootstrapPrompt({
|
|
|
133
133
|
'8. Responsive Strategy and Cross-Viewport Adaptation Matrix',
|
|
134
134
|
'9. Motion and Interaction Principles',
|
|
135
135
|
'10. Component Language and Morphology (cards, forms, nav, states)',
|
|
136
|
-
'11.
|
|
137
|
-
'12.
|
|
138
|
-
'13.
|
|
136
|
+
'11. Context Hygiene and Approved Reference Boundaries',
|
|
137
|
+
'12. Accessibility Non-Negotiables',
|
|
138
|
+
'13. Anti-Patterns to Avoid',
|
|
139
|
+
'14. Implementation Notes for Future UI Tasks',
|
|
139
140
|
'',
|
|
140
141
|
'## Required design-intent.json Fields',
|
|
141
142
|
'1. mode',
|
|
@@ -151,11 +152,15 @@ export function buildDesignBootstrapPrompt({
|
|
|
151
152
|
'11. crossViewportAdaptation',
|
|
152
153
|
'12. motionSystem',
|
|
153
154
|
'13. componentMorphology',
|
|
154
|
-
'14.
|
|
155
|
-
'15.
|
|
156
|
-
'16.
|
|
157
|
-
'17.
|
|
158
|
-
'18.
|
|
155
|
+
'14. accessibilityPolicy',
|
|
156
|
+
'15. visualQaPolicy',
|
|
157
|
+
'16. contextHygiene',
|
|
158
|
+
'17. experiencePrinciples',
|
|
159
|
+
'18. forbiddenPatterns',
|
|
160
|
+
'19. validationHints',
|
|
161
|
+
'20. requiredDesignSections',
|
|
162
|
+
'21. implementation',
|
|
163
|
+
'22. repoEvidence when onboarding or detector evidence exists',
|
|
159
164
|
'',
|
|
160
165
|
'## Hard Rules',
|
|
161
166
|
'1. No copy-paste from external style guides.',
|
|
@@ -169,8 +174,15 @@ export function buildDesignBootstrapPrompt({
|
|
|
169
174
|
'9. Responsive guidance must include layout mutation rules for mobile, tablet, and desktop. Shrinking the desktop layout is not enough.',
|
|
170
175
|
'10. Motion can be bold, cinematic, or highly expressive when it improves memorability, hierarchy, feedback, or product confidence. Optimize it instead of flattening it. Only reject motion when it harms clarity, accessibility, or runtime performance.',
|
|
171
176
|
'11. Define component morphology across interaction states and viewports so cards, forms, nav, and feedback surfaces adapt coherently instead of only resizing.',
|
|
172
|
-
'
|
|
173
|
-
'
|
|
177
|
+
'12. Keep UI-only requests context-isolated. Load frontend design rules first and do not eagerly load backend-only rules unless the task explicitly crosses those boundaries.',
|
|
178
|
+
'13. Treat WCAG 2.2 AA as the hard accessibility floor. Use APCA only as advisory perceptual tuning, never as a reason to waive a WCAG failure.',
|
|
179
|
+
'14. Accessibility planning must explicitly cover focus visibility, focus appearance, target size, accessible authentication, keyboard access, and dynamic status/state access.',
|
|
180
|
+
'15. Hybrid visual QA must stay deterministic-first. Define screenshot-baseline expectations, dynamic masking rules, noise thresholds, required mobile/tablet/desktop coverage, and long-page capture strategy before relying on semantic review.',
|
|
181
|
+
'16. Do not treat one screenshot as enough for a long page. Require above-fold capture, full-page capture when stable, and anchor-based section or tiled-scroll captures for deep pages.',
|
|
182
|
+
'17. Only escalate visual diffs to a semantic judge when deterministic evidence shows meaningful drift or missing required coverage.',
|
|
183
|
+
'18. Treat prior website memory, unrelated project aesthetics, and remembered screenshots as tainted context unless the user explicitly approves continuity.',
|
|
184
|
+
'19. Design continuity is opt-in. If no approved continuity exists, synthesize from the current repo evidence, current brief, and current project docs only.',
|
|
185
|
+
'20. Make at least one memorable visual bet so the resulting system is recognizable and not template-neutral.',
|
|
174
186
|
'',
|
|
175
187
|
'## Project Inputs',
|
|
176
188
|
`- Project name: ${discoveryAnswers.projectName}`,
|
|
@@ -189,8 +201,13 @@ export function buildDesignBootstrapPrompt({
|
|
|
189
201
|
'## Required Execution',
|
|
190
202
|
'1. Create or update docs/DESIGN.md with complete content.',
|
|
191
203
|
'2. Create or update docs/design-intent.json with machine-readable design intent.',
|
|
192
|
-
'3.
|
|
193
|
-
'4.
|
|
204
|
+
'3. Keep both files synchronized: the markdown explains the rationale and the JSON captures the machine-readable contract.',
|
|
205
|
+
'4. Encode accessibility as a split policy: WCAG 2.2 AA hard floor, APCA advisory readability tuning, and explicit hard-vs-advisory checks.',
|
|
206
|
+
'5. Encode hybrid visual QA as policy: deterministic-first screenshot review, approved masking categories, stability thresholds, required mobile/tablet/desktop coverage, long-page capture strategy, and semantic escalation boundaries.',
|
|
207
|
+
'6. Make long-page handling explicit: above-fold capture, full-page capture when stable, and anchor-based section or tiled-scroll captures when one image would miss deep content.',
|
|
208
|
+
'7. Preserve repoEvidence.designEvidenceSummary when onboarding or detector evidence exists instead of discarding it.',
|
|
209
|
+
'8. Ensure both files stay project-specific, dynamic, and practical for implementation and review.',
|
|
210
|
+
'9. After the contract exists, use it as a first-class source for future UI tasks.',
|
|
194
211
|
'',
|
|
195
212
|
].join('\n');
|
|
196
213
|
}
|