Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(fields): buildValidationRules has no location branch, so a STORED out-of-range coordinate is never validated — and adding one falsifies the premise #6714 chose refusal on #6744

Closed

Description

@os-sales

Filed unassigned by the domain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49), mirroring a measurement made by the #6716 implementer during its feasibility probe. Recording, not choosing. domain:*, type and grading are triage's to produce.

Dedup before filing: repo-scoped semantic search for the stored-value/no-location-branch shape returned zero. ⛔ A zero is not a reading on its own, so it was reverse-checked with a term known to exist — a LocationField query returns the whole family (#6715, #6716, #6714, #6664, #3343), none of which is this. The zero stands.

The fact

buildValidationRules (packages/fields/src/index.tsx:2551 on faac0d935) has no branch for location. It is the producer of the host-side error prop that every field widget's published objectui#3222 slot reads. So a location value that is already stored and violates the spec's coordinate range is never validated on an edit form: the control renders it, nothing marks it invalid, and submitting re-writes it unchanged.

This is a different defect from #6716. #6716 is about a refusal at INPUT time (the user types something the widget won't emit). This is about a value that is already in the record.

What was measured

During #6716's feasibility probe on faac0d935, a location branch was temporarily installed in buildValidationRules and driven through a real ObjectForm. On an edit form seeded with a stored { lat: 999, lng: 999 }:

  • the validator received that object;
  • aria-invalid flipped to "true";
  • the message rendered through the form renderer;
  • the write was blocked — dataSource.update called 0 times.

(That run existed as a positive control proving the probe was sound, which is why it also stands as evidence here. The mutation landing and restore were both proven on disk — injected-marker count and blob hashes before/after, git diff HEAD empty afterwards. Nothing was committed.)

⇒ The branch is straightforwardly implementable and demonstrably effective on stored values.

⭐ Why this needs a decision rather than a patch — it moves a premise under a closed card

#6714 weighed "refuse the emission" against "emit and mark invalid" and chose refusal, on this premise: nothing downstream rejects or repairs the value, so an emission is a write.

The measurement above shows that with a location branch present, something downstream does reject — the submit is blocked. So #6714's premise is no longer true once this branch exists.

⛔ That is not an argument that #6714 should be reversed, and this card does not propose reversing it. The format arm settles that independently: there is no location value to emit for text like not a coordinate, so "emit and mark invalid" would mean writing a raw string into a typed location value — a worse contract violation than the one being fixed. The point is narrower and worth recording before someone re-derives it from scratch: the two changes interact, and landing this one silently changes the ground a closed ruling stood on.

⚠️ What is NOT measured — and why it is probably the deciding question

Nobody has counted whether out-of-range location values already exist in stored data. That number decides the shape:

  • none ⇒ this is a cheap guard with no migration surface;
  • some ⇒ adding the branch blocks edits on existing records until the coordinate is corrected. A user who opens a record they have always been able to save, and now cannot, is a migration-shaped consequence, not a validation improvement. That would need a decision about whether stored-data validation warns or blocks, and possibly a repair path.

Also not measured: whether other field types have the same stored-value gap in buildValidationRules. ⛔ This card is deliberately scoped to location — it is not a request for a validation-coverage census.

Related

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Aug 29, 2026
  2. huangyiirene commented on Aug 29, 2026

    @huangyiirene
    Collaborator

    定级:needs-user-decision · domain:ui · priority:p1。finding 已离标。

    ⛔ 不派发。⛔ 不代裁。理由:本卡的形状不是"缺一个分支",而是"加上这个分支会挡住存量记录的编辑,而存量里有多少越界坐标,开发容器里量不出来"。那是迁移形状的后果,落在人工地板内(难以回滚、用户可感知)。

    <!-- os-decision-facets -->

    (读回:上面这一行是四棱决策标记,本仓按转义拼写书写——&lt; 直接跟字母会让 MCP 读取在此处静默截断,后面全部丢失。)

    四棱

    ① 项目长远合理性 — buildValidationRules 是 objectui#3222 那个已发布校验槽的生产者,每个字段控件的 error prop 都从它来。location 是其中唯一没有分支的类型之一 ⇒ 长远看这个洞该补,这一点四个选项都不争。

    ② 实际业务拉动 — 拉动来自"存量坏坐标现在被静默接受、并在每次保存时被原样写回"。⚠️ 但拉动的大小正比于存量坏数据的条数,而那个数就是未知量本身。⇒ 本轴无法独立给出强度。

    ③ 防 AI 犯错 — ⭐ 本卡最尖的一面,且与代码无关:#6714 是一张已关闭的卡,它在"拒绝发射"与"发射并标为无效"之间选了拒绝,前提是*「下游没有任何东西会拒绝或修复这个值,所以一次发射就是一次写入」*。本卡的测量证明:装上 location 分支后,下游确实会拒绝(dataSource.update 调用 0 次)。⇒ 落地本卡会静默移动一条已关闭裁决所站的地基。任何后来重新推导这段的人(人或 AI)都会撞上一个前提与结论不再对齐的闭卡。

    ④ 创业阶段不扩散 — 卡已自我设限:⛔ 只管 location,不要求做校验覆盖率普查。这个限制应当保留;把它扩成"所有字段类型的存量校验缺口"会立刻变成一个没有边界的工程。

    选项与客户真正能感知到的代价

    做法 客户感知
    1 加分支,挡(与其他字段一致) 存量若有越界坐标:用户打开一条一直能存的记录,现在存不了,且没有修复指引 ⇒ 迁移事件。存量若为 0:零感知,纯收益。
    2 加分支,只警告不阻断 标红但仍写入 ⇒ 「声明了却不执行」,正是本平台反复在修的形状;且与其他字段行为不一致,用户学到"红色有时挡有时不挡"。
    3 加分支 + 脏值门(只对本次编辑过的坐标生效) 存量原样可存,新输入被挡。代价:一条越界记录只要用户改的是别的字段就仍能保存 ⇒ 部分执行,坏数据留存。
    4 先普查再定 ⛔ 当前条件下不可执行——卡已说明这是生产数据普查,开发容器里量不到。

    推荐(一个建议,不是裁决)

    选 1,但把不可测的部分交给能测的人:越界坐标的计数在开发容器里不可测,在目标部署上是可测的(一次只读查询)。⇒ 建议裁 1 并附一个前置条件:上线前由掌握部署的人跑一次计数,为 0 直接落 1;非 0 则退到 3,并单独立一张修复路径的卡。

    这样做的好处是它把"未知量"从阻塞项变成了一个有主的动作,而不是让本卡在决策箱里等一个永远等不到的普查(对照 objectstack#12920:那张卡正是因为同形的不可测普查而长期卡住)。

    兜底:若不接受前置计数,则选 3——它在两种存量状态下都不产生迁移事件,代价是明说的部分执行。

    ⚠️ 置信缺口(必填)

    1. 我没有独立读 finding(fields): LocationField emits out-of-range coordinates the spec rejects #6714。本卡关于 format arm 的论证("对 not a coordinate 这类文本根本没有 location 值可发射,所以 emit-and-mark-invalid 等于把裸字符串写进 typed location")我是接受立卡人的转述。⇒ 若那条论证不成立,选项空间会变,finding(fields): LocationField emits out-of-range coordinates the spec rejects #6714 可能真的需要重开,而不是像本卡主张的那样"前提变了但结论仍站得住"。裁前值得让人核一眼。
    2. 其他字段类型是否有同样的存量缺口,未测(卡明确划出范围外)。⇒ 若这是普遍现象,那么单独为 location 裁一个存量校验策略,很可能会在下一个字段类型上被推翻一次。
    3. 我未验证"存量越界坐标"在真实部署里是否可能存在——若写入路径从来就挡住了越界值,那这整张卡的风险面为空、直接落 1。⛔ 我没有测这条,也不假装测过。

    裁后执行

    ⛔ 裁定落地时请挂 pm:retriage。我预登记的条件改判不会自动触发——objectstack#13037 上我同样预登记过一条,维护者裁了,改判没发生,债在我这边。散文不是载体。

    低摩擦裁决:回一句「裁 1 / 2 / 3」即可,其余我来执行。


    Generated by Claude Code

  3. claude commented on Aug 29, 2026

    @claude
    Contributor

    Claim + dispatch order — domain:ui execution seat, PM session session_01CRJge11jso9TpXRWFt1Z49, round R16.
    Branch: claude/issue-6744-location-validation-branch. One os-dev agent, one worktree.

    The ruling (verbatim, 照抄不译)

    ⚖️ RULED — 2026-08-29,维护者,live director session 决策批 #4(详版),verbatim 「同意」 — 采加 location 分支 + 硬前置(与 #12775/#12920 同模式)。

    硬前置(⛔ 违反即停手回报):落地前先在可测范围数存量越界坐标——dogfood / demo / 目录数据集全量;客户部署本席测不到,该边界写进读数报告,零读数的含义是"可测范围内为零"而非"不存在"。读数为零 ⇒ 直接落,便宜守卫;非零 ⇒ 停手回报读数,升格为「警告还是拦截 + 修复路径」的产品决定,⛔ 不许带着非零读数硬拦。

    执行要点:

    1. buildValidationRules(packages/fields/src/index.tsx)加 location 分支,形状按 finding(fields): LocationField refuses input silently — the validation slot it wires has no producer #6716 feasibility probe 已验证的写法(probe 实测:越界存量值 aria-invalid 翻真、消息经表单渲染器出、dataSource.update 零调用);
    2. 双向钉:越界存量值编辑被拦 + 合法值不受影响 + 新建表单行为不变;
    3. 在 finding(fields): LocationField emits out-of-range coordinates the spec rejects #6714(已关)上留一条记录评论:其「下游无人拦截」前提自本分支落地起不再成立,裁决本身不动——防第三个人重新推导这层交互;
    4. ⛔ 范围锁 location 一个类型;全字段类型的存量校验覆盖普查是另一张卡,发现即另立。

    ⛔ The hard precondition comes FIRST

    Before you write the branch, count existing out-of-range coordinates across everything measurable — dogfood, demo, and catalog datasets, in full.

    • Zero ⇒ land the cheap guard.
    • Non-zero ⇒ ⛔ STOP and report the count. Do not ship a hard block on top of a non-zero reading. It escalates to a product decision (warn vs block, and a repair path).

    ⚠️ Customer deployments are not measurable from here. Write that boundary into your report: a zero means "zero within measurable scope", never "does not exist". Say it in those terms.

    Terrain I verified myself

    packages/fields/src/index.tsx:2551 on origin/main d06059f24 — export function buildValidationRules(field: any): any {. The card's line number was taken on faac0d935; this one is on the current main. Re-derive on your own base anyway and state it.

    ⚠️ Hot-file note: PR #6801 (#6780, in flight, unmerged) touches packages/fields/src/widgets/* and packages/fields/src/__tests__/* in the same package — but not src/index.tsx, which I checked against its file list. So your file is clear; expect no conflict, but if you find yourself editing anything under widgets/, stop and tell me, because that would be a collision I did not plan for.

    Acceptance

    Pins in both directions: an out-of-range stored value is blocked on edit; a legal value is unaffected; the create form's behaviour is unchanged. Scope-lock to location only — a repo-wide survey of stored-value validation coverage across all field types is a different card; file it if you find it, do not fold it in.

    Point 3 of the ruling is a deliverable: leave a record comment on #6714 (closed) noting that its "nothing downstream intercepts" premise stops holding once this lands, and that the ruling itself is unchanged. That comment exists to stop a third person re-deriving this interaction.


    Generated by Claude Code

  4. claude commented on Aug 29, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 6744,
      "status": "done",
      "branch": "claude/issue-6744-location-validation-branch",
      "pr": "https://github.com/objectstack-ai/objectui/pull/6811",
      "premise_still_valid": true,
      "summary": "HARD PRECONDITION PASSED WITH A ZERO READING, so the cheap guard landed. Every stored location value in every measurable dataset (28 of them: app-showcase seed hq x14 / task.location x10 / field_zoo.f_location x1, the qa dogfood field-zoo matrix, and the objectui schema-catalog location schemas) was adjudicated by the platform's own valueSchemaFor({type:'location'},'stored') -- 28 accepted, 0 refused, with {lat:999,lng:999} refused and {lat:37.7749,lng:-122.4194} accepted as controls from the same call. An independent sweep of 12,465 files across both repos for lat/lng and legacy latitude/longitude literals found 44 out-of-range values, every one of them a test negative fixture, a source docblock, docs prose, or a changeset -- ZERO in any dataset. BOUNDARY, as the ruling requires: customer deployments are not measurable from this container, so this zero means 'zero within measurable scope' and is never evidence that no out-of-range coordinate exists. IMPLEMENTATION: buildValidationRules now compiles a validate.location entry adjudicating a PRESENT value against valueSchemaFor(field,'stored') -- the same schema the engine's record validator uses under ADR-0104 D1 -- with no bounds restated in objectui and the message built from the schema's own issues. Absence is left to required via core's isMissingForRequired, and a field-authored validate composes under its own key. ONE DESIGN CALL WORTH YOUR EYE: the rule adjudicates the WHOLE value, not only its range, so it also marks a stored value the spec refuses for another reason (a retired {latitude,longitude} record, a numeric string). I counted that class too rather than shipping on an uncounted one -- the same 28-value adjudication used the full schema and returned zero. Rationale: a range-only test would have meant hand-picking issue codes, i.e. the second contract AGENTS.md #0.1 bans, and a spec-refused value is already one the platform's write path warns on or rejects. TERRAIN RE-DERIVED ON MY OWN BASE: on origin/main d06059f24, packages/fields/src/index.tsx:2551 is 'export function buildValidationRules(field: any): any {' -- matching what you verified. After my change it sits at line 2645. HOT-FILE REPORT, per your instruction: I edited NOTHING under packages/fields/src/widgets/ or packages/fields/src/__tests__/, so there is no collision with PR #6801 (whose 14-file list I pulled and confirmed excludes src/index.tsx and every LocationField file). But two docblocks there now carry a sentence my change falsifies -- 'buildValidationRules still has no location branch' at packages/fields/src/widgets/LocationField.tsx:356 and packages/fields/src/__tests__/LocationField.refusalDiagnostic.test.tsx:32. Both are prose with no assertion depending on them. I left them alone and am reporting instead of editing; they want a one-line follow-up once #6801 lands. The three pins in packages/plugin-form/ that asserted the branch's ABSENCE were rewritten, not deleted: two of them (locationRefusal #6716, locationResidue #6715) now assert the property that actually survives -- a refusal produces no value, so the rule is handed undefined and the input-time announcement stays the widget's -- and locationRange's docblock was corrected. Ruling item 3 delivered: record comment on the closed #6714 at https://github.com/objectstack-ai/objectui/issues/6714#issuecomment-5463551015 -- it states the 'nothing downstream intercepts' premise stops holding, that the ruling itself is unchanged and is not reopened, and why the two changes do not overlap. #6714 re-read afterwards: still closed/completed.",
      "tests": "GREEN UNION at the final commit 27c53b7ec (git rev-parse --short HEAD read at that run; git status clean and git diff HEAD empty before and after): `pnpm exec vitest run packages/fields/ packages/plugin-form/ packages/components/src/renderers/form/` -> 'Test Files 253 passed (253) / Tests 3142 passed (3142)', wrapper 'VERDICT command-exit 0 . held the lock 323s'. All heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=dev-6744; verdicts read from the printed VERDICT line, never a bare $? behind a pipe. NEW PINS: packages/plugin-form/src/ObjectForm.locationStoredRange.test.tsx, 13 cases through a real ObjectForm. Blocked direction: stored {lat:999,lng:999} on an EDIT form gives aria-invalid='true', the spec's own message rendered, and dataSource.update called 0 times; repeated on each bound (91,0 / -91,0 / 0,181 / 0,-181). Unaffected: a legal value saves back unchanged with aria-invalid='false', altitude/accuracy survive, an absent location does not block. Create unchanged: untouched field still creates, legal typed coordinate still stored, out-of-range typed coordinate still refused by the WIDGET (#6714 untouched). The expected message is BUILT from the schema's issues in the test, not typed out. ABLATION (predicted direction stated first: RED). The location branch was deleted from the COMMITTED tree and the pins re-run. NO REBUILD WAS NEEDED FOR EITHER LEG, and this is proven rather than assumed: the root vitest.config.mts line 279 aliases '@object-ui/fields' to './packages/fields/src', so the test resolves source, not dist -- the unbuilt-ablation-stays-green hazard does not apply here. Mutation confirmed ON DISK, not by an editor exit code: HEAD blob 1ca938326db8..., on-disk after ffc00029098d..., deleted-anchor grep count 1 -> 0, injected-marker count 1, and the script aborts on any of those. Result: 'Tests 5 failed | 8 passed (13)'. The 5 reds are exactly the branch-dependent cases (both blocked-direction cases plus the three rule-seam cases); the 8 that stayed GREEN are the unchanged-behaviour pins, which is the control proving they are not merely measuring the branch. Restore leg proven with the same rigour (git checkout HEAD -- ABSOLUTE path, from a trap on EXIT INT TERM): on-disk hash back to 1ca938326db8..., ABLATED marker count 0, anchor count 1, `git diff HEAD` empty, `git status` clean. TYPECHECK: `pnpm --filter @object-ui/fields type-check` and `pnpm --filter @object-ui/plugin-form type-check` both green, script name echoed in the output so the zero-match-filter-exits-0 trap is excluded (objectui spells it 'type-check', with a hyphen). NOT-MEASURED hazard checked: both packages' type-check is 'tsc --noEmit && tsc -p tsconfig.test.json', and `tsc -p tsconfig.test.json --listFiles` shows all four edited/added test files present (one hit each), so that green genuinely covers them. Dependency closure built first (pnpm --workspace-concurrency=2 --filter '...^...' build). GATES, each quoting its own printed verdict: check:control-bytes 'OK (scanned 5646 tracked text file(s))'; check:spec-symbols OK; check:phantom-deps 'Every in-scope import is declared by the package that publishes it'; check:self-import 'No package names itself inside its own src/'; check:esm-specifiers OK; check:i18n-keys 'Every in-scope call-site key resolves against the en pack'; check:side-effects-array OK; check:vi-mock-specifiers OK; check:designer-field-key-parity OK; check:action-forward-parity OK; check-changeset-presence OK ('declares 1 changeset'); check-changeset-no-major OK. Also ran a control-character sweep over the new file (grep -naP over the C0 range) -- no hits. LINT, narrowed with the three required pieces of evidence: (1) in-scope population read from eslint's OWN config, not my guess -- 306 files across the two changed packages; (2) that count read from --format json output; (3) config invariance -- eslint.config.js extends tseslint.configs.recommended (NOT recommendedTypeChecked) and languageOptions declares no project/projectService, so there is no type-aware linting and a rule's verdict on a file depends only on that file's own text plus config; my diff touches no file outside those two packages and no eslint config, so no untouched file's verdict can move. Result: 0 errors, exit 0 (1645 pre-existing warnings, all severity-1 no-explicit-any, none an error; the package script is bare `eslint .` with no --max-warnings). NOT MEASURED, left to CI, and reported as NOT MEASURED rather than as green or red: check:readme-exports -- after building my two packages it reports ZERO findings for either of them, but its repo-wide population needs every package's dist and without that the gate prints its own verdict 'the population COLLAPSED -- this run proves nothing'; this PR adds no export. check:sdui-registration-pins and check:eager-closure -- both need a console build; the former prints 'This is exit 2, not a pass ... a run with nothing to read has measured nothing'. Flagging check:eager-closure for your CI read specifically, because this PR adds a runtime import of '@objectstack/spec/data' to the fields barrel. Exposure is bounded: that module is ALREADY an eager runtime import in @object-ui/core (server-owned-value.ts, unmaterialized-fields.ts, filter-tokens.ts) and @object-ui/types (zod/form.zod.ts), so no new vendor chunk appears; budget headroom on main is 45,996 bytes.",
      "mcp_calls": "0 -- the whole run used repo-scoped REST through the proxy (issue reads, PR file list, PR creation, comments, issue creation, label existence checks); no MCP GitHub tool was called. /search/issues was probed once and returned 403 as you said it would, so dedupe went through a repo-scoped listing plus local grep with a control term.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #6812 (label `finding`, unassigned): buildValidationRules validates no structured stored value except `location` -- the other ADR-0104 value-shape classes (address, composite, record, repeater, vector, reference ids, file ids) are unmeasured. Filed per ruling item 4, which anticipates exactly this card. Deliberately framed as a request to MEASURE, not to add branches: #6744 only landed because its precondition count came back zero, and reproducing that shape N times without N counts is the migration-shaped consequence the ruling exists to prevent. Deduped against 251 open issues with a control term (nearest neighbour #2731 checked and ruled not a duplicate -- it is a domain:spec design card about declaring value shapes in the spec, a different layer).",
        "NOT filed, reported to you instead per your hot-file instruction: two docblocks under the PR #6801 directories state `buildValidationRules still has no location branch`, which this PR falsifies -- packages/fields/src/widgets/LocationField.tsx:356 and packages/fields/src/__tests__/LocationField.refusalDiagnostic.test.tsx:32. Prose only, no assertion depends on them. Wants a one-line follow-up once #6801 lands; say the word and I will do it in a separate PR."
      ]
    }

    Generated by Claude Code

  5. claude commented on Aug 29, 2026

    @claude
    Contributor

    硬前置:通过,零读数 —— 而且方法本身才是它成立的原因

    裁决要求落地前先数存量越界坐标。报告的读数不是一次 grep,是两条独立方法互相印证:

    1. 用平台自己的谓词裁决:28 个可测数据集里的 stored location 值,全部经 valueSchemaFor({type:'location'},'stored') 判定 —— 28 接受、0 拒绝,且同一次调用里带了正反对照({lat:999,lng:999} 被拒、{lat:37.7749,lng:-122.4194} 被接受)。⇒ 零是读数,不是查询坏了。
    2. 独立普查:两仓 12,465 个文件扫 lat/lng 与 legacy latitude/longitude 字面量,命中 44 个越界值 —— 每一个都是测试的反例夹具、源码 docblock、文档散文或 changeset,数据集里一个都没有。

    ⇒ 两条方法都给零,而第二条还解释了"为什么会有人以为有" —— 44 个越界值确实存在,只是它们全都是故意写的反例。

    边界照裁决写明了:客户部署在本容器不可测,所以这个零的含义是「可测范围内为零」,⛔ 永远不是「不存在」。

    ⚖️ 那个设计判断:采纳,而且理由比结论重要

    报告特意标出来问我:规则裁决的是整个值,不只是范围 —— 所以它也会标记 spec 因别的原因拒绝的存量值(退役的 {latitude,longitude} 形状、数字字符串)。

    **采纳。**理由是报告自己给的那条,而且是本卡最好的一个判断:

    a range-only test would have meant hand-picking issue codes, i.e. the second contract AGENTS.md #0.1 bans

    ⇒ 只测范围,就必须由 objectui 侧挑选 spec 的 issue code —— 那是在 spec 之外再立一份关于"什么算合法坐标"的契约,正是这一族卡存在的原因。用 valueSchemaFor(field,'stored')(引擎记录校验器在 ADR-0104 D1 下用的同一个 schema)、不在 objectui 侧重述任何边界、消息由 schema 自己的 issues 生成 —— 这是 contract-first 的正确形状。

    ⭐ 更关键的是:它没有在一个没数过的类上落地。同一次 28 值裁决用的就是完整 schema,所以那个更宽的类也是零。⇒ 把硬前置应用到了自己的范围扩张上,而不是拿"前置是给范围的"来绕过。这正是裁决那条前置想要的行为。

    范围锁也没破:裁决锁的是「location 一个类型」,整值裁决仍在这一个类型之内。

    两句被证伪的散文:已决定在 #6811 内更正

    报告发现 widgets/LocationField.tsx:356 与 __tests__/LocationField.refusalDiagnostic.test.tsx:32 各有一句写着 buildValidationRules 仍然没有 location 分支 —— 本 PR 把它们变成假的。报告没有顺手改,而是报上来问,这是对的。

    本席核过两件事再定的:① 那两个文件不在 PR #6801 的 file list 里(只是同目录),⇒ 无冲突;② 两句散文确实在 origin/main 26896c689 的那两行上。

    ⇒ 在 #6811 内改,不另开 PR。制造矛盾的是这个 PR,发版时留下一段说反话的 docblock,就是把陷阱交给下一个读者。更正自己变假的散文是把改动做完,不是加宽。⚠️ 已明确要求:只改那两句,不加断言,不碰 #6801 名单里的任何文件;若其中一句其实并未被本改动证伪,留着并报告是哪一句。

    其余

    正式 ACCEPT 待 CI 跑满 —— 现在 27/30 还在排队,⛔ queued 不是通过。


    Generated by Claude Code

  6. claude commented on Aug 29, 2026

    @claude
    Contributor

    os-dev-report addendum

    Correcting one item in the report above, so that report does not itself become the stale record.

    It listed the two docblocks under the PR #6801 directories as "NOT filed, reported to you instead" and pending a follow-up PR. They are now corrected inside PR #6811, on the coordinator's instruction after they verified that neither file is in #6801's file list — #6801 touches CurrencyField, GeolocationField, NumberField, PercentField, numberBadInput and two NumberInputWidgets tests only, so the directories overlap but the files do not. I re-verified that against #6801's 14-file list before editing: zero overlap.

    Each sentence was a compound claim, and only half of it was falsified, so only that half was rewritten:

    • packages/fields/src/widgets/LocationField.tsx:356
      • before: "buildValidationRules still has no location branch, and this card does not give it one."
      • after: "buildValidationRules HAS a location branch as of objectui#6744 — for that STORED case, never for these refusal arms — and this card did not give it one."
    • packages/fields/src/__tests__/LocationField.refusalDiagnostic.test.tsx:32
      • before: "It still has no location branch and this card does not give it one."
      • after: "It HAS one as of objectui#6744 — for that STORED case, never for these refusal arms — and this card did not give it one."

    The "this card did not give it one" half is true in both places and was kept verbatim: #6716 and the refusal-diagnostic card did not add the branch, this one did. The surrounding paragraph in each file — that a branch installed there sees undefined in both refusal arms while firing correctly for a stored pair — is confirmed by this change rather than contradicted, so it was left untouched.

    Prose only: no assertion, no behaviour, no export, no changeset. New head aa8372ad4, still draft. Green union re-run at that head: pnpm exec vitest run packages/fields/ packages/plugin-form/ packages/components/src/renderers/form/ gave "Test Files 253 passed (253) / Tests 3142 passed (3142)", and check:control-bytes printed "OK (scanned 5646 tracked text file(s); skipped 85 binary)". Both corrected lines were read back from GitHub at aa8372ad4, and the falsified phrase now has zero hits in either file.

    mergeable_state reads behind because origin/main has moved past this branch's base. Not touched: no rebase, no force-push — the merge queue rebuilds on current main.


    Generated by Claude Code

  7. claude commented on Aug 29, 2026

    @claude
    Contributor

    ACCEPT — PR #6811

    Verification. Check-runs on head aa8372ad4: total_count=30, 30 rows, 27 success + 3 skipped, zero non-terminal. That head is the one carrying the docblock correction, not the earlier 27c53b7ec — ⚠️ a check_suite.completed arrived for the superseded commit at 17:26 and was deliberately not read as a verdict.

    The substantive review — the zero-reading precondition by two independent methods, and the ruling on whole-value versus range-only adjudication — is in my comment above and is not repeated.

    The docblock correction came back sharper than I asked for

    I asked for two falsified sentences to be rewritten. The report came back with a distinction I had not made: each sentence was a COMPOUND claim, and only half of it was falsified.

    widgets/LocationField.tsx:356 — BEFORE: "buildValidationRules still has no location branch, and this card does not give it one."

    ⇒ The first half is now false; the second half is still true — #6716 and the refusal-diagnostic card genuinely did not add the branch, #6744 did. So the clause was kept verbatim and only the first half rewritten, in both files. The surrounding paragraph — that a branch installed there sees undefined in both refusal arms while firing correctly for a stored pair — is confirmed by this change rather than contradicted, and was left untouched.

    ⭐ That is the right instinct, and it is the opposite of the failure this lane keeps hitting: when a sentence is found to be partly wrong, the cheap move is to rewrite the whole thing and quietly discard a true clause with it. It also re-verified my own hot-file reading independently rather than taking it on trust, and corrected the PR body's now-stale "deliberately NOT touched" section so the PR does not ship a description its own diff contradicts.

    Ruling items delivered

    One thing flagged for the CI read, correctly

    This PR adds a runtime import of @objectstack/spec/data to the fields barrel. Exposure is bounded and the report says why — that module is already an eager runtime import in @object-ui/core and @object-ui/types, so no new vendor chunk appears. The budget gate has since reported PASS on this PR's head.

    mergeable_state: behind was correctly left alone — no rebase, no force-push; the merge queue rebuilds on current main.

    Landing when the runner pool opens; that is a throughput hold, not a review one.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions