# Novalon Website - 领域术语表 ## 核心实体 ### 设计 DNA (Design DNA) 基于 Accenture + Bain + Porsche Consulting 三家顶级咨询公司设计体系分析后,整合出的 Novalon 三维设计基因: - **维度一:Design System(设计系统)**:可量化令牌(颜色、排版、间距、布局、形状、阴影、动效、组件) - **维度二:Design Style(设计风格)**:定性感知(氛围、视觉语言、构图、图像、交互感、品牌语气) - **维度三:Visual Effects(视觉效果)**:特殊渲染(滚动动效、微交互、视差、SVG 动画等) 决策状态:✅ 2026-06-28 确认 ### 咨询专业风(Consulting Professional) Novalon 网站的**主体视觉骨架**。核心特征: - 墨色为主、留白克制、强对比排版 - 数据驱动、答案优先的内容策略 - 模块化网格布局、工业化组件系统 - 参考对象:Accenture(系统化)+ Bain(品牌清晰度) 决策状态:✅ 2026-06-28 确认(作为主体骨架) ### ~~水墨文化基因(Ink Cultural DNA)~~ [已移除] 已通过 ADR-0006 决定移除。网站设计风格纯化为纯咨询专业风,不再使用任何水墨装饰元素。Logo 中的书法「睿」字保留(属品牌标识,非装饰性元素)。 决策状态:❌ 2026-07-10 移除(ADR-0006) ### 朱砂点睛 品牌红 #C41E3A 的使用原则——仅作点缀,不作为主色调。核心约束: - 面积占比 ≤ 10% - 使用场景:Hero 关键词、CTA 按钮、关键数字、模块标签、链接强调、下划线 - 用法向 Bain 看齐:精准、克制、有记忆点 **品牌红贯穿规则(每页必有品牌红):** 每页至少 3 处品牌红触达点,确保品牌识别一致性: 1. **Hero 区域**:1 个 badge 标签或 1 个关键词高亮(二选一,不叠加) 2. **CTA 区域**:主按钮使用 brand 色 3. **Section 标签**:Eyebrow 下划线装饰(4px 品牌红短线) 4. **数据高亮**:关键数字(≤2 个/页) 5. **链接交互**:hover 态、导航激活态、表单聚焦态统一使用品牌红 品牌红禁止使用场景: - 禁止作为段落文字颜色 - 禁止大面积背景(badge 背景除外) - 禁止与辅助色(蓝/青/琥珀/紫)在同一卡片内同时出现 决策状态:✅ 已确认(2026-06-28 重申约束,2026-06-29 补充贯穿规则) ### 品牌色令牌的语义拆分(2026-09-04 新增 · 暗黑模式修复) 品牌红必须区分「文字」与「底色」两种用法,二者**不能共用同一个 CSS 变量**: | utility | 变量 | 浅色 | 深色 | 适用 | |---|---|---|---|---| | `text-brand-ink` | `--color-brand-ink-rgb` | #C41E3A | **#F87171** | 品牌色**文字**:eyebrow、指标数字、标签、链接 hover | | `bg-brand` / `border-brand` | `--color-brand-rgb` | #C41E3A | #C41E3A(**不翻转**) | 按钮底色、边框、图标填充 | | `bg-brand-bg` | `--color-brand-bg` | #FEF2F4 | **#2A1418** | 品牌浅底块(与 `--color-error-bg` 同口径翻转) | | `--badge-accent-text` | `--badge-accent`(组件注入) | accentColor 原色 | `color-mix(accent 45%, white)` | DetailHero 徽章:accentColor 直用作深底文字不可读(#1e3a5f 深底 1.65:1),经 CSS 变量间接引用后按主题自动适配 | 依据(WCAG 相对亮度实测,非估算): - 红底白字按钮 #C41E3A × #F8FAFC = **5.58:1**;若把按钮底整体换成 #E04A68 会掉到 **3.75:1** → 所以**绝不能**整体提亮 `--color-brand` - 深色下品牌文字取 **#F87171**:于 #0A0E14 / #0F1419 / #151B23 分别 **6.99 / 6.69 / 6.26**,全达 AA; 且它已是深色主题 `--color-error-text` 的既有值,不引入新色值 例外 —— 以下场景保持 `bg-white` + `text-brand`(**不**用 brand-ink),因为它们是恒定品牌红/深色 区块上的**白底反转元素**,白底在两主题下都不翻转:CTA 区块白底主按钮、品牌红指标块上的白底角标、 Switch / Slider 的白底圆钮。 决策状态:✅ 2026-09-04 全站审计后确认(深色对比度违规 683 → 0); ✅ 2026-09-04 生产构建终验(33 路由 × 双主题 P1=0 / P3=0,剩余 P2 全为 GA 外网噪音) ### 动效设计四原则 (Motion Design Principles) 基于 Porsche Consulting "用动效象征变革"理念,统一全站动效语言: 1. **Purposeful(有目的)**:每个动效必须服务于内容传达,不做纯装饰动效 2. **Fast(快节奏)**:入场 180–280ms(`--transition-fast` … `--transition-normal`),hover 150ms,反馈 100ms 3. **Natural(自然)**:统一使用 `ease-ink` [0.22, 1, 0.36, 1] 作为默认缓动曲线 4. **Layered(分层)**:子元素入场 stagger 30-60ms,Section 间 stagger 100-150ms 动效禁止事项: - 禁止连续循环动画(pulse-soft 除外,仅用于骨架屏) - 禁止超过 700ms 的入场动效 - 禁止使用弹性缓动(spring)做内容入场(仅用于按钮按压反馈) 决策状态:✅ 2026-06-29 确认 ### 服务编号+色条编码(Service Number + Color Bar) 服务模块的区分方式,取代纯颜色编码: - **主要区分**:大号数字编号(01、02、03...) - **辅助区分**:卡片左侧 4px 细色条 - 不整卡上色,保持专业感的同时提供快速识别 决策状态:✅ 2026-06-28 确认 ### ~~墨韵流光~~ [已移除] 已通过 ADR-0006 移除。原包含旋转渐变边框和鼠标跟随光晕两个子机制,不再使用。 决策状态:❌ 2026-07-10 移除(ADR-0006) ### HSI 架构 (Hub-Spoke-Independent) Novalon 网站的信息架构模型,参考 IHG 洲际酒店集团官网模式设计。三层结构: - **Hub(枢纽)**:`/products` 产品目录作为统一入口,内部分为"企业套装区"和"专业产品区" - **Spoke(辐条)**:`/solutions` 解决方案作为行业场景入口,每个方案页面以"推荐套装组合 + 服务包"为核心叙事 - **Independent(独立)**:独立产品(安全/行业特种/硬件)在 Products 的专业产品区内拥有独立展示路径,不强制绑定特定解决方案 决策状态:✅ 2026-05-26 确认,见 ADR-0002 ### 四层叙事模型 (Four-Layer Narrative) 所有详情页(产品/方案/服务/独立产品)统一采用的分层内容架构: - **Layer 1 Hero(情感入口)**:大视觉 + 标题 + 一句话价值主张 + 状态标签。支持色调+背景+布局的有限变化 - **Layer 2 价值理性支撑**:按页面类型差异化——产品页展示功能模块与优势,方案页展示痛点→架构→组合,服务页展示挑战→成果→流程 - **Layer 3 信任证明**:案例故事、数据佐证、认证资质、客户评价。当前状态:**全新层,现有页面完全缺失** - **Layer 4 CTA 转化**:主行动 + 次行动 + 交叉推荐(方案↔产品↔服务双向链接) 决策状态:✅ 2026-05-26 确认 ### Hero 变化策略 (Hero Variation Strategy) 详情页 Hero 区域的视觉差异化策略。在保持"水墨雅致"统一品牌的前提下,允许三类变化: - **色调变化**:不同产品/方案/服务使用不同的主色调或渐变方向 - **背景纹理**:ERP 用几何网格、BI 用数据流线条、安全产品用盾牌纹样等语义化背景图案 - **布局微调**:文字位置、元素排列可有小幅差异(左对齐/居中/右对齐等) 约束:Header / Footer / Breadcrumb / 设计令牌全站不变,仅 Hero 区内变化 决策状态:✅ 2026-05-26 确认(选型 C:色调+背景+布局) ### 企业套装 (Enterprise Suite) Novalon 的 6 个核心产品,互为互补关系,常以组合形式出现在解决方案中: - ERP 睿新管理系统、CRM 客户管理、BI 数据平台、CMS 内容平台、SDS 供应链决策、OA 协同办公 目标客群高度重叠(中大型企业),客户可能同时购买多个套装产品。 ### 专业产品 (Standalone Products) 自成体系、不一定依赖企业套装的独立产品线: - 安全产品(堡垒机/漏扫/零信任等) - 行业特种软件 - 硬件产品 当前状态:近期有规划,需在本次重构中预留完整的模板体系 ### 特效组件 (Effects) **该目录已不存在**(口径核对 2026-09-23):`src/components/effects/` 在提交 `37296b5`(2026-05-10「三轮视觉改造与页面过渡动画」)中被**整体删除 25 个文件**,`git ls-tree -r HEAD` 与该目录的 `ls` 均为空。本节原文("24 个视觉特效组件……大部分未被首页使用,属于技术债务")是**重构前的现状盘点**,只作历史保留,不得再当作可寻址的目录引用。动效能力现在的落点是 `src/components/ui/`(`scroll-reveal.tsx`、`animated-counter.tsx`、`brand-visuals.tsx`)与 `src/components/sections/`(`hero-particle-field.tsx` + 其引擎)。 ### Design Tokens `.impeccable.md` 中定义的设计令牌系统,包含颜色、排版、间距、卡片系统、Section 背景交替规则。当前状态:**文档已定义,代码中 globals.css 有对应 CSS 变量,但组件层未完全落地**。 ## 关键决策 | 术语 | 含义 | 决策状态 | |------|------|---------| | 信息架构 | HSI 混合模型(Hub-Spoke-Independent),非纯层级也非纯平级 | ✅ 2026-05-26 确认 | | 视觉策略 | 统一品牌"水墨雅致"为底,Hero 区域支持色调+背景+布局变化 | ✅ 2026-05-26 确认 | | 叙事结构 | 四层模型(Hero → 价值支撑 → 信任证明 → CTA),全类型页面统一 | ✅ 2026-05-26 确认 | | 实施范围 | 全量落地:6产品 + 4方案 + 4服务全部重构,独立产品预留空模板 | ✅ 2026-05-26 确认 | | 重构范围 | 保持 Next.js App Router 架构不变,不更换技术栈 | ✅ 已确认(ADR-0001) | | 特效取舍 | 逐个评估 24 个特效组件,决定保留/改造/删除 | ✅ 已确认 | | 首页 Hero 视觉方向 | 先用原型对比再决定(排版驱动 vs 墨韵背景 vs 中间路线) | ✅ 已确认 | | web-design-engineer 定位 | 仅用于 Hero 原型验证,不用于全站重构 | ✅ 已确认 | | 运营状态 | 未正式上线,重构风险可控 | ✅ 已确认 | | 产品分类对齐 | 代码中 `enterprise`/`growth`/`specialized` 三分类与 CONTEXT.md 矛盾;统一为"企业套装区"(6核心产品)+ "专业产品区"(独立产品),删除 `growth` 分类 | ✅ 2026-06-07 确认 | | 解决方案 L3 信任层 | 需补上 `SolutionTrustSection`,但初创阶段案例数据不足,标记为 TODO;空数据时显示"更多案例即将发布"而非空白 | ✅ 2026-06-07 确认(TODO) | | 独立产品组件统一 | 独立产品从 V1 组件迁移到 V2/V3 组件体系,通过 hero-themes 差异化(深色调、技术纹理、参数化布局)体现"硬核"风格,不维护独立设计系统;V1 组件迁移完成后删除 | ✅ 2026-06-07 确认 | | 方案列表页组合叙事 | 解决方案卡片需展示"推荐组合"(如制造业=ERP+BI+SDS),让用户一眼看出方案=产品组合,体现 IHG Spoke→Hub 连接 | ✅ 2026-06-07 确认 | | Hero 视觉方向修正 | 当前深色渐变风格偏离"水墨雅致"品牌定位,需转向浅色/宣纸色底、深色文字、品牌色点缀;通过 web-design-engineer skill 做原型验证后再落地 | ✅ 2026-06-07 确认 | | 导航体现 HSI 层级 | Products(Hub)视觉权重最高,Solutions(Spoke)次之,Services 最轻;Products 下拉菜单需展示套装区/专业产品区分区 | ✅ 2026-06-07 确认 | | 方案页删除服务方式区域 | Solutions 列表页"服务方式"区域职责越界(属 Services 层),应删除;替换为方案→服务的轻量关联推荐链接 | ✅ 2026-06-07 确认 | | L3 信任层内容策略 | 初创阶段无真实案例/数据/资质,L3 暂不渲染;组件结构预留,数据就绪后启用。三档策略:有案例→正常展示;有意向→"正在服务中"标签;无数据→不显示 L3。**阶段 0(2026-08-20)已落地**:信任策略从「结果证据」转向「可验证的过程+能力+治理证据」——首页「共创计划」板块(共创进行中/产品内测中/成果授权公开三档如实状态 + 招募 CTA)、关于页资质区如实「建设中」空态 | ✅ 2026-06-07 确认 / 阶段 0 完成 2026-08-20 | | 首页共创计划板块 | 成立 <1 年无真实案例时,以主动板块替代被动标签:`page-copy` 字段 `earlyAccessTitle`/`earlyAccessCtaLabel`/`earlyAccessStatus` 驱动首页「首批客户共创计划」板块,如实呈现共创/内测/授权公开状态并引导转化(成为共创客户 → /contact)。零编造:不虚构客户/数据/资质 | ✅ 2026-08-20 确认 | | 数字口径 basis 结构强制 | 「每个数字带口径」从个别页自觉升级为结构约束:走共享数字样式渲染的指标(`metrics`/`outcomes`/`dataProofs`)必须声明 `basis: target\|team-history\|verified`,渲染端按 basis 自动附角注,缺失/非法保守回落到最弱的 `target`(「目标口径,非既成结果」)。CMS 侧 `basis` 为 select 字段,真实出路由业务在 admin 录入;`metrics-basis.test.ts` 机械校验 seed 全量条目显式声明、禁止条目无据自称 `verified`,并拦截「源自真实客户案例/经过实战验证」式虚构佐证文案。**注意**:字段定义改动需重跑 seed 同步 `ContentModel.fields` 后 admin 才出现该输入项;渲染端已对未同步数据兜底为 `target` | ✅ 2026-09-20 确认(critique P0 收尾) | | 组件版本统一 | 独立产品迁移后删除 `detail/`(V1),将 `detail-v2/` 重命名为 `detail/`,组件文件名去掉版本后缀(如 `DetailHeroV3` → `DetailHero`) | ✅ 2026-06-07 确认(待 Phase 0 执行) | | 设计定位 | 纯咨询专业风(Accenture + Bain + Porsche 三位一体),水墨元素已移除 | ✅ 2026-07-10 更新(ADR-0006) | | 设计 DNA 框架 | 三维度模型:Design System + Design Style + Visual Effects,基于 Accenture+Bain+Porsche 整合 | ✅ 2026-06-28 确认 | | 服务区分方式 | 服务编号+色条编码(数字为主,4px 色条为辅),不整卡上色 | ✅ 2026-06-28 确认 | | 叙事风格分层 | 首页/Solutions/Services 用咨询风,Products 用产品风为主+咨询风为辅;统一设计令牌,仅内容组织不同 | ✅ 2026-06-28 确认 | | 重构实施路径 | Phase 0 对齐清理 → Phase 1 首页与核心模板升级 → Phase 2 动效与体验打磨 | ✅ 2026-06-28 确认 | | 品牌人格 | 复合人格:主色调是"专业可靠的老专家",叠加"年轻有为的新锐"的活力,打底是"严谨精密的工程师"气质 | ✅ 2026-06-29 确认 | | 品牌完成度自评 | 40/100。原因:只是换了配色和样式(骨架有了),但品牌灵魂、视觉资产、内容深度都严重不足 | ✅ 2026-06-29 确认 | | 核心问题诊断 | 品牌定位无误,执行需跟上。通过 ADR-0006 移除水墨元素后,纯化咨询专业风 | ✅ 2026-07-10 更新(ADR-0006) | | 品牌提升优先级 | 前三件事:A)重做首页Hero > B)建立完整品牌视觉系统 > E)品牌故事页面(Q12) | ✅ 2026-06-29 确认 | | 设计DNA深化方案 | Accenture骨架 + Bain血肉 + Porsche点睛,三阶段落地(地基→品牌→个性) | ✅ 2026-06-29 确认(ADR-0004) | | 颜色策略 | 编号为主,色条为辅(保持当前方案) | ✅ 2026-06-29 确认 | | 内容策略 | 强借鉴Bain答案优先——首页首屏直接给出核心价值主张 + 量化成果 | ✅ 2026-06-29 确认 | | 初创文案真实性 | 公司成立于 2026-01-15,成立不足一年;全站静态文案不再使用「12 年深耕 / 500+ 企业 / 8+ 年核心团队经验 / 大厂背景 / 头部咨询 / 全球顶尖伙伴 / 虚构客户案例 / 未取得资质认证」等无法验证的表述,统一改为「2026 年成立 / 首批客户共创 / 专业核心团队 / 结果导向」;产品种子与 ERP 升级专题页同步清理虚构案例/认证,并已重新执行 `npm run db:seed` | ✅ 2026-08 确认 | | 生产部署模式 | 2026-08 切换为混合渲染:`next.config.mjs` 使用 `output: 'standalone'`,`Dockerfile.prod` + `docker-compose.server.yml` 启动 Next.js 容器,Nginx 托管静态资源并代理 `/api/*`、`/admin/*`、ISR 回源;生产 SQLite 位于 `data/prod.db`,通过 `DATABASE_URL=file:/app/data/prod.db` 与 `PRISMA_QUERY_ENGINE_LIBRARY` 运行 | ✅ 2026-08 确认 | | 动效强度 | 体验级全场景动效叙事(Porsche Consulting水准,但克制不炫技) | ✅ 2026-06-29 确认 | | 排版方向 | Accenture信息密度 + Bain标题对比 + Porsche图文节奏的融合方案 | ✅ 2026-06-29 确认 | | 品牌故事页品牌名 | 使用与 footer Logo 完全相同的青柳隶书 SVG path(`BrandCalligraphyName`),不加载 4.4MB 的 AoyagiReisho 字体文件,兼顾品牌一致性与性能 | ✅ 2026-08-18 确认 | | 风格主词 | Swiss Modernism 2.0(骨架)+ Bento Box Grid(信息组织)+ Hero-Centric & Conversion-Optimized(首屏转化)+ Trust & Authority & Social Proof(信任层)+ Motion-Driven(差异化记忆点)+ Accessible & Ethical(底线) | ✅ 2026-08-18 确认 | | 官网产品模块定位 | **IHG/字节式品牌矩阵**:官网品牌宣传为主,产品矩阵页保留为聚合入口(每产品一句话定位+指标证据+外链独立站);成熟产品 `externalUrl` 外链独立站(NovaVis → novavis.p.novalon.cn 已实践),未成熟产品官网详情页占位,独立站上线后切换外链。参照案例(已核实):IHG 品牌组合页 / 字节跳动 bytedance.com/products / 腾讯 tencent.com/business.html(模式 B:品牌+品牌矩阵聚合页);对照金蝶/用友(模式 C:产品为主,官网承载详情与转化) | ✅ 2026-08-19 确认 | | 品牌主口号 | **智连未来 · 成长伙伴 —— 您的数字化转型同行者**(整句全站统一采用)。品牌叙事内核(定位声明 / 承诺 / L0 价值主张 / L1 三支柱 / 语气语调)见 `docs/brand-narrative-core.md`,作为全站文案统一唯一锚点 | ✅ 2026-08-19 确认 | | 品牌叙事 CMS 化 | 品牌叙事内核全部下沉到 CMS `site-config` 模型(`slogan` / `valueProposition` / `positioningStatement` / `brandPromise` / `toneOfVoice` / `pillars`),后台可编辑;代码侧 `COMPANY_INFO` 与 `BRAND_NARRATIVE`(`src/lib/constants/company.ts`)作为未配置 CMS 时的兜底唯一真源,`layout.tsx` 读取后经 `SiteConfigProvider` 注入全站 | ✅ 2026-08-19 确认 | | 结构性文案 CMS 化 | 新增 `page-copy` 内容模型承载各业务页面章节标题/眉标/描述/CTA/空状态,覆盖首页 + 服务/方案/产品/案例/新闻列表页,seed 写入 6 条(home/services/solutions/products/cases/news)。实现为「CMS 优先 + 硬编码兜底」:CMS 未配置时回退 `TRUST_SIGNALS`/`EARLY_ACCESS`/`NARRATIVE_ACTS` 等常量,保证任何情况不白屏。数据层新增 `getPageCopy(pageCode)` / `getHomePageCopy()`,各 `page.tsx` 读取后以 `pageCopy` props 传入组件。详情页小节标题、页面内嵌业务常量(服务流程/合作模式/产品组合)、Header/Footer 等 UI 外壳按 UI 职责保留代码。数据实体(服务/产品/方案/案例/新闻/指标/Hero)仍由 `data-server` 从 Prisma 读取 | ✅ 2026-08-19 确认 | | 首页对标埃森哲重构(scene#16) | **视觉基调:局部深色 Hero(推荐项)**——保持浅色咨询风为底,仅 Hero 升级为全出血深色画布(近黑底 `bg-ink` + 白色 Logo `/logo-white.svg` + 品牌红 #C41E3A 单电压 ≤10%),制造埃森哲式戏剧感;**实施范围:Phase A+B 全量**——①内容支柱补齐:新增 Insights 行业洞察(2×2 gap-px 卡片网格 + 方法论/观点/共创类型标签)、FounderQuote 创始人观点(深红区块 + 白色点阵 + 大引言)、News 新闻动态(最近 3 条 + 查看全部)三个对标埃森哲思想领导力支柱的区块;②Hero 深色化;③CTA 签名符号:全站 Button 组件 `rounded-md` → `rounded-full`(Pill 胶囊化)+ ArrowRight 签名箭头。零编造内容原则:公司 2026-01-15 成立,Insights 兜底 4 条均为可验证方法论内容(不虚构研究报告/人名),FounderQuote 署名兜底「Novalon 创始团队」不虚构具体人名。实现:`home-content-v15.tsx` 替换 v14(9 区块顺序 Hero→Trust→Narrative→Insights→Services→FounderQuote→Cases→News→CTA),CMS 优先 + FALLBACK_INSIGHTS/NEWS 常量兜底;seed page-copy 新增 insights*/founderQuote*/news* 字段(upsert 幂等)。验证:tsc 0 errors / eslint 0 errors / Jest 128 套件 1621 通过 / Playwright 视觉回归 22 passed(macOS 11 限制下用 Chromium 117 兼容配置生成快照) | ✅ 2026-08-31 确认(署名口径已被 2026-09-21 行修订)| | FounderQuote 兜底署名改回法定主体名(修订上行) | 上行的「Novalon 创始团队」与 `p1-brand-visual-audit.spec.ts:30` 的 `FORBIDDEN_TEXT=/novalon/i` 冲突,且对外可见文案的署名应是法定主体「四川睿新致远科技有限公司」的简称而非英文品牌名。裁定:**改文案不改测试**——`FALLBACK_FOUNDER_QUOTE.name`(`home-content-v15.tsx:115`)与 `prisma/seed.ts:961` 同步为「睿新致远创始团队」,单测 `home-content-v15.test.tsx:181` 随动。DB 侧 `page-copy/home` 的 `founderQuoteName` 实测为空,页面走兜底分支,无需授权写库;`curl localhost:3000/` 复核渲染值为「睿新致远创始团队」且 0 处 "Novalon 创始团队"。零编造原则不变:仍不虚构具体人名 | ✅ 2026-09-21 确认(验收 §7-4 / 放行条件② 留痕)| | 装饰大字对比度口径 | 装饰性大字号文字(序号、客户名首字占位)不享有对比度豁免:axe-core 4.11.4 的 `color-contrast` 只看 DOM 可见文字颜色,`aria-hidden` / `role="none"` / CSS `opacity` 均不豁免(变体矩阵实测,仅 SVG ``、CSS mask、`::before` 等非文本编码可绕)。全站统一用大字档令牌 `text-text-hint`(#7C8CA5 / 深色 #94A3B8,对各级卡片底色 ≥3:1,满足 WCAG 1.4.3 大字 AA),不再用 `text-text-muted/10` 之类低 alpha 淡化;口径由 `scripts/utils/check-color-contrast.ts` 的「大号装饰文本 × 各级卡片底色」契约组固化 | ✅ 2026-09-21 确认(验收 A-12 清零)| | 触摸目标口径 | 硬门禁 = WCAG 2.2 **AA** SC 2.5.8 **≥24×24px**(含 Spacing/Equivalent/Inline 例外,正文内联链接按 `display:inline` 排除);SC 2.5.5 的 44×44px 属 **AAA**,在 `e2e/touch-targets.ts` 中只作为建议清单打印、不使构建失败。此前测试把 44px 标为 AA 是标准档位错用 | ✅ 2026-09-21 确认 | | GA4 SPA pageview 标题时序 | Next.js App Router 的 `` 在路由 commit 之后 2–5 帧才写入(生产实测 chromium-mobile 第 2 帧、桌面 chromium 第 3–5 帧),因此 `GoogleAnalytics.tsx` 必须带帧预算(`MAX_TITLE_SETTLE_FRAMES = 10`)轮询等待标题变化后再 `gtag('config')`;超预算兜底发送(不丢计数),新导航前补发未送出的上一条 pageview(不送上一页标题)| ✅ 2026-09-21 确认(验收 A-17)| | iPhone SE 复核口径(放行条件⑥) | 375×667 @2x + `colorScheme` 强制深/浅 × 同意条 pending/dismissed × 首页/新闻详情/新闻列表/联系页 = 16 组,证据(32 图 + `measurements.json` + 探针脚本)落在 `docs/acceptance/2026-09-21-iphone-se/`。实测:16/16 `scrollWidth == clientWidth == 375`(无横向溢出)、`footerBottomGap = 64`(验收 R-1 记录为 192–226 的双安全区空带)、滚到底后 `footerBottomVsViewport = -128` 一致;同意条在 pending 态以 `bannerTop=461` 覆盖页脚——这是 `fixed bottom-16` 浮层的设计行为,可关闭后消失。**边界**:这是浏览器仿真,不等同真机走查,真机确认仍需人工 | ✅ 2026-09-22 确认(验收 §8-⑥)| | `-[var(--color-*)]/<alpha>` 死样式族的收口边界 | 编译产物实测:src 下 22 处 / 17 个唯一类在 CSS 中 0 产出(Tailwind v3 不能对纯 hex 变量套 alpha,见 `tailwind.config.js:12-15`)。按**渲染证据**分级后只修 2 处「活组件 + 仅 hover」:`NewsDetailClient.tsx:49` → `hover:bg-brand-soft`、`service-card.tsx:33` → `hover:border-brand/20`(hover 不入基线,零像素影响,已确认三条规则在编译 CSS 中产出)。注意点亮后的合成底色须重算对比度:`hover:bg-brand/20` 在浅色主题下使 `text-brand-ink` 降到 4.18:1(破 AA 4.5:1),且 axe 忽略 `:hover`、`check:contrast` 只断言令牌配对,两道门禁均测不到,故取 12% 的 `brand-soft`(浅色 4.80:1 / 深色 6.60:1)。**不做**:`/privacy`、`/terms` 首屏 `via-[var(--color-brand)]/80` 一旦被"点亮"会在已审批基线里画出半透明暗坑,属设计判断;3 处需先在 `globals.css` + config 补 `--color-bg-section-rgb` / `--color-brand-bg-rgb` 通道;其余 14 处位于无任何路由渲染的 barrel-only 死代码。是否扩 `check-brand-text-token.ts` 到全族由用户定范围 | ⏳ 2026-09-22 待裁定(残留项,不属验收 §8 六条放行条件)| | 英文 wordmark 的受控口径(续上上行 §7-4) | 全仓唯一的字面 `NOVALON` 位于 `public/logo.svg:72`、`public/logo-white.svg:72`、`public/logo-calligraphy.svg:72` 的 `<text>` 元素,且各自行前注释 `<!-- NOVALON - 英文 -->` 自述为设计意图,三处 `<text>` 实测内容恰为 `NOVALON`(`letter-spacing="4"`,仅 `fill` 随底色不同:#0A0E14 / #FFFFFF)。提交 `8d3bd72` 另把书法人名统一到 header/footer/品牌页(新增 `BrandCalligraphyName`,改 `public/logo.svg`)。裁定:**wordmark 属图形资产内的受控内容,不是文案回归**;对外可见**文本**署名一律「睿新致远」(:195),`src` 下其余 `novalon` 串为技术上下文(`novalon.cn` 域名、`novalon_admin_token` 等存储键、PBKDF2 盐、管理端 `Novalon CMS` 界面)。据此把 `e2e/p1-brand-visual-audit.spec.ts` 从"零断言"改为三条真不变量:①两张 logo 资产经 `page.request.get` 取回后,每个 `<text>` 内容须恰为 `NOVALON`(改名、夹带或漏字即失败);②header/footer/首页的可见文本、`alt`、`title`、hover 后文本零 `novalon`(技术上下文除外);③凡"遍历后无命中即通过"的用例补 `expect(checked/hovered/withAlt).toBeGreaterThan(0)`,避免选择器失配伪装成绿灯。因 wordmark 以 `<img>` 加载、不成 DOM 文本,`:173-177` 的首页 Hero 豁免分支在生产 HTML 上当前不触发(改为内联 SVG 时会生效)——保留但不依赖。放行条件② 的「修订 `CONTEXT.md` 或测试」两条路径此处**同时**满足 | ✅ 2026-09-22 确认(验收 §7-4 / 放行条件②)| | 边界页(404 / 根错误兜底)的可测口径 | ⑤ 的扫描分母从 `sitemap.xml`(29 条)扩为 **sitemap ∪ 预渲染产物 ∪ 站内链接 BFS = 35 条**后,首轮即 `passed=false`(`docs/acceptance/2026-09-21-axe/axe-evidence.json`,双引擎双主题共 8 条 bad rows):`/_not-found` 的 h1「404」用 `text-brand-ink` + **`opacity-20`** ⇒ 有效 alpha 20%,`color-contrast` 必破;`/_global-error` 因项目无 `global-error.tsx`,由 Next 内置文档壳顶替 root layout ⇒ `<html id="__next_error__">` 无 `lang`,且本站主题是 `html[data-theme='dark']` 属性驱动(`globals.css:396` 明示非 `.dark` class),内置壳读不到令牌,深色落到浏览器默认 `rgb(10,10,10)`。裁定:**边界页属全站范围,不豁免**——404 与根错误页是每个访客都可能落到的页面,且是唯一的"无 CMS 数据兜底路径"。修复:404 标题改 `text-brand-ink/80`(120px 属大号文本,AA 需 3:1;沿用 §5.22 `/products/erp-upgrade` 水印数字的同一口径与同一档位),新增 `src/app/global-error.tsx` 自带 `<html lang="zh-CN">` + `<title>`(错误边界是 Client Component,不支持 `metadata` 导出)+ 与 `globals.css` 同值的 OS 主题内联样式(CSP `style-src 'self' 'unsafe-inline'` 允许)。**约束**:①可见文本一律不得用 `opacity-*` 暗化,装饰性大字用可编译的主题令牌 + `/80` 档;②新增 `app/` 顶层边界文件须自带文档壳与主题样式,且本版本 Next 的 `global-error` props 是 **`retry`**(`node_modules/next/dist/docs/01-app/03-api-reference/03-file-conventions/error.md`),不是旧 API 的 `reset`;③任何"全站 = 0"型门禁的分母必须是三源并集清单,`sitemap.xml` 只覆盖"希望被收录的页",单独使用即为口径错误。配套回归:`src/app/global-error.test.tsx`(3 例:`lang`、`retry` 接线、digest 展示) | ✅ 2026-09-22 修复并复扫通过:chain5/chain6 最终树 34 路由 × chromium/firefox × 深/浅 的 `contrastNodes / violationNodes / themeMismatch / bgMismatch` 全为 0、`rows=136`、`passed=true`(`docs/acceptance/2026-09-21-axe/axe-evidence.json`,详见 §5.24 与 `docs/acceptance/2026-09-21-gates/final-tree-results.md` ⑤)| | refresh token 的轮换/吊销:本轮**有意延后**(需 schema 变更 = 需授权动作) | `src/app/api/auth/refresh/route.ts` 只验签名即用旧 payload 重签,意味着失窃的 refresh token 在到期前可无限换取 access token。**闭合它需要 `jti` / `tokenVersion` 一类的服务端状态,即 Prisma schema 迁移**——按 `AGENTS.md` §5.1「破坏性/共享状态动作须单独取得授权」,DB 迁移不在常规变更里夹带,故本轮明确延后并留痕(源码注释同处 `:33-34` 已写明 backlog)。**已随车交付的缓解**(不需迁移):①按 `payload.userId` 实查 `User`,账号不存在或 `status === 0` 一律 401,堵住「被禁用/删除账号仍能在 7 天有效期内换新令牌」(B-7);②角色不按令牌里的旧 claim 沿用,而是走 `permissions` 层的同源查询 `UserRole` 关联表后**重签**,无关联角色的历史账号回落到与 login 同源的 `User.role` 标量,避免降权后仍持旧角色。边界:这两条只保证「账号状态实时」,**不**构成令牌吊销——已签发且账号仍启用的旧 refresh token 依旧可用到过期 | ✅ 2026-09-23 确认(延后为有意决策,非遗漏;轮换/吊销待授权迁移)| | CMS 写入侧字段校验的边界(承接「数字口径 basis 结构强制」行) | 出路由 `src/lib/cms/validate-content-data.ts` 承载,挂在 `POST /api/admin/items`(`:132`)与 `PATCH`(`:215`)上,**只执行 `ContentModel.fields` 已声明的约束**:`options` 即视为枚举(`select`/`dropdown` 与带 `options` 的 `text` 在 `content-types.ts` 同义)、`min`/`max`/`pattern`;违规返回 `validationError('内容字段校验未通过', { fields })` 并附每条 `path`。刻意保持宽松的两处:**未声明的键一律放行、未填的键不判必填**,以免改变既有载荷形态(seed 与页面组件依赖宽松结构);`loadDeclaredFields` 在模型缺失或 `fields` 不可解析时回落 `[]`,即**fail-open**(无声明 = 无约束),因此「后台有校验」不等于「值一定合法」,新增约束的正解是补 `ContentModel.fields` 而非在路由里加特例。`basis` 的强制仍在那一行的口径里:渲染端 `metrics-basis-note.tsx:11` 缺省回落 `target`,`metrics-basis.test.ts` 机械校验 seed 全量条目显式声明并禁止无据自称 `verified`;字段定义改动须重跑 seed 同步 `ContentModel.fields` 后 admin 才出现输入项 | ✅ 2026-09-23 确认(写入侧只判已声明约束 + fail-open 为有意取舍)| | 边界页(`/_not-found` / `/_global-error`)**不带站点 Header/Footer** | 这是结构结果而非疏漏,本轮核实并固化为口径:`src/app/not-found.tsx` 位于 `app/` 根、**不在 `(marketing)` 路由组内**,而 Header/Footer 只挂在 `(marketing)/layout.tsx:14,22`,故 404 页由 root layout 提供公共外壳(主题内联脚本、GA、CookieConsent、MobileTabBar)但**无导航与页脚**;`NotFoundContent` 自带恢复动线(返回首页 CTA + `history.back()` + 产品/方案/关于/联系四枚入口)。`src/app/global-error.tsx` 更彻底:按 Next 契约它**自带 `<html lang="zh-CN">` + `<title>` + 与 `globals.css` 同值的 OS 主题内联样式并顶替 root layout**(`node_modules/next/dist/docs/01-app/03-api-reference/03-file-conventions/error.md:163,165` 明写"必须自带文档壳、不含全局样式、`data-theme` 到不了它"),因此两页都**不能**指望复用 Header/Footer 或品牌红规则;错误边界是 Client Component,`metadata` 导出无效,标题只能用 React `<title>`。**约束**:新增 `app/` 顶层边界文件须自带文档壳与主题样式,且本版本 props 是 `retry` 不是 `reset`;给这两页补导航/页脚需先决定是否把 root layout 变成可复用外壳,属设计判断而非机械改动 | ✅ 2026-09-23 确认(口径固化,配套回归 `src/app/global-error.test.tsx`)| | lint warning 的处置口径:**0 error 判门禁,warning 不判红也不清零** | 现行裁定:`npm run lint` 通过标准是 **0 error**;warning 属**已知存量**并只登记分布、不阻塞合入(数量口径的**版本库内权威记录位**是 `docs/development/quality-gates.md` §1:2026-09-23 **第二周期**最终树复跑 `npm run lint` ⇒ **104 problems / 0 errors / EXIT=0**,分项 55 `no-console` + 25 `no-explicit-any` + **11** `set-state-in-effect` + 10 `no-img-element` + 各 1 `no-sync-scripts`/`no-html-link-for-pages`/死抑制(同日第一周期为 105,差值唯一来自后台编辑器"挂载期消费守卫"那个效果被删)。⚠ 不要再指向 `AGENTS.md` §5——该文件被 `.gitignore` 有意排除、由 `next dev` 再生,不可审也不可回滚,见验收 N-16)。分级由 `eslint.config.mjs` 声明而非随手 `--fix`:`@typescript-eslint/no-explicit-any`(`:52`)、`no-console`(`:54`,`allow: ['warn','error']`)、`react-hooks/set-state-in-effect`(`:61`)为 `warn`;`react/no-unescaped-entities`、`eqeqeq`、`prefer-const` 等是 `error`。按路径降档只有三处 override(`e2e/**/*.ts` 关 `no-console`、`**/*.test.{ts,tsx}` 与 `**/__tests__/**` 关 `no-explicit-any`、`tests/performance/*.js`),**`prisma/seed.ts` 不在其中**——它的进度日志是"有意容忍的 warning",不是配置豁免。**禁止的处置方式**:为凑绿把规则调成 `off`、加行内 `eslint-disable` 而不写理由、把 `Unused eslint-disable directive`(死抑制)当噪声忽略——死抑制本身按 §「门禁断言的有效性口径」第 1 条归入"什么都没测"。需要静音时须附来源注释 | ✅ 2026-09-23 确认(warning 存量制,error 零容忍)| | `duration-300` → 动效令牌 与 死样式收口:**本轮为 in flight,不得当作已完成** | 两条已知残留:①`duration-300` 一类 Tailwind 预设时长绕过 `--transition-fast/normal/slow`(`globals.css:255-258` 的 180/280/450/700ms)且 300ms 超出动效四原则「入场 180–280ms」的档位;②`-[var(--color-*)]/<alpha>` 静默不产出 CSS 的家族(见上方 §5.20 与「死样式族的收口边界」行)。**2026-09-23 文档同步时不写结论**:另一执行体正在同一批 `src/**/*.tsx` 上作业(写入瞬间 `src` 下 `duration-300` 命中 13 处、死样式族命中 8 处,均在实时变动中),任何计数此刻都不可引用。**约束(替换时才成立)**:动效时长走令牌、点亮死样式属设计判断、hover 合成底色须重算对比度(axe 与 `check:contrast` 都测不到 `:hover`)。复算命令:`grep -rn "duration-300" src` 与 `grep -rno "\-\[var(--color-[a-z-]*)\]/[0-9]*" src` | ⏳ in flight(2026-09-23 观察:他人正在编辑相关文件;未落地,不作为已确认决策引用)| | E2E 目标与 skipped 口径 / `check:axe*` 的落地状态(2026-09-23) | ①**口径**:`npm run test`(含 `test:all` 里的 `test:e2e:fast`)的 webServer 是 `npm run dev`(`e2e/playwright.config.ts:130`),GA4 的 4 个 `@critical` 用例 × 4 project = **16 个 skipped**(`.env.production` 独占 GA ID → dev 下不注入 gtag → 用例内 `test.skip`);产物口径只有 `npm run test:e2e:prod`(CI 在 `Jenkinsfile`「🌐 E2E 测试」仅 main 分支执行,且须先 build)。裁定:**引用 GA4/生产头覆盖必须指名 prod 目标**,"全绿"不等于"全断言"。②**静态 a11y 门禁已成型**:`check:a11y` = `check:contrast` + `check:headings` + `check:brand-token`,并已并入 `test:all`。③**已闭合(2026-09-23 同日落地)**:`package.json` 的 `check:axe` / `check:axe:routes` 指向的 `scripts/accessibility/{axe-node-count,crawl-routes}.mjs` 现已存在(由 `docs/acceptance/2026-09-21-axe/` 的一次性 harness 平移而来,最终树 34 路由 × 4 组合 `passed=true`,证据 JSON 仍留原目录),判定改为退出码(0 通过 / 1 判红 / 2 清单缺失或 0 条),并由 `Jenkinsfile`「♿♿ 全站 axe 节点计数」阶段(仅 main,服务用 `node dist/standalone/server.js`,按记录 PID 收服)自动执行 —— axe 节点计数自此**是**自动化门禁;引用其结果时须同时给出 `axe-evidence.json` 的 `routeCount` 与分母断言,只报 `passed=true` 不报分母即为口径错误。④文档同步另纠正三处:`npm run preview` 实为 `next start -p 3000`(非 `npx serve`,standalone 下会打警告)、渲染模式措辞由「静态导出」改「standalone 混合渲染」、`docs/testing.md` 的 dev 指示器机制改回 `e2e/fixtures.ts` 的真实实现 | ✅ 2026-09-23 确认(③已于同日落地为常驻门禁,④为该轮文档纠正;③的漂移记录见 `docs/lessons-learned.md` §5.26,其修复标注在同一行)| #### 门禁断言的有效性口径(chain6/chain7 新增) 验收期间发现 `config/test/lighthouserc.json` 有 3 条 `warn` 级断言(`autocomplete-valid` / `presentation-role-conflict` / `svg-img-alt`)**在 Lighthouse 里根本没有对应审计项**:把 chain6 全部 21 份报告的 `audits` 键取并集(175 个 id)比对 62 个非 `categories:` 断言键,只有这 3 条缺席;`@lhci/cli@0.15.1` 用的是它自带的 `lighthouse@12.6.1`(不是顶层的 13.4.1),其 `core/audits/accessibility/` 64 个审计文件里没有这三个。它们每轮稳定打印 `"…" is not a known audit. found: 0`,因为是 warn 级永不判红 —— 于是"57 项 a11y 断言全过"里混进了 3 项什么都没测的条目。 **约束(今后一律适用)**: 1. **门禁里的每一条断言必须映射到真实存在的测量项**。删除或新增断言都要留下"这项由谁兜底"的说明;`warn` 级、恒 0、无对照的断言按"假绿"处理,不得当作覆盖。 2. **拆门之前先证明覆盖还在别处**。用与 ⑤ 门禁同款的 `runOnly: {type:'tag', values:['wcag2a','wcag2aa','wcag21a','wcag21aa']}` 做正/负对照(`docs/acceptance/2026-09-21-axe/probe-axe-rule-coverage.mjs`,每条规则各造一个必然违规的最小节点):`autocomplete-valid`、`svg-img-alt` 确在 axe 通道内(各抓到 1 node);但 `presentation-role-conflict` 属 `best-practice` tag,**axe 门禁的 tag 集合根本不跑它**。因此处理不是"删了事",而是删死断言 + 在 `axe-contrast-evidence.mjs`(现 `scripts/accessibility/axe-node-count.mjs`)增加第二次 `runOnly: {type:'rules', values:EXTRA_RULES}` 运行。 3. **规则级通道也要断言分母**:每页 `extraRulesChecked === EXTRA_RULES.length`(计 `extraRulePagesUnderCovered`)+ 违规节点 0。axe 对未知 rule id 会抛错,这一条同时防"将来某条规则被 axe 改名后静默消失"——与本节第 1 条是同一种病。 4. **异常快的绿灯必须自证**。chain6 `type-check` 只花 2s,用注入 `const probe: number = "not a number"` 的正对照确认 `tsc` 能报错(冷缓存 11.1s)、删除后 2.9s 干净,成因是 `tsconfig.compilerOptions.incremental=true` 命中 `.tsbuildinfo` ⇒ 门禁有效。**"很快/很慢"只是怀疑的起点,能造正对照就不要靠推断背书**(与记忆「绿灯≠达标」同源)。 5. **文档里的数字要被复算,否则就从证据退化成传说**:该口径本身成立,但**它的示范当时写歪了**——原文称「`AGENTS.md` §5 记的 lint『实测 105 条 warning』在 chain4/chain6 实测均为 **106**,已按实测改文并注明分布(56 `no-console`/25/12/10/其余 3 条零散)」,而 2026-09-23 本树复跑 `npm run lint` 实为 **105 problems / 0 errors / EXIT=0**、`no-console` **55** 条,且"改文"落在未被 git 跟踪的 `AGENTS.md` 上(验收 N-16:由 `next dev` 再生,随时可丢)。裁定:**warning 计数按轮次漂移,不作为常量引用**;权威分布记录位改到 `docs/development/quality-gates.md` §1,并在其后附可复制的复算命令(含分项管道)。本条教训从"文档数字落后于实测"升级为"**文档数字被写进了不可审的载体**"。 来源:`docs/acceptance/2026-09-21-gates/final-tree-results.md` ④ 与「Lighthouse 的 3 条死断言」小节、`docs/lessons-learned.md §5.25`。 ## 页面类型与四层映射 ### 套装产品详情页 (`/products/[id]`) | 层 | 内容要点 | |---|---------| | L1 Hero | 产品名 + 分类 + 状态 + 定位语 + 有限视觉变化(如深蓝调性) | | L2 价值 | 核心功能模块 + 产品优势 + 技术规格 + 适用场景 | | L3 信任 | 适用行业案例 + 痛点→产品如何解决的故事 | | L4 CTA | 预约体验 + 下载资料 + "使用此产品的客户也关注了 XX 方案" | ### 解决方案详情页 (`/solutions/[id]`) | 层 | 内容要点 | |---|---------| | L1 Hero | 行业名 + 方案标题 + 副标题 + 行业氛围视觉 | | L2 价值 | 行业痛点 → 方案架构图 → 推荐套装组合(核心差异点) | | L3 信任 | 同行业标杆客户案例 + 实施效果数据 | | L4 CTA | 预约演示 + 下载白皮书 + 相关产品深度卡片 | ### 服务详情页 (`/services/[id]`) | 层 | 内容要点 | |---|---------| | L1 Hero | 服务名 + 定位语 + 服务范围标签 | | L2 价值 | 挑战→成果 KPI + 服务流程可视化 + 团队/方法论 | | L3 信任 | 服务案例 + 客户评价 + SLA 承诺 | | L4 CTA | 咨询服务 + 相关方案推荐 | ### 独立产品详情页 (`/products/[id]` — 专业产品区) | 层 | 内容要点 | 特殊之处 | |---|---------|---------| | L1 Hero | 产品名 + 类别标签 + 独立视觉调性 | 更"硬核"风格 | | L2 价值 | 功能特性 + 技术参数 + 对比优势 | 偏技术/参数导向 | | L3 信任 | 认证资质(等保/行业标准)+ 部署案例 + 性能数据 | 合规证明优先 | | L4 CTA | 申请试用/演示 + 技术文档 + 可搭配套装推荐 | 不绑定特定方案 | ## 歧义已解决 - **"重构"≠ 推倒重来**:在现有 Next.js 架构内做系统性清理和提升,不更换技术栈 - **"web-design-engineer"≠ 代码生成器**:它是设计验证工具,产出原型 HTML,不是最终代码 - **"克制动效"≠ 零动效**:动效服务于信息传达(hover 反馈、scroll reveal、卡片交互),但不做装饰性粒子/水墨动画 - **"参考 IHG"≠ 视觉模仿 IHG**:借鉴的是 IHG 的信息架构思维(集团枢纽 + 品牌独立叙事),而非其视觉风格 - **"产品独立"≠ 官网撤出产品**:独立产品拥有独立子域名与独立叙事(NovaVis → novavis.p.novalon.cn 已实践,走 `externalUrl` 外链);官网仍保留产品矩阵页作为聚合入口(每产品一句话定位+指标+外链),不承载深度详情 - **"咨询专业风"≠ 丢弃水墨**:水墨已从"整体风格"降级为"文化基因",现通过 ADR-0006 完全移除。网站纯走 Accenture + Bain + Porsche 咨询专业风 - **"设计 DNA 重构"≠ 从零开始**:是对齐标准 + 清理债务 + 重点升级,而非推倒重来 - **"Phase 0"≠ 没有产出**:虽然是"脏活累活",但通过组件减少、文件体积下降、测试覆盖率提升等可量化指标体现价值