Repository navigation
fix(app-shell): an expression field shows the draft's server verdict at its own path - #26999
Conversation
Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx Co-Authored-By: Claude <noreply@anthropic.com>
…n path Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx Co-Authored-By: Claude <noreply@anthropic.com>
…the RLS pins Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx Co-Authored-By: Claude <noreply@anthropic.com>
…-0i0ziw # Conflicts: # ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 34c4643db8560186553c354510b9c2251276149f && git checkout 34c4643db8560186553c354510b9c2251276149f
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 50b1b7d81e753c7e79f039c5d53c95e44ed99f6d 5aa7e9722995abe0a6c970f86f1166b07fd86985 && git checkout -B drift-repro 50b1b7d81e753c7e79f039c5d53c95e44ed99f6d && git merge --no-ff 5aa7e9722995abe0a6c970f86f1166b07fd86985
node scripts/docs-audit/affected-docs.mjs --json 50b1b7d81e753c7e79f039c5d53c95e44ed99f6d
|
席位核对ACCEPT · seat 席位意见:表达式字段现在按自己的路径读服务端
Generated by Claude Code |
…-0i0ziw # Conflicts: # ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx
席位核对 · addendum (queue kick, re-merge)ACCEPT stands · seat The merge queue removed this PR for
Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40623264216 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40624557779 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40625589243 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40627570244 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 40629404974 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
…ix for #27037) The case seeds RELATION_FILTER_ID_CAP (1,000) rows and deletes 1,001: 2.3 s alone, past the default 5 s on a loaded full-suite queue shard, which ejected #26960, #27011 and #27020 (#27037). The slowdown itself is #27004's (since #26930 a 1,001-row predicate delete is about 18x slower); this only budgets for it. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QUs3Bshfmr8srPY21BVS4u (cherry picked from commit 6674ba8)
|
Ported fix for #27037, not this PR's change. The merge queue dequeued this PR on Local: that test file passes (the cap case 1.8 s); Generated by Claude Code |
席位核对 · addendum (queue flake, ported fix)ACCEPT stands · seat The merge queue removed this PR for
Generated by Claude Code |
…-0i0ziw # Conflicts: # ui/packages/app-shell/src/views/metadata-admin/PermissionMatrixEditor.tsx
…the package door now reads through it Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx
…e-read after the save Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx
|
Not this PR's · seat
Generated by Claude Code |
席位核对 · addendum (queue conflict, re-merge)ACCEPT stands · seat The merge queue removed this PR for
Generated by Claude Code |
Requested by Warren · project thread
Fixes #26858
Clause-②: no
Metadata-protocol: none
维护者速读
_diagnostics的服务端裁决;该路径有错误时显示服务端消息,不再显示 "Valid CEL"。lint 的边条件expression-invalid发现补上flows[N].edges[M].condition路径。ui/packages/app-shell/src/views/metadata-admin/draftVerdict.ts、CelPredicateField.tsx、packages/lint/src/validate-expressions.ts。pnpm --dir ui exec vitest run packages/app-shell/src/views/metadata-admin/serverVerdictAtPath-26858.test.tsx与pnpm --filter @objectstack/lint exec vitest run src/validate-expressions.edge-condition-path.test.ts。What changes
ExprIssuegains an optionalpath. A top-level flow edge'sconditionfinding carriesflows[N].edges[M].conditionbeside its unchangedwhere;authoring-rulesmaps it aspath: i.path ?? i.where. The served draft verdict therefore lands atedges.M.condition(via the existingitemRelativeIssuePath). Rule, verdict and message are unchanged; the runtime gate's differential fingerprint compares the same written flow on both sides.DraftVerdictContextplususeServerErrorsAt(path)indraftVerdict.ts, an equality-only lookup on the served path, never a prefix.CelPredicateFieldtakesverdictPath; when the served verdict has errors at it, the field shows the server message, setsaria-invalid, and withholds "Valid CEL". RLS clauses passrowLevelSecurity.N.using/.check.FlowEdgeInspectorshows served errors atedges.N.conditionunder the condition.ResourceEditPage(its served diagnostics),PermissionMatrixEditPage(its own draft read, refreshed after each save), and the Studio Automations page (its own flow draft read, refreshed after each save).Why
Ruling p2 on #26858: after #26856 the expression field still printed its own client verdict where the draft's server verdict at that path said otherwise (an RLS predicate over a formula field, a flow edge condition). The field now shows the
_diagnosticsverdict at its own path whenever one exists. No publish rule is copied into the client.Acceptance notes
Noted by the implementer, not filed (seat-applied body amendment):
AutomationsPillarinStudioDesignSurface.tsx) shows no draft-level publish verdict in its banner or canvas Problems panel. fix(metadata-protocol): a draft's _diagnostics reports what its publish will refuse #26856 wired that for the metadata-adminResourceEditPageonly; this PR adds only the field-level provider.whenCEL field inPermissionMatrixEditorgets noverdictPath: no served rule was measured at such a path.lint-flow-patternsflow-default-edge-with-conditionfinding has no key path, so its served verdict cannot land on an edge field.Verification
serverVerdictAtPath-26858,PermissionMatrixEditor.serverVerdict-26858,ResourceEditPage.serverVerdict-26858,AutomationsPillar.serverVerdict-26858. They cover a refused RLS predicate (server message, no "Valid CEL"), a refused edge condition, the no-verdict control, the sibling-path no-leak case, and the lint finding'sedges.N.condition.CelPredicateFieldturns 4 field tests red; inFlowEdgeInspector, 3; deleting the lint path assignment, 4; mappingi.whereonly, 1. Controls stay green in each.@objectstack/lintfull suite 7515 passed plus typecheck;@object-ui/app-shelltype-check; related app-shell suites 1129 passed; after mergingmain, the touched suites 199 passed.dispatch-gates --commands: 63 families run, each exit 0;--ranreconciles 63 derived, 63 run, 0 NOT-MEASURED.Human Minimum
packages/specholds no runtime logic. (spec untouched)pnpm lintpasses.main, one pull request.packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01JQwxbYiz7aUf8wSAnnRyMx