Skip to content

chore(deps-dev): bump wait-on from 9.0.10 to 9.1.0 in /client - #46

Closed
dependabot[bot] wants to merge 524 commits into
devfrom
dependabot/npm_and_yarn/client/wait-on-9.1.0
Closed

dependabot[bot] wants to merge 524 commits into
devfrom
dependabot/npm_and_yarn/client/wait-on-9.1.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 19, 2026

Copy link
Copy Markdown

Bumps wait-on from 9.0.10 to 9.1.0.

Release notes

Sourced from wait-on's releases.

v9.1.0

Updated some dependencies

  • axios
  • joi
  • mocha
  • eslint-plugin-chai-friendly
Commits

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

- CL-H1: screen_capture_stop 与 dispose 结算防抖中悬挂的 pendingStartResolve,消除渲染层 invoke 永久挂起(快速开始→停止、帧超时重启链不再卡死)
- CL-H2: importTable 每行显式按首行列集合取值(缺失补 null),修复 IndexedDB 迁移行间字段不一致时的列错位静默数据损坏
- CL-H3: db:search LIKE 降级路径统一 LIMIT 20,常见词搜索不再同步全表扫描 + 全量 IPC 传输
- CL-H4: rebuildIndex 改为异步分批执行(每批 500 行 + setImmediate 让出事件循环),数万文档重建不再阻塞主进程窗口/托盘/IPC;同步更新 main.ts 与 migration:complete 调用点
- CL-H5: rateCard 增加 isRating 防重入锁(try/finally 保证异常释放),消除双击/触屏误触导致的同一卡片双调度与重复复习记录

验证: npm run lint (0 errors) + npm run test (875 passed) + npm run build 全部通过
…atchdog上限

- CL-M1: ai:stream:start 的 API 路径白名单校验(仅 /api/v1/(ai|multimodal)/ 前缀,拒绝 ?/# 注入),堵住代理访问任意网关端点
- CL-M2: postJsonStream 读取阶段 30s 无数据超时(原仅覆盖建连)+ 所有退出路径 reader.cancel() 释放连接 + 外部 abort 信号检测
- CL-M3: safeHandleBatched 返回真实结果(最后一次调用结算 Promise),microtask 异常 reject 给调用方而非 unhandledRejection
- CL-M4: 屏幕采集缩略图 1920×1080 → 1280×720(extractFrame 目标分辨率),多窗口每帧位图分配降 56%
- CL-M5: db:batch 批量操作条数上限 1000,防止单事务长期持有写锁阻塞全部 db IPC
- CL-M6: columnCache 失效策略——initialize/close/checkpointAndClose 时 clear,运行期 schema 变更不再过滤新列
- CL-M7: MCP Bridge 子进程最小环境白名单(14 个基础变量),不再透传宿主全部环境变量(供应链凭据泄露面)
- CL-M8: displayMedia handler 校验请求 frame 来源(file:// 或 localhost),非应用来源拒绝授权(防静默录屏+系统音频)
- CL-M9: dbFileMigrator 复制前检查目标目录已存在 keban.db 则拒绝(防覆盖旧库);备份名加时间戳并保留最近 5 份
- CL-M10: 帧超时 watchdog 连续重启上限 3 次(收到有效帧清零),耗尽后停止并 toast 提示,消除幽灵采集循环
- CL-M11: callWithLocalFallback 本地探测缓存过期时先刷新再决策,不再静默跳过本地推理

验证: npm run lint (0 errors) + npm run test (875 passed) + npm run build 全部通过
- CL-L1: fs:read-file 禁止读取数据库文件(keban.db*)+ 50MB 大小限制
- CL-L2: ai:set-gateway-url 拒绝自定义端口与路径(CSP connect-src 动态放行的攻击面收窄)
- CL-L3: backup:save 校验 JSON 内容与 100MB 上限
- CL-L4: 自动更新状态机(idle/checking/available/downloading/downloaded/error)——install 仅 downloaded 态、download 仅 available 态,防止任意时机触发退出安装与并发下载
- CL-L5: chatRepository.getMessages limit 钳制 1-200
- CL-L6: preload 专用监听 API(onWindowClosing/onMaximizedChanged/onSyncBeforeQuit)纳入 ALLOWED_EVENT_CHANNELS 校验
- CL-L7: schema ALTER 区分 duplicate column(幂等成功)与其他错误(记日志且不推进 user_version,保留重试机会)
- CL-L8: video_record_stopped 确认事件校验绑定窗口 sender
- CL-L9: ai:stream 活跃流在发起窗口销毁时 abort 清理
- CL-L10: uncaughtException 崩溃恢复——DB checkpoint 落盘后 relaunch,不再带病运行
- CL-L11: saveAIConfigAction 网关地址同步失败抛错 + gatewaySyncError 状态可观测

验证: npm run lint (0 errors) + npm run test (875 passed) + npm run build 全部通过
- SYNC-H1: Push 冲突判定收紧为 client version <= server version——相同版本号不同内容的静默覆盖改为返回冲突(双设备并发编辑不再丢数据;幂等重试由 op.ID 去重覆盖)
- SYNC-H2: WS sync_request 每连接在飞查询上限 2(信号槽),单连接洪泛不再打满数据库连接池(50)拖垮全部用户
- SYNC-M1: Resolve 增加 FOR UPDATE 行锁 + 版本必须大于服务端版本(拒绝版本回退);成功后广播到其他在线设备(实时收敛)
- SYNC-M2: Push 广播条件从 opSeqNoByID 非空改为 accepted 非空——无 ID 操作(fallback ID)落库后同样广播
- SYNC-M3: CRDTPush changeset SHA-256 哈希幂等去重((user_id, changeset_hash) 唯一索引 + 并发兜底),网络重试不再重复落库膨胀
- SYNC-L2: Pull/CRDTPull 的 deviceId 白名单校验(防回环与超长参数)

验证: go build + go vet + go test 全部通过
- ALG-H1: FSRS S0(G) 从 FSRS-4 硬编码常量 [0.4,0.6,2.4,9.0] 改为权重 w[0..3](fsrs-rs 官方语义 S0(G)=w[G-1]);修正误导注释(权重为项目自定义非官方默认、w[6] 为保留位不参与 difficulty 更新、D0 为固定表近似并标注官方公式);同步更新测试断言
- ALG-M1: sm2 easeFactor 缺失/NaN/0 防御(回退 2.5),消除 NaN interval → Invalid Date 无限传播
- ALG-M2: rateCard 中 updateCard 改为 await + try/catch——异步写失败不再 unhandled rejection;review 已落库时继续推进 UI(内存态最新,DB 旧值下次复习覆盖,不丢数据不重复调度)
- ALG-L1: SM-2 历史 interval 反推 stability 的近似性注释说明
- ALG-L2: goldenErrorMultiplier 历史遗留接口注释(实际由 store 层 compressForGoldenError 后处理生效)

验证: lint 0 errors + 875 tests passed + build 成功(FSRS/SM2 44 项算法测试全通过)
- WEB-L1: DownloadCta 版本信息 fetch 增加 5s 超时 + 单次重试;加载中显示加载提示,源站不可达时明确回退 GitHub Release(原实现 DNS 挂起时按钮一直显示兜底值,无法区分加载中与故障)
- SYNC2-H3: pause() 不再置 syncInProgress(该锁由 sync finally 释放),resume 等待加 15s 超时兜底——存储路径切换等流程不再永久挂起
- SYNC2-H1: resolve 成功后 markEntityLogsSynced 清理该实体全部未同步日志——配合服务端版本语义收紧(<=冲突),消除 resolve 后旧日志永久循环冲突
- SYNC2-H2: 冲突对象 localData 携带真实本地数据(最后一条 payload 日志,纯 delete 回退读业务表),localVersion 取最后一条日志版本——修复保留本地提交空对象清空实体数据
- SYNC2-H4: operationLog.synced 写入数值 0/1 与查询 equals(0/1) 类型一致,修复 oplog push 链路静默失效与模式切换丢数据;类型同步改为 0|1

验证: lint 0 errors + 875 tests passed
- SYNC2-L1: oplog pull cursor advances only to last successfully applied
  version, preventing permanent skip of failed operations
- SYNC2-L2: autoSync no longer counts lock/offline states as failures,
  avoiding spurious exponential backoff after network recovery
- SYNC2-L3: getPendingCRDTChanges supports per-table filtering, fixing
  push starvation when multiple tables have pending changes
- SYNC2-L4: offline queue max version read by version instead of
  createdAt to avoid duplicate versions within the same millisecond
- SYNC2-L5: reset per-table CRDT in-memory doc on persistence failure,
  preventing baseline drift and MissingDependencyError
- #1: JWT algorithm now injected via SUPABASE_JWT_ALGORITHM (default
  HS256, aligned with Supabase default signing); placeholder detection
  prevents 'configured' false impression causing whole-site 401
- #2: remove double rollback on streaming rate-limit overrun - the Lua
  script already atomically DECRs, manual rollback let users drain
  their own quotas into negative counts
- #3: error_pattern chain/router defensive validation - missing fields
  from LLM JSON output filtered instead of 500 (ValidationError)
- #4: GLM generate_vision returns actual clamped max_tokens; vision
  chain logs truncation warning when output approaches the limit
- #5: Gemini generate_stream iteration moved into thread pool via
  asyncio.to_thread, unblocking the event loop during streaming
- #6: providers return real input/output token split; fallback cost
  tracking prefers it and falls back to 60/40 estimate instead of
  the misleading 50/50 split (output priced 2-3x higher)
- #7: balance queries use Key pool primary key (plural env vars),
  DeepSeek balance no longer silently skipped
- #8: JWKS fetch distinguishes network failures (stale cache reuse
  with 60s retry backoff) from HTTP/key errors (fail-closed),
  preventing whole-site 401 on transient Supabase hiccups
- #9: import_concept registered in TIMEOUT_CONFIG/RATE_LIMITS plus
  startup validation warning for unregistered features
- #10: error_pattern cache key includes user_id and hashes full
  content, preventing cross-user result reuse
- #11: vision confidence redefined as structured-extraction
  completeness (text 0.5 + aux fields 0.5) instead of fabricated
  0.9/0.3; GLM ASR fabricated 0.9 fixed to 0.0 placeholder
- #12: fallback chain budget comments unified to *3.0 matching
  implementation (was *1.5, misleading maintainers)
- #13: key rotation moved to with_retry_and_timeout wrapper so
  vision/stream/ASR/video paths rotate keys too, not just generate
- #14: JWT_SECRET marked as dead config in .env/.env.example with
  SUPABASE_JWT_ALGORITHM documented; startup warning when legacy
  JWT_SECRET is set but SUPABASE_JWT_SECRET is empty
- M1: feynman setExplanation no longer auto-advances step (double
  advance skipped step2 view); progression owned by advanceStep
- M2: pomodoro wall-clock calibration completion branch now plays
  sounds and sends notifications like the normal path
- M3: coral streak/check-in/progress use local dates consistently
  (UTC+8 midnight planting was counted as previous day)
- M4: plantCoral re-reads DB before set, no longer overwrites
  concurrent plant with stale snapshot
- M5: CryptoManager init failure now explicit (hasInitFailed, throws);
  device key material encrypted via Electron safeStorage IPC
  (previously plaintext in localStorage); fix missing logger import
  in SyncEngine (phase 1 regression)
- M6: useAudioPlayer.play clears running fadeOut interval
- M7: convertWeakPointsToFlashcards batches card creation before
  marking mastered, avoiding duplicate cards on retry
- M8: useVoiceInput serializes stop/start (pending flag + re-check),
  old stop can no longer kill a newly started capture
- ELEC2-M1: MCP manager init failure resets initialized flag and
  retries with exponential backoff (1s-30s, max 8 attempts) - the
  stale flag previously disabled MCP silently for the whole run
- ELEC2-L1: window recreation (macOS activate) resets sync-before-quit
  state machine - stale requested=true + completed=false made the new
  window impossible to close
- ELEC2-L2: audio capture runtime degradation re-checks capturing
  before restarting the provider, eliminating ghost capture when
  stop() races with degradeToEndpoint
High:
- OfflineQueue: orderBy('version') on non-indexed field throws Dexie
  SchemaError, breaking offline enqueue (regression from SYNC2-L4);
  switched to sortBy in-memory (enqueue/getPendingItems/getReadyItems)
- auth.py JWKS: network-failure branch now bounded by stale-grace
  window (was unbounded stale reuse); in-lock retry_after reuse
  added; 5xx treated as transient (stale reuse) vs 4xx fail-closed

Medium:
- error_pattern: cache-hit path now validates/filters like first-run
  (was bypassing validation -> 500); cache stores cleaned data;
  negative count/empty keywords filtered
- Key rotation: removed per-provider generate rotate (double rotation
  with wrapper made even-key pools never use the 2nd key)
- writeWithLog: resetTable failure no longer propagates to block the
  main write path
- SyncEngine: finally clears syncInProgress unconditionally (pause
  during in-flight sync left the lock, resume waited 15s timeout)
- feynmanStepSlice: catch path now syncs zustand store so retry does
  not duplicate cards for already-created weak points
- windowManager: window recreation clears syncTimeoutTimer (stale
  timer would app.quit() the rebuilt window)
- rate_limit: global-limit overrun now rolls back the feature counter
  (Lua only rolls back the exceeded layer)

Low:
- markEntityLogsSynced matches synced !== 1 (legacy boolean/undefined)
- parseLocalDate validates format; daysBetween NaN -> Infinity
- ecosystem initialize uses local date; restore() re-reads DB
- worldState streak diff uses Math.round tolerance
- useVoiceInput start timeout surfaces error message
- Gemini stream uses provider thread pool (not default executor)
- qwen_vision returns max_tokens for truncation detection
- jwt_algorithm normalized strip().upper()
- X1: CryptoManager.init now wired to auth lifecycle (login derives
  device key via safeStorage, logout clears; init failure surfaces
  explicit warning toast instead of silent plaintext); mcpManager
  gains shuttingDown flag - no retry scheduling after shutdown and
  retryAttempts reset for dev hot-reload
- X2: electron.d.ts duplicate Window.electronAPI declaration removed
  (env.d.ts is the single authoritative superset; conflicting
  signatures were masked by skipLibCheck)
- X4: Gemini vision/multi/video return real input/output token split
  for cost tracking; DeepSeek input tokens use cache-miss portion
  (cache-hit billed at 1/4 price, previously overestimated)
- X5: error_pattern cache key uses only fields the chain consumes
  (first 20 correctAnswer/userAnswer, no flashcardId) - improves
  hit rate without correctness impact
- X6: feature-config startup validation extracted to shared function
  and applied to streaming registry (was middleware-only, streaming
  misconfigs silently fell back to 300s timeout / default limits)
- 收入方案设计:docs/product/temporary-revenue-implementation.md
- 数据库层:schema.ts 新增 beta_profile/licenses/invite_codes 三表,SCHEMA_VERSION=10
- 类型系统:client/src/types/beta.ts — UserTier/TIER_RANK/TIER_PERKS 权益矩阵
- 状态管理:betaStore.ts — Zustand persist 持久化 tier/激活码/邀请码
- UI组件:BetaProfile(身份卡片)、InviteCodeSection(邀请码管理)、
  LicenseActivation(激活码输入+服务端验证)、UpgradePrompt(非阻断升级引导)
- 权限Hook:useTierAccess(tier-based 功能访问控制)、useBetaProfile(metadata加载)
- SettingsPage 集成:ProfileSettings 后插入 BetaProfile 区域
- AI网关集成:rate_limit.py TIER_LIMITS 分级配额 + providers.py TIER_MODEL_ACCESS 分级路由
- 新增路由:routers/license.py(激活码验证) + routers/beta.py(邀请码API)
- 管理工具:scripts/license-gen.mjs(激活码离线生成,支持 PRO/LIFE/SND1/THM1)
- 代码审查修复:修复 recalcEffectiveTier 排序、激活码大小写、tier 参数传递、
  服务端验证缺失、v10迁移、邀请码数量逻辑、cohort 类型转换、import re 延迟导入等30个问题
- 路由注册:main.py 和 __init__.py 注册 license_router 和 beta_router
Aparencia and others added 18 commits August 16, 2026 23:44
- 预置 ~/.bubblewrap/config.json(jdkPath/androidSdkPath),消除全新 runner
  上 JDK 安装交互提示导致的 exit 130(v0.38~v0.40 build-apk 连续失败根因)
- 删除语义错误的 bubblewrap update(--manifest 应指向本地 twa-manifest.json
  而非 web manifest URL);工程已入库,直接 build 即可
- build 密码改经 BUBBLEWRAP_KEYSTORE_PASSWORD/BUBBLEWRAP_KEY_PASSWORD
  环境变量传入(CLI 无密码参数,原 --keystorePass 等被静默忽略)
- 签名参数改用 --signingKeyPath/--signingKeyAlias(原 --keystorePath 无效,
  会落到 twa-manifest.json 中的 Windows 本地路径)
- 防御:SDK tools/bin 占位 + build-tools 36.1.0 缺失时显式预装
- keystore secret 缺失时 exit 1 显式失败;GitHub Release 上传仅 tag 触发时执行

已在本地完成全链路构建验证(gradle assembleRelease + zipalign + apksigner,
产出 2.6MB 签名 APK 验证通过)
Bumps [wait-on](https://github.com/jeffbski/wait-on) from 9.0.10 to 9.1.0.
- [Release notes](https://github.com/jeffbski/wait-on/releases)
- [Commits](jeffbski/wait-on@v9.0.10...v9.1.0)

---
updated-dependencies:
- dependency-name: wait-on
  dependency-version: 9.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Aug 19, 2026
@Aparencia Aparencia closed this Aug 21, 2026
@dependabot @github

dependabot Bot commented on behalf of github Aug 21, 2026

Copy link
Copy Markdown
Author

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot
dependabot Bot deleted the dependabot/npm_and_yarn/client/wait-on-9.1.0 branch August 21, 2026 03:19
Aparencia added a commit that referenced this pull request Sep 13, 2026
依据 = 计划 Task 21 卡 Step 1–5 + §C6.3(六件)+ §C9.10(逐字对照)+ §C4.3 / §C11.1 / §C11.4 / §C7.3 / §C9.1 / §C16.2。
形态 = **原文 + 就地加注**(保留历史原文,只加注)⇒ 本提交 **+24 行 / −0 行**,**没有任何 `-` 行**(V2 判据)。

【逐字对照:改了哪几行 / 原文是什么(改前原文逐字 = 改后仍逐字在文件里)】

1. §10 批 7 行(`:722` 时点锚 ⇒ 现 775)—— 原文(保留):
   「…**`structuredBlocks` 整模块存废**(批 1 控制方裁决:接线…**或**删除…二选一,**批 1 未决前不得删**) | **标签能写进去**;**档位选完真生效**;**`structuredBlocks` 已作出接线或删除的明确裁决**」
   加注(新):批 7 收口就地加注 = 逐导出裁决(第三条路)明文授权(① `escapeHtml` 只摘 `:11` import + `:13` 再导出 · ② `renderLatex`/`renderMarkdownTable` 删 · ③ `lowConfidenceClass` 留 + 加宽 ≥2)+ 另三处实测落位(12 条补 UI 实做 10 条 · registry 净值 311 · 撤下 3 条保留函数体的形态)。

2. §11-7(`:824` 时点锚 ⇒ 现批 1 进度注)—— 原文(保留):
   「…删除后复算 = registry 312 / 前端零引用 **25** 条(= 47 − 22,逐条与上列归属一致)。」
   加注(新):批 7 收口注 = registry **313 → 311** · 前端零引用 **24 → 11**(实测;口径与仪器、正控 68 / 负控 0 一并给出)+ 差额分解(−10 补 UI + −3 撤下)+ 新命令 `remember_video_profile_tier` PROD 2 不计入 + 残留 `update_fragment_group` 仍零引用。

3. §12「3 套 markdown 渲染器归一」行 + 批 5 加注之后(`:864` / `:870-875` 时点锚)—— 原文(保留):批 5 加注整块,含『`structuredBlocks.ts`(第 5 套、**无生产消费者**)』。
   加注(新):批 7 去向终态 = 已完成归一(`utils/markdownLine.ts` 100 行 · `ChatMessageMarkdown` 并入后删除 · 站点 2 → 1 / 插件站点 8 → 4 · 终态 2 套活)+ 🔴 逐字句「**归一 = 逻辑归一;观感统一未做,归批 8**」+ 🔴 **补登规格加注漏点**:第 4 套活渲染器 `components/NotePreviewView.tsx:40 renderMarkdown`(开工 346 行 / 终态 364 行;T16 `6509e04c` 已补表征测试)+ 残余(两处页内 seek 未接 ⇒ 批 8)。

4. §9 表内三处状态更正(#14 `kb_search` / #30 `video_profile_spec_by_kind` / #46 `update_fragment_group`;锚在表末 #47 行之后,**以免块引用把 47 行表格截断**)—— 原文(保留):三行表体原文一字未改。
   加注(新):#14「补 UI(本批)」批 3 Task 12 已交付(`b567f0e6`,T21 实测 PROD 1)· #30 **角色变更登记**(并行真源 → 离线降级路径;两张映射仍在、仍有生产调用点)· #46 记录同步批 1 已做,**但 T21 实测「接线」那一半未做**(全 `app/src/**` 含测试 0 命中,仍在 registry)⇒ 登记批 8 输入。

5. §9「删除的通用影响面」(`:694` 时点锚 ⇒ 现「**删除的通用影响面**:仅 `lib.rs` 的 `generate_handler!`…」)—— 原文(保留):整句。
   加注(新):就地更正 = 注册清单已搬到 `app/src-tauri/src/app_commands.rs`(批 0-C3),`lib.rs` 已无 `generate_handler!`;T21 实测该文件含 311 条目 ⇒ 原判断(影响面 = 注册清单一处)成立,只是换了文件。

【门禁读数(串行,工作树)】
- `node scripts/docs-check.mjs` ⇒ exit 0 ·「扫描 281 个 Markdown 文件(检查 181 个)」五项全 ✅(与批 7 工作树基线 281/181 逐字一致;本提交**未新增/删除 `.md`** ⇒ 扫描数不变)
- `node scripts/line-limits.mjs --full` ⇒ exit 0 ·「>600 硬限 0(棘轮内)· 301–600 档 121 · 登记条目 121」(`docs/**` 不在行数门禁域)
- `git diff --numstat -- <规格>` ⇒ **24 / 0**;`git diff` 的 `^-` 行数 = **0**(V2)
- 规格行数(`countLines()` 口径):**998 → 1022**

【诚实边界】
- 批 7 的**完整逐字对照表**另见 `task-21-report.md`(gitignored);本提交的 durable 形态 = 「原文保留在文件里 + 加注」⇒ 对照可复算。
- 三处 §9 注**放在表格之后**(而非各自行后):块引用会**截断 Markdown 表格**,而后 17 行原文一字不许改 ⇒ 只能整表之后就地注;注文逐条点名所属行号。
- `update_fragment_group` 的「接线那一半」**未做**是**实测发现**(不是卡里的预期),已逐字登记;**不得**读成「本批 12 条补 UI 已全部接线」。
Aparencia added a commit that referenced this pull request Sep 13, 2026
依据 = 计划 Task 21 卡 Step 6(**同七段结构** + ①–⑨ 九项必含)+ §C9.10(读数同批给出)+ §C11.1 / §C11.4 / §C11.7 / §C11.8 / §C7.3 / §C54.3 / §C54.5 / §C54.6
形态 = **纯追加**(既有条目一字未改;本节插在「批 6」节与「批 0 其余部分」节之间)⇒ 本提交 **+150 行 / −0 行**。

【逐字对照:改了哪几行 / 原文是什么】
- **改前(保留,一字未动)**:… 批 6 节末尾 `> 🔻 T36 的归组对拍(…)…` 之后紧接 `### 批 0 其余部分(未落地)`。
- **改后**:同一位置 = `---` + `### 批 7 · 未接线落地(2026-09-13,`681e73c6^..` 至全批收口提交,**T21 落库时实测 59 个提交**)` 整节 + `---` + **原文的 `### 批 0 其余部分(未落地)` 与其正文逐字保留**。
- 🔴 首版实施中我误删了 `### 批 0 其余部分(未落地)` 标题行,**当场发现并逐字恢复**(`git diff` 复核:该节 11 个 `###` 标题在提交前与 HEAD 逐一对应)。

【七段结构(V5 探针 7/7 HIT)】交付 / 验收(三条验收兑现度表 + T21 落库时八闸读数)/ 规格漂移纠正 / 过程中纠正的计划错误(**第 1–12 例**逐条带出处与落位)/ 诚实代价 / 未做(登记,逐条带归属批次)/ 提交清单(59 个,按任务归组)。

【卡 Step 6 的 ①–⑨ 九项必含(探针 20/20 HIT)】
① `structuredBlocks` 逐导出裁决 + **用例净 −7 的说明(8 删 − 1 迁 = 非 LOST)** ② `[[ts:ms]]` 残余**以实测为准**(两条串渲染链 + React 链芯片**均已可点** ⇒ §C10.2 期望成立;残余 = 两处**页内 seek**)③ `docs/tech-debt/` 归因(**是用户所有的决定**;`docs-check` 的 1 个差逐字归因到它)④ **音频两条 = 待产品裁决** ⑤ 未做清单(R4.1 的 5 个粘滞字段形态 / 带证据三轨的实现 / 审校模式的实现)⑥ 🔴 逐字「**归一 = 逻辑归一;观感统一未做,归批 8**」⑦ 🔴 读端角色变更(「并行真源」→「离线降级路径」)⑧ 🔴 散文对拍探针登记为「**批 8 的候选闸**」⑨ 🔴 `get_decision` 的 H7 结果(只做详情面那一片;**其余 5 项逐字登记批 8 输入**;只写「H7」+ 必要片段,未整段搬运)。

【T21 附加登记(台账指派,卡未逐条列)】
- 🔴 **§11-8「段① 的『落库』」口径逐字**:「段① 的『落库』= **会话生效态 + 记忆体**,非 `sessions` 表落列」(§C44.2 / §C45.1;供 T22 照抄)
- 🔴 **§11-8「跨会话记住」全路径成立**:原 `source_window == None` 路径**必读不回**(§C51.4 的 Important I1),**已由 T19 的 `17d33095` 修复**(`memory_key_for_start` + 往返判据 + 负控)⇒ 验收表写「**全路径成立**」
- 🔴 **10 个贴边件清单**(T21 逐条 `countLines()` 实测 **10/10 与台账一致**)+ 「**任何后续编辑必须先拆件**」+ **就地更正一处台账路径错**:`NotesReadingColumn.tsx` 实为 `app/src/components/notes/`(§C49.5① 与派发语写的 `views/note/` 不存在)
- 🔴 **D 的六条展示面是「设计决定」而非裁决**(§C54.6 逐字)⇒ **不得**写成「按规格实现」
- 🔴 **C7「重启后卡录制」覆盖面未覆盖**(触发口径偏离:该命令无心跳字段)⇒ 登记批 8
- 🔴 **计划勘误第 1–12 例**逐条落账(第 7–11 例 T12 已落;第 1–6 与第 12 例由 T21 落;与「控制方第 N 例」是两条序列,已注明勿混)
- 🔴 **10 条技术债/批 8 输入**:`pr-check.yml` paths-filter 缺口 + 懒侧守卫三处无执行者 · 散文探针候选闸 · `@types/katex` 待查 · Rust `trim()` vs 前端 `parseTags` 不一致 · 新件 `position:"fixed"` 潜在陷阱 · `Surface` registry 对 legacy 无合法新增路径(余 2 处转批 8)· `commands_video.rs` 末尾换行门禁盲区 · 「subject ≤50」无机器判据 · 两处页内 seek · 音频两条(产品裁决)
- 🔴 **懒侧余量薄两句**(§C47.3 逐字)+ **红点集合「成员会随运行漂移」**(不得简化成「只有 W1/A4」)+ **`node_modules` 事故**(§C23.5)+ **`fa45caf1`/`f7ac5d0f` 两树 (e) 不自洽**(§C16.2)

【门禁读数(串行,工作树;🔴 不是全批终态 —— 终态由 T22 出)】
- `node scripts/docs-check.mjs` ⇒ **exit 0** ·「扫描 **281** 个 Markdown 文件(检查 **181** 个)」五项全 ✅(**未新增/删除 `.md`** ⇒ 与批 7 工作树基线 281/181 逐字一致)
- `node scripts/line-limits.mjs --full` ⇒ **exit 0** ·「>600 硬限 **0**(棘轮内)· 301–600 档 **121** · 登记条目 **121**」
- `node scripts/check-command-registry.mjs` ⇒ **exit 0** ·「✅ 命令注册一致:定义 **311** / 注册 **311** / 重复 **0**」
- `git diff --numstat -- docs/versions/v0.22.md` ⇒ **150 / 0**;`git diff` 的 `^-` 行数 = **0**
- 🔴 **其余五闸(`tsc` / vitest / `bundle-budget` / `bundle-eager-graph` / `cargo`)本节不重跑** —— T21 的写集只有 `docs/**`,对它们零影响;引用 T12/T20 的读数一律标明来源与树。

【诚实边界】
- 本节**不是全批收口**:**未重跑五闸**、**未出验收终态**、**提交数「59」只在本节的规格提交 `f0f2998c` 上成立**(此后任何单元落库都会改变它)⇒ **全批终态一律以 T22 为准**。
- 凡**未由 T21 亲测**的数字逐字标「引自 §Cxx / Txx 报告,未独立复核」;T21 亲测项 = registry 311/311/0 · 两个门禁读数 · 10 个贴边件行数 · §9 前端零引用 11 条 · `update_fragment_group` 0 命中 · `video_profile_for_spec` / `KIND_TO_FORM` / `KIND_TO_TIER` 调用点 · 若干文件行数。
- 🔴 **`update_fragment_group`(#46) 的「接线」那一半未做**是 T21 的**实测发现**(卡 Step 4 的注文隐含它已做)⇒ 已同时回写规格 §9 该行 + 本节,并登记批 8。
Aparencia added a commit that referenced this pull request Sep 13, 2026
依据 = `rulings.md` **§C56.2**(裁决:这是批 7 的**交付缺口**,不是「批 8 输入」)+ **§C56.1**(规格 `:738` 处置栏逐字「补 UI(本批)」;计划 `:532`/`:2299`/`:2309` 三处指派一致)+ **§C57.1/§C57.5**(T23 交付 + 返工已逐项复核)。
形态 = **原文 + 就地加注**(上一轮的实测发现**逐字保留**、处置以加注**作废**)⇒ 本提交 **+8 行 / −0 行**。

【逐字对照:改了哪几行 / 原文是什么】
- **位点 1 = 规格 §9 表末 #46 行的状态更正注(`:745`)**
  · **原文(保留,一字未动)**:「…**批 7 只做"接线"那一半**(命令本身的生产调用点)。🔴 **但 T21 实测推翻了后半句的兑现**:…⇒ **「接线」那一半在本批未做**。**处置**:与 §C9.1 的裁决不冲突…⇒ **逐字登记为批 8 输入**,**不得**读成「本批 12 条补 UI 已全部接线」。」
  · **加注(新增)**:「🔻 **收口更正(2026-09-13 · T21 追加轮;上一注的实测发现保留、处置作废)**」= 该「→ 批 8」处置**作废**(引 §C56.2 逐字)+ 规格处置栏与计划三处指派的逐字依据 + T23 三条 sha 与交付物 + **T21 独立复测 PROD 0 → 1**(落点 `FragmentGroupAction.tsx:92` 逐字载荷)+ 落点形态(`:71`/`:72` 的 feed 双道收口 · `{ fragmentId, groupId }` 的 camelCase 依据 `commands_fragments.rs:141-145` · `groupId: null` = 移出组)+ 判据 V7/V8/V9 + 🔴 **缺口成因**(计划口径正确且预警过;T20 的「6+4=10」吞掉第 11 个名字)。
- **位点 2 = 规格 §11-7 的批 7 收口注第 4 条(`:908`)**
  · **原文(保留,一字未动)**:「🔴 **残留 1 条挂着「补 UI(本批)」却仍零引用**:`update_fragment_group`(#46) 全 `app/src/**`(**含测试**)命中 **0 文件 / 0 处**…⇒ **登记为批 8 输入**,并见 §9 该行的状态更正注。」
  · **加注(新增)**:「🔻 **收口更正(2026-09-13 · T21 追加轮;上面三条原读数一律保留为「T21 首轮」的历史读数)**」= 🔴 **残留 1 条 → 0 条** · 🔴 **前端零引用 11 → 10**(口径不变)· **有引用数 11 → 12**(本批实做补 UI = **11 条** = T20 的 6 + T23 的 1 + T18/T19 的 4)· 处置改为「已交付」。

【T21 追加轮实测(自跑,非转述)】
- `update_fragment_group` 前端命中:**PROD `app/src/components/FragmentGroupAction.tsx`(4)** · TEST `FeedFragmentList.test.tsx`(9) · `batch7UiWiring.test.tsx`(2);正控 `invoke(` **68** 个生产文件 · 负控 **0**。
- T23 三条提交的 `--numstat` 与 parent 链:`125eec85`(4 路径,parent `d0ada786`)→ `5f662811`(1 路径,parent `125eec85`)→ `5d59e332`(3 路径,parent `5f662811`);逐条 `git show --name-only -1` = 只列自己的路径。
- 行数(`countLines()`):`FeedFragmentList.tsx` **299** · `FragmentGroupAction.tsx` **155** · `FeedFragmentList.test.tsx` **299** · `batch7UiWiring.test.tsx` **218**。

【门禁读数(串行,工作树;与上一轮逐条对账)】
- `node scripts/docs-check.mjs` ⇒ **exit 0** ·「扫描 **281** 个 Markdown 文件(检查 **181** 个)」⇒ **与上游基线 281/181 逐字一致**(本提交未新增/删除 `.md`,且**未改**非本文档)
- `node scripts/line-limits.mjs --full` ⇒ **exit 0** ·「>600 硬限 **0** · 301–600 档 **121** · 登记条目 **121**」⇒ **与上游逐字一致**
- `node scripts/check-command-registry.mjs` ⇒ **exit 0** ·「定义 **311** / 注册 **311** / 重复 **0**」⇒ **与上游逐字一致**(T23 未新增命令)
- `git diff --numstat -- <规格>` ⇒ **8 / 0**;`git diff` 的 `^-` 行数 = **0**(V2 继续成立)
- 🔴 **结构自证**:本文件的 `#`–`####` 标题逐条对拍 = **HEAD 51 / 工作树 51 / 差异 0 处**(§C55.2 / §C56.4 的纪律 —— 「不改历史原文」不能只看 numstat 删除列)
- 规格行数:**1022 → 1030**

【诚实边界】
- 🔴 **「删掉『登记为批 8 输入』的处置」按「就地作废」而非字面删行实现** —— 因为本轮**同时**被要求「规格 diff 仍必须只有 `+` 行、`−` 列为 0」(V2 继续有效)。字面删行会与该硬判据直接冲突 ⇒ 处置用加注**显式作废**(原文可读、结论唯一)。**如需字面删除,请明示——那会同时作废 V2。**
- §C57.2 的**控制方派单缺陷**(`container` vs `feed` 地形)与三条新事实的落账**不在本提交**:本提交只改规格,`v0.22` 与 `docs/standards/**` 在后续两条提交里。
Aparencia added a commit that referenced this pull request Sep 13, 2026
依据 = `rulings.md` **§C56.2**(#46 处置作废 + 已交付)+ **§C56.3**(计划勘误第 13 例)+ **§C55.3**(贴边件清单「不是 10 条」的裁决与「全树扫描为唯一来源」)+ **§C57.2**(控制方派单缺陷的纪律)+ **§C57.4④**(实做数收口为 11)。
形态 = **原文 + 就地加注 / 追加**(本节的每一处旧文本都逐字保留,更正一律以「🔻 收口更正 / 补登」加注)⇒ 本提交 **+26 行 / −0 行**。

【逐字对照:改了哪几处 / 原文是什么】(行号为改动前的工作树行号)
1. **`:764`「补 UI 实做 10 条」** —— 原文(保留):「- **补 UI 实做 10 条**(§C9.1 逐字名单):… 判据件 `batch7UiWiring.test.tsx` **216 行**)。」
   加注:**实做面收口为 11 条**;口径 = §C9.1 的「10」是计数口径、逐个列名 **11 个**(计划 `:2304` 自陈 + `:2305` 裁决「列全 11 个,不删任何一个」);**11 条逐名** + 第 11 条由 T23 交付(三条 sha + PROD 0→1);**规格 §10 的「12」仍不改**(差额 = `kb_search`,批 3 已交付);并更正 `batch7UiWiring.test.tsx` 的 **216 → 218 行**(T21 实测)。
2. **`:789-794` 规格漂移纠正表**(表后加注,**表格本体一字未动**)—— 原文(保留):三行分别写「实做 10 条」·「前端零引用 **24 → 11** … 残留 `update_fragment_group`」·「`#46`(… **T21 实测「接线」那一半未做**)」。
   加注:① 实做 **10 → 11**;② 零引用 **11 → 10**、有引用 **11 → 12**、**残留 1 → 0**;③ `#46` **已由 T23 于本批补做**(原读数保留为过程记录,处置由「批 8 输入」改为「已交付」)。
3. **`:815-831` 贴边件清单(10 条表)** —— 原文(保留):10 行表 + 两条已有的 `>` 注。
   加注:🔴 **范围声明**(该表 = **本批触碰过的件**,**不是全树**;**一律不得作为判据输入**)+ 🔴 **全树机器扫描读数**(**T21 追加轮自跑**:共 **579** 文件 · **≥300 = 35** · **295–299 = 21** · 合计 **56**)+ **对上游(§C55.3 的 578 / 35 / 20 / 55)的差额逐条归因**(新件 `FragmentGroupAction.tsx` ⇒ 文件数 +1;`FeedFragmentList.test.tsx` 297 → **299** ⇒ 295–299 档 +1;**≥300 档不变**)+ 🔴 **逐字纪律**「**手列清单一律不得作为判据输入;以全树脚本扫描为唯一来源**」+ 手列清单漏掉的两个恰 300/300 件 + T22 的两张表要求。
4. **`:848` 未做清单的 `#46 → 批 8` 行** —— 原文(保留):「- 🔴 **`update_fragment_group`(#46) 的「接线」那一半**(T21 实测前端命中 0)→ **批 8**。」
   加注:**本行从「未做」清单撤回、移入「交付」**;并**逐字登记本条完整来历**(① 计划侧正确且预警过 → ② T20 计数口径吞掉第 11 个名字 → ③ **由 T21 的仪器发现** → ④ 控制方 §C56.2 判为批 7 交付缺口 → ⑤ T23 补做(含一次 T23 自己质疑、控制方改判的 **feed 地形返工**)→ ⑥ T21 追加轮更正)。
5. **`:810` 计划勘误段末(第 1–12 例)** —— 原文(保留):整段①②…⑫与出处行。
   加注:🔻 **补登计划方第 13 例**(§C56.3)= 计划 `:2299`/`:532` 写 `{ id, groupId }`,Rust 真身 `commands_fragments.rs:141-145` 是 `fragment_id`/`group_id` ⇒ Tauri 2 camelCase ⇒ **JS 必须是 `{ fragmentId, groupId }`**(实际落库 `FragmentGroupAction.tsx:92`);教训「计划里凡 IPC 载荷键名都须用既有同族调用点对拍」;并注明**本段标题的「12」按本注读作 13 例**。
6. **同上(新开一块,单独标注序列)** —— 🔻 **另登记一条「控制方序列」的教训**(§C57.2;**控制方派单类错误在本批的第 14 例**):派单措辞「复用同文件既有形态」把 `promote_fragment_to_note`(**笔记去向 = container**)的先例误用为 `update_fragment_group`(**碎片归组 = feed**)的先例 ⇒ 由 T23 质疑、控制方取证后改判;🔴 **纪律逐字**:「复用同文件既有形态」**必须附带「该形态服务于哪个流程」**——**同一文件里的两个流程可以有不同的语义前提**;并**逐字标明它属控制方序列、不得写成「计划方第 14 例」**。

【T21 追加轮自跑读数(非转述)】
- 全树扫描:**579 文件 / ≥300 = 35 / 295–299 = 21 / 合计 56**(口径 `countLines()`,域 `app/src/**/*.{ts,tsx}`;文件逐条已存 `tmp/t21/probe-t21b.mjs` 输出)。
- T23 三条提交:`125eec85`(4 路径,parent `d0ada786`)· `5f662811`(1 路径,parent `125eec85`)· `5d59e332`(3 路径,parent `5f662811`);行数 `FeedFragmentList.tsx` **299** · `FragmentGroupAction.tsx` **155** · `FeedFragmentList.test.tsx` **299** · `batch7UiWiring.test.tsx` **218**。

【门禁读数(串行,工作树;与上游逐条对账)】
- `docs-check` ⇒ **exit 0** ·「扫描 **281** / 检查 **181**」⇒ 与上游 **281/181 逐字一致**
- `line-limits --full` ⇒ **exit 0** ·「>600 硬限 **0** · 301–600 档 **121** · 登记条目 **121**」⇒ 与上游**逐字一致**
- `check-command-registry` ⇒ **exit 0** ·「定义 **311** / 注册 **311** / 重复 **0**」⇒ 与上游**逐字一致**
- `git diff --numstat -- v0.22` ⇒ **26 / 0**;`^-` 行数 = **0**
- 🔴 **结构自证**:本文件 `#`–`####` 标题逐条对拍 = **HEAD 20 / 工作树 20 / 差异 0 处**;v0.22 行数 **958 → 984**

【诚实边界】
- 🔴 **「从『未做』清单移除」按「就地在原行下追加撤回声明」实现**,**未字面删行** —— 与规格侧同一理由:本批的**「原文 + 就地加注」体例**(本轮硬要求重申)优先于字面删除;撤回转义由「🔻 收口更正」**显式且唯一**。
- 全树扫描的**域不含 `scripts/**` 与 `.css`**(与 `line-limits.mjs` 的 `SOURCE_EXT` 一致)⇒ 该两个数**只在 `app/src/**/*.{ts,tsx}` 域内成立**;`scripts/check-bundle-budget.mjs`(300/300)**不在该域**,它只出现在上游的手列清单里。
- 计划勘误**第 13 例的键名更正**由控制方 §C56.3 登记;T21 只**落账**并核了 Rust 真身与前端实际载荷(`commands_fragments.rs:141-145` / `FragmentGroupAction.tsx:92`),**未**回溯计划文件(计划文件属 E1 写集)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant