|
1112
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
|
1776402871
|
Edit
Delete
|
|
1113
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
{"Commits":[{"Sha1":"8a95110c2 {"Commits":[{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"}],"HeadCommit":{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...8a95110c2f089d5e800363910dee9bd22993258c","Len":1}...
|
1776402871
|
Edit
Delete
|
|
2003
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
|
1778625303
|
Edit
Delete
|
|
1134
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
|
1776410323
|
Edit
Delete
|
|
1135
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"280c26d50 {"Commits":[{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"}],"HeadCommit":{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/8a95110c2f089d5e800363910dee9bd22993258c...280c26d501e997899fd203579d774521be2fe166","Len":1}...
|
1776410323
|
Edit
Delete
|
|
1136
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"5c3113137 {"Commits":[{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"}],"HeadCommit":{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/280c26d501e997899fd203579d774521be2fe166...5c31131371cccf1842c6ed8aa4df13df09861249","Len":1}...
|
1776867159
|
Edit
Delete
|
|
1207
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"fa2dbcdf3 {"Commits":[{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"}],"HeadCommit":{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/5c31131371cccf1842c6ed8aa4df13df09861249...fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Len":1}...
|
1777044501
|
Edit
Delete
|
|
2004
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
|
1778625303
|
Edit
Delete
|
|
29963
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/b7-dev-resident-runtime
|
0
|
|
1789445393
|
Edit
Delete
|
|
29964
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/b7-dev-resident-runtime
|
0
|
{"Commits":[{"Sha1":"b7e62c57b {"Commits":[{"Sha1":"b7e62c57bb8298ef54a679a431dbfdf218814dfe","Message":"chore(reports): bind the ai-gateway first-start evidence @ c27c06a\n\nliveliness / readiness 200(db: Not connected)、带 master key 的 /v1/models\n200 返回 platform-default-chat、无 key 401 / 错 key 400;/v1/chat/completions\n401 是供应商侧 replace-me,链路本身通。干净树绑 c27c06a。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T10:07:05-07:00"},{"Sha1":"c27c06ab1c884ee06c2e783c7b514e98163a2840","Message":"fix(stack): stop injecting an empty DATABASE_URL into ai-gateway\n\nLiteLLM 见到空串即以 \"unsupported scheme '\u003cmissing scheme\u003e'\" 退出,而\n`DATABASE_URL: ${LITELLM_DATABASE_URL:-}` 在变量未设时注入的正是空串。\n这个定义从 2026-09-11 写下起就没被验证过——stack-up 记录里 ai-gateway\n一直是\"未起\",所以缺陷一直没暴露。\n\n- compose.yaml:ai-gateway 不再声明 DATABASE_URL(无 DB 模式)。\n- overlays/ai-gateway-db.yaml:要 DB 模式改为显式叠加,且 LITELLM_DATABASE_URL\n 必填;注释写明不得指向 platform_aigateway_*(M7 权威库)。\n- stack/README:镜像行改为 digest 实况,litellm tag 已首次 pull 核实;\n 两处\"ai-gateway 未起\"改为 12 服务全跑。\n- CLAUDE.md stack 行补 2026-09-14 增量,只引机器证据。\n\n本轮只动 D-7 采纳组件,未动 M7 模块(仍 state=shape / blocked_by DEC-007)。\n供应商密钥仍是 replace-me,真实模型调用返回供应商 401,已在记录里写明。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T10:06:42-07:00"},{"Sha1":"01188daa7965c1cfa90fdc9f8aabdf96a1892d14","Message":"chore(reports): bind the B-7 resident-runtime evidence @ c75f22a\n\n七 profile 装载、内核与七个模块 /health 全 200、无凭证决策端点 401、经 Caddy\n入口 200;容器 restart unless-stopped、healthy。provenance 干净树绑 c75f22a。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T09:52:17-07:00"},{"Sha1":"c75f22a20fb62553cb0b0556dbdce8fbd6087757","Message":"feat(stack): run the platform runtime as a resident dev container (B-7)\n\n核实报告的 B-7 记「没有可被 HR / OS 调用的地址」:compose 的 runtime 一直是\n候选注释块,七个 platform_\u003cm\u003e_dev 库建了但零张表。本次启用该服务并把它跑起来。\n\n- compose.yaml:启用 runtime,镜像改 ${PLATFORM_RUNTIME_IMAGE:?};补上原模板\n 缺的七个 DATABASE_URL_\u003cMODULE\u003e——模板写于一模块一库之前,只有内核三个 URL,\n 按原样启用四个 authority 模块会连不上自己的库。\n- overlays/dev.yaml:restart unless-stopped + 回环 53001。\n- provision/redis-dbs.json:登记逻辑库 14(七 profile 同进程只能独占一个)。\n- runbook §2 / stack README:dev 常驻形态与起停命令。\n\n供给与验收留在 docs/B-7-dev常驻运行时启动记录-2026-09-14.md;环境变量文件在\n仓外 .secrets/,不入 git。ai-gateway 容器因 ghcr 拉取经本机代理被 reset 未起,\n已在记录里写明,不冒充全量。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T09:51:41-07:00"}],"HeadCommit":{"Sha1":"b7e62c57bb8298ef54a679a431dbfdf218814dfe","Message":"chore(reports): bind the ai-gateway first-start evidence @ c27c06a\n\nliveliness / readiness 200(db: Not connected)、带 master key 的 /v1/models\n200 返回 platform-default-chat、无 key 401 / 错 key 400;/v1/chat/completions\n401 是供应商侧 replace-me,链路本身通。干净树绑 c27c06a。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T10:07:05-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/78edacc6e101fa24876cac37302ffb425fd94597...b7e62c57bb8298ef54a679a431dbfdf218814dfe","Len":4}...
|
1789445393
|
Edit
Delete
|
|
1116
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
|
1776406532
|
Edit
Delete
|
|
1117
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
{"Commits":[{"Sha1":"c438f31da {"Commits":[{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"}],"HeadCommit":{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Len":1}...
|
1776406533
|
Edit
Delete
|
|
2005
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
|
1778625303
|
Edit
Delete
|
|
32721
|
5
|
5
|
5
|
82
|
0
|
0
|
refs/heads/feat/c16-ticket-discussion
|
1
|
|
1790173656
|
Edit
Delete
|
|
32722
|
5
|
5
|
5
|
82
|
0
|
0
|
refs/heads/feat/c16-ticket-discussion
|
1
|
{"Commits":[{"Sha1":"bcb6c98e6 {"Commits":[{"Sha1":"bcb6c98e6772b398d9ba016acab501dc10a7a8ac","Message":"test(discussion): 双后端协作讨论真实 HTTP 验收与治理登记\n\n- 两后端 ticket-discussion.acceptance.test.ts:真实 PG/Redis + OIDC 验签 + 本地假平台;打开/发送/重放/同步/撤回、同租户无关用户同一 404、开关关闭 503 NOT_CONFIGURED、平台宕机 503 UNAVAILABLE、非法入参 400、TicketMessage/outbox 零写入、service: 主体 403\n- governance.registry.json tickets 域登记新入口文件、模块接线、测试、校验与租户入口、web 契约消费断言\n- check:runtime 构建并单测新包;turbo globalEnv 登记 PLATFORM_CONVERSATION_* 变量\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T07:12:38-07:00"},{"Sha1":"ba366e7bc6d75d92272c5fc89a75e8f9156206a7","Message":"feat(web): 工单详情新增协作讨论面板\n\nDiscussionPanel 位于附件面板之后:5 秒轮询、按平台 sequence 展示、墓碑显示已撤回、本人消息可撤回、clientMessageId 用 crypto.randomUUID();未启用 / 不可用给出明确提示;API helper 类型全部来自 contracts。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T06:46:20-07:00"},{"Sha1":"942c938b99292a4bdb4d41957be84ea1ca685291","Message":"feat(discussion): 双后端接入工单协作讨论入口与蓝图登记\n\n- NestJS TicketDiscussionModule / Fastify ticketDiscussionRoute:GET discussion、POST messages(201/200 透传)、POST retract;ticket:read / ticket:reply + 工单访问检查(同一 404)+ contracts 校验\n- 错误经 discussionHttpError 单源映射;本仓零写入(无 schema / 迁移 / outbox,不碰 TicketMessage)\n- docs:ticket-discussion 蓝图、owner-matrix 与词典登记;两份 .env.example 记录 dev/test 受信子系统开关\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T06:37:27-07:00"},{"Sha1":"df4db6d852d43442b1dc3c28f069575857c4c3d5","Message":"feat(discussion): 新增平台会话账本客户端包与协作讨论契约\n\n- @repo/collaboration-conversation:受信子系统 HS256 短期令牌(仅 PLATFORM_CONVERSATION_TRUSTED_SUBSYSTEM_ENABLED=1 时签发)、幂等建会话、成员懒加入与 409 重试一次、租户映射失败关闭、redirect manual、DISCUSSION_* 错误映射单源、内存假平台\n- contracts:讨论查询/发送/撤回 schema、页与回执形状、错误码\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T06:06:48-07:00"}],"HeadCommit":{"Sha1":"bcb6c98e6772b398d9ba016acab501dc10a7a8ac","Message":"test(discussion): 双后端协作讨论真实 HTTP 验收与治理登记\n\n- 两后端 ticket-discussion.acceptance.test.ts:真实 PG/Redis + OIDC 验签 + 本地假平台;打开/发送/重放/同步/撤回、同租户无关用户同一 404、开关关闭 503 NOT_CONFIGURED、平台宕机 503 UNAVAILABLE、非法入参 400、TicketMessage/outbox 零写入、service: 主体 403\n- governance.registry.json tickets 域登记新入口文件、模块接线、测试、校验与租户入口、web 契约消费断言\n- check:runtime 构建并单测新包;turbo globalEnv 登记 PLATFORM_CONVERSATION_* 变量\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T07:12:38-07:00"},"CompareURL":"luoanwu/juhai-ai-work-order-system/compare/43c911bff4123b2a3d62b2845249caec3b3235db...bcb6c98e6772b398d9ba016acab501dc10a7a8ac","Len":4}...
|
1790173656
|
Edit
Delete
|
|
29912
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/camera-console-20260912
|
0
|
|
1789445230
|
Edit
Delete
|
|
29913
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/camera-console-20260912
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"2e1790389ad8e1d76caadd4d3cad5ea87ad7fb3a","Message":"docs(release): record camera console deployment and live QA\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-11T22:49:33-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...2e1790389ad8e1d76caadd4d3cad5ea87ad7fb3a","Len":0}...
|
1789445230
|
Edit
Delete
|
|
29965
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/cl-5-publish-client-fact
|
0
|
|
1789445395
|
Edit
Delete
|
|
29966
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/cl-5-publish-client-fact
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"eb3cf2c38148bfc0dac9ab1e8cdd5733ae8aa13f","Message":"chore(reports): rebind to 64914b9 and refresh the foundation audit snapshot\n\nThe audit snapshot that the MS-4 exit condition cites had not been rerun\nsince 2026-09-05 -- before the decision meeting. It still reported 2 DECs\napproved and 30 pending against today's 32/0, and still raised\nFACT_DECISIONS_PENDING_OR_UNKNOWN, which that meeting resolved. Refreshed\nhere and in 基础/reports/基础目录统一审计.latest.json (the source copy,\noutside version control).\n\nStatus stays BLOCKED. Seven blockers persist, INVENTORY_INVALID is new\n(企业 IdP lacks 开发计划.md). Each is now attributed in plan deviation #32,\nwhich also records that the cited \"19/19\" denominator does not exist in\nthe report at all: it is 25 directories / 21 formal / 4 unregistered\ncandidates, with 20 of 21 formal entries document-complete.\n\nGate reports rebound to 64914b9 on a clean tree; `pnpm check` exits 0.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T21:26:55-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/main...eb3cf2c38148bfc0dac9ab1e8cdd5733ae8aa13f","Len":0}...
|
1789445395
|
Edit
Delete
|
|
37817
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
|
1791877967
|
Edit
Delete
|
|
37818
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"ff5ee3351 {"Commits":[{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},{"Sha1":"9631e78cfeee4abd1ccb7e7f777864e4815ded49","Message":"chore: 合并 main 引入权限说明与操作对象快照后端\n\n前端接入权限说明与操作记录操作对象前,先把 main 上的后端交付(a435000、536e36c、85e2c17)合入前端分支。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:33:36-07:00"},{"Sha1":"3973681b67a737220c25c4bc3f916ca2b687b5ee","Message":"feat(console): 重排个人中心并把登录记录改为当前登录加表格\n\n个人中心原先把邮箱、多因素验证放在最前,账号信息压在下方;登录记录每条都是一张大卡片,十几条记录要滚很久,已过期的登录也和当前登录一样醒目。本次按控制台其他页面的布局约定重排个人中心。\n\n实现内容:\n- 上排并列「我的账号」(名字首字头像 + 平台管理身份徽标)与「我的企业」(企业 / 你的身份 / 成员代码三列表格,手机上收窄内边距不必横向滚动)\n- 邮箱与多因素验证合并为「账号安全」卡片,左侧标题与说明、右侧内容,900px 以下上下排列;多因素验证面板与登录页共用,本次未改\n- 邮箱区域改用与多因素验证相同外观的状态摘要(未登记 / 未验证 / 已验证 + 投递状态);登记或发送验证邮件的表单点按钮后就地展开,展开后聚焦第一个字段,提交后无论成败都清除密码;「取消待处理的验证与恢复链接」改名为「作废已发出的邮件链接」并保持常驻(找回密码链接不体现在邮箱状态里)\n- 登录记录拆为「当前这次登录」单独一块(四个时间 + 期限规则)与「其他登录」表格(登录时间 + 编号缩写 / 状态 / 最近使用 / 自动退出于);表格时间用今天、昨天等简短写法,完整时间在悬停提示中\n- 已退出的登录不再显示退出按钮;已过期、已失效的登录仍可退出以撤销业务系统中残留的授权,按钮改为轻量样式,整行弱化\n- 退出确认弹窗底部改为「取消 + 确认退出」,补充最近使用时间,登录编号带名称与注解;账号标识同样带名称与注解\n- 单测改用新的邮箱按钮与字段名,新增「当前登录单独列出、已退出的登录不提供退出按钮」用例;acceptance-p11-t02 同步新的邮箱登记流程与已验证文案,acceptance-t05 依赖的类名与按钮名保持不变\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、224 项全部通过\n- 浏览器检查 1280 宽、375 窄屏与亮暗色,整页无横向溢出;邮箱登记表单与退出确认弹窗只打开查看,未实际提交\n- acceptance-p11-t02、acceptance-t05:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:28:12-07:00"},{"Sha1":"2508f797ba72291a981665d5f4fcc4fb86280af8","Message":"feat(console): 为技术细节中的编号补充名称与用途注解\n\n技术细节原先只列出编号,部分地方连名称都没有,普通使用者看不懂这串字符是什么、什么时候用得上。本次为各页面技术细节中的编号、版本和代码补充名称与一句用途说明。\n\n实现内容:\n- TechDetails 展开后先显示一句总说明:这些编号用于定位记录,日常不需要关心,反馈问题时可复制给管理员或技术支持\n- DescriptionList 每项新增可选 hint,在值下方显示灰色注解;有注解时值包在 .dlist__value 中,按值定位的测试不受注解文字影响\n- 新增 lib/tech-hints.ts 统一注解文案:对象标识、记录版本、账号标识与成员标识的区别、密钥编号、客户端标识与客户端代码的区别等\n- 工作台账号标识、程序接入新建密钥后的密钥编号、应用接入新建客户端后的客户端标识原先只露出编号,改为带名称的描述列表并加注解\n- 企业、账号、成员、部门、用户组、应用接入、应用开通、角色、授权、程序接入、程序身份、权限查询接入、操作记录、状态变更影响预览中的技术细节逐项补充注解\n- 同步 acceptance-p10-t01、acceptance-t03 中按记录版本值定位的选择器为 dd .dlist__value\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、223 项全部通过(暂时移开个人中心未提交改动后单独运行)\n- 浏览器检查应用接入客户端详情抽屉的技术细节注解显示正常;其余页面未逐页目测\n- acceptance-p10-t01、acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:27:34-07:00"},{"Sha1":"e5c32be5d8e106d727495fd92d5b3bf6ab2a3b4f","Message":"feat(console): 把权限查询接入改为分区详情抽屉并以选择代替粘贴标识登记\n\n权限查询接入页列表与详情只显示一串 UUID,登记时需要手动粘贴企业、应用、服务三个标识;系统过期后状态仍显示「正常」,管理员无法看出它的查询已被拒绝。本次按控制台已定的列表、抽屉与弹窗样式重排该页。\n\n实现内容:\n- 列表改为「查询的应用 / 所属企业 / 到期时间 / 状态」,应用名称是打开详情的按钮、整行可点;企业与应用名称各读取第一页(最多 100 个),读不到时回退为「类别 + 标识前 8 位」\n- 正常但已过期的系统显示「已过期」徽标并提示查询会被拒绝,正常且 3 天内到期时提前提醒;列表新增定制空状态\n- 详情抽屉分「基本信息(企业、应用、服务名称)/ 密钥说明 / 停用(危险区)」,四个标识与固定查询范围收进技术细节;停用默认收起为按钮,展开后勾选确认、可取消,停用后抽屉保持打开并把焦点留在抽屉上\n- 登记改为两步:平铺列表选正常状态的企业,再用单选卡片选该企业已启用的应用和应用下的服务,填写摘要与到期时间(输入框限定现在至 30 天后);底部为「重新选择企业 / 确认登记」,提交字段与原来一致\n- 公共样式 .card__actions 不再收缩,卡片说明较长时操作按钮保持一行;600px 以下卡片头部换行,按钮排到标题下方\n- 同步登记单测为按企业、应用、服务选择的流程,acceptance-t03 的 A11 改为点击应用名称打开详情、展开停用并等待停用后的说明\n\n验证:\n- npm run format:check、npm run lint:通过\n- npx tsc -b:通过\n- npm run test:26 个测试文件、223 项全部通过\n- 浏览器在演示环境查看 1280 宽、375 窄屏与亮暗色;演示环境未开启登记功能,登记流程用页面内临时拦截请求验证,提交字段正确且未写入后端\n- acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T23:49:35-07:00"}],"HeadCommit":{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},"CompareURL":"pengzhiyu/IAM/compare/3cf111b21a47760e5c71fc6b2fba96d882dbd3f1...ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Len":5}...
|
1791877967
|
Edit
Delete
|
|
37962
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"695ea4d16 {"Commits":[{"Sha1":"695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Message":"feat(console): 重排工作台与平台、企业、应用三个概览页\n\n四个概览页此前沿用早期布局:工作台只有两个入口,待办和应用用零散小卡片展示,功能入口不分组,与已改造的列表页风格不一致。本次按「上方状态卡片、下方两栏分组入口」统一四页布局。\n\n实现内容:\n- 工作台:三个并列入口「平台管理 / 应用 / 企业管理」,新增应用配色 entry--apps;应用管理员入口写明负责的应用,无身份的入口锁定并说明原因\n- 工作台新增「我的企业」可点表格(企业、你的身份,每次读取 10 条,满页时可加载更多),账号摘要放侧栏并链接个人中心,基本概念改为四格横排\n- 平台概览:「需要你关注」改为卡片,三类事项固定列出,没有内容时显示对勾与「目前没有。」,有内容时显示数量、最多 3 个名称与处理入口,读取失败只在该行重试\n- 企业概览:本企业的应用改为卡片内表格,停用的应用不可进入并注明原因;空状态改用公共 EmptyList\n- 应用概览:三步引导放进卡片,步骤之间用分隔线,右上角显示完成进度;任一步读取中或失败时不显示进度\n- 三个概览的功能入口统一用 overview-groups 两栏分组,窄屏改为上下排列;删除不再使用的待办卡片、应用卡片与一切正常提示条样式\n\n验证:\n- npm run typecheck、npm run lint、npm run format:check:通过\n- npm run test:27 个测试文件、234 项通过(同步修改平台、企业、应用概览单测,新增 home.test.tsx 4 项)\n- 浏览器检查 1280 宽、375 窄屏与暗色:四页无页面级横向溢出;待办与停用应用状态用页面内临时拦截 fetch 验证\n- 验收脚本未运行(脚本只依赖「工作台」标题与 .entry--locked,均已保留)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:50:19-07:00"},{"Sha1":"ceb5884bba8e1274c550348e99226f46614e6511","Message":"feat(console): 把应用定义独立成「应用」分组并统一权限相关命名\n\nIAM 面向多租户,一个应用登记后可由多家企业开通。原导航把应用的全局定义(登录客户端、受保护的服务、权限与资源规则)放在「平台管理」下,企业内的应用授权又叫「应用管理」,使用者难以分清权限为何不在应用层维护、改了会影响谁。\n\n实现内容:\n- 侧边栏改为「平台管理 / 应用 / 企业管理 / 应用授权」四组:平台管理只对平台管理员展示链接;新增「应用」分组(应用列表),平台管理员与应用管理员可见;原「应用管理」改名「应用授权」;网址保持不变\n- 应用详情网址仍在 /platform/applications 下,导航高亮、顶部上下文标识(「应用定义」)与面包屑(应用 › 应用列表)归入「应用」\n- 平台侧「应用接入」改为「应用列表」、「权限清单与资源规则」改为「权限定义与资源规则」,徽标改为「所有企业共用」,权限定义卡片与修改弹窗写明对所有开通企业生效\n- 企业侧「权限清单」改为「可用权限」,入口改为「修改权限定义」;工作台、平台概览、切换对话框、无权限说明、操作记录操作名称及相关提示同步新命名\n- 侧边栏测试改为可切换平台角色,新增平台管理员与应用管理员分组可见性用例;弹出面板测试先等待焦点进入面板再按 Esc,消除原有时序抖动\n- acceptance-t03、acceptance-p10-t02、acceptance-p10-t03 同步新的标签名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、230 项通过;侧边栏测试单独连续运行 5 次均通过\n- 浏览器经 5173 连接演示后端,在 1280 宽、375 窄屏及亮/暗色下检查四个分组、应用详情、企业可用权限与跳转、修改弹窗影响说明:正常\n- 应用管理员视角仅有单元测试覆盖(演示环境无应用管理员账号);验收脚本未运行\n- 「已在 N 个企业开通」需后端提供按应用统计的接口,本次未实现\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:36:58-07:00"},{"Sha1":"7a1bd50d627fb56ebd548956a8a05c61fd306f64","Message":"fix(console): 转义代码输入框 pattern 中的连字符\n\n浏览器按 v 模式编译 input 的 pattern,字符类末尾未转义的「-」会被判为非法正则,浏览器报错并直接跳过该格式校验。其余页面已使用转义写法,本次统一。\n\n实现内容:\n- 权限代码(新增权限、资源类型代码)、角色代码、程序身份代码、应用代码共 5 处 pattern 改为 \\- 转义,匹配规则不变\n\n验证:\n- 两种写法用 new RegExp(..., 'v') 编译通过\n- 浏览器中新增权限弹窗输入 Bad-Code 时 validity.patternMismatch 为 true\n- npm run format:check、npm run lint、npm run typecheck:通过;npm test:26 个测试文件、228 项通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:11:02-07:00"},{"Sha1":"54b1e1ee340da10ec01235cc9d1cf8d6ca22ca5c","Message":"feat(console): 把权限清单的新增与修改拆开并支持按行修改\n\n平台权限清单原先只有一个「新增或修改权限」入口,要修改已有权限必须手输准确的代码,输错会误建一项不能删除的权限;企业侧只读权限清单也看不出该去哪里修改。\n\n实现内容:\n- 平台权限清单每行增加「修改」:代码只读展示,名称和说明预填,内容未变不能保存,修改不再要求勾选确认\n- 未设置名称的权限名称框留空且可留空,只改说明时名称保持原样;已停用的权限也可修改名称和说明\n- 顶部按钮改为「新增权限」:代码与已有权限重复时拦下并引导到列表「修改」,新增仍需勾选确认\n- 企业侧应用权限清单在平台管理员或该应用的应用管理员登录时,页头显示「去平台修改权限」入口\n- 操作记录中 authorization.group_changed 改称「创建用户组」(后端只在新建用户组时写入)\n- 表格行末操作按钮新增 management-actions--end 靠右排列\n- acceptance-t03 改用「新增权限」按钮,并把提交按钮限定在弹窗内\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、228 项通过(新增修改模式与新增重复代码拦截用例)\n- 浏览器经 5173 连接演示后端实际保存:只填说明保存成功且名称保持原样、其余权限说明保留、清单版本逐次加 1;重复代码被拦下;企业侧入口跳转与说明显示正常\n- acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:10:34-07:00"}],"HeadCommit":{"Sha1":"695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Message":"feat(console): 重排工作台与平台、企业、应用三个概览页\n\n四个概览页此前沿用早期布局:工作台只有两个入口,待办和应用用零散小卡片展示,功能入口不分组,与已改造的列表页风格不一致。本次按「上方状态卡片、下方两栏分组入口」统一四页布局。\n\n实现内容:\n- 工作台:三个并列入口「平台管理 / 应用 / 企业管理」,新增应用配色 entry--apps;应用管理员入口写明负责的应用,无身份的入口锁定并说明原因\n- 工作台新增「我的企业」可点表格(企业、你的身份,每次读取 10 条,满页时可加载更多),账号摘要放侧栏并链接个人中心,基本概念改为四格横排\n- 平台概览:「需要你关注」改为卡片,三类事项固定列出,没有内容时显示对勾与「目前没有。」,有内容时显示数量、最多 3 个名称与处理入口,读取失败只在该行重试\n- 企业概览:本企业的应用改为卡片内表格,停用的应用不可进入并注明原因;空状态改用公共 EmptyList\n- 应用概览:三步引导放进卡片,步骤之间用分隔线,右上角显示完成进度;任一步读取中或失败时不显示进度\n- 三个概览的功能入口统一用 overview-groups 两栏分组,窄屏改为上下排列;删除不再使用的待办卡片、应用卡片与一切正常提示条样式\n\n验证:\n- npm run typecheck、npm run lint、npm run format:check:通过\n- npm run test:27 个测试文件、234 项通过(同步修改平台、企业、应用概览单测,新增 home.test.tsx 4 项)\n- 浏览器检查 1280 宽、375 窄屏与暗色:四页无页面级横向溢出;待办与停用应用状态用页面内临时拦截 fetch 验证\n- 验收脚本未运行(脚本只依赖「工作台」标题与 .entry--locked,均已保留)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:50:19-07:00"},"CompareURL":"pengzhiyu/IAM/compare/ff5ee33515b0a21b6ba738d00c52373fabfaa50d...695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Len":4}...
|
1791901432
|
Edit
Delete
|
|
38012
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"e89aafa0c {"Commits":[{"Sha1":"e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Message":"style(console): 把列表状态的待办提示放到状态徽标同一行\n\n平台「所有账号」的待激活账号、「企业列表」的待设置所有者企业,提示写在状态徽标下方另起一行,使这些行比其他行高,列表参差不齐。\n\n实现内容:\n- 公共 OpenableRow 的状态单元格改为徽标与提示同一行(inline-flex,列太窄时整体换行),提示取消上边距\n- 同步更新相关注释中提示位置的描述\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 252 项测试全部通过\n- 浏览器(5173 Vite,连接演示后台):1280 宽下所有账号 20 行(含 4 个待激活)、企业列表 6 行(含 1 个需要设置所有者)行高均为 56px;375 宽下所有账号行高同为 56px,页面无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:37-07:00"},{"Sha1":"2c8b658c8ba637573d666bec33eda68ffe8673dc","Message":"feat(console): 改造多因素验证绑定与登录验证码输入并加入成功标记\n\n绑定认证器页的剩余时间只是二维码下一行小字,验证码是普通输入框还要手动提交,「取消绑定并清除」与确认按钮并排却会作废本次绑定;登录验证成功后直接跳走,没有完成反馈,各处倒计时也只有文字。\n\n实现内容:\n- 新增 CodeInput:外观 6 个数字框,底层一个透明原生输入框,保留粘贴、one-time-code 自动填充与读屏名称;只收数字,带空格的粘贴也可用(不设 maxLength 以免截断),退格删除最后一位,输满调用一次完成回调\n- 绑定页与登录验证都改用 6 格并输满自动提交;首次绑定未设好正式密码时不提交并提示,验证码保留;恢复码仍用普通输入框,切换后焦点移到新输入框\n- 绑定剩余时间改为二维码下方的大字「分:秒」(成功色,最后 1 分钟提醒色)与时限说明,读屏只在剩不到 1 分钟时提醒一次;「确认成功后旧认证器与旧恢复码立即失效」移到确认按钮下方,仅重新绑定时显示\n- 「取消绑定并清除」改为左上角「← 取消绑定」,点击后就地展开确认,确认后才通知服务端作废\n- 宽屏两栏时右栏与二维码托板垂直居中,右栏更高时仍从顶部排列\n- 新增 SuccessMark:登录流程验证成功或绑定完成后面板换成描画对勾,onComplete 仍立即调用并告知外层,MfaPage 与刷新身份并行至少停留 640ms;减少动态效果时不描画不停留\n- 新增 CountdownRing 与 useCountdown:非登录流程的验证剩余时间、验证冷却、登录限流等待在文字旁加 14px 进度环,最后 20% 改用提醒色\n- motion.md 补充成功标记与进度环;原有 MFA 测试中被自动提交取代的点击步骤已删除,冷却测试改为切到假计时器后补满第 6 位;新增 6 格输入、倒计时、未设密码不提交、取消确认、成功标记与进度环测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 252 项测试全部通过;工作区完整 npm run check(含生产构建)通过\n- 浏览器(5173 Vite,1280 宽):用户已在演示环境完成真实绑定并登录,绑定时使用的是改造过程中的哪一版页面未确认;另在页面内临时拦截 MFA 接口、使用虚构二维码与密钥,确认正常、输入一半、取消确认、最后 1 分钟变色与首次绑定(含正式密码)布局,未发出真实绑定请求\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:26-07:00"},{"Sha1":"549ada99615519240dea8d63657dc02a35cdd7f7","Message":"feat(console): 为移除用户组成员和退出其他登录加入退场与高亮提示\n\n用户组「已选成员」点移除后整行瞬间消失,下面的行直接跳上来,焦点也会丢失;个人中心退出其他登录后,弹窗关闭时看不出列表里哪一行变了。\n\n实现内容:\n- 新增公共 useLeaving:数据立即更新,被移除的项在原位置保留一个退出时长(200ms,减少动态效果 120ms)并标记退场,重新加回的项不再退场\n- 用户组已选成员改为三层结构,移除时淡出并以 grid-template-rows 收起高度,退场中的行 inert;焦点移到相邻一行的「移除」,没有其他成员时落到列表容器\n- 个人中心退出其他登录成功后记录这次登录,弹窗关闭时对应行以 .is-updated 高亮一次\n- motion.md 新增「移除退场与退出登录提示」一节;补充 useLeaving 与焦点移交测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 246 项测试全部通过\n- 浏览器:用户在演示环境中自行查看了用户组移除与退出登录高亮效果\n- 未运行生产构建与验收脚本\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:32:42-07:00"},{"Sha1":"5f34b48affdaccbdce04811a2e8013ffccd3b335","Message":"feat(console): 加入标签下划线滑动、概览页错落入场与架构图平滑缩放\n\n第一档动效之后补第二档观感改进:详情页标签下划线原先随整页重挂载瞬间出现,概览页首屏一次性整体出现,组织架构图缩放瞬间跳变。本次让三处都有连续的过渡,不新增也不修改动效令牌。\n\n实现内容:\n- 新增公共 TabNav/TabPanel:整条标签栏一条下划线,用 translateX + scaleX 对准当前标签,切换时滑动 --dur-base;首次定位与宽度变化直接就位;应用详情、企业详情改用它\n- 带标签的详情路由加 handle.tabbed,壳层改用 usePageKey:切换标签不再整页重挂载,页头与标签栏保留、不重新读取详情、焦点留在标签上、不回到页顶,标签内容由 TabPanel 淡入\n- 工作台与平台、企业、应用三个概览页首屏区块依次 rise-in,每档 35ms;入口卡与功能分组按组内顺序错开;useFirstEntrance 保证本次打开控制台后每页只播放一次,只用 backwards 填充不影响悬停上浮\n- 平台概览「需要你关注」中没有事项的类别,对勾以 stroke-dashoffset 描画\n- 组织架构图保留 CSS zoom 布局,缩放时以视野中心为锚点调整滚动,并用 Web Animations 从新旧实际宽度之比过渡到原样(180ms);连续点击取消上一段并按当前显示大小继续;测量根节点而非占满宽度的列表\n- 减少动态效果时:下划线不滑动、入场不错开、对勾直接显示、缩放只保留中心锚点\n- motion.md 新增「标签滑动、概览入场与架构图缩放」一节;新增标签栏定位与首屏入场判断测试\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 244 项测试全部通过;构建仅有代码包体积提示\n- 浏览器(5173 Vite,1280 宽):应用详情切换标签时下划线 transform 从 translateX 12px 逐帧过渡到 278px,页头与标签栏为同一节点、未重新请求详情,真实点击后焦点留在标签;企业详情标签同样滑动;四个概览页入场延迟依次为 0/35/70/105/140ms,再次进入不重播;对勾描画 dashoffset 从 11 过渡到 0;架构图在页面内临时拦截接口提供 33 个虚构部门,放大缩小时中心部门不变、偏移随比例缩放,连续三次放大结果正确且无残留动画,未写入演示数据\n- 减少动态效果模式:未在浏览器中模拟,仅按样式与代码逻辑确认\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T19:25:14-07:00"},{"Sha1":"4f344b38d882e1015d12e589c84abe698a527368","Message":"fix(console): 后端未返回开通企业数时概况不再出错\n\n应用概况默认详情接口一定返回 tenant_counts;连接尚未执行 V30 迁移的后端时字段缺失,概况标签直接抛错白屏。改为按「暂时无法获取」处理,不显示为 0,整页正常展示。\n\n实现内容:\n- ApplicationDetail.tenant_counts 改为可选,TenantReach.counts 允许为 null,表示后端没有返回统计\n- 「开通情况」卡片在没有统计时只显示「暂时无法获取开通企业数,可以稍后点「重新统计」再试。」并保留重新统计按钮\n- 权限弹窗的开通企业说明在没有统计时给出不带数量的共享说明并注明暂时无法获取\n- 新增后端缺少统计字段时的概况与文案测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 241 项测试全部通过\n- 浏览器(5173 Vite 加载的工作区版本,同时含后续动效改动;连接尚无 V30 的演示后台):sales 应用概况正常打开,「开通情况」显示暂时无法获取\n- 未运行生产构建与验收脚本\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T19:24:45-07:00"}],"HeadCommit":{"Sha1":"e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Message":"style(console): 把列表状态的待办提示放到状态徽标同一行\n\n平台「所有账号」的待激活账号、「企业列表」的待设置所有者企业,提示写在状态徽标下方另起一行,使这些行比其他行高,列表参差不齐。\n\n实现内容:\n- 公共 OpenableRow 的状态单元格改为徽标与提示同一行(inline-flex,列太窄时整体换行),提示取消上边距\n- 同步更新相关注释中提示位置的描述\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 252 项测试全部通过\n- 浏览器(5173 Vite,连接演示后台):1280 宽下所有账号 20 行(含 4 个待激活)、企业列表 6 行(含 1 个需要设置所有者)行高均为 56px;375 宽下所有账号行高同为 56px,页面无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:37-07:00"},"CompareURL":"pengzhiyu/IAM/compare/695ea4d16f5066a81e3808b0ba4432b2a69cbd87...e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Len":14}...
|
1791948977
|
Edit
Delete
|
|
38139
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"1bcbe8d10 {"Commits":[{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},{"Sha1":"9653ba1c28cf197bb8f493be032cd9d7017c5b0b","Message":"feat(console): 加入数字滚动、骨架交叉淡入、保存按钮变形与通知叠放\n\n控制台质感改造第 4 批。原先数字直接出现、骨架被内容硬切替换、保存成功只靠右下角通知告知、多条通知竖排挡住右下角内容。本次为这四处加入过渡,请求时机不变。\n\n实现内容:\n- 新增 CountUp:以 @property --count 整数插值、CSS 计数器绘制,挂载时从 0、之后从旧值滚到新值(--dur-count 600ms);读屏与文本读取始终是最终值;只用于平台概览待办数、应用概览可分配权限数与应用开通情况\n- ResourceView 外层改为恒定存在的 display: contents 容器:骨架出现过(等待超过 160ms)的那次加载,骨架残影在原位置模糊淡出、内容淡入;组件首次换上内容时表格前 8 行依次上浮(--stagger-row 40ms);残影只在骨架处于块级容器时出现,已高亮的行不参与\n- useMutation 增加 hold 选项与 saved 状态:成功后停留 SAVED_HOLD_MS(600ms)再执行成功回调,停留中卸载表单立即执行;Button 增加 saved/savedLabel,显示 --success-fill 实底、描画对勾与「已保存」,提交中与已保存时宽度以 WAAPI 过渡;接入 13 处「保存…」按钮(确认启用、确认撤销等按钮不变)\n- 通知改为叠放:后层上移 10px、缩小 5%、与最前一条等高且隐去内容,只露出前 3 层;指针移入或焦点进入时按各自高度展开并暂停全部计时;两个播报区共用叠放顺序\n- 新增令牌 --dur-count、--stagger-row、--success-fill(既有动效令牌未改);authorization-scopes 的 min-width 规则覆盖新外层;motion.md 补充四项动效并登记按钮宽度、通知高度为宽高动画例外\n\n验证:\n- npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功;新增 motion-feedback.test.tsx 5 项(已保存停留与卸载、通知叠放与悬停暂停、骨架换内容的 rows/fade/不播放、数字回退显示)\n- 浏览器实测:sales 应用开通情况数字逐帧采样为 0→1→2;所有账号页延迟读取 700ms 时残影与骨架位置宽度一致并在结束后移除,前 8 行延迟 0–280ms,再次加载只淡入;部门编辑表单在页面内拦截写请求返回成功(未写入演示数据),按钮经提交中到「✓ 已保存」,两次宽度过渡均触发,停留后抽屉关闭并高亮该行;通知在桌面宽度叠放、悬停展开,375 宽暗色下叠放正常且无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:14:53-07:00"},{"Sha1":"0d4c13bbd0341fb82dbea0b33c13a3a13d5a3abd","Message":"fix(console): 预留滚动条位置后不再重复补偿弹层锁定宽度\n\n上一提交给根元素设置了 scrollbar-gutter: stable,打开对话框或抽屉锁定滚动时仍按滚动条宽度给 body 加右内边距,页面内容与上下文带右侧的搜索入口会左移 15px。\n\n实现内容:\n- useScrollLock 在浏览器支持 scrollbar-gutter 时补偿值为 0,不支持时沿用原来按滚动条宽度补偿的做法\n- data-scroll-locked 标记与锁定计数不变\n\n验证:\n- 浏览器实测所有账号页(经典滚动条、页面可滚动):打开与关闭账号详情抽屉前后,搜索入口与搜索框位置不变,--scrollbar-compensation 为 0\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:57:10-07:00"},{"Sha1":"cf32ed31e26dd552caa280de1996b4f23da1123e","Message":"feat(console): 精简目录工具栏为搜索框与状态分段切换\n\n目录工具条原先由带标签的输入框、状态下拉框、「搜索」按钮、常驻的「清除筛选」和文字刷新按钮组成,占位多且需要两步才能筛选。改为回车即搜索的搜索框、选中即生效的状态分段,次要操作收进图标按钮与菜单。\n\n实现内容:\n- DirectoryFilters 改为带放大镜的搜索框(占位文字即无障碍名称,回车生效,有内容时框内出现「清空搜索内容」);不合规输入不发请求,提示以 role=alert 显示\n- 新增 StatusSegments:原生单选组(名称「状态筛选」),选中即生效并带上当前搜索词,选中白底平移到新选项;counts 只在数据全在前端时传入(可用权限页)\n- 「清除筛选」只在有生效条件时出现,点击后焦点回到搜索框;apply 增加第三个参数 search/status/clear,调用方只在回车搜索时把焦点移到结果区\n- 新增 DirectoryTools:刷新改为图标按钮,次要操作进入「更多操作」菜单;平台企业列表的「按标识打开」收入菜单;新增 more 图标\n- 删除通用的「不区分大小写」提示,有实际信息的说明以一行小字放在工具条下方;窄屏搜索框占满一行,分段可横向滚动并收窄选项间距\n- 成员、平台企业与账号、用户组、操作记录、配置目录、角色权限清单等页面改用新组件;设计规范补充「工具条精简」,动效清单新增「状态分段切换」\n\n验证:\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功;management-integration 新增分段即时生效、清除筛选出现与焦点、清空按钮与不合规输入等用例,application-management、authorization-management 改为回车搜索\n- 浏览器实测企业列表:状态分段立即生效且焦点留在分段,回车搜索后焦点移到结果,搜索词与状态可叠加,清除筛选后恢复并回到搜索框,更多操作菜单含「按标识打开」;可用权限分段数量为全部 5 / 正常 4 / 已停用 1;375 宽暗色下五个状态可放下且页面无横向溢出\n- 验收脚本 acceptance-p10-t01、p10-t02、t02、t03、t04 已同步为回车搜索、点击分段和打开更多操作菜单:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:53:14-07:00"},{"Sha1":"77f8300377a586c241661e9e749fbc3fe0f69347","Message":"fix(console): 修复标签页内容贴边与滚动条消失导致的页面跳动\n\n企业详情「成员」「应用」标签里的平台提示条与下方卡片之间没有间距;列表筛选后结果变短、经典滚动条消失时,页面可用宽度变化 15px,居中内容与上下文带右侧的搜索入口左右跳动。\n\n实现内容:\n- .tab-panel 改为纵向排列,块间距 var(--space-5),与 management-stack 一致;应用详情各标签只有单块内容,不受影响\n- html 设置 scrollbar-gutter: stable,始终预留滚动条位置;系统使用覆盖式滚动条时没有影响\n\n验证:\n- 浏览器实测企业详情成员、应用标签:提示条与卡片间距为 20px;应用详情四个标签布局不变\n- 浏览器实测所有账号页依次切换五个状态:移除修复时搜索入口在两个位置间偏移 15px,加上修复后位置不变\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行;与页面宽度相关的断言均为内容不超出窗口,预留滚动条不会使其失败\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:52:56-07:00"}],"HeadCommit":{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/e89aafa0cfa32442a18b91a9e6e892cb485fc2ff...1bcbe8d10af01d2081b561a4531c4549a72387bd","Len":20}...
|
1791990986
|
Edit
Delete
|
|
38474
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"d2ff1f1d1 {"Commits":[{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},{"Sha1":"1079b27dfca2ad1535dbab213431ca3895478780","Message":"feat(console): 支持按邮箱邀请平台管理员\n\n平台管理员原先只能从已有账号中添加,而新账号只能通过企业邀请产生,导致想增加平台管理员必须先把对方拉进某家企业,没有邮件服务时则根本加不了。后端已提供平台级邀请,前端随之接入。\n\n实现内容:\n- 平台管理员页新增「邀请管理员」(主要入口),原「添加管理员」在平台侧改名为「添加已有账号」并说明适用场景\n- 邀请表单:邮箱、管理职责(不预选,平台管理员或应用管理员)、应用管理员的负责应用、生效与截止时间、确认勾选;邮件不可用时说明原因并禁用表单\n- 后端错误码分别说明:SELF_INVITATION、INVALID_INPUT、INVITATION_PENDING、INVITATION_NOT_APPLICABLE、LIMIT_EXCEEDED;冲突后「重新填写」并刷新待接受列表\n- 新增「待接受的邀请」列表:邮箱、管理职责与应用名称、邀请有效期,管理职责已过截止时间的标注提示;可按读到的版本撤销,409 时关闭并刷新列表\n- WriteError 新增 conflictAction,允许新建类表单改写冲突按钮文字\n- 激活页与登录页文案改为通用的「接受邀请」,成功提示说明含管理职责时需要按提示开通两步验证\n\n验证:\n- npm run check(格式、lint、类型检查、测试、构建):通过,测试 279 项,含新增 platform-invitations.test.tsx 5 项\n- 浏览器(Vite + 页面内模拟接口):发送邀请后列表新增记录;邮件不可用时表单禁用并显示说明\n- 未与真实后端联调,未验证真实邮件投递与收件人接受邀请流程\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:58-07:00"},{"Sha1":"18ddef4d5ee7662de116717dc7970482b123e033","Message":"feat(console): 开通企业时填写名称并支持修改企业名称\n\n开通企业原先只能填企业代码,之后各处只能靠代码辨认企业。后端已支持开通时必填 displayName、平台管理员与企业所有者改名,前端随之接入。\n\n实现内容:\n- 开通企业弹窗新增必填「企业名称」,按后端同样的规则预检(去首尾空白后 1—160 个 Unicode 字符,拒绝控制字符与行、段落分隔符),提交时去掉首尾空白;成功卡片显示企业名称\n- 平台企业详情「基本信息」提供「设置名称 / 修改名称」,已归档企业不提供入口\n- 企业概览页头仅对本企业所有者显示改名入口;企业版本取自 GET /api/v1/me/tenants/{tenant} 的 tenant_version,缺失时不提交\n- 两处共用 TenantNameEditor:每次打开重新读取企业版本;409 冲突后重新读取但保留已输入的名称;未命名企业不把代码预填为名称\n- 企业侧改名成功后,就地更新上下文里的企业名称,页头与切换器立即显示新名称,不重新校验整个上下文\n- 企业列表搜索文案改为「搜索企业名称或代码」,操作记录新增 tenant.renamed 的「修改企业名称」标签\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:274 项通过,含新增 tenant-name.test.tsx 4 项;tenant-overview.test.tsx 改为包裹 ToastProvider\n- 浏览器(Vite + 页面内模拟接口):开通企业提交 code 与 displayName;未命名企业设置名称后标题更新;所有者改名遇到 409 时保留输入,带新版本重提成功\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:27-07:00"},{"Sha1":"327cad554ad55a68f628c06f3b486bf54a76184b","Message":"fix(console): 邀请邮件未配置时不再锁死弹窗\n\n未配置邮件服务时,邀请接口返回 503 MAIL_UNAVAILABLE,此时邀请已经整体回滚;但前端把所有 503 都当作结果不确定,锁定表单并禁止关闭,只剩原样重试,邀请弹窗因此关不掉。\n\n实现内容:\n- useMutation 对后端合同保证已回滚的错误码(MAIL_UNAVAILABLE、MAIL_TEST_RECIPIENT_REQUIRED)按确定失败处理:不锁定输入,可以取消和关闭;其余 503、5xx 和网络错误仍按结果不确定处理\n- 业务弹层通过 ForceDismiss 向错误提示提供「关闭,稍后核对」,结果不确定时用户可以显式离开,原样重试仍然保留\n- 两个邮件错误码给出具体说明:邀请没有发出也没有保存,或只能邀请 .test 邮箱\n- /api/v1/me 的 mail_delivery_available 为 false 时,成员页置灰「邀请成员」并在列表上方说明原因;字段缺失时按可用处理\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:270 项通过,含新增 write-dismiss.test.tsx 4 项\n- 浏览器(Vite + 页面内模拟接口):成员邀请遇到通用 503 时可用「关闭,稍后核对」关闭;MAIL_UNAVAILABLE 时输入不锁定、可以取消;邮件不可用时邀请按钮置灰并显示说明\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:42:56-07:00"},{"Sha1":"e2c4a59663c315cfdfc12159c26306a8f32859ae","Message":"merge: 合入企业名称、邀请邮件能力与平台管理员邀请后端\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:24:35-07:00"}],"HeadCommit":{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},"CompareURL":"pengzhiyu/IAM/compare/1bcbe8d10af01d2081b561a4531c4549a72387bd...d2ff1f1d1423e14426de9db677c5239376cec6a8","Len":12}...
|
1792116394
|
Edit
Delete
|
|
38508
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"36fd05364 {"Commits":[{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},{"Sha1":"b892d7971af67f4f48c971d89b1a96f4c27d9249","Message":"test(capacity): 驱动支持恢复合同统计、专用报告与受控拥塞诊断\n\n容量驱动原来把任何刷新 503 都记为会话不可用,本地也没有办法制造真实的入口名额占满。本提交合入隔离实验中的驱动恢复选项、专用报告与拥塞辅助;正式容量命令默认路径不变。\n\n实现内容:\n- CapacityDriver 新增默认关闭的恢复选项:仅原 token 端点的完整响应可判定未执行,响应头、长度或 chunk 合同不明确时不授予重试资格;每次刷新最多两次串行尝试、25ms 退避、250ms 预算;原始 503、额外尝试、额外 HTTP 与台账父子耗时分别计入样本与汇总;私有轮换台账按 pending/completed/not_started 配对并 force 落盘,未知 pending 永不被后续记录洗白\n- 新增 CapacityRefreshRecovery(台账状态机与合同判定)、CapacityRecoveryEvidence、CapacityRecoveryExperimentDriver(只通过显式构造器开启恢复的计划入口)以及 CapacityRefreshRecoveryTest 15、CapacityRecoveryStatisticsTest 3;RefreshRecoveryContractIT 用真实双实例与数据库屏障验证 503→200 且旧令牌只消费一次,撤权/到期/已消费/回滚仍按原规则\n- scripts/capacity:recovery_report.py 严格复算恢复样本(业务成功、原始拒绝、额外 HTTP 分别计账,样本/汇总/存量三方对账);http_report.py 对恢复合同样本按设计拒绝;environment.py 与 round.py 新增 --driver-main 白名单;prepare.py 编译清单加入新驱动类;round.py --congestion 与 congestion.py 按日程持有部署独占屏障制造真实入口拥塞(持有 50–1000ms、最多 60 窗口、失败即停);README 补充说明\n- 工具测试:test_recovery_report 28、test_congestion 9、test_tools 新增 2\n\n验证:\n- PYTHONDONTWRITEBYTECODE=1 python3 -I -m unittest discover -s scripts/capacity -p 'test_*.py':66 项通过\n- 单元 283 项与集成回归同上一提交,在同一工作树上执行:12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本地对照证据见未入库的 release/p12-recovery-contrast-local-20261015-b80658e8(低负载零 503)与 release/p12-congestion-recovery-local-20261015-b9411306(真实 503 下恢复率 21.9%、会话零丢失)\n- 未运行云端容量验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:59:08-07:00"},{"Sha1":"f8a1e548ef6adf50a225636d7005b3f13cb259da","Message":"feat(protocol): 入口名额拒绝返回未执行标记并由 SDK 有界重试一次\n\n每实例 8 个协议入口名额占满时 POST /oauth2/token 立即 503,客户端无法区分“业务未开始”与“结果未知”,只能丢弃会话重新登录;E2d 云测 30 次此类拒绝使原始可用会话 19970/20000,正式测量未开始。本提交把隔离候选的恢复合同合入主区:服务端只在该分支标记未执行,SDK 据此最多再试一次,其余失败语义不变。\n\n实现内容:\n- AttackProtectionConfiguration:仅 POST /oauth2/token 的 tryAcquire 失败分支,在调用过滤链之前加响应头 IAM-Request-Outcome: not-started-v1;状态 503、Cache-Control: no-store 与正文 {\"error\":\"server_error\"} 不变,/internal/protocol/* 与其他 503 不带标记,名额数与释放逻辑不变\n- iam-java-sdk 新增 RefreshRecovery:只有状态、唯一头、no-store 与固定正文(多读一字节)全部匹配才判定未执行;同一会话串行,最多额外一次,退避 25ms,第二次须在首次发起后 250ms 内发出,每次发起前重查撤销/绝对/闲置期限;BffSessions 第二次仍未执行时保留原代与 lastUse 并返回 503 TOKEN_REQUEST_NOT_STARTED,未知结果、invalid_grant、验签失败仍结束会话\n- 测试:RefreshRecoveryTest 15 项(真实 Spring 协议解析加模拟 HTTP)、IngressOutcomeContractTest(八名额占满时只有拒绝分支带标记且名额全部归还)、SdkRefreshRecoveryIT(真实 Java SDK、浏览器、双 IAM 与数据库屏障:单次/两次拒绝后恢复、撤销/到期/已消费拒绝、提交后丢响应不重放、本地闲置不发第二次)及支撑类 SdkRecoveryTestBridge、SdkLoginDiagnostics、SdkTestClock;测试签名密钥改为 3072 位与生产一致\n- 文档:attack-protection.md 新增“P12 入口拒绝的明确未执行标记”,sdk.md 新增“P12 明确未执行的刷新恢复”并修正刷新尝试次数描述\n\n验证(在同时含后续 test(capacity) 提交内容的同一工作树上执行):\n- ./mvnw -o -B -ntp -pl iam-key-security,iam-java-sdk,iam-server -am test:6 个模块 283 项单元测试通过\n- ./mvnw -o -B -ntp -pl iam-server -am verify -Dit.test=SdkRefreshRecoveryIT,RefreshRecoveryContractIT,AuthIngressLifecycleIT,AuthIngressConservativeIT,AuthIngressTimeContractIT,AttackProtectionIT,MachineBudgetIT,RefreshExpiryLifecycleIT,ScopedLifecycleIT,SessionLifecycleIT,DualApplicationsIT,ProtocolIT(含 spotless:check):12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本提交单独检出到临时工作树执行 ./mvnw -o -B -ntp -pl iam-server,iam-java-sdk -am test-compile:通过\n- 本地证据见未入库的 release/p12-id-clock-sdk-recovery-local-20261015-87b969eb 与 release/p12-congestion-recovery-local-20261015-b9411306(受控拥塞下开启组 228 次拒绝全部确认未执行、恢复 50 次、会话零丢失)\n- 未运行云端容量验收,P12 正式门槛未变\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:58:41-07:00"},{"Sha1":"bcd9b9cd1cc5de30b234888c49738613500d7511","Message":"feat(console): 支持应用、登录客户端与资源类型名称\n\n应用登记原先只能填写代码,登录客户端和资源类型也只有代码,角色标签显示的是「应用管理员 · sales」这类代码。后端已补齐三类名称的写入与读取,控制台同步接入。\n\n实现内容:\n- 应用:登记时名称与代码都必填,提交 displayName;概况页「基本信息」增加设置/修改名称(读取应用版本,归档应用不提供入口);应用列表可按名称或代码搜索\n- 角色标签、工作台、企业切换器与平台入口提示改用 application_name,旧后端未返回时回退为应用代码;权限与路由仍以 application_id 为准\n- 登录客户端:创建时可选填名称(留空不提交该字段);列表以名称为主、代码为辅;详情可就地设置、修改或清除名称(清除提交 null,使用客户端版本)\n- 资源类型:添加资源规则时可选填名称;规则标题以名称为主,可就地改名,改名使用资源类型自己的 name_version,旧后端没有 name_version 时不提供改名;企业侧数据范围与选项显示「名称(代码)」\n- 新增 InlineNameEditor(就地展开的改名表单)与 codeWithName 展示工具\n\n验证:\n- npm run check:格式、lint、类型检查通过,33 个测试文件 293 项测试通过,构建成功\n- 新增 display-names.test.tsx 共 8 项:角色标签回退、可选名称校验、应用登记与改名请求体、客户端创建可选名称与清除名称、资源规则名称提交与按 name_version 改名\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 登记应用请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:57:20-07:00"},{"Sha1":"873358da99c3ab27ed78c5f4c87edba00229b960","Message":"feat(console): 邀请时填写姓名并支持本人与平台修改姓名\n\n新账号的姓名原先固定为「成员」,成员列表、所有账号等处只能靠成员代码区分。后端已支持邀请时填写姓名、本人改名和平台代改,控制台同步接入。\n\n实现内容:\n- 企业邀请成员、邀请平台管理员均增加必填「姓名」,提交 displayName;待接受的平台邀请以姓名为主、邮箱为辅显示,旧邀请没有姓名时只显示邮箱\n- 个人中心增加「修改姓名」,读取 /api/v1/me 的 version 提交;display_name_set=false 时提示确认姓名,输入框不预填默认名称,成功后用回执更新会话身份\n- 「所有账号」详情增加「更正姓名」,展开时重新读取账号版本,已归档账号不提供入口;企业侧不提供代改\n- 成员列表与设置所有者的搜索改为可按姓名或成员代码搜索;姓名未确认的成员和账号在列表与详情中标出\n- 企业改名弹窗抽成通用 NameEditor(必填/可选、提交 { displayName, version },409 保留草稿),名称校验抽成 nameError,规则仍为 1—160 个 Unicode 字符、拒绝控制字符与行/段落分隔符\n\n验证:\n- npm run check:格式、lint、类型检查通过,32 个测试文件 285 项测试通过,构建成功\n- 新增用例覆盖两类邀请的姓名必填与请求体、按姓名搜索与未确认标记、本人确认姓名、平台更正姓名及版本来源、归档账号无入口\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 两类邀请请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:52:20-07:00"}],"HeadCommit":{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},"CompareURL":"pengzhiyu/IAM/compare/d2ff1f1d1423e14426de9db677c5239376cec6a8...36fd0536408149355981d06096633ca3249a035e","Len":9}...
|
1792119824
|
Edit
Delete
|
|
38628
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"fd4d21c62 {"Commits":[{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},{"Sha1":"e40df4d323d530d8e43f53c49c898f046ca59719","Message":"feat(console): 组织架构图支持拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看超出范围的部门,部门多时不便浏览,也无法放大到整个屏幕查看。增加直接拖动、全屏展示和鼠标滚轮缩放。\n\n实现内容:\n- 按住鼠标左键拖动图即可平移,移动超过 4 像素才算拖动,松手时不会误开部门详情;触屏保留原生滚动\n- 新增「全屏」按钮:点击后立即铺满浏览器窗口,并尝试浏览器原生全屏;原生全屏不可用、被拒绝或请求无回应时保持铺满窗口,按 Esc 或「退出全屏」返回\n- 全屏下沿用缩小、放大、原始大小按钮,进出全屏时保持原来位于中心的部门\n- 鼠标滚轮向上放大、向下缩小,以指针为中心,范围仍为 50%–150%;按住 Shift 或横向滑动时保留浏览器原有的横向滚动,并阻止 Ctrl + 滚轮放大整个网页\n- 新增 maximize、minimize 图标,更新页面与全屏提示文案\n- 补充拖动平移、窗口铺满、原生全屏请求无回应、原生全屏 Esc 退出、滚轮缩放共 5 条单测\n\n验证:\n- npm run format:check、lint、typecheck:通过\n- npm run test:34 个测试文件 300 项全部通过\n- npm run build:通过\n- 内置浏览器连接演示环境 p08-alpha 实测:拖动平移与点击、全屏铺满窗口与退出、全屏下按钮与滚轮缩放、滚轮以指针为中心、375 宽窄屏与暗色均正常\n- 未验证:浏览器原生全屏(内置浏览器中原生全屏请求无回应)及真实 Mac 触控板手势\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:11:56-07:00"},{"Sha1":"ff21ad957d0a9077aaf58390df732d1fce85afb1","Message":"feat(auth): 统一认证页样式与控制台登录页一致\n\n业务应用走统一登录时,用户看到的 /login、/oidc/select、/activate 由服务端直接输出,原样式为绿色配色、没有品牌标识,企业选择的每家企业都是同样的实心主按钮,登录失败只有一行红字,与控制台登录页风格不一致。本次只调整 auth.css,不改服务端 HTML、表单字段与 CSP。\n\n实现内容:\n- 配色改为控制台“暖石与墨”:暖白方格底、白色卡片、墨黑主按钮,陶土色只用于链接;焦点环用墨黑,避免与错误红混淆\n- 页面 CSP 为 default-src 'none'; style-src 'self',不能加载图片与字体,左上角品牌标识用伪元素与渐变绘制(墨黑圆角方块内绘锁孔 + “IAM 统一身份认证”),卡片底部统一显示“由 IAM 统一身份认证保护”\n- 企业选择的每家企业改为可点击的列表行(左侧企业名、右侧“进入 →”),悬停描边加深;无可选企业时显示虚线说明框\n- 登录失败提示改为带浅红底色与左侧强调条的提示块;输入框 44px 高,悬停与聚焦有明确状态\n- 暗色跟随系统设置;窄屏(≤520px)缩小留白;卡片入场只做 6px 上移,不从透明淡入,动画未执行时也始终可见,减少动态效果时不播放\n- 同步 docs/handoff/demo-apps-frontend.md:记录本次样式改动、验证方式与部署后的检查项\n\n验证:\n- 按 AccountController 与 ProtocolController 的输出复刻登录、登录失败、选择企业、无可选企业、接受邀请、激活成功 6 种页面,以与服务端相同的 CSP 本地预览,检查亮色、暗色与 375px 宽度,浏览器控制台无 CSP 拦截\n- 核对 LoginSelectionIT 只断言页面引用 /auth.css 且返回 200,不依赖样式内容\n- 未运行:后端测试、IAM 制品构建与真实登录流程中的页面检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:46:38-07:00"},{"Sha1":"4ee4225dec2523e41b58301645a83bb63532ce61","Message":"feat: 合并客户与商机管理和售后服务台演示前端\n\n演示后端 iam-demo-app 已在 main,但缺少前端,-Pdemo-web 无法打包完整页面。本次合入演示前端、控制台“创建交付工单”选项以及方案与交接文档,供后端打包、部署与联调。\n\n实现内容:\n- 演示前端(58e3700):新增 iam-demo-web,CRM 与工单台两套入口,构建输出 iam-demo-web/dist/crm、dist/support,与 demo-web profile 读取路径一致;接入会话门禁、“我的权限”抽屉、tenant_hint 跳转、切换企业与两种退出、客户/商机/跟进/交付、工单流转/转派/处理记录与报表导出\n- 控制台(e295811):平台可批准的程序操作增加 ticket:create(创建交付工单)\n- 文档(efc7c1a):docs/demo-apps.md 原始方案,docs/handoff/demo-apps-backend-01.md 当初的后端建议,docs/handoff/demo-apps-frontend.md 前端交付与部署联调建议\n\n验证:\n- 合并前确认 main 为分支起点 3451213,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- iam-demo-web npm run check 通过(Vitest 30 项);iam-admin-web npm run check 通过(Vitest 295 项)\n- 未运行:-Pdemo-web 打包、后端测试、真实后端联调与内网部署\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:48-07:00"},{"Sha1":"efc7c1a07ab3e7fe97ffe18fb71071f10d41d045","Message":"docs(demo): 补充演示应用方案与前后端交接文档\n\n演示应用的原始方案和给后端的建议此前只在本地,前端完成后也缺少交付说明与部署联调的交接。补齐三份文档,记录方案、已确认的决定、前端实际交付与待后端执行的事项。\n\n实现内容:\n- docs/demo-apps.md:CRM 与工单台的功能、页面、权限映射、登录与企业选择体验、阶段二赢单自动建单设计、演示脚本与验收标准;状态标为“原始方案,已据此实现”,与交接文档冲突时以交接文档为准\n- docs/handoff/demo-apps-backend-01.md:当初交给后端评估的建议提示词,保留用于追溯\n- docs/handoff/demo-apps-frontend.md:前端实际交付、对后端合同的处理、前端验证结果与未执行项,以及给后端的打包、部署与联调测试建议\n\n验证:\n- 文档中的命令、路径与测试数量对照本次 iam-demo-web 与 iam-admin-web 的实际检查结果核对\n- 未运行:文档所述的打包、部署与真实联调步骤\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:00-07:00"}],"HeadCommit":{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},"CompareURL":"pengzhiyu/IAM/compare/36fd0536408149355981d06096633ca3249a035e...fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Len":15}...
|
1792138442
|
Edit
Delete
|
|
38661
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"0c742655b {"Commits":[{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},{"Sha1":"c2dc52296ef54797419f350f43456e973fadc03c","Message":"fix(console): 显示应用名称与成员姓名而不只显示代码\n\n企业「应用开通 → 启用新应用」候选列表只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐这些读接口的名称字段,本次在控制台接入。\n\n实现内容:\n- 新增 memberNaming:姓名为主、成员代码为辅;没有姓名或姓名等于代码时只显示代码,仅在 display_name_set 明确为 false 时提示「姓名未确认」\n- 应用开通:候选列表显示应用名称并附代码,搜索提示改为「搜索应用名称或代码」;应用详情优先使用详情接口的 application_name;按成员设置的列表与单人设置显示姓名和成员代码,搜索提示改为按姓名或成员代码查找\n- 企业/平台管理员分配:负责范围显示应用名称(详情补充应用代码),分配对象姓名未确认时提示\n- 管理员候选显示姓名未确认提示;业务授权候选、用户组候选、业务角色分配按后端最小披露合同继续只显示成员代码,不联查成员目录\n- 程序身份:负责人列表、详情、候选显示姓名与成员代码,候选搜索提示改为「搜索姓名或成员代码」;技术细节中企业、应用显示名称(括号内为代码)\n- 新增字段均按可缺失处理,较早的后端不返回时回退显示代码\n\n验证:\n- npm run check:格式、lint、类型检查、307 项测试、构建均通过\n- 新增 display-name-reads.test.tsx 7 项:候选名称与旧后端回退、详情名称优先、成员准入姓名、管理员分配、候选最小披露、负责人候选\n- 未运行:浏览器检查与真实后端联调(需重建 jar 并重启演示环境,本次未做)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:22:03-07:00"},{"Sha1":"63f1e0d5fd0dac58c74be467a927e4f5cab3ce06","Message":"fix: 补齐管理读接口的应用名称与成员姓名\n\n修复启用新应用候选仅显示代码的问题,并补齐原有姓名读取权限内的管理目录展示字段。\n\n实现内容:\n- 补齐应用候选、应用关系、管理员分配及程序身份的应用名称与相关名称搜索\n- 为成员准入、负责人、管理员候选和分配提供姓名及确认标记,保留独立代码字段\n- 保持用户组候选、业务授权候选和业务角色绑定的姓名最小披露边界,不改变权限判断、错误码与排序\n- 增加字段、搜索及权限边界回归测试,同步接口合同并提供九项建议的前端接入交接\n\n验证:\n- Java 25 执行 ./mvnw -B -ntp -pl iam-server -am verify -Dit.test=DisplayNameReadIT,ApplicationManagementIT,AuthorizationManagementIT,ManagementReadIT,ServicePrincipalIT,ManagedDisplayNamesIT -Dfailsafe.failIfNoSpecifiedTests=false:BUILD SUCCESS\n- 291 项单元测试、50 项集成测试通过,失败、错误和跳过均为 0;格式检查、编译、架构检查及后端打包通过\n- git diff --check 与暂存区差异检查通过,交接文档 10 个 JSON 示例解析有效\n- 未运行全部集成测试、性能对照、安全漏洞扫描或前端验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:02:27-07:00"}],"HeadCommit":{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/fd4d21c62aca9d27e2056be38444fb25cecd9ef5...0c742655b78b87ea5d7cd9c43028ad20e7527e25","Len":3}...
|
1792142767
|
Edit
Delete
|
|
38804
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"28fda4f95 {"Commits":[{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},{"Sha1":"443dc01bf44b0bb0a93a6e9ff2f715adacb09ab9","Message":"feat(console): 没有管理身份的账号只显示个人账号页\n\n原先只要能登录就渲染管理工作台壳层,只能登录业务应用的普通员工也能看到侧栏、工作台和企业入口(管理数据由后端逐接口拒绝)。增加管理身份门禁,普通员工只保留本人账号安全设置。\n\n实现内容:\n- 新增 shell/admission.ts:平台角色非空直接放行,不发请求;否则逐页读取 /api/v1/me/tenants?limit=100(不只看第一页,偏移上限 100000),任一企业 admin_roles 非空即放行并停止读取;业务应用角色不计入\n- ProtectedRoute 已登录后经 AdminGate:读取中显示加载页,读取失败显示可重试的故障页(不放行也不降级),有管理身份渲染 AppShell,否则渲染 MemberShell;登录、MFA、邮件链接路由不受门禁影响\n- 新增 MemberShell:顶部为“IAM 账号中心”品牌、主题切换与账号菜单,内容为个人中心;不渲染侧栏、上下文切换和命令面板,其他控制台地址一律改到 /me\n- 新增 useOptionalScope;PersonalPage 不在控制台壳层内时隐藏“切换企业”并改用不提管理功能的企业说明\n- layout.css 增加个人账号页顶部条样式与 600px 以下窄屏留白\n- login-handoff.test.tsx 增加 4 项门禁测试,personal.test.tsx 补充 useOptionalScope 模拟\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 36 个文件 314 项、Vite 构建全部通过\n- 新增测试覆盖:普通员工被改到 /me 且企业读两页、第二页才有管理角色时放行、有平台角色时不为门禁读取企业、读取失败可重试\n- 真实员工账号与部署环境浏览器验收:未运行;角色在会话中途被撤销时,界面在下次身份复核或重新登录后才切换,期间仍由后端拒绝管理接口\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:55-07:00"},{"Sha1":"c7966f8b5cfc3fb5a6b26c349ecb7d84b9cb7f30","Message":"fix(console): 认证页品牌与 MFA 提示不再写成进入控制台\n\n从业务应用登录的员工同样经过登录与 MFA 页面,原文案“IAM 控制台”“即可进入控制台”会让人误以为要进入管理后台。改为对两种登录目的都成立的中性说法。\n\n实现内容:\n- AuthShell 顶部品牌字样由“IAM 控制台”改为“IAM 统一身份认证”,同步更新组件注释\n- MFA 页三处副标题由“进入控制台”改为“完成登录”;标题、步骤与按钮不变\n\n验证:\n- npx vitest run:36 个文件 310 项通过;首次全量运行时 group-lifecycle.test.tsx 的“404显示可聚焦完整错误”偶发失败 1 次,该文件单独连续运行 3 次及全量重跑均通过,与本次文案无关\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 浏览器:本机 Vite 开发服务器登录页已显示新品牌字样;服务端渲染的 /login 页面不在本次范围\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:20-07:00"},{"Sha1":"a328b990fc462631d30a0a07378f2ee4fe39c0bf","Message":"fix(console): 业务应用登录完成 MFA 后只回跳一次\n\n从业务应用登录并完成 MFA 后,页面会先进入 IAM 控制台首页,过一会儿才回到业务应用。原因是完成回调先刷新身份(状态切到 checking 卸载了 MFA 面板),身份读回后重新挂载的面板拿不到续办地址,把人导航到首页;随后旧回调才整页跳回 /oidc/select,形成两个导航负责人竞争。\n\n实现内容:\n- MfaPage 完成回执带受控续办地址(只接受 /oidc/select?transaction=\u003cuuid\u003e)时,成功标记停留后直接整页跳转,不刷新控制台身份,全程只有这一次导航\n- 没有续办地址(直接登录控制台)时才刷新身份并进入工作台;恢复码仍须勾选已保存后才继续,外部 next 仍不接受\n- AuthProvider 的 refresh 增加 quiet 选项:读取期间不切到 checking,只在拿到结果后一次性更新,避免流程中页面被卸载重挂\n- 新增 login-handoff.test.tsx:用正式路由树与真实 AuthProvider 覆盖已绑定验证、首次绑定并保存恢复码、减少动态效果三种情况\n\n验证:\n- npx vitest run:36 个文件 310 项通过;新增 3 项在 MfaPage 还原为修复前版本时有 2 项失败,能复现原问题\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 真实账号 MFA 与业务应用全链路浏览器验收:未运行,需重新部署后人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:41:39-07:00"}],"HeadCommit":{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},"CompareURL":"pengzhiyu/IAM/compare/0c742655b78b87ea5d7cd9c43028ad20e7527e25...28fda4f953efc9cdb31bad0fae81ae1b074efce4","Len":4}...
|
1792205228
|
Edit
Delete
|
|
38823
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"3ddc9da39 {"Commits":[{"Sha1":"3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Message":"feat(console): 隐藏没有权限进入的平台与应用入口\n\n只负责企业的管理员原先仍能在侧栏、切换弹窗和工作台看到上锁的“平台管理”“应用”入口及说明,容易分散注意力、引出“是否缺少权限”的疑问。统一改为“进不去的入口一律不显示”,让各角色只看到与自己职责相关的入口。\n\n实现内容:\n- 侧栏:分组按 visible 过滤,平台分组只对平台管理员、应用分组只对平台管理员与应用管理员显示;展开与收起形态一致,删除不再使用的锁定说明与 .side-group__note 样式\n- 切换弹窗:平台入口与“或进入企业”分隔只对 PLATFORM_ADMIN 显示;应用管理员与只负责企业的管理员直接从企业列表开始,初始焦点回退到弹窗内第一个可聚焦元素\n- 工作台:入口卡只渲染可进入的(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个),去掉锁定样式;入口数量写入 data-entrance-group 决定列数与入场顺延;单入口整行横排,600px 以下改回竖排;账号卡没有平台角色时不再显示“没有平台管理身份”\n- 测试:新增 context-switcher.test.tsx 3 项;sidebar.test.tsx 增加只负责企业的管理员展开/收起 2 项并改写应用管理员用例;home.test.tsx 按新规则改写 3 项\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 37 个文件 319 项、Vite 构建全部通过\n- 将侧栏、切换弹窗、工作台三个组件临时还原为修改前版本时,新增与改写的 7 项测试失败,能发现旧行为\n- 浏览器:在本机 Vite 开发服务器页面临时插入入口卡样例标记,检查 1280、800、375 宽度与暗色模式下单入口与双入口布局;375 宽度发现单入口对齐错误并已修正\n- 未运行:真实企业管理员、应用管理员账号的整页走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:32:27-07:00"}],"HeadCommit":{"Sha1":"3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Message":"feat(console): 隐藏没有权限进入的平台与应用入口\n\n只负责企业的管理员原先仍能在侧栏、切换弹窗和工作台看到上锁的“平台管理”“应用”入口及说明,容易分散注意力、引出“是否缺少权限”的疑问。统一改为“进不去的入口一律不显示”,让各角色只看到与自己职责相关的入口。\n\n实现内容:\n- 侧栏:分组按 visible 过滤,平台分组只对平台管理员、应用分组只对平台管理员与应用管理员显示;展开与收起形态一致,删除不再使用的锁定说明与 .side-group__note 样式\n- 切换弹窗:平台入口与“或进入企业”分隔只对 PLATFORM_ADMIN 显示;应用管理员与只负责企业的管理员直接从企业列表开始,初始焦点回退到弹窗内第一个可聚焦元素\n- 工作台:入口卡只渲染可进入的(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个),去掉锁定样式;入口数量写入 data-entrance-group 决定列数与入场顺延;单入口整行横排,600px 以下改回竖排;账号卡没有平台角色时不再显示“没有平台管理身份”\n- 测试:新增 context-switcher.test.tsx 3 项;sidebar.test.tsx 增加只负责企业的管理员展开/收起 2 项并改写应用管理员用例;home.test.tsx 按新规则改写 3 项\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 37 个文件 319 项、Vite 构建全部通过\n- 将侧栏、切换弹窗、工作台三个组件临时还原为修改前版本时,新增与改写的 7 项测试失败,能发现旧行为\n- 浏览器:在本机 Vite 开发服务器页面临时插入入口卡样例标记,检查 1280、800、375 宽度与暗色模式下单入口与双入口布局;375 宽度发现单入口对齐错误并已修正\n- 未运行:真实企业管理员、应用管理员账号的整页走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:32:27-07:00"},"CompareURL":"pengzhiyu/IAM/compare/28fda4f953efc9cdb31bad0fae81ae1b074efce4...3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Len":1}...
|
1792208469
|
Edit
Delete
|
|
39272
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"06daf4a65 {"Commits":[{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},{"Sha1":"765bf820452bc4d64f63ed449b249fafcfc1f60d","Message":"fix(console): 邀请页说明新密码要求并按错误码反馈激活失败\n\n接受邀请页没有说明新账号密码须为 12—128 个字符;激活失败时直接构造不带错误码的 ApiError,INVALID_PASSWORD 等错误码丢失,页面只能显示\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。\n\n实现内容:\n- api.ts 将内部 toApiError 改名并导出为 apiErrorFromResponse,供成功时返回 HTML 的 /activate 在失败时复用错误体解析;request 的行为不变\n- 激活改由 submitActivation 提交:保持 urlencoded 表单,不设 Accept: application/json,只按状态码判定成功、不解析 HTML 正文;失败时保留 HTTP 状态、code、trace_id 与纯数字 Retry-After;401/403 丢弃缓存的 CSRF 令牌,供用户手动重新提交;不自动重试\n- 密码字段说明改为\"已有 IAM 账号请填写原密码;新账号请设置 12—128 个字符的密码\";因页面分不清新旧账号,不设 minLength、不在提交前拦截短密码,只拦截空密码\n- 新增 activationFailure 映射:INVALID_PASSWORD 显示在密码字段下方并在渲染后聚焦,不叠加顶部告警;INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT 使用固定文案,不判断账号是否存在;401/403 只说明未通过安全校验,不断言令牌失效;404/409 其他情况与未知错误码安全回退;429 使用有效的 Retry-After;网络异常与 5xx 显示\"提交结果未知\";获取安全令牌失败显示\"邀请尚未提交\"\n- 告警标题随反馈类型变化并显示追踪编号;找回密码、验证邮箱页继续使用原有 failureCopy 文案\n\n验证:\n- npm --prefix iam-admin-web run format:check:通过\n- npm --prefix iam-admin-web run typecheck:通过\n- npm --prefix iam-admin-web run lint:通过\n- 本地演示 IAM 上用 curl 以无效凭据 POST /activate:返回 400 JSON,含 code=INVALID_ACTIVATION、message、trace_id,确认失败响应可按错误码解析\n- 单元测试、浏览器检查与真实邀请激活:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:01-07:00"},{"Sha1":"63544c67bb5cd377f09d6696006f02363a77353a","Message":"fix(auth): 修复会话过期后刷新页面返回认证错误\n\n过期身份在页面路由执行前被统一返回 401 JSON,导致首次刷新无法进入登录页。\n\n实现内容:\n- 控制台页面清理失效会话后跳转登录页,携带过期提示和安全编码的返回地址\n- 公开页面和静态资源按匿名继续处理,API 保留原 401 JSON 响应\n- 协议授权 GET 请求恢复原匿名登录流程,保留其他协议端点的错误契约\n- 补充地址边界、空闲与绝对到期、账号失效及跨实例身份清理回归测试\n\n验证:\n- Java 25 下服务端 223 项及依赖模块 95 项单元测试通过\n- SessionPageIT、SessionLifecycleIT、LoginSelectionIT、ProtocolIT、PackagedConsoleIT、BrowserSecurityIT 共 69 项集成测试最终通过\n- 新增用例修正绝对跳转地址断言和双时钟测试准备后,重跑 SessionPageIT 17 项全部通过\n- Maven 编译、Spotless 格式检查及 git diff --check 通过\n- 未运行全部集成测试,未进行真实浏览器等待过期后的人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:32:14-07:00"},{"Sha1":"6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7","Message":"feat: 合并隐藏无权进入的平台与应用入口\n\n用户验收后提出,只负责企业的管理员不应看到平台管理与应用列表入口。按“进不去的入口一律不显示”的统一规则,合入 feat/console-layout 上的前端调整。\n\n实现内容:\n- 入口隐藏(3ddc9da):侧栏无权分组整组隐藏;切换弹窗的平台入口只对平台管理员显示;工作台入口卡只渲染可进入的入口(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个,单入口整行横排);工作台账号卡不再显示“没有平台管理身份”\n\n验证:\n- 合并前确认分支基于 28fda4f,main 在其后只有合并提交 58745d8,与分支内容无冲突;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 37 个文件 319 项、构建)\n- 未运行:后端测试;真实企业管理员、应用管理员账号的整页走查与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:38:26-07:00"},{"Sha1":"58745d8c25c809411e3c9cb00249b911ba89d5db","Message":"fix: 合并业务应用登录回跳与管理工作台门禁修复\n\n演示部署后发现两个问题:从业务应用登录并完成 MFA 后会先进入 IAM 控制台首页再回到业务应用;只能登录业务应用的普通员工也能进入管理工作台外壳。本次合入 feat/console-layout 上的前端修复与交接说明。\n\n实现内容:\n- MFA 回跳(a328b99):完成回执带受控续办地址时成功标记停留后直接整页跳回 /oidc/select,不刷新控制台身份,只有一次导航;refresh 增加 quiet 选项避免流程中页面重挂\n- 认证页文案(c7966f8):品牌字样改为“IAM 统一身份认证”,MFA 副标题由“进入控制台”改为“完成登录”\n- 管理工作台门禁(443dc01):平台角色或任一企业管理角色(逐页读完本人企业)才渲染管理工作台;没有管理身份只显示“IAM 账号中心”个人账号页,读取失败可重试且不放行\n- 交接说明(28fda4f):docs/handoff/login-return-and-console-gate.md,含给后端的部署与改进建议\n\n验证:\n- 合并前确认 main 为分支起点 0c74265,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 36 个文件 314 项、构建)\n- 未运行:后端测试;真实账号 MFA、业务应用全链路与部署环境浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:44:05-07:00"}],"HeadCommit":{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},"CompareURL":"pengzhiyu/IAM/compare/3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f...06daf4a651e1a490ace181ac708099def39e8de0","Len":5}...
|
1792382363
|
Edit
Delete
|
|
39315
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"6bd108ddf {"Commits":[{"Sha1":"6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Message":"feat: 合并邀请登录账号可见性的前端接入\n\n用户发现被邀请人打开邀请链接后只能输入密码,不知道自己的登录账号是什么,管理后台也看不到用户用什么登录。后端已在 dd37c0e 提供邀请只读检查、成员邀请邮箱快照与平台账号登录标识,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 接受邀请页(c88c7be):独立的 InvitationPage 落地后自动只读检查一次,显示登录账号与邀请内容;新账号设置并确认 12—128 个字符的密码,已有账号输入当前密码并提供忘记密码入口;检查与激活按错误码反馈,429 按 Retry-After 倒计时,不自动重试;换链接时旧结果作废;成功后经路由状态把账号预填到登录页,不进网址\n- 管理详情(8209c1b):成员详情显示“邀请邮箱(加入时)”快照,null 显示“无记录”;平台账号详情显示登录标识,只有邮箱显示验证状态;两处列表不变\n- 登录页入口(8f406dc):“收到邀请?接受邀请”改为指向控制台邀请页,没有邮件链接时引导打开邀请邮件\n\n验证:\n- 合并前确认分支基于 06daf4a,main 之后只有后端提交 dd37c0e,与三个前端提交没有共同文件;主目录未提交改动仅在 scripts/experience/、docs/handoff/ 与 iam-demo-video/,与本次合并没有共同文件\n- 核对 dd37c0e 中的交接文档与 InvitationInspectionController,与前端接入所依据的接口路径、字段和错误码一致\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 38 个文件 334 项、构建)\n- 未运行:合并后的前端检查与后端测试、浏览器对真实后端的联调与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:00:38-07:00"},{"Sha1":"8f406dc1a007ea3a5b9a37a79322a9308c2d6559","Message":"fix(console): 登录页邀请入口改为指向控制台邀请页\n\n登录页底部“收到邀请?接受邀请”原先链到服务端简易页 /activate,那里要手动粘贴邀请凭据,也看不到登录账号。改为指向控制台邀请页,没带邮件链接时由该页引导打开邀请邮件。\n\n实现内容:\n- LoginPage 的“接受邀请”链接改为 /console/activate,与同页“忘记密码?”一样使用完整路径的普通链接\n- 邀请页没有链接时的说明改为“接受邀请需要从邀请邮件中的链接进入”,并说明页面隐藏或停留超过 30 分钟时链接会被清除、需要重新打开;不显示表单,也不发起检查或激活\n\n验证:\n- npm --prefix iam-admin-web run check:格式、lint、类型检查通过,Vitest 38 个文件 334 项通过,构建成功\n- 新增 login-protection.test.tsx 1 项(入口地址)、invitation.test.tsx 1 项(无链接时只引导、不发请求)\n- 未运行:浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:57:38-07:00"},{"Sha1":"8209c1bfd928ce9ab6d645b51ff9dc76a544db99","Message":"feat(console): 成员详情与平台账号详情显示邀请邮箱和登录标识\n\n企业管理员和平台管理员此前都看不到用户用什么登录,无法在对方忘记账号时告知。按后端交接文档接入成员详情的 invitation_email 快照与平台账号详情的 login_identifiers。\n\n实现内容:\n- Member 新增可选 invitation_email;成员详情显示“邀请邮箱(加入时)”并可复制,说明它是接受本企业邀请时的快照、不随账号邮箱变化;null 显示“无记录”,旧后端不返回时不显示该行;成员列表不变\n- PlatformUser 新增可选 login_identifiers;平台账号详情显示“登录账号”,逐行列出邮箱或用户名并可复制,只有邮箱显示已验证/未验证;没有标识时显示“无登录标识”,旧后端不返回时不显示该行;账号列表不变\n- management.css 新增 .login-ids 样式,窄屏整行折行\n\n验证:\n- npm --prefix iam-admin-web run check(含上一提交):格式、lint、类型检查通过,Vitest 38 个文件 332 项通过,构建成功;之后只改了成员详情的一处注释,重新运行 format:check 通过\n- management-integration.test.tsx 新增 2 项:邀请邮箱的有值、null、缺失三种情况,登录标识列表与邮箱验证状态\n- 未运行:浏览器检查与真实后端联调(后端改动尚未提交,演示环境仍为旧版本)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:52:57-07:00"},{"Sha1":"c88c7be70cb41dac8c5b962f958b76e8c7ced3f4","Message":"feat(console): 接受邀请页显示登录账号并区分新旧账号\n\n接受邀请页原先只有一个密码框,不告诉被邀请人要注册或关联的是哪个登录账号,也分不清新账号与已有账号。按后端交接文档 docs/console/invitation-login-account-handoff.md 接入 POST /api/v1/invitations/inspect,并把接受邀请拆成独立页面。\n\n实现内容:\n- 新增 pages/InvitationPage.tsx:拿到链接后自动只读检查一次(StrictMode 下也只调用一次,令牌只放在请求体),显示登录账号、邀请内容(企业名称、平台管理员或应用管理员及应用名称)、新账号的邀请姓名与有效期;响应缺少登录账号或账号状态、邀请类型取值未知时按检查失败处理,不猜测新旧账号\n- NEW 显示设置密码与确认密码,前端校验 12—128 个字符及两次一致;EXISTING 只输入当前密码,不设最短长度,并提供忘记密码入口;隐藏的 username 字段供密码管理器关联账号\n- 检查失败按错误码反馈:INVALID_INVITATION、INVITATION_NOT_APPLICABLE 不再提供重新检查;401/403 丢弃缓存的 CSRF 令牌;429 按 Retry-After 倒计时(缺失时 60 秒),结束后由用户手动重新检查;5xx、网络异常与无法识别的响应允许重新检查;不自动重试\n- 激活提交沿用 urlencoded 表单与 HTML 成功响应;503 AUTH_BUSY 提示未提交,INVALID_ACTIVATION 按检查时的账号状态给出提示,激活 429 同样在提交按钮上倒计时;网络异常与其他 5xx 仍提示结果未知\n- 同文档收到新链接时用新 key 重建流程组件,旧链接晚到的检查或提交结果随旧组件作废;页面隐藏、离开或 30 分钟后清除邀请秘密与已输入的密码\n- 成功页写明登录账号;“前往登录”经路由状态把账号预填到登录页,不放进网址,登录页预填时焦点直接落到密码框\n- 链接接收与新密码规则抽到 lib/emailLink.ts;EmailLinkPage 只保留重置密码与验证邮箱,移除激活分支\n- 结果块程序聚焦时一并去掉全局 box-shadow 焦点环,与原注释“不画焦点环”一致;重置密码、验证邮箱的成功块同样受益\n\n验证:\n- npm --prefix iam-admin-web run check(暂时收起管理详情改动,仅含本提交):格式、lint、类型检查通过,Vitest 38 个文件 330 项通过,构建成功\n- 新增 invitation.test.tsx 9 项、login-protection.test.tsx 2 项,覆盖检查一次、新旧账号表单、服务端密码错误、链接不可用、无法识别的账号状态、429 倒计时、旧链接晚到结果、页面隐藏清除秘密与登录预填\n- Vite 开发服务器加页面内模拟检查与激活接口,在内置浏览器查看新账号、已有账号、限流倒计时、链接不可用、成功页与登录预填;手机宽度无横向滚动,深色模式正常\n- 未运行:与真实后端联调(后端改动尚未提交,演示环境仍为旧版本)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:52:13-07:00"},{"Sha1":"dd37c0e1718f50bee4b88148471b6fc1259a572d","Message":"fix(accounts): 补齐邀请登录账号信息的受控展示\n\n邀请收件人和管理员缺少辨认登录账号的信息,增加受权限约束的展示入口,并保留原密码证明与企业隔离边界。\n\n实现内容:\n- 新增匿名邀请检查接口,要求 CSRF,限制来源和令牌预算,不消费邀请\n- 邀请邮件展示登录邮箱及加入对象,保存对象名称快照并过滤控制字符\n- V36 记录成员加入时的邀请邮箱,历史无可靠关联的数据保留为空\n- 平台账号详情返回登录标识,成员详情返回本企业邀请快照,列表及搜索范围不变\n- 同步账号、邮件合同与前端接入交接文档,补充权限、激活及迁移测试\n\n验证:\n- Java 25 下执行 Maven verify:服务端 224 项单元测试通过\n- 邀请、管理读取、邮件、账号及数据库迁移共 7 类 73 项集成用例分批通过,无跳过\n- 最后针对性 verify:29 项单元测试及 6 项邀请检查集成测试通过\n- 提交前重新执行 ./mvnw -B -ntp -pl iam-server -am spotless:check:通过\n- git diff --check 与 git diff --cached --check:通过\n- 前端接入、真实邮件供应商及部署环境验收尚未执行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:41:10-07:00"}],"HeadCommit":{"Sha1":"6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Message":"feat: 合并邀请登录账号可见性的前端接入\n\n用户发现被邀请人打开邀请链接后只能输入密码,不知道自己的登录账号是什么,管理后台也看不到用户用什么登录。后端已在 dd37c0e 提供邀请只读检查、成员邀请邮箱快照与平台账号登录标识,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 接受邀请页(c88c7be):独立的 InvitationPage 落地后自动只读检查一次,显示登录账号与邀请内容;新账号设置并确认 12—128 个字符的密码,已有账号输入当前密码并提供忘记密码入口;检查与激活按错误码反馈,429 按 Retry-After 倒计时,不自动重试;换链接时旧结果作废;成功后经路由状态把账号预填到登录页,不进网址\n- 管理详情(8209c1b):成员详情显示“邀请邮箱(加入时)”快照,null 显示“无记录”;平台账号详情显示登录标识,只有邮箱显示验证状态;两处列表不变\n- 登录页入口(8f406dc):“收到邀请?接受邀请”改为指向控制台邀请页,没有邮件链接时引导打开邀请邮件\n\n验证:\n- 合并前确认分支基于 06daf4a,main 之后只有后端提交 dd37c0e,与三个前端提交没有共同文件;主目录未提交改动仅在 scripts/experience/、docs/handoff/ 与 iam-demo-video/,与本次合并没有共同文件\n- 核对 dd37c0e 中的交接文档与 InvitationInspectionController,与前端接入所依据的接口路径、字段和错误码一致\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 38 个文件 334 项、构建)\n- 未运行:合并后的前端检查与后端测试、浏览器对真实后端的联调与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:00:38-07:00"},"CompareURL":"pengzhiyu/IAM/compare/06daf4a651e1a490ace181ac708099def39e8de0...6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Len":5}...
|
1792393307
|
Edit
Delete
|
|
39386
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"68a0d5d09 {"Commits":[{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},{"Sha1":"b6c5512d570e29949a14257b436fc1de35d8e73b","Message":"fix(auth): 补齐委派授权与用户组成员姓名\n\n授权管理员需要通过姓名辨认分配对象,组详情也不能依赖前一页候选反查成员。\n\n实现内容:\n- 业务角色绑定及成员候选返回姓名和确认标记,支持姓名与成员代码搜索\n- 用户组详情增加完整只读 members 数组,与 memberships 共用查询结果\n- 保留原企业和应用权限、隐私边界及停用撤权规则\n- 补充权限、搜索、历史状态和完整成员回归测试,同步接口合同与前端交接文档\n\n验证:\n- Maven verify:319 项单元测试、51 项指定集成测试通过,失败、错误和跳过均为 0\n- verify 包含 Spotless 格式检查、编译、架构检查及后端打包;git diff --check 通过\n- 未执行全量集成测试、前端构建及浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:51:53-07:00"},{"Sha1":"6f2d8cf8392a3c27d5e1806729e2342ef040a621","Message":"feat(console): 角色分配与用户组成员显示姓名\n\n应用「角色分配」和用户组成员原先只能显示成员代码,管理员认不出分配对象。后端已按 docs/console/delegated-member-names-handoff.md 为业务角色分配、成员候选和用户组详情补齐姓名,前端随之接入。\n\n实现内容:\n- 角色分配列表与详情的成员显示姓名,副信息「成员 · 成员代码」,subject_name_set=false 时提示「姓名未确认」;用户组分配 subject_name 为 null,继续显示组名称\n- 分配角色的成员候选显示姓名与成员代码,搜索框改为「搜索姓名或成员代码」,用户组候选为「搜索用户组名称或代码」;CandidatePicker 新增 searchLabel,企业管理员候选同样使用成员文案;分配记录搜索框改为「搜索姓名、成员代码、用户组或角色」\n- 用户组详情直接使用只读 members 数组显示全部成员(含本人、第 101 人以后),删除先读前 100 个候选反查代码的逻辑;新加入的人用勾选器看到的候选信息显示;停用成员注明「成员已停用」\n- 用户组清单与勾选器显示「姓名 + 成员代码」,按钮无障碍名称为「移除成员 姓名(代码)」以区分同名成员;搜索框改为「搜索姓名或成员代码」\n- 写入保持不变:组成员全量替换仍只提交 {version,memberships},不发送 members,姓名不作为标识或写入值;后端不返回 members 或姓名时回退显示代码或标识缩写\n- 同步类型注释、单元测试,以及 acceptance-t02、acceptance-t04、acceptance-group-lifecycle 的搜索框名称与候选定位(改为按行内成员代码定位)\n\n验证:\n- npm run check:格式、lint、类型检查、38 个测试文件 339 项测试与构建全部通过\n- 新增或改写测试覆盖:业务分配姓名、组绑定名称、姓名未确认、两类候选搜索框;组详情 25 人全部显示姓名与代码、停用成员、打开勾选器前不请求候选;勾选器姓名显示及新加入成员的显示\n- 浏览器经本地模拟接口验证:角色分配列表与候选显示姓名、按姓名搜索出两名同名成员并以代码区分;用户组清单与勾选器显示姓名,勾选前后被点行位置与高度不变\n- 后端改动目前仍是主目录未提交改动,未与真实后端联调;三个验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:30-07:00"},{"Sha1":"354be5b9c9f80a7bb5d750274e0aaaa736016416","Message":"test(console): 等待用户组改名错误块聚焦后再断言\n\n用户组改名返回 403/404 的用例在错误文案出现后立即断言焦点,而错误块是在提交后的 effect 里才聚焦,多文件并行运行时偶发先断言、后聚焦而失败。\n\n实现内容:\n- group-lifecycle 的 403/404 用例改为 waitFor 等待焦点落到 .write-error 后再断言,界面行为不变\n\n验证:\n- 此前该用例在多文件并行运行中出现过 2 次失败;在修改前的 6bd108d 与当前代码上分别用同一组 5 个测试文件连续运行 8 轮,均未复现\n- 修改后 group-lifecycle、group-editor、display-name-reads、authorization-management 共 40 项测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:14-07:00"},{"Sha1":"130a9ed5ceca7be71baed1ddecd2c4b085bd7ea6","Message":"fix: 合并用户组成员布局改造\n\n用户组详情勾选候选成员时,上方「已选成员」列表随勾选变高,页面看起来一直在自己滚动。合并 feat/console-layout 上的前端修复,把成员清单与「添加成员」勾选器分开显示。\n\n实现内容:\n- 合入 9ca3197:成员清单与勾选器二选一显示,勾选时上方内容高度不变;待加入、待移除在清单原位标注并可撤销,新增「还原」\n- 只修改 iam-admin-web 下的页面、样式、单元测试与 acceptance-t02 选择器,不涉及后端与接口合同\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 337 项测试及格式、lint、类型检查、构建全部通过\n- 合并结果与 9ca3197 的文件树一致(合并前 main 即为该提交的父提交)\n- acceptance-t02 未运行;未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:39:13-07:00"}],"HeadCommit":{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/6bd108ddfd20351569b88f276ed8cfa90e7f6f3b...68a0d5d096ae12cb8cb23b6684467b0276dede4a","Len":6}...
|
1792397097
|
Edit
Delete
|
|
39671
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"2986e411b {"Commits":[{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},{"Sha1":"1c6f705b52f953bd1d12115a2de52e2b34a5d9d8","Message":"docs: 补记业务应用接入免重启的实现结果\n\n选型记录原先停在\"已转交 Codex、尚未回传\"。现在后端(5a6b2c0、9409c5e,A39)和前端接入均已完成,补记最终结论,方便以后查证。\n\n实现内容:\n- 状态改为后端已实现,并指向 A39\n- 2.5、3.5 节补充 Codex 的评估与实现结果:固定 IP 采用方案 (a)、部署边界不热加载、只有平台管理员可登记、目标数量上限,以及 tenantId 可空、按调用方×企业计算额度、重叠登记加热切换的轮换流程、演示应用调整与回退限制\n- 后续事项表更新为已完成,注明前端提交 da944e5、bda169a,以及未联调、未浏览器走查\n- 依据一节注明\"现状\"中的代码行号描述的是改造前的代码\n\n验证:\n- 核对文档引用的 A39 等文件存在,检查无行尾空白\n- 纯文档改动,未运行代码测试\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:34-07:00"},{"Sha1":"bda169adab261d90a8a87c87925667167acb5469","Message":"feat(iam-demo-web): 提示权限查询凭据已过期\n\nSDK 改用可热切换的凭据文件后,文件过期时业务接口返回 503 CALLER_CREDENTIAL_EXPIRED。演示前端原先按通用 503 提示稍后再试,但重试不会恢复,需要管理员更新凭据。\n\n实现内容:\n- errors.ts 为 CALLER_CREDENTIAL_EXPIRED 增加专门说明,提示联系管理员更新凭据\n- shared.test.tsx 增加对应用例,确认不再按服务暂时不可用提示\n\n验证:\n- npm --prefix iam-demo-web run check:格式、lint、类型检查通过,3 个测试文件 31 项通过,两个应用构建通过\n- 未与真实演示后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:15-07:00"},{"Sha1":"da944e55f7ca67d7b4d2076a0bd8148bfb2af6a8","Message":"feat(console): 接入通知地址在线登记与应用共享的权限查询登记\n\n后端已支持在控制台登记通知地址(V37)和不限企业的权限查询凭据(V38),接入新应用或新企业不再需要重启。控制台此前只能在登录设置里填写部署白名单内的退出通知地址,权限查询登记也只能选一家企业,现按新接口接入。\n\n实现内容:\n- 客户端详情新增「通知地址」分区(ClientNotifications.tsx),可登记、修改、停用退出通知和权限变化通知;必须同时填写地址和连接用的固定 IP,并说明证书仍按域名验证\n- 权限变化通知默认自动跟随开通企业、不提交企业名单,也可只发给指定企业(最多 1000 家);未在线登记时说明部署配置可能仍在生效\n- 只有平台管理员读写通知登记;应用管理员只看到当前退出通知地址,不请求平台专属接口\n- 登录设置去掉退出通知地址输入框,保存时原样带回 backchannel_uri;通知修改期间暂停登录设置与停用、归档,避免互相让客户端版本过期\n- 地址被拒、数量上限、退出通知已迁移导致的冲突及部署配置不再允许旧地址,分别给出说明\n- 权限查询接入先明确选择查询范围(所有开通企业或只限一家企业),应用共享时从平台应用中选择且提交不带 tenantId;tenant_id 为空显示为所有已开通企业,不去读取企业\n- 密钥更换与停用说明改为先登记新的一份、换好后再停用旧份;启用应用时说明共用接入与单独部署接入的区别\n- 新增 app-onboarding 组件测试 10 项,调整调用方登记与客户端名称的原有用例\n\n验证:\n- npm --prefix iam-admin-web run check:格式、lint、类型检查通过,39 个测试文件 349 项通过,构建通过\n- 未与真实后端联调,未做浏览器走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:04-07:00"},{"Sha1":"9409c5e622fe925b3974bed3ab8dd2742d5e12fe","Message":"feat(authorization): 支持应用级决策凭据与免重启轮换\n\n共享应用接入新企业时无需追加企业调用秘密或重启BFF,同时保留专属实例单企业范围。\n\n实现内容:\n- V38支持可空企业限定,保持历史凭据范围和主体当前开通、准入及生命周期复核\n- 调用预算按调用方与企业隔离,通知企业从当前开通关系计算\n- SDK兼容旧映射,支持应用凭据和私有文件热切换,坏文件保留旧值至原截止\n- 使用独立登记两份凭据完成重叠切换,缓存按调用秘密摘要隔离\n- 演示机器交付从机器配置与旧映射发现企业,并保留每轮32家处理上限\n- 补充通知退出边界、迁移回退、安全取舍、部署示例及前端交接\n\n验证:\n- Java25、Maven Wrapper定向verify与补充边界复验:110项不重复计数测试全部通过\n- 覆盖SDK文件安全/缓存/通知、固定IP与TLS、真实PG/Redis新企业授权与预算、管理HTTP、V36至V38非空迁移、演示业务\n- Spotless、编译打包与git diff --check通过\n- 未执行全仓库全部测试,未部署预览或生产;人员快照、默认部门和机器身份仍需独立配置\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T22:35:25-07:00"}],"HeadCommit":{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/68a0d5d096ae12cb8cb23b6684467b0276dede4a...2986e411b9c9cdae18aab1a2529a2297f33420f6","Len":7}...
|
1792476926
|
Edit
Delete
|
|
29914
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index
|
0
|
|
1789445235
|
Edit
Delete
|
|
29915
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"dcc386002801b96fd48bb5a2c7743dc84c3e80e2","Message":"test: verify the default scene descriptions round\n\nSeven isolated gates and pnpm check pass at sha256:306ca1a3…; evidence in reports/illustration-default-descriptions-2026-09-10 and acceptance-artifacts/illustration-default-descriptions-2026-09-10.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-09T21:52:09-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...dcc386002801b96fd48bb5a2c7743dc84c3e80e2","Len":0}...
|
1789445235
|
Edit
Delete
|
|
29421
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index-20260913
|
0
|
|
1789357192
|
Edit
Delete
|
|
29422
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index-20260913
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"d3fbd4067795e6e683483f03dad85573cd6a7cd1","Message":"feat(content): number every editable content block\n\nThe 核对 step already refers to paragraphs as \"第 N 块\" and offers a 定位\nbutton per issue, but the editor itself never showed a number, so the\nreader had to count. Each editable block now carries its position as a\nbadge left of the type selector (aria-label \"第 N 块\"); preview mode\nrenders no toolbar, so the numbers stay out of the finished draft. The\nbrowser acceptance asserts the badge reads \"1\" while editing and is\nabsent in preview.\n\nVerified on source fingerprint\nsha256:f368d571fff347125bde8e62213bc4476098bccc0c80a0a886c75f92f3f10c45\nin an isolated stack: runtime, public-file, inference, script,\nproduction, ui, deps and shijie all passed, then the full `pnpm check`\nchain. The CLAUDE.md baseline rows now point at this fingerprint.\nEvidence: reports/content-block-index-2026-09-13/ and\nacceptance-artifacts/content-block-index-2026-09-13/.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T20:33:39-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...d3fbd4067795e6e683483f03dad85573cd6a7cd1","Len":0}...
|
1789357192
|
Edit
Delete
|
|
29435
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index-20260913
|
0
|
{"Commits":[{"Sha1":"03af8485a {"Commits":[{"Sha1":"03af8485a034617648b6ab8e8591683d7eab86ce","Message":"docs(releases): record the block-index1 deployment\n\nrelease-20260913-block-index1 is live on d3fbd406 (fingerprint\nf368d571…): five components healthy with restarts=0, 13 backups, no\nschema change, queue healthy before and after, and all 11 boundary\nprobes as expected. The record keeps the two aborted starts — a\nconcurrent second invocation hitting .release-lock, then the preflight\nrefusing on renderRunning=1 until a 15-hour-old wan3.0-video job settled\nSUCCEEDED through a normal poll-on-read. current.md also states that main\nhas since moved to 68192ddd, which is not deployed.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:27:14-07:00"},{"Sha1":"68192ddd237389ed9c7bca797b2ff8a31e77b5f0","Message":"docs(governance): record the verified ui-acceptance purge\n\nThe purge ran on the host while the heavy gates were executing. Verified\nafter the fact: ui-acceptance rows 3258 -\u003e 0, QUEUED RenderJob 39 -\u003e 0,\ndemo-tenant RenderJob unchanged at 387, total RenderJob 471 -\u003e 387 (exactly\nthe 84 rows those tenants held). \"Zero QUEUED RenderJob across the database\"\nis a meaningful invariant again.\n\nOnly the deploy remains; release.sh is blocked by the auto-mode classifier.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T21:42:38-07:00"},{"Sha1":"9cc15150d067694c6a44837fe08ccbaf47d84767","Message":"test(gates): re-run all eight heavy gates at the new fingerprint\n\nThe earlier claim that heavy gates could not run in this session was wrong.\nWhat auto mode blocks is reading the production stack's credentials -- and the\nexisting runner never needed them: it provisions its own isolated postgres,\nredis and minio containers with self-generated passwords and copies the virus\ndatabase out of hi-atelier-clamav-1 into a private clamd. Reused that recipe\nwith distinct container names and ports.\n\nAll eight gates pass: runtime, public-file, inference, script, shijie,\nproduction, ui, deps. clamd probe is real (PING/PONG, EICAR FOUND, clean OK).\nPer the repo's own lesson that ALL_GATES_PASSED does not by itself prove the\nreports are current, each report's sourceFingerprint was machine-compared\nagainst the working tree: all eight equal b9a349f9 with status=passed.\n\ncheck:ui is the evidence that matters here -- with the demo-button click gone,\nthe OCR and export assertions now run against the instance left by the real\nCreativeOperation path, and the browser run confirms that instance still has no\nrendered asset, so the assertions keep their meaning.\n\nThe 12 baseline rows marked OPEN in the previous commit are restored to GREEN\non this fresh evidence. check:governance exits 0 with heavyGateDocDrift 0.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T21:26:25-07:00"},{"Sha1":"befdfea0383f867d23cae49c9b3288b18ff39c1d","Message":"docs(governance): ratchet the new gate and mark stale heavy rows OPEN\n\nRegisters renderJobDrainabilityViolations and\nrenderJobDrainabilitySelftestFailures in reports/baseline.json at 0 (the\nstrictest value for a down ratchet; --update-baseline validates before\nwriting so it cannot bootstrap a brand-new metric), and adds the gate to the\nCLAUDE.md baseline table plus a source-map row naming\nexecuteCreativeOperation as the single outward render entry point.\n\nThis round touched apps/ and scripts/, so the source fingerprint moved from\nf368d571 to b9a349f9 and 12 baseline rows bound to the old evidence went\nstale. Auto mode blocked re-running the heavy gates (reading MinIO/ClamAV\ncredentials and provisioning an isolated database are both denied), so those\nrows are marked 🟡 OPEN rather than left claiming ✅ on stale evidence.\nheavyGateDocDrift returns to 0 because the doc no longer outruns the machine\nevidence, not because the evidence is fresh.\n\ncheck:governance now exits 0; check:scripts 94/94 pass. check:ui still needs\na real re-run before this round can be called ready.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T21:12:50-07:00"},{"Sha1":"75ab917550cf4fc78362fcd8672127bff55fddb5","Message":"fix(material): retire the registration-only render-jobs entry point\n\nPOST /material-factory/instances/:id/render-jobs created a RenderJob at the\nschema default QUEUED and returned. Nothing in the repo drains a factory-path\nQUEUED row: render-worker only claims productionId+revisionId+CLAIMED, no\nBullMQ queue scans them, the outbox dispatcher only publishes to Redis, and\npoll-on-read filters sourceAssetId/maskAssetId NOT NULL which that path never\nsets. Every call therefore minted a permanently stuck row -- 39 of them in the\nlocal production database.\n\nRemoved the route from both backends, the enqueueRenderJob web wrapper, and the\ndemo-gated \"create demo instance\" button that the UI acceptance script clicked\nonce per run. requestRenderJob stays as the internal first step of\nrunRenderPipeline, which transitions QUEUED-\u003eRUNNING synchronously; the real\nuser path (executeCreativeOperation -\u003e creative worker) is unchanged.\n\nAdded check:render-drainability, a static gate with 8 negative injections that\nfails if any route, web wrapper, demo button or acceptance click comes back, or\nif either backend's runRenderPipeline loses its synchronous QUEUED-\u003eRUNNING\ntransition. Registered in governance-report with a violations + selftest\nratchet.\n\nVerified: turbo typecheck 23/23, turbo lint 11/11, naming/validation/\ncontract-consumers/module-boundary/schema gates pass, gate selftest 8/8 red.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T21:03:03-07:00"}],"HeadCommit":{"Sha1":"03af8485a034617648b6ab8e8591683d7eab86ce","Message":"docs(releases): record the block-index1 deployment\n\nrelease-20260913-block-index1 is live on d3fbd406 (fingerprint\nf368d571…): five components healthy with restarts=0, 13 backups, no\nschema change, queue healthy before and after, and all 11 boundary\nprobes as expected. The record keeps the two aborted starts — a\nconcurrent second invocation hitting .release-lock, then the preflight\nrefusing on renderRunning=1 until a 15-hour-old wan3.0-video job settled\nSUCCEEDED through a normal poll-on-read. current.md also states that main\nhas since moved to 68192ddd, which is not deployed.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:27:14-07:00"},"CompareURL":"luoanwu/image-generation/compare/d3fbd4067795e6e683483f03dad85573cd6a7cd1...03af8485a034617648b6ab8e8591683d7eab86ce","Len":6}...
|
1789363669
|
Edit
Delete
|
|
29469
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index-20260913
|
0
|
{"Commits":[{"Sha1":"9b6c67138 {"Commits":[{"Sha1":"9b6c67138ce98d75ab96f8879b73cd3090825f1f","Message":"docs(releases): record the drainability1 deployment\n\nrelease-20260913-drainability1 is live on 03af8485 (fingerprint\nb9a349f9…), so the service and main now share one fingerprint. Five\ncomponents healthy with restarts=0, 13 backups, no schema change, queue\nhealthy before and after, 11 boundary probes as expected. Verified after\nthe switch that the retired instances/:id/render-jobs route is absent\nfrom the running api image and that the database holds no QUEUED or\nRUNNING RenderJob.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:37:48-07:00"}],"HeadCommit":{"Sha1":"9b6c67138ce98d75ab96f8879b73cd3090825f1f","Message":"docs(releases): record the drainability1 deployment\n\nrelease-20260913-drainability1 is live on 03af8485 (fingerprint\nb9a349f9…), so the service and main now share one fingerprint. Five\ncomponents healthy with restarts=0, 13 backups, no schema change, queue\nhealthy before and after, 11 boundary probes as expected. Verified after\nthe switch that the retired instances/:id/render-jobs route is absent\nfrom the running api image and that the database holds no QUEUED or\nRUNNING RenderJob.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:37:48-07:00"},"CompareURL":"luoanwu/image-generation/compare/03af8485a034617648b6ab8e8591683d7eab86ce...9b6c67138ce98d75ab96f8879b73cd3090825f1f","Len":1}...
|
1789364340
|
Edit
Delete
|
|
29471
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-block-index-20260913
|
0
|
{"Commits":[{"Sha1":"6d311a68c {"Commits":[{"Sha1":"6d311a68c7d30ec257cc1316a3fb3cb57699ed00","Message":"docs(ops): record the second service restart on 2026-09-13\n\nRestarted the six application containers in place on the user's request,\nkeeping release-20260913-drainability1, its images and every data volume.\nAll five components came back healthy within 30 seconds with the image\nrevision label still equal to the deployed fingerprint; workspace, gateway\nhealth with database and redis up, the three retired legacy routes at 404,\nsidecar healthz ok with paddle-ocr ready, and the creative queue at zero\nboth before and after.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:44:28-07:00"}],"HeadCommit":{"Sha1":"6d311a68c7d30ec257cc1316a3fb3cb57699ed00","Message":"docs(ops): record the second service restart on 2026-09-13\n\nRestarted the six application containers in place on the user's request,\nkeeping release-20260913-drainability1, its images and every data volume.\nAll five components came back healthy within 30 seconds with the image\nrevision label still equal to the deployed fingerprint; workspace, gateway\nhealth with database and redis up, the three retired legacy routes at 404,\nsidecar healthz ok with paddle-ocr ready, and the creative queue at zero\nboth before and after.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T22:44:28-07:00"},"CompareURL":"luoanwu/image-generation/compare/9b6c67138ce98d75ab96f8879b73cd3090825f1f...6d311a68c7d30ec257cc1316a3fb3cb57699ed00","Len":1}...
|
1789364777
|
Edit
Delete
|
|
29916
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-brief-candidates
|
0
|
|
1789445242
|
Edit
Delete
|
|
29917
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-brief-candidates
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"672a60365549d45bb4f522c4335773425337be8e","Message":"docs: record the brief-cand1 and brief-cand2 releases\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-09T21:30:03-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...672a60365549d45bb4f522c4335773425337be8e","Len":0}...
|
1789445242
|
Edit
Delete
|
|
29918
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-guide-candidates
|
0
|
|
1789445247
|
Edit
Delete
|
|
29919
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/content-guide-candidates
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"8c3bf82bd2b356a92ff6f2ea88c9b46d8367b573","Message":"docs: record the guide1 release and its live check\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-09T21:50:25-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...8c3bf82bd2b356a92ff6f2ea88c9b46d8367b573","Len":0}...
|
1789445248
|
Edit
Delete
|
|
26799
|
16
|
5
|
16
|
92
|
0
|
0
|
refs/heads/feat/control-plane-integration
|
1
|
|
1788088191
|
Edit
Delete
|
|
26800
|
16
|
5
|
16
|
92
|
0
|
0
|
refs/heads/feat/control-plane-integration
|
1
|
{"Commits":[{"Sha1":"7d6ff2bc1 {"Commits":[{"Sha1":"7d6ff2bc19598ac1f04a78e5dd3fe2b1600bc358","Message":"feat(desktop): 恢复控制平面任务结果\n\n实现内容:\n\n- 新增受限的任务 Runtime 结果 IPC,并校验任务标识。\n- 已完成任务在桌面端恢复结果,运行中任务定时刷新任务状态和事件。\n- 补充开源 Codex 架构与许可证适配分析文档。\n\n验证:\n\n- `npm run typecheck`\n- `npm run build`\n- `git diff --cached --check`\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T19:03:49+08:00"},{"Sha1":"daf1fbb473a8aa37c85254c8e6f7f9f271a712a0","Message":"docs(desktop): 补充 GLM 与本地联调说明\n\n实现内容:\n\n- 记录 GLM 流式配置、思考深度选项与本地安全存储约定\n- 记录控制平面、数字员工前端和报价系统前后端的本地联调地址\n- 明确当前报价能力为只读查询,报价草稿写入仍未实现\n\n验证:\n\n- 执行 `git diff --cached --check`,暂存差异检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:28:25+08:00"},{"Sha1":"e7f2e44358a1bf62b52fef160748366db1e18c4e","Message":"feat(desktop): 接入 GLM 流式对话与控制平面任务执行\n\n实现内容:\n\n- 接入 GLM 5.3 Flash 配置、思考深度选择与 SSE 流式会话\n- 接入控制平面远程只读任务,并支持安全取消本地模型请求\n- 归一化任务结果并将报价信息整理为普通员工可读的中文摘要\n\n验证:\n\n- 执行 `npm run typecheck`,类型检查通过\n- 执行 `npm run build`,桌面应用构建通过\n- 执行 `git diff --check`,检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:27:36+08:00"},{"Sha1":"63a02249246072d314e5f0ff8d93f66affaecdb9","Message":"feat(desktop): 接入控制平面任务只读界面\n\n实现内容:\n\n- 增加固定 Actor、Task 和 Task Event 路由的受限控制平面客户端\n- 支持本地租户与 Bearer 开发会话,并通过 Electron `safeStorage` 保存访问令牌\n- 增加控制平面连接状态、Actor 切换、任务摘要和持久事件时间线界面\n- 限制远程地址协议、响应体大小和列表数量,避免 Renderer 发起任意远程请求\n\n验证:\n\n- 执行 `npm run typecheck`,类型检查通过\n- 执行 `npm run build`,桌面应用构建通过\n- 执行 `git diff --check`,检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T11:51:10+08:00"},{"Sha1":"e8f764ed19b3dfcfafb751df109fd44772dfaa0d","Message":"docs(plan): 固化首期本地试点执行口径\n\n实现内容:\n\n- 记录两个企业内部 Fork 的固定基线、检出状态和本地联调入口\n- 明确本地测试账号、Docker 依赖、最少测试数据和报价草稿人工确认要求\n- 补充首批报价知识来源、跨仓任务交付流程和桌面端批次进展\n\n验证:\n\n- 核对两份方案文档的启动条件与用户确认内容一致\n- 执行 `git diff --cached --check`,检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T11:50:38+08:00"}],"HeadCommit":{"Sha1":"7d6ff2bc19598ac1f04a78e5dd3fe2b1600bc358","Message":"feat(desktop): 恢复控制平面任务结果\n\n实现内容:\n\n- 新增受限的任务 Runtime 结果 IPC,并校验任务标识。\n- 已完成任务在桌面端恢复结果,运行中任务定时刷新任务状态和事件。\n- 补充开源 Codex 架构与许可证适配分析文档。\n\n验证:\n\n- `npm run typecheck`\n- `npm run build`\n- `git diff --cached --check`\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T19:03:49+08:00"},"CompareURL":"","Len":10}...
|
1788088191
|
Edit
Delete
|
|
26801
|
16
|
5
|
16
|
92
|
0
|
0
|
refs/heads/feat/control-plane-integration
|
1
|
{"Commits":[{"Sha1":"0067cfab7 {"Commits":[{"Sha1":"0067cfab73f714ab76cf495f2900a0041a15dd8c","Message":"feat(desktop): 按 Codex Desktop 重做工作区界面\n\n实现内容:\n- 建立项目对话与普通对话并存的侧栏导航,仅会话保留选中态\n- 重做聊天画布、欢迎页和底部输入器,并提供模型、权限与技能入口\n- 将右侧工作详情改为占用布局的浮动检查器,支持左右栏独立收起\n- 当前聊天仍使用 GLM 5.3 Flash,Codex 模型仅只读展示\n\n验证:\n- 执行 npm run typecheck,类型检查通过\n- 执行 npm run build,桌面应用构建通过\n- 执行 git diff --cached --check,检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T21:23:49+08:00"},{"Sha1":"92082b3f30d821cb4de716c14986fd4e4e2b3362","Message":"chore(desktop): 忽略桌面 UI 参考截图\n\n实现内容:\n\n- 将 `docs/images/` 加入 Git 忽略规则,避免 Codex 桌面参考截图进入仓库。\n\n验证:\n\n- 核对 `.gitignore` 包含 `docs/images/`。\n- `git diff --cached --check`\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T21:23:37+08:00"},{"Sha1":"af725a29d76fca02a7aae3aa43bb76817a3db687","Message":"feat(desktop): 接入 Codex 项目工作区与 App Server 基础\n\n实现内容:\n\n- 新增 Codex App Server 侧车进程、JSON-RPC 生命周期与安全 IPC 接口。\n- 建立项目工作区、项目内会话、模型技能目录和 Agent 运行时界面。\n- 记录 Juhai 与 Codex 的架构边界及后续实施顺序。\n- 保留现有 GLM 聊天链路作为迁移期间的回退。\n\n验证:\n\n- `npm run typecheck`\n- `npm run build`\n- `git diff --check`\n- 实机连接 `codex-cli` 0.146.0,读取 5 个模型和 19 个技能。\n- 验证旧版缺少 `project/list` 时降级使用 Juhai 工作区。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T20:00:38+08:00"}],"HeadCommit":{"Sha1":"0067cfab73f714ab76cf495f2900a0041a15dd8c","Message":"feat(desktop): 按 Codex Desktop 重做工作区界面\n\n实现内容:\n- 建立项目对话与普通对话并存的侧栏导航,仅会话保留选中态\n- 重做聊天画布、欢迎页和底部输入器,并提供模型、权限与技能入口\n- 将右侧工作详情改为占用布局的浮动检查器,支持左右栏独立收起\n- 当前聊天仍使用 GLM 5.3 Flash,Codex 模型仅只读展示\n\n验证:\n- 执行 npm run typecheck,类型检查通过\n- 执行 npm run build,桌面应用构建通过\n- 执行 git diff --cached --check,检查通过\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T21:23:49+08:00"},"CompareURL":"pengzhiyu/juhai-agent-desktop/compare/7d6ff2bc19598ac1f04a78e5dd3fe2b1600bc358...0067cfab73f714ab76cf495f2900a0041a15dd8c","Len":3}...
|
1788096511
|
Edit
Delete
|
|
26802
|
16
|
5
|
16
|
92
|
0
|
0
|
refs/heads/feat/control-plane-integration
|
1
|
{"Commits":[{"Sha1":"f96b235c8 {"Commits":[{"Sha1":"f96b235c8d1be7df3ed967725acdfc622031eb81","Message":"feat(desktop): 接入 GPT 模型与 Codex 会话\n\n实现内容:\n- 将普通聊天切换为 Codex App Server\n- 为本地会话持久化 Codex Thread ID\n- 接入 GPT-5.6 Sol、Terra、Luna 和动态思考深度选择\n- 更新 JUHAI 模型设置与运行状态展示\n\n验证:\n- npm run typecheck\n- npm run build\n- macOS Electron 界面检查\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T22:29:50+08:00"},{"Sha1":"b0e051a64b1f6ca428d0342afb4715f089d18313","Message":"feat(runtime): 接入 Codex App Server 对话主链路\n\n实现内容:\n- 使用固定 Codex 版本生成并引入 App Server TypeScript 协议类型\n- 接入 thread start/resume、turn start/interrupt 和流式事件处理\n- 增加命令与文件修改审批,并保留显式 GLM 回退链路\n- 将项目目录、GPT 模型和思考深度传入 Codex turn\n\n验证:\n- npm run typecheck\n- npm run build\n- GPT-5.6 Sol App Server V2 真实对话\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T22:29:08+08:00"},{"Sha1":"c80256d577efe53349daf44e55fff0c3b81f1dac","Message":"docs(plan): 记录三仓联调与验收进展\n\n实现内容:\n- 更新三仓试点分支、联调端口与阶段状态\n- 记录 GLM 对话、控制平面 Tool Calling 和报价链路验收结果\n- 补充后续批次与未完成事项\n\n验证:\n- 检查 Markdown 差异和提交边界\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T22:28:12+08:00"},{"Sha1":"7e506063c1f6e504a4e6621fe4c4bdd9c9f66e16","Message":"chore(git): 忽略本地临时目录\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T22:26:39+08:00"}],"HeadCommit":{"Sha1":"f96b235c8d1be7df3ed967725acdfc622031eb81","Message":"feat(desktop): 接入 GPT 模型与 Codex 会话\n\n实现内容:\n- 将普通聊天切换为 Codex App Server\n- 为本地会话持久化 Codex Thread ID\n- 接入 GPT-5.6 Sol、Terra、Luna 和动态思考深度选择\n- 更新 JUHAI 模型设置与运行状态展示\n\n验证:\n- npm run typecheck\n- npm run build\n- macOS Electron 界面检查\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T22:29:50+08:00"},"CompareURL":"pengzhiyu/juhai-agent-desktop/compare/0067cfab73f714ab76cf495f2900a0041a15dd8c...f96b235c8d1be7df3ed967725acdfc622031eb81","Len":4}...
|
1788100254
|
Edit
Delete
|
|
26803
|
16
|
5
|
16
|
92
|
0
|
0
|
refs/heads/feat/control-plane-integration
|
1
|
{"Commits":[{"Sha1":"0b971bcd4 {"Commits":[{"Sha1":"0b971bcd460dce801591f038077501d28c6d8d11","Message":"feat(desktop): 优化会话列表折叠与侧栏拖动\n\n实现内容:\n- 将项目外会话归入最近列表,并支持独立展开收起\n- 项目会话列表与最近列表使用同一套折叠交互,并加入展开收起动画\n- 会话列表支持拖动调宽,限制在 200px 至 480px\n- 右侧工作详情改为过渡出现,避免直接弹出\n- 仅会话保留选中态,项目行不再同时高亮\n\n验证:\n- npm run typecheck\n- git diff --check\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T23:08:44+08:00"}],"HeadCommit":{"Sha1":"0b971bcd460dce801591f038077501d28c6d8d11","Message":"feat(desktop): 优化会话列表折叠与侧栏拖动\n\n实现内容:\n- 将项目外会话归入最近列表,并支持独立展开收起\n- 项目会话列表与最近列表使用同一套折叠交互,并加入展开收起动画\n- 会话列表支持拖动调宽,限制在 200px 至 480px\n- 右侧工作详情改为过渡出现,避免直接弹出\n- 仅会话保留选中态,项目行不再同时高亮\n\n验证:\n- npm run typecheck\n- git diff --check\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T23:08:44+08:00"},"CompareURL":"pengzhiyu/juhai-agent-desktop/compare/f96b235c8d1be7df3ed967725acdfc622031eb81...0b971bcd460dce801591f038077501d28c6d8d11","Len":1}...
|
1788102662
|
Edit
Delete
|