sqlite-web 0.7.2
gitea.db
action
Create
Query
access
access_token
action
action_artifact
action_run
action_run_index
action_run_job
action_runner
action_runner_token
action_schedule
action_schedule_spec
action_task
action_task_output
action_task_step
action_tasks_version
action_variable
app_state
attachment
auth_token
badge
branch
collaboration
comment
commit_status
commit_status_index
commit_status_summary
commit_sync_log
commit_sync_status
dbfs_data
dbfs_meta
deploy_key
email_address
email_hash
external_login_user
follow
gpg_key
gpg_key_import
hook_task
issue
issue_assignees
issue_content_history
issue_dependency
issue_index
issue_label
issue_pin
issue_user
issue_watch
label
language_stat
lfs_lock
lfs_meta_object
login_source
milestone
mirror
notice
notification
oauth2_application
oauth2_authorization_code
oauth2_grant
org_user
package
package_blob
package_blob_upload
package_cleanup_rule
package_file
package_property
package_version
project
project_board
project_issue
protected_branch
protected_tag
public_key
pull_auto_merge
pull_request
push_mirror
reaction
release
renamed_branch
repo_archiver
repo_hidden_file
repo_indexer_status
repo_license
repo_redirect
repo_topic
repo_transfer
repo_unit
repository
review
review_state
secret
session
sqlite_sequence
star
stopwatch
system_setting
task
team
team_invite
team_repo
team_unit
team_user
topic
tracked_time
two_factor
upload
user
user_badge
user_blocking
user_open_id
user_redirect
user_setting
version
watch
webauthn_credential
webhook
Toggle helper tables
Structure
Content
Query
Insert
Drop
Import
Export
Update row 20279 in action
id
Primary key.
INTEGER NOT NULL
user_id
INTEGER
op_type
INTEGER
act_user_id
INTEGER
repo_id
INTEGER
comment_id
INTEGER
is_deleted
INTEGER NOT NULL (default 0
ref_name
refs/heads/chore/governance-ghost-assets-and-readmodel
TEXT
is_private
INTEGER NOT NULL (default 0
content
{"Commits":[{"Sha1":"8fe17cd57002bf1ed691e63a80c71db5c03d0f5f","Message":"feat(solutions): 项目名称默认取客户名称 + 经营目标/目标客群/硬性约束标签化\n\n本轮直接改动(客户方案域):\n\n- 建项表单选定客户后默认预填客户名称,且**只覆盖上一次自动填入的值**——用户手改过\n 就彻底交还给他,换客户也不再动它。仍是纯 UI 预填:name 在 contracts 里照旧 min(1)\n 必填,后端不替任何调用方脑补名称。\n- 经营目标、目标客群、硬性约束统一改为标签(chips)录入,候选从本租户已有方案现算、\n 按频次排序,不建标签字典表(用户裁决:只做到「表单内标签输入 + 历史候选」这一层;\n 租户级标签库是独立主数据对象,要走 owner-matrix 登记与完整模块流程)。\n- 标签归一(去空白 → 拒空串 → 去重保序)提为 contracts 单源 tagListSchema,读取侧\n 归一为 normalizeTagList。只在前端 chips 去重挡不住 curl([\"A\",\"A \"] 就能撑破上限、\n 读模型里并排出现两个肉眼一样的标签,C26 同一条教训),两后端各补一条读回断言,\n 证明规则真在服务端生效。\n- targetSegment 由单值 VARCHAR(500) 迁为 Json 标签数组,迁移\n 20260731090000_solution_target_segment_tags(两后端同份):就地\n ALTER ... TYPE ... USING,空串→[]、非空单值→单元素数组;**刻意不按分隔符拆**——\n 存量是自由文本,猜标签边界会造出谁也没确认过的半句话标签。转换语义已在真实\n PostgreSQL 上用 legacy 值单独验证。\n- 发布闸门判空由 .trim() 改为经 normalizeTagList 后 length===0,并同步\n check:role-permissions 的绊网正则;normalizeTagList 同时兜住迁移前写下的冻结快照\n (公开页读的就是快照,按定义不可回填)。\n- 定位确认凭证比对标签改用集合语义 sameTagSet:纯拖动排序不改变复核人确认过的那组\n 客群,按数组逐位比对会把已确认误判成 POSITIONING_STALE,逼销售重走复核。\n- E2E 首跑抓到一个真问题:标签成签会让输入框长高一行、提交按钮随之下移,mousedown\n 与 mouseup 落到不同元素上,那一下点击被浏览器吞掉。测试改为显式 Tab 失焦,并保留\n 「只失焦不回车也不丢标签」这条断言(失焦即成签,避免静默丢数据)。\n\n⚠️ 共享工作区提交:提交时本仓有并行会话在途(收款域、报价对客策略与发送对话框、\n操作手册生成、队列隔离与设计令牌门禁、商品目录导入等),其改动一并进入本提交。\n无法按文件拆分——packages/contracts/src/solution.ts 同时含两边内容。\n\n验收(作用域=本地工作区,提交时 dirty,不得外推为远端已验证):\n- pnpm check 全绿(14 个静态门禁 + lint + typecheck)\n- pnpm check:runtime 267 用例 / 地板 265,{contracts:187, api-nestjs:40, api-fastify:40}\n- pnpm check:ui 8/8 真浏览器用例\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-01T00:21:22-07:00"},{"Sha1":"a79aa437569cad73ecee4ede960c6f80a88bf98d","Message":"docs: 记录 G24 分页形态裁决(方案①:列表分页 + 独立 options 接口)并说明本轮未落地的原因\n\n用户已裁决方案①,设计细节(Paginated/OptionList 契约形状、3 个 options 接口的字段\n及其反推依据)一并写入 G24,下一轮直接落地,不必重新讨论。\n\n本轮未落地的原因写明:这是会改变 4 个接口响应形状的跨层迁移,而同一 checkout 上\n有并行会话正在开发收款域——改到一半的跨层 API 迁移留在共享工作区会直接卡住对方,\n因此整体回退、只留裁决结论。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T08:15:46-07:00"},{"Sha1":"cafbd90f352d9fae794c4cae88c8435d84ebf132","Message":"feat(overview): 关闭 C27——把总览 KPI 从浏览器搬到服务端聚合 owner\n\n问题不在今天,在加分页那天\n总览 6 个指标全部在 MobileOverview.tsx 里对 GET /api/quotations 的全量返回 reduce,\n且「什么算已提交/已通过/已确认」「主报价金额怎么取」只以三个本地 Set + 一个函数的形式\n存在于这一个前端组件里。当前列表无分页,所以指标确实是对的——但它的正确性依赖\n一个没人承诺过的前提。只要给列表加分页或后端加截断,指标会静默退化成「当前页的统计」,\n页面还印着「全部来自当前租户」,没有任何测试会红。\n\n修法:把「谁决定聚合范围」搬回拥有数据的那一层\n- contracts 出单源:QUOTATION_{SUBMITTED,APPROVED,CONFIRMED,WAITING_CUSTOMER}_STATES\n + summarizeQuotations + countQuotationStates\n- 两后端 GET /api/quotations/summary 只做窄投影取行,算账一律调那个纯函数;\n 采购侧 GET /api/fulfillment/purchase-orders/summary 用 groupBy 让数据库出计数\n- 前端只做展示与单位换算(分→元、小时→天)\n\n顺带买到 G17 的一小块:聚合逻辑放 contracts 而非两后端各写一遍,\n双后端行为对等在这条路径上是结构保证,不需要门禁,因为不存在两份实现。\n\n同轮下线两处假值\n- 写死的「你好,本地报价管理员」→ 按 contracts 角色显示,不编造用户姓名\n- 最近报价表每行恒为「当前团队」的「负责人」列 → 整列移除(Quotation 无归属人字段),\n 口径同「开票收款尚未建模」:宁可不显示,也不用假值占位;同步收窄 grid 列数\n\n证据\n- pnpm check exit=0\n- pnpm check:runtime:本轮净贡献 87 用例(地板 83→87、ownTestCases 93→95)\n 两后端各 1 条聚合验收:空集均值 0 而非 NaN/byState 覆盖状态全集/跨租户不参与/403 负例\n- pnpm check:ui:8/8 全绿\n\n未闭环并显式登记为 G24:列表本身仍无分页。分页形态是真岔路——这 4 个列表同时喂着\n展示列表和 15 个关联对象下拉,天真分页会让 C22 的「关联对象来自真实读模型选择」\n退化成「只能选到第一页」。三个候选方案已写入 G24,待裁决。\n\n注:本仓有并行会话正在开发收款域。本次提交按文件路径逐个对账,\nquotation.ts 用补丁级 hunk 过滤剔除了对方的 ROLE_PERMISSIONS 改动;\nreports/*.latest.json 因计数被对方未提交的测试污染,本轮不提交,只提交经独立核算的 baseline.json。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T08:06:50-07:00"},{"Sha1":"ec76984fa40261041bf89feeb5d64680a77ad577","Message":"feat(products,customers): 补编辑入口并关闭 C26——partial 更新 schema 丢掉的价格不变量\n\n审计口径「后端有写接口、前端无入口」:PATCH /api/products/:id 与 /api/customers/:id 在\n两后端都已实现且写链治理齐全(权限 + 租户条件写 + 0 行 404 + outbox 同 tx),\n但前端全仓只有 solutions 用过 PATCH——商品和客户建完就再也改不了。\n\n动工前核契约,先发现一个必须先补的洞(C26)\n- 价格不变量「底价/成本价 ≤ 标准价」只写在 createProductSchema 的 superRefine 里;\n updateProductSchema = productBaseSchema.partial() 从 base 派生,PATCH 完全绕过它。\n- 长期不可达只因前端没有编辑入口——补 UI 会把它立刻变成可达。\n- 修法不是给 update schema 也加个 refine:PATCH 可能只带 minimumPriceCents,\n 单看请求体判不出来。拆两半:contracts 提单源 checkProductPriceInvariant;\n update schema 只判同一请求内同时出现的字段,两后端在 tx 内合并现有记录后调同一函数兜底。\n\n前端\n- products/customers 各补 update API + mutation hook + 内联编辑器。\n- 编辑表单刻意用 createProductSchema 校验(它带不变量),让前后端拦同一件事。\n- SKU 与商品类型不开放编辑:已被历史报价明细固化为不可变快照,事后改会让旧报价口径漂移。\n- useUpdateCustomer 一并失效 quotations 缓存:客户名是报价抬头来源,否则报价列表继续显示旧抬头。\n\n证据\n- pnpm check exit=0\n- pnpm check:runtime:85 用例(31/27/27),地板同步 83→85、ownTestCases 91→93\n 新增两后端各 1 条 HTTP 负例:单字段 PATCH→400、双字段 PATCH→400、失败后读回未变、合法 PATCH 写库\n- pnpm check:ui:8/8 全绿,新增编辑闭环与不变量提示断言\n\n过程中自伤两次并已修正(记入 C26)\n- 编辑用例改了共享商品 PRODUCT_NAME → 下游 3 条用例全挂;改用专用 EDIT_SKU 商品并在常量处写明禁令\n- 新增商品让报价下拉选项从 3 变 4 → 更新计数并注明构成,保留其「挡重复项/挡漏建」的作用\n- 顺带把 productLibrary.locator(\"form\") 收窄为 getByTestId(\"product-create-form\")(C16 同款规则)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T07:48:35-07:00"},{"Sha1":"aed0147384ea12244797a17c46bfe98c4cdeb0a2","Message":"fix(governance): 关闭 C25——删除幽灵 UI 资产并给「文档点名的代码符号」上门禁\n\n审计「每个菜单的真实对接」时发现 OrdersPanel/UsersPanel 在整个 apps/web/src 里\n没有任何 import,且是 9 个 API helper 的唯一消费者——一整棵约 560 行的死子树。\n\n真正的问题不是死代码,是三份治理文档仍拿它们当活资产:\n- owner-matrix 把 User/Order/OrderEvent 的读模型消费方写成这两个面板(追不到可达 UI);\n- CLAUDE.md C16 宣称的防线 getByTestId(\"users-panel\") 在 E2E 里早已不存在;\n- CLAUDE.md 的「apps/web 三面板样板」指向的布局已被 18 入口工作台取代。\n既有门禁交集恰好为空:typecheck 不报未使用导出;check:docs-truth 的幽灵资产断言\n管的是「文档给示例但文件不存在」(这里正相反);check:module-integration 只扫菜单内条目。\n\n处置(用户裁决:删除而非挂回 ADMIN 入口)\n- 删 OrdersPanel/UsersPanel + 9 个仅供其消费的 helper + 0 引用且注释失真的 api 泛型对象\n + 0 引用的 USD 版 formatCentsToCurrency;\n- /api/users、/api/orders、/api/jobs 后端与双后端 HTTP/DB 测试一律不动,只是不再有 UI 路径;\n- owner-matrix 三行改「无 UI 消费方」并加登记规则 5;C16 行改「规则仍生效、原实例已下线」;\n 「三面板样板」更正为现网 shell 结构;quotation-blueprint 两处同步;经验库补 C25 完整叙事。\n\n新增/重锚两处门禁(均已负向测试)\n- check:module-integration 加 owner-matrix-consumer-*:文档点名的组件必须在 apps/web 真实可达。\n 负向证据:真实磁盘造一个无人 import 的 ZombiePanel 并被点名 → 红;\n 摘掉 EventFeed 唯一 import → 红(证明正向路径不是空跑,Outbox 行确实在被断言)。\n- check:contract-consumers 的前端半边原本三条断言全锚在 OrdersPanel 上——即长期在守一个\n 没人走的路口。重锚到报价/商品/履约三个真实工作台,并从「好模式存在」改为「坏模式不存在」:\n 原断言局部改坏 1/3 处不会红(实测),新 reject 改坏一处即红(实测)。\n\n证据:pnpm check exit=0(本地工作区,7f1be32 基线同样 exit=0)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T07:32:18-07:00"}],"HeadCommit":{"Sha1":"8fe17cd57002bf1ed691e63a80c71db5c03d0f5f","Message":"feat(solutions): 项目名称默认取客户名称 + 经营目标/目标客群/硬性约束标签化\n\n本轮直接改动(客户方案域):\n\n- 建项表单选定客户后默认预填客户名称,且**只覆盖上一次自动填入的值**——用户手改过\n 就彻底交还给他,换客户也不再动它。仍是纯 UI 预填:name 在 contracts 里照旧 min(1)\n 必填,后端不替任何调用方脑补名称。\n- 经营目标、目标客群、硬性约束统一改为标签(chips)录入,候选从本租户已有方案现算、\n 按频次排序,不建标签字典表(用户裁决:只做到「表单内标签输入 + 历史候选」这一层;\n 租户级标签库是独立主数据对象,要走 owner-matrix 登记与完整模块流程)。\n- 标签归一(去空白 → 拒空串 → 去重保序)提为 contracts 单源 tagListSchema,读取侧\n 归一为 normalizeTagList。只在前端 chips 去重挡不住 curl([\"A\",\"A \"] 就能撑破上限、\n 读模型里并排出现两个肉眼一样的标签,C26 同一条教训),两后端各补一条读回断言,\n 证明规则真在服务端生效。\n- targetSegment 由单值 VARCHAR(500) 迁为 Json 标签数组,迁移\n 20260731090000_solution_target_segment_tags(两后端同份):就地\n ALTER ... TYPE ... USING,空串→[]、非空单值→单元素数组;**刻意不按分隔符拆**——\n 存量是自由文本,猜标签边界会造出谁也没确认过的半句话标签。转换语义已在真实\n PostgreSQL 上用 legacy 值单独验证。\n- 发布闸门判空由 .trim() 改为经 normalizeTagList 后 length===0,并同步\n check:role-permissions 的绊网正则;normalizeTagList 同时兜住迁移前写下的冻结快照\n (公开页读的就是快照,按定义不可回填)。\n- 定位确认凭证比对标签改用集合语义 sameTagSet:纯拖动排序不改变复核人确认过的那组\n 客群,按数组逐位比对会把已确认误判成 POSITIONING_STALE,逼销售重走复核。\n- E2E 首跑抓到一个真问题:标签成签会让输入框长高一行、提交按钮随之下移,mousedown\n 与 mouseup 落到不同元素上,那一下点击被浏览器吞掉。测试改为显式 Tab 失焦,并保留\n 「只失焦不回车也不丢标签」这条断言(失焦即成签,避免静默丢数据)。\n\n⚠️ 共享工作区提交:提交时本仓有并行会话在途(收款域、报价对客策略与发送对话框、\n操作手册生成、队列隔离与设计令牌门禁、商品目录导入等),其改动一并进入本提交。\n无法按文件拆分——packages/contracts/src/solution.ts 同时含两边内容。\n\n验收(作用域=本地工作区,提交时 dirty,不得外推为远端已验证):\n- pnpm check 全绿(14 个静态门禁 + lint + typecheck)\n- pnpm check:runtime 267 用例 / 地板 265,{contracts:187, api-nestjs:40, api-fastify:40}\n- pnpm check:ui 8/8 真浏览器用例\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-01T00:21:22-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/9618d78da3e668f14e3c1611d7090f45eef0c085...8fe17cd57002bf1ed691e63a80c71db5c03d0f5f","Len":7}
TEXT
created_unix
INTEGER
Update
Cancel