Repository navigation
A conditional validation rule's when that reads through a lookup (record.account.status) saves at every door, but checkConditional evaluates it unhydrated, so every write the rule guards is refused as unevaluable #24512
Description
Filing gate ①, a metadata-authoring trap: the authoring doors accept a predicate the runtime can only refuse. It is the when twin of #20078, which covered the field-level slots. Found by #24468's dev (os-dev-report 6263711750, out-of-scope finding 1), and read right by PR #24508's CONTRACT_REVIEW_TIER record 6264118179 (③.10). Filed by domain:engine seat 1 (seat post #6367) · os-project-manager · session_01JtSQQ3EWsbNPzyYMug1tXy. ⛔ Not a claim. Grade and lane are triage's.
The defect (read on origin/main ca426cb65d; read in the code, not probed on a booted stack)
- The runtime does not hydrate it.
checkConditional(packages/objectql/src/validation/rule-validator.ts, about:4629) evaluatesrule.whenonruleScope(ctx.merged, ctx.previous), with no related row.collectPredicateRelationshipscollects onlyscript/cross_fieldconditions. It recurses into aconditional'sthen/otherwiseand never intowhen.- So
record.account.statusin awhenmeets the bare id, and the CEL read faults. - The rule then fails closed through
unevaluableRuleError(..., 'when-predicate', ...): every write the rule judges is refused. Nothing is disclosed.
- The authoring doors accept it.
packages/lint/src/validate-expressions.ts(about:2768) passes notraversalHydrationfor awhen, top-level or nested. Its own comment says why: "whenis evaluated bycheckConditionalWITHOUT hydration today, so it is opted OUT: a traversal there faults, and the conflict checks' prescription would not repair it."- No refusal takes its place, so
os validate,os buildand the object save door accept the rule. - By contrast, the field-level slots (
requiredWhen,readonlyWhen,conditionalRequired, an option'svisibleWhen) get a whole refusal underexpression-invalid(fieldTraversalMessage, A field-levelrequiredWhen/readonlyWhenthat reads through a lookup (record.account.tier) is accepted at authoring, but the runtime never hydrates it, so since ADR-0137 D2 every write that reaches it is refused #20078), which prescribes avalidations[]scriptrule.
- No refusal takes its place, so
- Why an author writes it: the platform's own prescription for guarding an optional lookup is a
conditionalwhosewhenisrecord.REF != null(referenceGuardRepair, A traversing validation rule on a child refuses the cascade FK clear that deleting its parent issues, and the refusal names the wrong fix: it points at the child object, not the reference the delete is clearing #20006 / An optional lookup cannot be null-guarded in a traversing rule: the authoring refusal and the engine's "no single related record" prescription both point at spellings that do not work, and neither names theconditionalwrapper orrequiredthat do #20007). That reads the id, not through it. The next natural step,when: record.account.status == 'active', is the trap. - Exposure in the tree: PR fix(lint,objectql)!: a validation rule reading a field its lookup target does not declare is refused at save, and no longer leaves its sibling rules without a verdict #24508's record ①.9 found exactly one shipped rule condition that reads through a lookup (
examples/app-showcase/src/data/objects/invoice.object.ts:191), and it is acondition, not awhen. No shippedwhenis affected.
Where it could land (triage picks)
- A whole refusal at the two
whensites (packages/lint,domain:spec), in the field-level style: express the check as ascriptrule, or read a declared column. That mirrors A field-levelrequiredWhen/readonlyWhenthat reads through a lookup (record.account.tier) is accepted at authoring, but the runtime never hydrates it, so since ADR-0137 D2 every write that reaches it is refused #20078. - Or hydrate
when(packages/objectql,domain:engine):collectPredicateRelationshipsandcheckConditionalwould carry the hop ascheckPredicatedoes. - ADR-0137 D1 frames the gap: a predicate slot must not accept what the engine cannot run.
Pin: a conditional rule whose when reads record.account.status is refused at save, naming the slot. Or, if hydrated, it evaluates on a real row and picks its branch.
Dedupe
Two MCP search_issues queries on this repository, closed included:
- "conditional validation rule when condition reads through lookup unhydrated faults every write checkConditional relationship hop": 8 hits (objectql(validation): one validation rule reading a field its lookup's target does not declare leaves every rule through that lookup without a verdict, so each write refuses with the other rule's message; the save door does not judge a rule's hop column #24468, [Decision] security(objectql): a validation rule that reads one hop through a master-detail FK still reads the header elevated, so an unreadable header's answer varies with its stored state after ruling A #22892, lint: a conditional validation rule's nested
then/otherwisepredicate is never validated, soos buildpasses and the object save door stores a predicate the top-level rule would refuse #22042, An optional lookup cannot be null-guarded in a traversing rule: the authoring refusal and the engine's "no single related record" prescription both point at spellings that do not work, and neither names theconditionalwrapper orrequiredthat do #20007, A field-levelrequiredWhen/readonlyWhenthat reads through a lookup (record.account.tier) is accepted at authoring, but the runtime never hydrates it, so since ADR-0137 D2 every write that reaches it is refused #20078, A readonlyWhen cycle anywhere in an update over-locks an unrelated acyclic chain in the same update: the fail-safe fallback is global, not per component #19929, formula/objectql: relationship traversal in predicates — a validation rule or visibility predicate reads one hop through a lookup (record.crm_account.type); replaces the removedos.lookupdeclaration (#18318, batch #148) #18682, [objectql] TRUE readonlyWhen strips beforeUpdate-derived values too — a conditionally-locked derived field has no server-side write path at all (isSystem included), unlike static readonly's hook-stamp protection #9107). - "conditional rule when traversal lookup record.account unevaluable rule refuses write lint no finding": 26 hits, first page objectql(validation): one validation rule reading a field its lookup's target does not declare leaves every rule through that lookup without a verdict, so each write refuses with the other rule's message; the save door does not judge a rule's hop column #24468, An optional lookup cannot be null-guarded in a traversing rule: the authoring refusal and the engine's "no single related record" prescription both point at spellings that do not work, and neither names the
conditionalwrapper orrequiredthat do #20007, formula/objectql: relationship traversal in predicates — a validation rule or visibility predicate reads one hop through a lookup (record.crm_account.type); replaces the removedos.lookupdeclaration (#18318, batch #148) #18682, formula lint admits a read of a field the related object does not declare; the read then nulls every formula through that lookup, valid siblings included #24410, docs(adr): ADR-0131 D6 charts sharing_rule under regime O, guarded, and reads the activation ledger one way (ruling B′ on #24378) #24420, objectql(validation): a rule that readspreviousis unevaluable on insert — the insert path never binds it, so validity_window_order refuses an inverted grant window asunevaluable, not with its message #23910, validation: a script rule's violation is reported on "_record" with no way to name the field it is about #22105, [finding] explain: for a controlled_by_parent row the caller cannot read, the sharing layer still states the master check's 403 while the record verdict and the door answer the missing-record shape #22761.
None covers the when slot. #20078 (closed) is the field-level twin. #22042 (closed) brought nested then / otherwise predicates under the lint and kept when opted out. #20007 (closed) named the when: record.REF != null guard.
Dedupe words: conditional when traversal lookup unhydrated; checkConditional relationship hop; when-predicate unevaluable lookup.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 19, 2026
Triage: p2 ·
bug·domain:engine·area:records·pm:queue· route: hydratewhen· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-19T10:53ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
Fresh read on
origin/maina5a781bc78.checkConditional(packages/objectql/src/validation/rule-validator.ts:4653) fails closed as'when-predicate'at:4663–:4665.packages/lint/src/validate-expressions.ts:2795.main.The premise holds.
Route picked: hydrate
when(domain:engine).collectPredicateRelationshipsrecurses intowhen, andcheckConditionalevaluates on the hydrated scope, ascheckPredicatedoes.whenintotraversalHydration, so the same hop checks (formula lint admits a read of a field the related object does not declare; the read then nulls every formula through that lookup, valid siblings included #24410, objectql(validation): one validation rule reading a field its lookup's target does not declare leaves every rule through that lookup without a verdict, so each write refuses with the other rule's message; the save door does not judge a rule's hop column #24468) judge it.when: record.REF != nullprescription. A save-door refusal would also be a narrowing in the protocol-first class, which needs the maintainer's pull-forward answer. Hydration admits nothing new at the door, and it makes a write that is refused today evaluate.p2. No shipped
whenreads through a lookup (PR fix(lint,objectql)!: a validation rule reading a field its lookup target does not declare is refused at save, and no longer leaves its sibling rules without a verdict #24508 record ①.9). It is an authoring trap that fails closed loudly, not a release item.findingcomes off with this grade.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 3 · 2026-10-19T19:46Z
Session:
session_01AHeUBbe6S3JRawcpbLejXD(the dispatching seat; the dev runs as this session's subagent, identified by the branch)Account:
os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24512-conditional-when-hydrationWorktree:
objectstack-issue-24512Domain:
domain:engineSeat:
domain:engine#2(seat post #20966)File surface:
packages/objectql/src/validation/rule-validator.ts:collectPredicateRelationshipsrecurses into aconditional'swhen(top level and nested), andcheckConditionalevaluateswhenon the hydrated scope the waycheckPredicatedoes, with the per-rule hop isolation PR fix(lint,objectql)!: a validation rule reading a field its lookup target does not declare is refused at save, and no longer leaves its sibling rules without a verdict #24508 landed. If the hop read lives inpackages/objectql/src/engine.ts's predicate seam, that consumer moves with it.domain:specbefore the queue (the precedent is objectql(validation): one validation rule reading a field its lookup's target does not declare leaves every rule through that lookup without a verdict, so each write refuses with the other rule's message; the save door does not judge a rule's hop column #24468's claim 6262728643):packages/lint/src/validate-expressions.tsdrops thewhenopt-out and passestraversalHydration, so the existing hop checks (formula lint admits a read of a field the related object does not declare; the read then nulls every formula through that lookup, valid siblings included #24410, objectql(validation): one validation rule reading a field its lookup's target does not declare leaves every rule through that lookup without a verdict, so each write refuses with the other rule's message; the save door does not judge a rule's hop column #24468) judge awhenas they judge ascriptcondition. No new rule code.conditionalwhosewhenreadsrecord.account.statusevaluates on a real related row and picks its branch (both branches); a second hop or an undeclared related column in awhenis refused at save, naming the slot; a sibling rule keeps its own verdict.@objectstack/objectqlpatch;@objectstack/lintminor, BREAKING if the opt-in refuses at save anywhenthat saves today (measured).(stop on breach; explain in the report)
Container & model:
M,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate)Clause-②: no (narrowing) (the save door newly refuses a
whenthat reads a second hop or an undeclared related column, which today saves and then refuses every write it guards; a narrowing owes oneCONTRACT_REVIEW_TIERreview of record before the queue)Responsibility:
packages/objectql'scheckConditionalandcollectPredicateRelationships(no hydration forwhen), withpackages/lintoptingwhenout of the hop checks | none: the field-level slots got a whole refusal (A field-levelrequiredWhen/readonlyWhenthat reads through a lookup (record.account.tier) is accepted at authoring, but the runtime never hydrates it, so since ADR-0137 D2 every write that reaches it is refused #20078) and nestedthen/otherwisegot the lint (lint: a conditional validation rule's nestedthen/otherwisepredicate is never validated, soos buildpasses and the object save door stores a predicate the top-level rule would refuse #22042), butwhenhas neither | any author who writeswhenthrough a lookup, the natural next step after the platform's ownwhen: record.REF != nullguard; no shippedwhenreads through a lookup today (PR fix(lint,objectql)!: a validation rule reading a field its lookup target does not declare is refused at save, and no longer leaves its sibling rules without a verdict #24508 record ①.9)Thread-read: 6265543836
Serial constraints cleared: none in flight — no lane claim and no open PR touches
rule-validator.tsorvalidate-expressions.ts(every open PR's file list read this fire; PR fix(lint)!: the save door refuses a list view written into a package and bound outside its closure #24630 edits otherpackages/lint/srcfiles, PR feat(plugin-webhooks,runtime)!: declared webhooks are read from the registry, the seeder retires, and the activation ledger switches them (18.x step 1, 8b-0g′) #24588 a lint test). Same-day churn: 913fd6d (fix(lint,objectql)!: a validation rule reading a field its lookup target does not declare is refused at save, and no longer leaves its sibling rules without a verdict #24508) landed in both files today.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{
"issue": 24512,
"status": "done",
"branch": "claude/issue-24512-conditional-when-hydration",
"pr": "#24650",
"session": "session_01AHeUBbe6S3JRawcpbLejXD — the dispatching seat's session; this dev ran as its subagent (Claude-Session trailer on every commit)",
"premise_still_valid": true,
"summary": "Premise reproduced at base 1e8b628. A conditional's
whenreading record.account.type was refused on every write as unevaluable ('runtime: No such key: type ... The when-predicate reads 'type', which this object does not declare'). The save door/build accepted awhenwith a second hop, an undeclared related column or a both-ways read with 0 errors. Engine (packages/objectql rule-validator.ts only; engine.ts untouched): collectPredicateRelationships now collects a conditional'swhenat every depth, so the engine's existing resolvePredicateRelated preloads its hop (same loader, system authority, projection, and the per-rule undeclared-column isolation from PR 24508). checkConditional evaluateswhenon resolveTraversalScope's scope, as checkPredicate does; the branch keeps the untouched context. Scope refusals go through a shared traversalScopeRefusal builder that checkPredicate now also uses (its text and log are byte-identical). referentialClearRefusal applies to awhenfault on a delete's reference cleanup. Lint (packages/lint validate-expressions.ts, the domain:spec rider): the top-level and nestedwhenpass traversalHydration, so the existing hop checks judge them under EXPRESSION_INVALID. No new rule, code or message. The now-unread RulePredicate.slot is removed. MEASURED NARROWING beyond the claim: a real-engine probe (base vs head; probe not committed) shows a null-safewhen(.? / has() / inline record.account != null test) on an EMPTY reference was judged byotherwisebefore and is refused now ('no single related record' / 'both ways'), the same as a condition. The same null-safe spellings on a SET reference silently took the wrong branch (otherwise) before and are now judged on the row. So the objectql changeset is minor BREAKING (narrowing), not patch; see open_questions. Shipped-tree exposure at 1e8b628: 0whenreads through a reference outside tests (control regex withconditionfinds 8 lines).","tests": "Repro before the fix (rule-validator.ts / validate-expressions.ts at base): new objectql unit pins 10 failed / 38 passed, the then-pin showing constraint.fault 'runtime: No such key: type'. New lint pins: 3 failed (each 'expected [] to deeply equal [ "object 'hop_order' · validation 'gate' when" ]'). Final head a8614e4:
pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2gave 447 files, 8432 tests passed, exit 0.pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2gave 148 files, 6932 tests passed, exit 0. Typecheck: objectql exit 0, lint exit 0 (each includes check:test-typecheck). Ablations, each via scripts/ablation-replace.mjs (anchor hit x1, blob changed, restored to the HEAD blob with git diff HEAD empty; subjects imported by relative src path, so no dist leg). (A) delete addFrom(r.when): 5 red, including real-engine pin (a) showing the card's 'No such key: type' refusal. (B) checkConditional evaluates ctx.merged: 6 red. (C) when scope refusal replaced by return null: 4 red. (D) when cleanup text replaced by null: 1 red. (E1/E2) lint opt-in reverted at the top-level / nestedwhen: 5 / 4 red. Direction as expected (turn red) on every leg. test:repo not run: CI-owned, and no repo-project test is touched.","gates": "Local:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) derived 70 commands, the same list at e5a2eec and at the final head a8614e4. On a8614e4 all 70 ran, each exit captured before any pipe: 70 x exit 0.--ranreports '70 derived, 70 run, 0 NOT-MEASURED, 0 UNRUN' (exit 0). The earlier battery on e5a2eec had three non-zero exits, each resolved before the final run. check:error-code-casing exit 1: new test literals lacked thefieldkey; fixed in 9b80c99. check:engine-split-ratio exit 2: shallow-clone refusal; deepened with --shallow-since=2026-07-14, then exit 0. check:dual-build-cjs-loads exit 3: PREREQUISITE NOT MET; full turbo build 77/77 exit 0, then exit 0. check-adr-0087-registration: accepted 'not-required (no-migration-prescription)' on the BREAKING+bang+clause-②-narrowing changeset. Local-only families check:dev-prereqs and check:skill-frame-freshness: not owed, since packages/spec and the frame files are untouched. CI on PR 24650 head a8614e4 at report time: 'No other open PR may claim the same issue' success; 'Packed-tarball smoke (opt-in)' skipped; every other run in_progress (Check Changeset, Governed Surface Queue Guard, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped x3, Type Check · consumer gates / debt ledger / source gates / workspace, the card-claims-branch and single-writer-path checks, filter). Not awaited, per contract.","mcp_calls": "0",
"api_writes": "3 REST writes in 2 fleet-write relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches under the session token, executed as objectstack-fleet[bot]. Stroke 1 (fw-20261019T210614Z-372b85, run 39324819197, success, read-back identical 12749/12749 bytes, assignees os-warren): POST /repos/objectstack-ai/objectstack/pulls (draft PR 24650) and POST /repos//issues/24650/assignees. Stroke 2: POST /repos//issues/24512/comments (this os-dev-report). git push (not a REST write): the empty-branch probe plus 5 pushes of the branch.",
"open_questions": [
{
"question": "The dispatch planned @objectstack/objectql as patch. The write-time probe measured a narrowing on that face: a null-safe
whenon an empty reference was judged byotherwiseand is now refused. The changeset therefore ships objectql minor BREAKING with Clause-② no (narrowing), alongside lint minor BREAKING. Does the seat accept that classification?","options": [
"A: keep objectql minor BREAKING (narrowing), as shipped. It follows the measured behaviour and the 8d8f965 precedent for an objectql write-time narrowing.",
"B: re-grade objectql to patch. That under-declares a measured write-time narrowing, which the Clause-② arm exists to make visible.",
"C: special-case
whento skip the empty-reference / both-ways refusal so nothing narrows at write time. This divergeswhenfromcondition, makes the verdict depend on the CEL operator written (what the hydration design forbids), and departs from the triage route 'as checkPredicate does'."],
"recommendation": "A, because the narrowing is measured, the ruled route requires
whento behave as a condition does, and the changeset and PR body already carry the FROM/TO and the guard prescription for it."}
],
"out_of_scope_findings": [],
"deviations": [
"objectql changeset is minor BREAKING with Clause-② no (narrowing), not the planned patch. One changeset file covers both packages (.changeset/24512-conditional-when-hydration.md). Evidence: the write-time probe table in the PR body.",
"Triage premise 'hydration admits nothing new ... makes a write refused today evaluate' holds only for the plain spelling. Null-safe spellings were silently mis-branched before (now corrected), and on an empty reference they are now refused.",
"referentialClearRefusal was extended to the
whenfault path for parity with checkPredicate (text only, pinned by ablation D).","RulePredicate.slot was removed from lint: its only reader went away with the opt-out.",
"The existing lint pin '#22042 ... OFF for a nested
when' was rewritten to assert the opt-in, since it pinned exactly the branch removed.","No booted dogfood pin (packages/qa/dogfood is outside the claim's file surface). The HTTP statuses 400 VALIDATION_FAILED / 422 INVALID_METADATA are the existing mappings and were NOT MEASURED on a booted stack here. The envelope is asserted at the engine (code VALIDATION_FAILED plus per-field code and constraint) and at the save-door pass (rule expression-invalid).",
"Merged origin/main 14ccb1d before opening the PR (AGENTS §10). The incoming files (service-automation, spec/ui export) do not overlap this diff. Full suites and the 70-gate battery were re-run on the merged head.",
"The shared clone was deepened (git fetch --shallow-since=2026-07-14 origin) for check:engine-split-ratio. It is additive to the shared object store."
],
"files_changed": [
".changeset/24512-conditional-when-hydration.md",
"packages/objectql/src/validation/rule-validator.ts",
"packages/objectql/src/validation/rule-relationship-traversal.test.ts",
"packages/objectql/src/engine-predicate-relationship.test.ts",
"packages/lint/src/validate-expressions.ts",
"packages/lint/src/validate-expressions.rule-one-hop.test.ts",
"packages/lint/src/runtime-gate.object-validation-writes.test.ts"
],
"line_budget": "not applicable: no skills/** or ratcheted line ledger touched; diff +498/-55 over 7 files, under the 3000-line human-merge threshold",
"cleanup": "Worktree /home/user/objectstack-issue-24512 removed (node_modules deleted first; git worktree remove exit 0, status was clean). No dev server or monitor was started. Background runners were waited out with tail --pid. The probe test file was removed by its trap."
}
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
待裁:#24512 的修复带两处收窄,是否提前进 18.0 ·
domain:engineseat 2 ·session_01AHeUBbe6S3JRawcpbLejXD· 2026-10-19T21:13Z⛔ Not a release: claim 6275835421 and PR #24650 stay this seat's. The card moves
pm:dispatched→needs-user-decisionin the same act as this comment. PR #24650 stays draft until the answer is recorded here.一句话问题: 修好「
when经关联读值永远求不了值」之后,有两类写法会从「存得进去、运行时出错或悄悄走错分支」变成「保存或写入时直接被拒」。这算协议类收窄,按你定的口径要问:进不进 18.0?为什么现在要问
when」这条路,前提是「不在门上收紧」(6265543836:"Hydration admits nothing new at the door")。dev 实测证伪了这个前提(报告 6277364966,PR 正文的两张测量表)。latest是 17.7.0,next是 18.0.0-next.5,.changeset/pre.json已是mode: exit,版本 PR chore: version packages #24524 挂着。fix(objectql,lint)!: a conditional rule'swhenreads one hop through a reference, hydrated like a condition #24650 若在它之前合入,就随 18.0.0 发出。两处收窄(实测)
os validate/os build/ 对象保存):when读两跳、读关联对象没声明的列、或同时把关联当值和当对象读,今天存得进去、之后每次写入都被拒;改后保存时就拒,指出位置。record.account.?type…/has(record.account.type) && …的空判断写法,关联为空时以前走otherwise,改后写入被拒,拒绝文字指出正确写法(把record.account != null单独做外层when)。同样的写法关联非空时,以前悄悄走错分支,改后判对。暴露面: 已发布代码树里
when经关联读取的写法为 0(对照:同一正则换成condition命中 8 行)。选项
when与condition同判;坏写法保存时就被拒when经关联读值仍然每次写入都失败(本卡的缺陷不修),或者告警版要另做一轮业务含义直译: A = 新车出厂就装好正确的仪表;B = 先按旧仪表出厂,下一代车型再换。
四轴
when和condition走同一套补全与同一套拒绝,特例减少;B 让 18.x 整个周期保留一个已知的「能存不能跑」缺口。when;拉动来自作者照平台自己的when: record.REF != null提示往下写时会踩到的坑。推荐:A
只看「项目长远合理性」选 A:趁 18.0 是新装起点,一次把
when与condition对齐。B 不取:它让本卡缺陷在 18.x 里不修,或者为过渡多做一版。置信缺口:看不见 18.0 之外是否有人已在私有元数据里写了这类空判断式
when。自检:只看①选 A;②③④ 是否翻转:否。
裁后执行
whenreads one hop through a reference, hydrated like a condition #24650 翻 ready 入队;卡回pm:dispatched跟到合入。whenreads one hop through a reference, hydrated like a condition #24650 保持 draft、挂pm:on-hold+Restart-when:19.0 开版;如要 18.x 告警版,本席另起卡。os-decision-facets
when与condition同判);B 在 18.x 保留已知缺口。Prior rulings read: when,conditional,hydration,narrowing → standing rule 6261447528 (pull-forward); triage 6265543836 (route); thread: 2
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Ruled: A — land into 18.0 · recorded by
domain:engineseat 2 ·session_01AHeUBbe6S3JRawcpbLejXD· 2026-10-19T22:35Zwhenthat reads through a lookup (record.account.status) saves at every door, butcheckConditionalevaluates it unhydrated, so every write the rule guards is refused as unevaluable #24512, Seed replay rewrites every seeded row that carries a password field on every boot: the existing row is read through engine.find, which masks the password, so isNoOpReplay compares the seed plaintext with the mask #24624 and Active metadata save stores an object without its package namespace prefix that publish-drafts then refuses (NAMESPACE_PREFIX) #24547 together and proposed the one-line reply 「24512 A,24624 B,24547 进」. For this card that is letter A of the pull-forward analysis 6277452230: the fix and both narrowings ride 18.0.needs-user-decision→pm:dispatched. Claim 6275835421 stands.whenreads one hop through a reference, hydrated like a condition #24650 heada8614e4116carries the seat ACCEPT 6277482448 and theCONTRACT_REVIEW_TIERPASS 6278025857, and every check is green. The seat flips it to ready and arms auto-merge now, so it rides 18.0.0 if it lands before the Version Packages PR is merged.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landing held ·
domain:engineseat 2 ·session_01AHeUBbe6S3JRawcpbLejXD· 2026-10-19T22:39Z. ⛔ Not a release: claim 6275835421 and ruling 6278876096 stand.whenreads one hop through a reference, hydrated like a condition #24650 to ready and armed auto-merge, then readmain's hourly full battery red. The scheduledCIrun 39331938913 oncc95f5e63failedDogfood Regression Gate (3/3)at "Boot example apps and exercise real user flows" (packages/qa/dogfood,pnpm run testexit 1). Its job log is behind a host this container cannot reach (403), so the failing flow is not attributed to a lane yet.mainis green. Nothing on the branch changes. The PASS record 6278025857 is on the head, which does not move.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:engineseat 2 ·session_01AHeUBbe6S3JRawcpbLejXD· 2026-10-20T01:46Z073b1b2480origin/main073b1b2480(git merge-base --is-ancestor);git grep -c resolveTraversalScopeinpackages/objectql/src/validation/rule-validator.ts= 9State: closed
completedby the PR'sFixes;pm:dispatchedremoved in this act. Ruled A, into 18.0 (6278876096); theobjectqlandlintminorchangesets ride the next Version Packages PR.Generated by Claude Code