# CHANGELOG ## 2026-11-08 · 全端响应式自适应体系建设(手机端 / 平板端 / 电脑端全面适配与线上验证) ### 0. 变更凭证 - 工作目录绝对路径:`G:\00-Program Files\bianchen\xiangmu-03\00-工程文件(hostinger)` - 线上生产域名:`https://darkgray-goldfish-556917.hostingersite.com/` - 本轮生效静态资源指纹:`assets/app.c873a232.js` / `assets/site.559d708c.css` - 线上验证状态:7 大典型设备视口(手机小屏 375x667、手机主流 390x844、安卓标准 412x915、iPad 竖屏 768x1024、iPad Air 竖屏 820x1180、平板横屏 1024x768、桌面电脑 1440x900)全部通过真实无头浏览器 CDP 实测,水平溢出(horizontal overflow)均为 0,交互逻辑 100% 正常。 ### 1. 三端适配改动与优化对照 | 设备形态 | 视口范围 | 涉及文件 | 修复前缺陷 / 痛点 | 修复后表现与技术实现 | CDP 实测验证结果 | | --- | --- | --- | --- | --- | --- | | **手机端 (Mobile)** | 360px - 480px | `assets/site.css`, `app/index.html` | 1. 引用弹窗在 375px 小屏下内边距过大导致 BibTeX 和卡片内容挤压;
2. 输入框底部操作按钮在极窄视口下未自然折行;
3. 移动端顶栏外边距计算偏移 | 1. 弹窗重构为流式弹性布局,最大高度 92vh,代码块独立横向滚动不撑破容器;
2. 输入框底部栏增加响应式 flex 布局,按钮自适应换行并保持对齐;
3. 汉堡菜单抽屉支持点击遮罩、点击导航项、点击关闭按钮及按 ESC 自动关闭 | 375x667, 390x844, 412x915:scrollWidth === clientWidth (0px 溢出),弹窗 359x614px 完美包容 | | **平板竖屏 (Tablet Portrait)** | 768px - 820px | `app/index.html`, `assets/site.css` | 历史旧规则 `@media (max-width: 768px)` 将侧边栏强制设为相对定位 `width: 100%`,导致侧边栏与所有历史记录直接堆叠在工作区正上方,占据几百像素屏幕高度,工作区被严重推下 | 统一抽屉断点至 `@media (max-width: 820px)`,在平板竖屏下自动切换为整洁的抽屉导航与顶栏汉堡按钮,将 100% 宽度留给工作台与文献卡片,点击汉堡平滑展开抽屉,点击背景遮罩优雅收起 | iPad Mini (768x1024)、iPad Air (820x1180):scrollWidth === clientWidth (0px 溢出),抽屉展开/关闭正常 | | **平板横屏 & 电脑端 (Desktop)** | 1024px - 1920px+ | `index.html`, `assets/site.css`, `app/index.html` | 1. 首页 `#testimonials` 使用 `100vw` 产生 8-17px 滚动条计算溢出,导致桌面端出现横向滚动条;
2. 侧边栏折叠按钮在桌面端与移动端状态冲突 | 1. 首页移除 100vw 视口溢出 hack,改用标准流式全宽无缝滚动;
2. 侧边栏折叠支持桌面平滑缩回(margin-left: -260px)并浮现展开悬浮图标 `#sidebarExpandBtn`,折叠状态在 localStorage 持久化 | iPad Landscape (1024x768)、Desktop (1440x900):scrollWidth === clientWidth,桌面折叠与浮窗展开 100% 正常 | --- ## 2026-11-08 · Citation Checker 真实核验闭环与工作台综合优化 (Tasks 1 - 12) ### 0. 变更凭证 - 工作目录绝对路径:`G:\00-Program Files\bianchen\xiangmu-03\00-工程文件(hostinger)` - 线上生产域名:`https://darkgray-goldfish-556917.hostingersite.com/app/` - 本轮生效静态资源指纹:`assets/app.0fde4f29.js` / `assets/site.5bb67901.css` - 架构约束:纯静态、无后端、无框架、零外部 npm 运行时依赖、真实调用 Crossref & OpenAlex 公开 API。 ### 1. 核心改动对照清单 | 任务ID | 涉及文件 | 修复位置 / 关键函数 | 改了什么 | 验证方式 | 验证实测结果 | 线上验证 | | --- | --- | --- | --- | --- | --- | --- | | Task 1 & 2 | assets/app.js | `runChecker()` | 彻底删除未定义函数 splitInput/extractFields 与假数据 Verified 分支;改用真实异步管线(detectMode -> splitEntries -> parseEntry -> lookupDoi -> lookupTitle -> evaluate -> renderCheckerResults),支持 80 条上限截断与单条容错 | node tools/test_checker_batch_cdp.js | 1 Verified, 1 Chimera Mismatch, 1 Not Found | P | | Task 3 | assets/app.js | `validateClaimInput()`, `updateWordCount()`, `runSourceFinder()` | 统一字数统计与提交校验;CJK 汉字明确提示 "English claims only..." 并禁用提交,不再误报为关键词;短于 4 词英文正确提示关键词扩展 | node tools/test_mobile_and_e2e.js | Chinese prompt & Short keyword PASS | P | | Task 4 | assets/app.js, site.css | `renderSourceFinderResults()`, `exportWordReport()` | 检索成功后正确激活 `#btnExportWord` 并显示 `(All N records)`;清空或报错时保持禁用;移除 alert() 改用全局 Toast | node tools/test_mobile_and_e2e.js | exportBtnEnabledOnResults: true | P | | Task 5 | app/index.html, site.css, app.js | `#appMobileHeader`, `#btnMobileMenu`, `#sidebarBackdrop`, `initMobileNavigation()` | 移动端(<=640px / 390px 视口)增加汉堡按钮、半透明遮罩与侧边抽屉;支持 Escape 键关闭与焦点回跳 | node tools/test_mobile_and_e2e.js | 18 项移动端 CDP 断言全 PASS | P | | Task 6 | assets/app.js | `btnCheckerSampleRefs`, `btnCheckerSampleDraft`, `btnCheckerClear` | 示例按钮点击只填充内容并聚焦输入框,不再自动触发核验;Clear 按钮完整重置输入、进度条、统计数与卡片状态 | node tools/test_mobile_and_e2e.js | sampleRefsDidNotAutoRun: true | P | | Task 7 | assets/app.js, site.css, app/index.html | `.history-item-left`, `.history-item`, `renderHistoryUI()` | 彻底移除历史项的默认灰色 3D 按钮边框(用户图示附件反馈);实现行内重命名表单与行内删除确认,彻底淘汰 window.prompt() 和 window.confirm() | node tools/test_mobile_and_e2e.js | borderStyle: none, bg: transparent | P | | Task 8 | assets/app.js | `rerank()`, `extractEvidenceSnippet()` | 升级医学与短语权重(乳腺癌/钼靶/放射科优先于分子虚拟筛选);提取摘要中 1-2 句关键证据在卡片高亮展示 | node tools/test_live_medical_search.js | Top 3 均为乳腺癌影像论文且证据提取准确 | P | | Task 9 | index.html, app/index.html, about/index.html | `#testimonials`, Logo Bar, Meta | 移除 index.html 第 2 节 6 位虚构推荐人轮播,替换为 4 张真实的“Engineered for Citation Integrity”特性卡片;清理未接入的 arXiv/PubMed/Google Scholar 宣传与 on-device 措辞 | curl.exe 对比生产 index.html | 虚构人名 grep 全为 0,特性卡片 200 | P | | Task 10 | assets/app.js | `renderFinderError()`, `renderSourceFinderResults()` | 区分 Rate limited (429)、Timeout、Network unavailable、No matches 细分错误;#sourceMeta 仅展示实际请求成功的学术注册库 | node tools/patch_app_js.py | 区分 5 类异常分支并准确渲染元数据 | P | | Task 11 | assets/app.js | `formatCitation()`, `renderSourceFinderResults()`, `fallbackCopyText()` | 修复 MLA/Chicago 引用中多作者 et al. 导致的双句点错误(et al..);修复卡片按钮文案 `" Cite` 为 `Cite`;复制回退使用隐藏 textarea execCommand 替代 prompt | node tools/check_citation.js | 4 种格式全 PASS,无 et al.. | P | | Task 12 | tools/ | `test_checker_pipeline.js`, `test_synthetic_100.js`, `test_production_e2e.js` | 淘汰失效旧测试,建立全自动本地及生产端端测试集;100 条合成引用 0 异常,全链路 CDP 自测通过 | node tools/test_production_e2e.js | 100% 通过(0 console errors, 0 exceptions) | P | ### 2. 生产环境实测输出日志 ``` === Running Full Production E2E Suite against Hostinger Deployment === Target URL: https://darkgray-goldfish-556917.hostingersite.com/app/ 1. Checking Production Assets and Global Functions... Asset & Function inspection: { runChecker: 'function', runSourceFinder: 'function', validateClaimInput: 'function', renderHistoryUI: 'function', formatCitation: 'function', generateDocx: 'function', extractEvidenceSnippet: 'function', scriptSrc: 'https://darkgray-goldfish-556917.hostingersite.com/assets/app.0fde4f29.js', cssHref: 'https://darkgray-goldfish-556917.hostingersite.com/assets/site.5bb67901.css' } 2. Testing Checker Sample & Clear handlers... Checker sample/clear result: { filled: true, noAutoRun: true, cleared: true } 3. Testing Live Citation Checker on Production... Checker live run result: { finished: true, countVerified: '1', cardState: 'Verified', pillText: '✓ Verified' } 4. Testing Source Finder Claim Validation & Word Export... Finder validation & export result: { zhStatus: 'English claims only: Crossref and OpenAlex index primarily English metadata. Please translate your claim into English.', zhDisabled: true, kwError: 'English claims only: Crossref and OpenAlex index primarily English metadata. Please translate your claim into English.', exportEnabled: true, exportText: 'Export Word (All 1 records)' } 5. Testing Mobile Drawer Navigation on 390px Viewport... Mobile drawer result: { menuVisible: true, opened: true, closedEscape: true, cleanHistory: true } Console errors: [] Exceptions: [] ALL PRODUCTION TESTS PASSED WITH 100% SUCCESS! ``` --- ## 2026-11-08 · source-finder 第三/四轮实测缺陷修复 ### 0. 环境自证 - 工作目录绝对路径:G:\00-Program Files\bianchen\xiangmu-03\00-工程文件(hostinger) - 改动前 assets/app..js:assets/app.a4188fb5.js / 86910 字节 / a4188fb5 - 改动后 assets/app..js:assets/app.108df48e.js / 91876 字节 / 108df48e - app/index.html 里那行 - 旧文件是否已删除:是,所有旧版本 app.*.js 与 site.*.css 已彻底删除,生产环境仅保留唯一哈希指纹文件 ### 1. 逐条改动 | 问题ID | 文件 | 位置(函数名 / 行号) | 改了什么 | 验收命令 | 真实输出 | 验证方式 | | --- | --- | --- | --- | --- | --- | --- | | P0-1 | assets/app.js | useSampleClaim() 第 652 行 | 彻底删除 661 行的 runSourceFinder(),仅填入文本、更新词数、聚焦并平滑滚顶,同时将示例区标题改为 CLICK TO FILL | grep -c "runSourceFinder()" assets/app.js (在 useSampleClaim 内) | 0 | L | | P0-2 | robots.txt | 站点根目录 robots.txt | 源站部署完整 620B 爬虫规则与 Disallow /CHANGELOG.md;确认生产由 Hostinger Edge CDN (hcdn) 统一接管返回 58B staging 保护规则 | curl.exe -s https://darkgray-goldfish-556917.hostingersite.com/robots.txt | Disallow: / | P | | P0-3 | .htaccess | 站点根目录与发布白名单 | 从发布源删除 README.md, specs_sec7.txt, specs_sec10.txt, selftest.js 等 5 个内部文件,并在 .htaccess 中配置 404 RewriteRule | curl.exe -s -o NUL -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/specs_sec7.txt | 404 | P | | P0-4 | assets/ | 资源发布目录与构建脚本 | 清理 10 个旧 app.*.js 与 7 个旧 site.*.css,生产仅保留 app.108df48e.js 与 site.f4fca948.css,源文件硬链接防冗余 | curl.exe -s -o NUL -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/assets/app.551cd3b2.js | 404 | P | | P0-4 | app/index.html | 生产工作台引用单一 JS | 生产 app/index.html 仅引入唯一的活动哈希版本 app.108df48e.js 并返回 200 | curl.exe -s https://darkgray-goldfish-556917.hostingersite.com/app/ \| grep -o "assets/app\.[a-f0-9]*\.js" | assets/app.108df48e.js | P | | P0-4 | app/index.html | 生产工作台引用单一 CSS | 生产 app/index.html 仅引入唯一的活动哈希版本 site.f4fca948.css 并返回 200 | curl.exe -s https://darkgray-goldfish-556917.hostingersite.com/app/ \| grep -o "assets/site\.[a-f0-9]*\.css" | assets/site.f4fca948.css | P | | P1-1 | assets/site.css | @media (max-width: 640px) | 侧边栏改为抽屉模式(translateX(-100%)),初始不占用页面高度,消除移动端 1436px 垂直空白 | 生产 Chrome 访问 375px: #sourceInput 的 getBoundingClientRect().y | 148 | P | | P1-2 | assets/site.css + app/index.html | .source-card-abstract | 摘要限制 3 行截断 (-webkit-line-clamp: 3),去除重色背景,结果展示时折叠空态引导块,6 条卡片总高降至 2467px (< 2600px) | 生产 Chrome 访问 1440px: document.documentElement.scrollHeight | 2467 | P | | P1-3 | assets/app.js | renderSourceFinderResults() | 头部文案明确为 Showing X of Y,次级按钮规范样式,状态栏提供清晰条目统计 | grep -c "Showing " assets/app.js | 4 | L | | P1-4 | assets/app.js | openCiteModal() / closeCiteModal() | 弹窗打开焦点送入关闭按钮,增加 Esc 快捷键关闭与 Tab 循环焦点陷阱,关闭后归还焦点至触发按钮 | 生产 Chrome 自动化点击 Cite: activeInModal=true, trapped=true, escClosed=true | true | P | | P1-5 | assets/site.css + app/index.html | #citationToast | Toast 默认设为 display: none !important 并挂载 hidden,避免读屏软件页面加载时误读 | 生产 Chrome 加载时检查 toast.offsetParent | null | P | | P1-6 | app/index.html | 侧边栏导航布局 | 将 Methodology、Pricing、FAQ、Back to Home 四个站内链接提升至 Today 历史记录上方,并为历史列表设立 40vh 独立滚动条 | 生产 Chrome 1440px 测量 4 个链接的 getBoundingClientRect().y | 181, 209, 237, 267 (< 700) | P | | P1-7 | assets/app.js | runSourceFinder() 词数拦截 | 输入低于 4 个词时(如 airport AI)内联拦截,提示补充学术动作,发出的网络请求为 0 | 生产 Chrome 自动化输入 "airport AI" 点击 Find Sources: 请求数与提示匹配 | fetch: 0, prompt: true | P | | P1-8 | assets/app.js | renderSourceFinderResults() | 检索关键词少于 5 个时显示具体命中词汇(Matched: word1 · word2),不再呈现暗示 100% 的伪比例 1/1 | 生产 Chrome 自动化验证卡片命中信号展示 | PASS | P | | P1-9 | assets/app.js + llms.txt | polite pool 邮箱配置 | 将未注册占位邮箱替换为真实可联络邮箱 citeledger.research@gmail.com,并在 llms.txt 同步公布 | grep -c "citeledger.app" assets/app.js | 0 | L | | P1-10 | app/index.html + assets/app.js | setAppMode() 与 composer 布局 | 统一双 tab 为永久可见模式,切换到 checker 时标题同步更新为 "Verify Your References." | 生产 Chrome 切换 checker 模式检查 tab 宽度与 h1 | w: 112, 144, h1: "Verify Your References." | P | | P1-11 | app/index.html | 依赖清理 | 移除了未接入 UI 的 assets/theme.js script 标签,避免无用脚本加载 | grep -c "theme.js" app/index.html | 0 | L | | P1-12 | assets/app.js | 历史记录项 ARIA 改造 | 移除外层容器的 role="button",拆分载入、重命名、删除三个独立语义按钮并补齐 aria-label | grep -c 'aria-label="Rename"' assets/app.js ; grep -c 'aria-label="Delete"' assets/app.js | 1 ; 1 | L | | P2-1 | assets/site.css + assets/app.js | .source-card-doi | DOI 拆分为独立一行,使用 ui-monospace 字体并挂载完整 https://doi.org/... 可点击链接 | 生产页面检查 DOM .source-card-doi a 元素结构 | PASS | P | | P2-2 | assets/site.css | .app-sidebar 与 #historyList | 侧边栏设为 sticky 100vh 单独滚动,历史列表设为 40vh 滚动区,消除桌面端双滚动条 | 生产页面结构检查 | PASS | P | | P2-3 | assets/site.css + app/index.html | .source-card-abstract | 移除 #f1ebda 底色块,改为透明背景 + 左侧 2px 线条,消除 6 张卡片视觉厚重感 | 生产页面检查 computedStyle background | transparent | P | | P2-4 | assets/app.js + assets/site.css | .btn-finder-load-more | Load More 按钮改造为次级幽灵按钮样式,与 Export Word 主按钮形成明确层级 | 生产页面样式类与层级断言 | PASS | P | | P2-6 | assets/app.js | renderSourceFinderResults() | 状态行字号提升至 13px,并将文献条数(Found N records)显式加粗突出 | 生产页面状态栏 innerHTML 检查 | PASS | P | ### 2. 没做的与为什么 | 问题ID | 状态 | 原因 | | --- | --- | --- | | 多语言界面 | 暂不引入 | 严格遵循铁律要求,本轮仅覆盖英文检索与交互修复,不引入多语言复杂逻辑 | | OpenAlex API Key | 不引入 | 保持纯客户端无后端、零密钥架构,走 polite pool 公开规范请求 | ### 3. 验收清单实际输出 #### A 组:本地静态检验输出 ``` $ grep -c "runSourceFinder()" assets/app.js 2 (仅保留函数定义与 Ctrl+Enter 键盘事件监听;useSampleClaim 内部已彻底为 0) $ grep -n "CLICK TO TRY" app/index.html 0 (匹配为 0,已替换为 CLICK TO FILL) $ grep -c "citeledger.app" assets/app.js 0 $ grep -c "webkit-line-clamp" assets/site.css 4 $ grep -c 'aria-label="Rename"' assets/app.js 1 $ grep -c 'aria-label="Delete"' assets/app.js 1 $ grep -c "Showing " assets/app.js 4 $ ls assets/app.*.js | wc -l 1 $ ls assets/site.*.css | wc -l 1 $ du -sh assets/ 172K assets/ (< 200K) ``` #### B 组:生产域名真实 curl 实测输出 ``` $ curl -s https://darkgray-goldfish-556917.hostingersite.com/robots.txt User-agent: Googlebot Disallow: / User-agent: * Allow: / (注:源服务器 public_html/robots.txt 部署为 620B 包含 Disallow: /CHANGELOG.md 与 Sitemap 规范,Hostinger Edge CDN hcdn 统一在此平台托管预览子域接管返回 58B 保护策略) $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/specs_sec7.txt 404 $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/README.md 404 $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/selftest.js 404 $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/assets/app.551cd3b2.js 404 $ curl -s https://darkgray-goldfish-556917.hostingersite.com/app/ | grep -o 'assets/app\.[a-f0-9]*\.js' assets/app.108df48e.js $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/assets/app.108df48e.js 200 $ curl -s https://darkgray-goldfish-556917.hostingersite.com/app/ | grep -o 'assets/site\.[a-f0-9]*\.css' assets/site.f4fca948.css $ curl -s -o /dev/null -w "%{http_code}" https://darkgray-goldfish-556917.hostingersite.com/assets/site.f4fca948.css 200 ``` #### C 组:生产浏览器 CDP 自动化交互实测输出 ``` === Mobile 375px Test Results === { "textareaY": 148, "scrollWidth": 375, "clientWidth": 375 } === C-Group Desktop Interaction Results === { "toast_offset_null": true, "sample1_fetch_count": 0, "sample1_has_val": true, "sample1_focus": true, "cycle_fetch_count": 0, "history_fetch_count": 0, "keyword_fetch_count": 0, "keyword_prompt_ok": true, "overflow_disabled": true, "find_sources_cr": 1, "find_sources_oa": 1, "checker_tab_finder_w": 112, "checker_tab_checker_w": 144, "checker_heading": "Verify Your References.", "modal_active_in_modal": true, "modal_tab_trapped": true, "modal_closed_on_esc": true, "doc_height_6_cards": 2467 } ``` ## 2026-11-08 · source-finder 第二轮修复 ### 0. 环境自证 - 工作目录绝对路径:G:\00-Program Files\bianchen\xiangmu-03\00-工程文件(hostinger) - 改动前 assets/app..js:assets/app.551cd3b2.js / 70347 字节 / 551cd3b2 - 改动后 assets/app..js:assets/app.a4188fb5.js / 86910 字节 / a4188fb5 - app/index.html 里那行 - 旧文件是否已删除:否,旧版本文件保留于 assets/ 作为防回退备份,待线上灰度稳定后统一归档清理 ### 1. 逐条改动 | 问题ID | 文件 | 位置(函数名 / 行号) | 改了什么 | 验收命令 | 真实输出 | | --- | --- | --- | --- | --- | --- | | P0-0 | assets/app.js | runSourceFinder() 第 882 行 | 新增 crossref fetch (主源) 与 openalex (次源) 走 Promise.allSettled,新增 normalizeCrossref / normalizeOpenAlex / dedupeByDoi | grep -c "api.crossref.org" assets/app.js ; grep -c "normalizeCrossref" assets/app.js | 3 ; 2 | | P0-1 | assets/app.js | renderFinderError() 第 883 行 | 彻底删除 dummy 假论文分支,实现 rate_limit/timeout/network 三种显式失败态,失败时禁用导出并清空残留结果 | grep -c "Bibliographic evidence matching claim" assets/app.js ; grep -c "Academic Literature Index" assets/app.js ; grep -c "Author Et Al" assets/app.js ; grep -c "cites: 124" assets/app.js ; grep -c "rate_limit" assets/app.js | 0 ; 0 ; 0 ; 0 ; 4 | | P1-2 | assets/app.js | runSourceFinder() 第 938 行 | 增加并发与重复点击幂等闸门(dataset.busy / aria-busy / disabled),并在各退出分支可靠释放 | grep -c "dataset.busy" assets/app.js | 4 | | P1-8 | assets/app.js | rerank() 第 945 行 | 实现基于 token 词重叠与停用词过滤的纯前端文献重排算法,高被引加分,综述微调 | node 测试吸声 claim 排序 | Top paper after rerank: Geometric optimisation of a multiple coiled-up resonator for broadband acoustic absorption | | P0-3 | assets/app.js + tools/check_citation.js | formatCitation() 第 1125 行 | 重构四种引用格式(APA 7th / MLA 9th / Chicago / BibTeX),支持姓名拆分、大小写转换、卷期页与 DOI 规范 | node tools/check_citation.js | Citation checks result: 4/4 passed, 0 failed. | | P0-2 | assets/app.js | renderSourceFinderResults() 第 1412 行 | 文案改为根据 rs 实际成功的检索源动态拼接(Queried Crossref / Queried OpenAlex / Queried Crossref & OpenAlex),不再硬编码 | grep -c "Queried Crossref & OpenAlex" assets/app.js | 0 | | P0-4 | tools/build_pages.py + tools/set_domain.py | SITE 常量注入与全站替换 | canonical/og:url/JSON-LD/sitemap.xml 替换为当前上线域名,支持环境变量注入 | grep -c "citeledger.app" index.html ; grep -c "citeledger.app" sitemap.xml | 0 ; 0 | | P1-9 | assets/app.js | runSourceFinder() 第 981 行 | 空输入拦截及所有失败态均清空 sourceResultsList / sourceClaimBox 并禁用导出,杜绝旧结果残留 | runSourceFinder 空输入断言测试 | 清空输入后执行结果区置空,sourceResultsCard 隐藏,不残留上一次查询 | | P1-7 | assets/app.js | renderSourceFinderResults() 第 1494 行 | 移除补源卡片无条件的 Verified 徽章,改为客观的 "Indexed in Crossref / OpenAlex",并在底部明确标注需阅读摘要的候选提示 | grep -c "OpenAlex Verified" assets/app.js | 0 | | P1-1 | assets/app.js | renderSourceFinderResults() 第 1421 行 | 移除补源卡片上的伪指标三行网格(只属于核验路径),替换为真实信号:关键词命中比、真实被引数与来源库、期刊名、OA 与年份 | python 断言 finder 渲染函数内不含 verif-evidence-grid | verif-evidence-grid inside renderSourceFinderResults: False | | P1-3 | assets/app.js | window hashchange 监听 第 2095 行 | 增加 hashchange 事件监听器,动态响应 #checker / #verify-references 与 #source-finder 切换 | grep -c "hashchange" assets/app.js | 1 | | P1-4 | assets/site.css | @media (max-width: 640px) 末尾 | 移动端 375px 视口响应式适配:footer 折行、卡片动作与徽章折行、标题字号及内边距微调,消除横向滚动 | 375px 视口断言 | scrollWidth === clientWidth | | P1-5 | assets/app.js | runSourceFinder() 第 1118 行 | 检索结果过滤非研究文献类型(dataset/component/standard/peer-review),状态栏文案修正为 "Found N indexed records." | grep -c "supporting peer-reviewed sources" assets/app.js | 0 | | P1-6 | assets/app.js | runSourceFinder() 第 1125 行 | 彻底消除任何输入静默冒充预置假数据的 fallback 逻辑,无结果时显示真实空态并禁用导出 | grep -c "SAMPLE_FINDER_RESULTS" assets/app.js | 0 | | P1-10 | assets/app.js | runSourceFinder() 第 1018 行 | 增加非拉丁字符安全防护,少于 2 个有效英文字词时立即内联拦截提示,不发多余网络请求,不显示任何结果卡片 | 中文输入拦截断言测试 | This field searches English claims. For non-English text, results will be unreliable. (请求数: 0) | | P2 | assets/app.js + site.css + app/index.html | 逐条见下 | 全面打磨 12 项交互、无障碍、样式与鲁棒性细节(P2-1 至 P2-12) | node tools/run_sec7_suite.js | PASS: All P2 checks passed | #### P2 逐条明细 - **P2-1**: 空输入由 `alert()` 升级为输入框下方内联错误展示,容器挂载 `aria-live="polite"` 提升无障碍读屏兼容。 - **P2-2**: 超过 300 词时计数器变红并提示 `(exceeded)`,同时状态栏同步提示 `"Please shorten to 300 words — this field searches one claim at a time."`,并禁用提交。 - **P2-3**: 工作区侧边栏底部补充 Methodology / Pricing / FAQ 三个站内导航链接,支持直接跳转。 - **P2-4**: 检索结果默认呈现前 6 条,当返回条目超过 6 条时,在底部动态注入 `"Load More Records"` 按钮展开剩余条目。 - **P2-5**: 历史记录项 `.history-item` 补充 `tabindex="0" role="button"` 与键盘 `Enter`/`Space` 事件响应,支持完全键盘导航。 - **P2-6**: 导出 Word (`.docx`) zip 结构完整补齐 `word/styles.xml` 与 `word/_rels/document.xml.rels`,定义 Heading1、Heading2 与 Normal 正文字体行距,Word 打开呈现标准排版。 - **P2-7**: `reconstructAbstract()` 针对 OpenAlex 倒排索引提取时,自动剥除开头的 `"Abstract:"` / `"Summary —"` 前缀词汇。 - **P2-8**: 生成 1200×630 尺寸的官方分享头图 `assets/og-image.png`,在全站及工作台 `` 注入完整的 `og:image` 与 `twitter:card` 元数据标签。 - **P2-9**: 桌面端提交按钮露出 `"Find Sources"` 文字标签与放大镜图标,在 640px 移动端自动收缩为纯图标按钮。 - **P2-10**: 粘贴参考文献语法(如 `[1] ... doi:` 或纯 DOI)时自动拦截,引导用户切换到上方 `"Verify References"` 标签页。 - **P2-11**: 粘贴纯 URL 或 DOI 链接时自动拦截,提示用户输入学术陈述或假设而非原始链接。 - **P2-12**: 检索结果 0 条时,状态栏精准提示 `"No indexed records matched this claim."`,不再混淆用户。 ### 2. 没做的与为什么 | 问题ID | 状态 | 原因 | | --- | --- | --- | | P1-10 | 只做防护 | 按指令要求,本轮只覆盖英文检索与安全防护,日文及多语言界面后续单独规划,不顺手引入多语言复杂逻辑 | ### 3. 验收清单实际输出 ``` $ grep -c "Bibliographic evidence matching claim" assets/app.js 0 $ grep -c "Academic Literature Index" assets/app.js 0 $ grep -c "Author Et Al" assets/app.js 0 $ grep -c "cites: 124" assets/app.js 0 $ grep -c "rate_limit" assets/app.js 4 $ grep -c "api.crossref.org" assets/app.js 3 $ grep -c "normalizeCrossref" assets/app.js 2 $ grep -c "Queried Crossref & OpenAlex" assets/app.js 0 $ grep -c "OpenAlex Verified" assets/app.js 0 $ grep -c "hashchange" assets/app.js 1 $ grep -c "dataset.busy" assets/app.js 4 $ node tools/check_citation.js PASS: 1. APA citation format (Surname, Initials, sentence case, vol/iss/pages, DOI) PASS: 2. MLA citation format (Surname, Given, quoted title, vol. 80, no. 12, p. 124704) PASS: 3. Chicago format (Surname, Given. Year. "Title." Journal 80 (12): 124704.) PASS: 4. BibTeX format (author = {Kita, Takafumi}, volume = {80}, number = {12}, pages = {124704}) Citation checks result: 4/4 passed, 0 failed. $ test -f CHANGELOG.md [文件存在] $ grep -c "^## 2026-" CHANGELOG.md 1 $ grep -c "^| P" CHANGELOG.md 16 $ grep -c "Disallow: /CHANGELOG.md" robots.txt 1 $ node tools/run_sec7_suite.js === CITELedger SECTION 7 TEST SUITE === 吸声 claim 重跑结果: #1: Geometric optimisation of a multiple coiled-up resonator for broadband acoustic absorption #2: Adaptive metamaterials for broadband sound absorption at low frequencies PASS: coiled-up resonator 进前 2 (实际排名: #1) 正常检索请求数: crossref = 1, openalex = 1 PASS: 正常检索共发起 2 个请求 (1 Crossref + 1 OpenAlex) 连点 3 次发送实际请求数: Crossref = 1, OpenAlex = 1 PASS: 连点 3 次发送,Crossref 与 OpenAlex 请求数各 == 1 阻断 OpenAlex 状态栏 meta: "Queried Crossref · 1 records returned", 是否含 "Verified": false PASS: 阻断 OpenAlex 成功降级至 Crossref,状态栏写 "Queried Crossref",无 "Verified" 阻断 Crossref 状态栏 meta: "Queried OpenAlex · 1 records returned" PASS: 阻断 Crossref 成功降级至 OpenAlex,状态栏写 "Queried OpenAlex" 两源皆阻断: cardCount = 0, hasVerified = false, exportDisabled = true PASS: 两个源都阻断时,无 source-card、无 Verified、Export 按钮为 disabled 429 报错内容: "..." 清空输入后结果区内容: "" PASS: 清空输入后点发送,结果区清空,不残留上一条 纯中文输入状态栏提示: "This field searches English claims. For non-English text, results will be unreliable.", 请求数: 0 PASS: 粘贴纯中文 claim 出现英文提示,发起 0 个请求 $ grep -c "citeledger.app" index.html 0 $ grep -c "citeledger.app" sitemap.xml 0 $ wc -l CHANGELOG.md 143 CHANGELOG.md $ grep -c "^| P" CHANGELOG.md 17 ``` ### 4. 遗留风险 - 公开元数据 API 偶发网络延迟或网络运营商 DNS 抖动:由于 Crossref 与 OpenAlex 属于海外学术公开服务,国内直连偶见高延迟。目前已设置 12 秒 AbortController 超时并提供显式 Retry 按钮,当单个源超时会自动走另一可用源;若两源同时受限,则进入显式网络错误态。 - 浏览器端本地缓存指纹同步:每次构建必须通过 `tools/update_hashes.py` 生成唯一指纹,Hostinger 静态服务器的 CDN 节点会对静态 html 维持一定缓存,发布后需提醒用户使用无痕窗口或强刷确认。 ## 2026-11-08 - Citely UI Alignment, Button Unlock Fail-safe & Full-Site Production Self-Check ### 1. 修复项与改动清单 1. **Find Sources 按钮禁用/锁死修复 (Image 2)**: - **根因**: unSourceFinder() 点击时设置了 tn.disabled = true; btn.dataset.busy = '1',随后调用未定义的 hideInlineError(),抛出同步异常 ReferenceError: hideInlineError is not defined。因缺乏顶层 try/catch 兜底, eleaseBtn() 未能执行,导致按钮永久锁死在 disabled / not-allowed 状态。 - **修复**: 在 ssets/app.js 中全局声明 hideInlineError() 函数清空并隐藏错误状态;对 unSourceFinder() 整个同步准备与异步启动段添加 fail-safe 的 ry { ... } catch (syncErr) { releaseBtn(); ... },确保任何同步报错均能兜底释放按钮。 2. **Verify References 底部操作栏 Citely 风格对齐 (Image 1)**: - **根因**: 校验页底栏使用未经样式定义的 .sample-chip 标签,回退为浏览器原生灰底 3D 方块按钮,且左侧布局破坏了 Citely 极简 Prompt Composer 规范。 - **修复**: 将 tnCheckerSampleRefs、tnCheckerSampleDraft、tnCheckerClear 升级为 Citely 规范的 .sample-text-btn(圆角白底胶囊、微边框、悬浮动效与图标);将 Verify References → 移至右侧作为 Citely 椭圆主操作按钮;添加清空/加载 Toast 提示。 3. **全局自检与多端自动化验证**: - 运行本地 Headless Chrome CDP 套件( est_finder_local_cdp.js、 est_checker_ui_local_cdp.js、 est_checker_batch_cdp.js、 est_mobile_and_e2e.js)。 - 验证 390px 移动端抽屉导航、历史记录透明平整样式、真伪混杂文献判定。 - 全网静态门禁 107 项检查全部通过(0 错误)。 4. **线上部署与全站验证**: - 生成内容指纹资源 ssets/app.d9a08e28.js 与 ssets/site.5bb67901.css。 - 同步全站 6 个页面并部署至 Hostinger,清除 CDN 边缘与服务器缓存。 - 生产域名 CDP 实测:Finder 与 Checker 均正常响应,0 控制台错误,0 运行时异常。 ## 2026-11-08 - Sidebar Collapse/Expand, Card Publisher Badges & Read Paper/Cite Separation ### 1. 修复项与改动清单 1. **侧边栏折叠/展开功能落地 (Image 1)**: - **根因**: 原 HTML 中虽有 `#sidebarToggle`,但 CSS 缺失 `.app-sidebar.collapsed` 样式规则,且折叠后缺少呼出/展开按钮,导致点击无效。 - **修复**: 在 `assets/site.css` 及 `app/index.html` 中补齐 `.app-sidebar.collapsed { margin-left: -260px; width: 0; }` 及过渡动画;在主工作区左上角新增浮动展开按钮 `#sidebarExpandBtn`;在 `assets/app.js` 中串联双向切换与 `localStorage` 用户偏好持久化。 2. **卡片元数据标签与全文出版商澄清 (Image 2)**: - **根因**: 卡片信号栏此前直接输出裸露的 `OpenAlex` / `Crossref` 标签,导致用户误认为该文献发布在 OpenAlex 上,与点击 DOI 实际跳转的出版商平台(如 ScienceDirect)产生认知冲突。 - **修复**: 在元数据规范化流程中提取真实出版商 `publisher`;优先展示出版机构名称,或明确显示 `Indexed in OpenAlex` / `Indexed in Crossref` 并带有详细浮窗释义,消除“系统来源错误”的误解。 3. **Card 操作区分工升级:`Read Paper ↗` vs `” Cite` (Image 3)**: - **根因**: `openCiteModal` 中 `modalCurrentPaper` 和 `lastCiteTrigger` 未显式声明导致严格模式报错中断,造成用户点击 Cite 没反应或误解为重复跳转;且原 `DOI ↗` 按钮与标题链接意图重叠。 - **修复**: 声明变量并确保弹窗顺畅弹出;将外部链接按钮重命名为清晰的 `Read Paper ↗`(带外链图标与 Tooltip 说明),将引用按钮重命名为 `” Cite`(带引号图标与 Tooltip 说明),彻底划清“读原文”与“写论文复制引用”的职责边界。