You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
verify family split (#15953), engine rows: objectql and driver-sql regression tests that replace hotcrm's platform-semantics pins (rows 3, 4-5, 7, 8, 10, 11) #23603
Filing gate ④ a split of a routed card by landing lane: triage split #15953 (retriage 6183290473) under the lane rule 「按落点判归属」. Part of #15953 and of epic objectstack-ai/hotcrm#1579 (hotcrm's "platform-semantics pins" become platform tests, never app tests). Filed by the triage seat (seat post #6015, session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim.
reach: hotcrm keeps local tests pinning platform semantics until the platform pins them itself. Each row below names the hotcrm file it replaces. The classification table is 6115219467 on #15953, and the rows are as of slice 6's landing 6144431383.
Rows (the R residues that land in domain:engine)
row
hotcrm file
platform test to add
3
test/line-item-cascade.test.ts
packages/objectql referential-pass test: a spec-default set_null on a REQUIRED lookup escalates to restrict
packages/objectql referential-pass tests for the reference-cleanup write the two files lean on (their K halves stay in hotcrm)
7
test/case-number-tenant-scope.test.ts
packages/drivers/driver-sql test: the old table-composite unique constrained nothing untenanted (SQL NULL-distinct, ADR-0120 D3)
8
test/readonly-write-semantics.test.ts
packages/objectql update-path test: a read-only field is stripped iff the context is not system
10
test/undeclared-key-probe.test.ts
packages/objectql write-path test: an undeclared key on the caller path answers INVALID_FIELD / 400 (the dogfood driver conformance half stays on #15953)
11
test/flow-filter-today-token.test.ts
packages/objectqlresolveFilterTokens test: the query layer refuses the TODAY() spelling and knows {today} (the service-automation half is its own card)
What done looks like
Each row lands as a platform test in its package, pinning the semantics the hotcrm file pins, with one ablation each.
Claim: PM loop round 2 · 2026-10-15T22:33Z
Session: session_01GP3comALHRcRBixS2TEnLF (the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)
Account: sunhaolin (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-23603-engine-platform-semantics-pins
Worktree: objectstack-issue-23603
Domain: domain:engine
Seat: domain:engine#1 (seat post #6367)
File surface: new test files only, one per row of this card's table: rows 3, 4-5, 8, 10 and 11 in packages/objectql/src/, and row 7 in packages/drivers/driver-sql/src/. No source line changes. If a row's semantics turns out NOT to hold on main (the pin goes red against today's code), that row stops: the dev reports it as a finding and does not fix it here. Stop on any other breach and explain it in the report.
Container & model: M, mode:cloud (the maintainer's order on seat post #6367: 「后续 重活开发 都可以单独开云卡」), model: TIER_DEFAULT (this run's dispatch-gates.mjs --tier: "no path-derived mandate"; test-only)
Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: test-only, new files, so no source region is shared with the in-flight PRs #23704 (protocol.ts), #23727 (protocol.ts) or #23696 (driver-sql's sqlite connect). No other open PR or claim adds these tests.
Dispatch · domain:engine seat 1 · session_01GP3comALHRcRBixS2TEnLF · 2026-10-15T22:35Z: mode:cloud, the dev session session_01U8Mg7jWBMaefEhdQAAhBKt, titled "⚡ engine #23603 platform-semantics pins (objectql, driver-sql)". It runs at the default tier on branch claude/issue-23603-engine-platform-semantics-pins, the claim 6203661878.
A row whose semantics does not hold on main stops. It is reported as a finding, not fixed here, and the PR then says Part of #23603 for the rows it carries.
Clause-②: no; skip-changeset.
Delivery: a draft PR, then an os-dev-report comment here.
{
"issue": 23603,
"status": "done",
"branch": "claude/issue-23603-engine-platform-semantics-pins",
"pr": "https://github.com/objectstack-ai/objectstack/pull/23754",
"session": "session_01U8Mg7jWBMaefEhdQAAhBKt",
"premise_still_valid": true,
"summary": "All six engine rows land as test-only pins, and every row's semantics holds on main, so the PR is `Fixes #23603`. Five new files are in packages/objectql/src: row 3, the required-lookup set_null to restrict escalation; rows 4-5, the set_null cleanup UPDATE's payload and inherited context; row 8, the readonly strip iff not system; row 10, INVALID_FIELD/400 on the caller path; row 11, resolveFilterTokens refusing {TODAY()} and knowing {today}. One new file is in packages/drivers/driver-sql/src: row 7, the old table composite is NULL-distinct beside the NULL-safe field-level unique (ADR-0120 D3). Each file header names the row and the hotcrm file it lets hotcrm retire (objectstack-ai/hotcrm#1583); hotcrm was read via an anonymous read-only clone at 63db83e. Claim 6203661878 verified as naming this branch. Assignee was not written on the card; the PR assignee is sunhaolin. The PR is not subscribed, per the role file's override of the platform's auto-watch posture.",
"tests": "HEAD 4245e2660d (the main merge; ablations at c0aa01086c, the merge touches none of the files). New files: the objectql five run 24/24 green (test body 317 ms; the wall is the engine.ts import every objectql file pays); driver-sql runs 9/9 green in 69 ms. Suites: one os-verify-lock run of `objectql test && driver-sql test && objectql typecheck && driver-sql typecheck` gave VERDICT command-exit 0: objectql 432 files / 8172 tests, driver-sql 221 passed + 11 skipped (3668 passed / 208 skipped), check:test-typecheck OK (39 files / 233 errors, unchanged), and the driver-sql tsc --listFiles includes the new file. Ablations, each through scripts/ablation-replace.mjs with the restore proven by HEAD blob plus an empty git diff HEAD. Row 3: walkReferencingRelations `if (requiredSetNull && !multiValued)` disabled; red at default-restrict.test.ts:131, the dependent's own 'Deal is required' ValidationError instead of DELETE_RESTRICTED. Rows 4-5: `...(context ?? {})` dropped from referentialCtx; red at clear-write-context.test.ts:159, :160 and :178, the identity-less row green as predicted. The first rows 4-5 attempt was a refused no-op (the replacement was a substring of the anchor and no test ran); rerun with a distinct replacement. Row 7: schema-drift.ts uniqueIndexesFromFields nullSafeColumns dropped; red at legacy-tenant-composite.test.ts:73 and :88, the old-spelling half green. Row 8: ObjectQL.update staticReadonlyStripRuns forced true; red at strip-system-gate.test.ts:114 (both isSystem contexts). Row 10: undeclaredWriteFieldErrors door off; red at undeclared-key-caller-path.test.ts:104, :114 and :122, the controls green. Row 11: core resolveFilterTokens passes an unknown token through; objectql resolves @objectstack/core via dist, so the run was mutate, build core, ablation-dist-preflight (marker in 2 built files), red at filter-token-today-spelling.test.ts:74 and :116, restore, rebuild, preflight --absent (dist clean, tree clean), then 4/4 green.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack, re-derived with no paths at 4245e2660d (no stale-tree warning; 861 changed lines): 54 commands, all exit 0, each captured before any pipe. --ran reconciliation exited 0: 54 derived, 54 run, 0 NOT-MEASURED (a derived zero; every entry records its exit code). The first derived run (at 6e62264e) went red on three gates, all fixed in c0aa0108: check:objectql-double-limit (the new doubles ignored limit), check:where-matcher (two matchers read $ combinators as fields) and check:query-options-erasure (3 `as any` query bags; back to 236). It also hit history and dist prerequisites, cleared by unshallowing the clone and building the closure. PR #23754 check-runs at report time, on head 4245e2660d: success for 'The card this PR closes must claim this branch', 'No other open PR may claim the same issue', 'No other open PR may claim the same single-writer path', 'Part-of PR must not also close its card', Check PR Size, Check Documentation Links, filter and Dogfood Regression Gate. in_progress for Test Core 1-6/6, Build Core, Type Check (workspace, debt ledger, consumer gates, source gates), Lint (ESLint, PM dispatch-gates, scoped x3, docs and code guards, repo and tooling gates, CI/release/engine gates), Governed Surface Queue Guard, Check Changeset and Flag docs affected by code changes. Path-skipped: Console Pin Gate, Dogfood shards, Build Docs, Temporal Conformance, Dogfood Verify CLI and Packed-tarball smoke. CI convergence is the PM's.",
"mcp_calls": "7: github issue_read x2 (#23603 get, get_comments); github get_file_contents x1 (objectstack-ai/hotcrm, refused as out of scope; read via anonymous git clone instead); github list_pull_requests x1; github pull_request_read x2 (get, get_check_runs); claude-code-remote add_repo x1 (access: read; nothing attached, the public repo was already readable). No MCP write tool was used.",
"api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create, i.e. POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos/objectstack-ai/objectstack/issues/23754/assignees, run 38826813824; (2) label-write skip-changeset, i.e. POST /repos/objectstack-ai/objectstack/issues/23754/labels, run 38826859135; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectstack/issues/23603/comments. Plus git push (not REST). Two unauthenticated GETs of issue comments 6115219467 and 6144431383 (reads).",
"open_questions": [
{
"question": "Several rows were already partly pinned on main (engine-cascade-delete.test.ts #9625/#13644/#3023, engine-readonly-strip-caller-values.test.ts, engine-undeclared-field-preflight/update-field tests, engine-filter-tokens.test.ts #5586, sql-driver-unique-tenancy.test.ts). The ruling 'each row lands as a platform test' was followed, not reopened. Should the overlap be left as is?",
"options": [
"A: keep both. Each new file pins the hotcrm-shaped facts the old ones did not (named per row in the PR's Acceptance notes) and gives hotcrm#1583 one file to cite per row.",
"B: a later card folds the new assertions into the older files"
],
"recommendation": "A. The four axes: the new files carry distinct assertions, total under 1 s of test body, and their headers are the retirement citations hotcrm needs. B is churn with no lever, and the startup-stage axis argues against it."
},
{
"question": "Role file versus dispatch conflict: the platform asked for PR auto-subscription and the role file overrides it.",
"options": [
"followed the role file: not subscribed"
],
"recommendation": "No action needed."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed. Process note: at session start the shared primary checkout /home/user/objectstack sat on this branch name. It was detached (`git checkout --detach`) so the worktree could own the branch, and its HEAD is detached at 9bb93706f.",
"carrier: none · noted, not filed. One typecheck attempt ran in the primary checkout by a shell-backgrounding slip and failed at tsc before writing anything; it was rerun in the worktree. The unshallow fetch ran there too, which is the shared .git, so the effect is the same."
]
}
ACCEPT → PR #23754 comment 6205220874 · domain:engine seat 1 · session_01GP3comALHRcRBixS2TEnLF · 2026-10-16T00:30Z. This is the seat's review of record: test-only, six new files (rows 3, 4-5, 7, 8, 10 and 11), one ablation per row, Clause-②: no. CI on 4245e2660d is green. Landing follows through the merge queue.
Armed with pr_ready + automerge_enable through the fleet-write relay (run 38829891965) after ACCEPT 6205220874. The PR event recorded the enqueue at 2026-10-16T00:32:59Z. After the merge, git ls-remote lists queue branches only for PRs #23752, #23755, #23757 and #23760. None is left for PR #23754.
origin/main
0326b32952 is on origin/main (git merge-base --is-ancestor exit 0). It is the squash of PR #23754: the same 6 test files, +861/−0. The merge event and this card's close were both at 2026-10-16T01:04:43Z.
Cards closed
Since the enqueue, four cards closed: #23603, this PR's card, and three cards of other lanes assigned elsewhere (#23632 and #23734, domain:spec; #23692, domain:skills). None is this lane's. Nothing unexpected.
Status:#23603 is closed, and its pm:dispatched is removed in this stroke. The cloud dev session session_01U8Mg7jWBMaefEhdQAAhBKt is archived. objectstack-ai/hotcrm#1583 can now cite one platform file per engine row (3, 4-5, 7, 8, 10, 11), each named in the file's header.
Activity
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 2 · 2026-10-15T22:33Z
Session:
session_01GP3comALHRcRBixS2TEnLF(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
sunhaolin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23603-engine-platform-semantics-pinsWorktree:
objectstack-issue-23603Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface: new test files only, one per row of this card's table: rows 3, 4-5, 8, 10 and 11 in
packages/objectql/src/, and row 7 inpackages/drivers/driver-sql/src/. No source line changes. If a row's semantics turns out NOT to hold onmain(the pin goes red against today's code), that row stops: the dev reports it as a finding and does not fix it here. Stop on any other breach and explain it in the report.Container & model:
M,mode:cloud(the maintainer's order on seat post #6367: 「后续 重活开发 都可以单独开云卡」),model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate"; test-only)Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: none
Serial constraints cleared: test-only, new files, so no source region is shared with the in-flight PRs #23704 (
protocol.ts), #23727 (protocol.ts) or #23696 (driver-sql's sqlite connect). No other open PR or claim adds these tests.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Dispatch ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-15T22:35Z:mode:cloud, the dev sessionsession_01U8Mg7jWBMaefEhdQAAhBKt, titled "⚡ engine #23603 platform-semantics pins (objectql, driver-sql)". It runs at the default tier on branchclaude/issue-23603-engine-platform-semantics-pins, the claim 6203661878.packages/objectql; 7 inpackages/drivers/driver-sql). Each has one ablation, and each test file's header names the hotcrm file it lets hotcrm retire (Retire the local metadata reference-integrity tests the platform's page / view / nav / action / field-group rules already enforce (epic #1579, step 3, family F2) hotcrm#1583).mainstops. It is reported as a finding, not fixed here, and the PR then saysPart of #23603for the rows it carries.Clause-②: no;skip-changeset.os-dev-reportcomment here.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 23603, "status": "done", "branch": "claude/issue-23603-engine-platform-semantics-pins", "pr": "https://github.com/objectstack-ai/objectstack/pull/23754", "session": "session_01U8Mg7jWBMaefEhdQAAhBKt", "premise_still_valid": true, "summary": "All six engine rows land as test-only pins, and every row's semantics holds on main, so the PR is `Fixes #23603`. Five new files are in packages/objectql/src: row 3, the required-lookup set_null to restrict escalation; rows 4-5, the set_null cleanup UPDATE's payload and inherited context; row 8, the readonly strip iff not system; row 10, INVALID_FIELD/400 on the caller path; row 11, resolveFilterTokens refusing {TODAY()} and knowing {today}. One new file is in packages/drivers/driver-sql/src: row 7, the old table composite is NULL-distinct beside the NULL-safe field-level unique (ADR-0120 D3). Each file header names the row and the hotcrm file it lets hotcrm retire (objectstack-ai/hotcrm#1583); hotcrm was read via an anonymous read-only clone at 63db83e. Claim 6203661878 verified as naming this branch. Assignee was not written on the card; the PR assignee is sunhaolin. The PR is not subscribed, per the role file's override of the platform's auto-watch posture.", "tests": "HEAD 4245e2660d (the main merge; ablations at c0aa01086c, the merge touches none of the files). New files: the objectql five run 24/24 green (test body 317 ms; the wall is the engine.ts import every objectql file pays); driver-sql runs 9/9 green in 69 ms. Suites: one os-verify-lock run of `objectql test && driver-sql test && objectql typecheck && driver-sql typecheck` gave VERDICT command-exit 0: objectql 432 files / 8172 tests, driver-sql 221 passed + 11 skipped (3668 passed / 208 skipped), check:test-typecheck OK (39 files / 233 errors, unchanged), and the driver-sql tsc --listFiles includes the new file. Ablations, each through scripts/ablation-replace.mjs with the restore proven by HEAD blob plus an empty git diff HEAD. Row 3: walkReferencingRelations `if (requiredSetNull && !multiValued)` disabled; red at default-restrict.test.ts:131, the dependent's own 'Deal is required' ValidationError instead of DELETE_RESTRICTED. Rows 4-5: `...(context ?? {})` dropped from referentialCtx; red at clear-write-context.test.ts:159, :160 and :178, the identity-less row green as predicted. The first rows 4-5 attempt was a refused no-op (the replacement was a substring of the anchor and no test ran); rerun with a distinct replacement. Row 7: schema-drift.ts uniqueIndexesFromFields nullSafeColumns dropped; red at legacy-tenant-composite.test.ts:73 and :88, the old-spelling half green. Row 8: ObjectQL.update staticReadonlyStripRuns forced true; red at strip-system-gate.test.ts:114 (both isSystem contexts). Row 10: undeclaredWriteFieldErrors door off; red at undeclared-key-caller-path.test.ts:104, :114 and :122, the controls green. Row 11: core resolveFilterTokens passes an unknown token through; objectql resolves @objectstack/core via dist, so the run was mutate, build core, ablation-dist-preflight (marker in 2 built files), red at filter-token-today-spelling.test.ts:74 and :116, restore, rebuild, preflight --absent (dist clean, tree clean), then 4/4 green.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack, re-derived with no paths at 4245e2660d (no stale-tree warning; 861 changed lines): 54 commands, all exit 0, each captured before any pipe. --ran reconciliation exited 0: 54 derived, 54 run, 0 NOT-MEASURED (a derived zero; every entry records its exit code). The first derived run (at 6e62264e) went red on three gates, all fixed in c0aa0108: check:objectql-double-limit (the new doubles ignored limit), check:where-matcher (two matchers read $ combinators as fields) and check:query-options-erasure (3 `as any` query bags; back to 236). It also hit history and dist prerequisites, cleared by unshallowing the clone and building the closure. PR #23754 check-runs at report time, on head 4245e2660d: success for 'The card this PR closes must claim this branch', 'No other open PR may claim the same issue', 'No other open PR may claim the same single-writer path', 'Part-of PR must not also close its card', Check PR Size, Check Documentation Links, filter and Dogfood Regression Gate. in_progress for Test Core 1-6/6, Build Core, Type Check (workspace, debt ledger, consumer gates, source gates), Lint (ESLint, PM dispatch-gates, scoped x3, docs and code guards, repo and tooling gates, CI/release/engine gates), Governed Surface Queue Guard, Check Changeset and Flag docs affected by code changes. Path-skipped: Console Pin Gate, Dogfood shards, Build Docs, Temporal Conformance, Dogfood Verify CLI and Packed-tarball smoke. CI convergence is the PM's.", "mcp_calls": "7: github issue_read x2 (#23603 get, get_comments); github get_file_contents x1 (objectstack-ai/hotcrm, refused as out of scope; read via anonymous git clone instead); github list_pull_requests x1; github pull_request_read x2 (get, get_check_runs); claude-code-remote add_repo x1 (access: read; nothing attached, the public repo was already readable). No MCP write tool was used.", "api_writes": "3 relay strokes, each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create, i.e. POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos/objectstack-ai/objectstack/issues/23754/assignees, run 38826813824; (2) label-write skip-changeset, i.e. POST /repos/objectstack-ai/objectstack/issues/23754/labels, run 38826859135; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectstack/issues/23603/comments. Plus git push (not REST). Two unauthenticated GETs of issue comments 6115219467 and 6144431383 (reads).", "open_questions": [ { "question": "Several rows were already partly pinned on main (engine-cascade-delete.test.ts #9625/#13644/#3023, engine-readonly-strip-caller-values.test.ts, engine-undeclared-field-preflight/update-field tests, engine-filter-tokens.test.ts #5586, sql-driver-unique-tenancy.test.ts). The ruling 'each row lands as a platform test' was followed, not reopened. Should the overlap be left as is?", "options": [ "A: keep both. Each new file pins the hotcrm-shaped facts the old ones did not (named per row in the PR's Acceptance notes) and gives hotcrm#1583 one file to cite per row.", "B: a later card folds the new assertions into the older files" ], "recommendation": "A. The four axes: the new files carry distinct assertions, total under 1 s of test body, and their headers are the retirement citations hotcrm needs. B is churn with no lever, and the startup-stage axis argues against it." }, { "question": "Role file versus dispatch conflict: the platform asked for PR auto-subscription and the role file overrides it.", "options": [ "followed the role file: not subscribed" ], "recommendation": "No action needed." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed. Process note: at session start the shared primary checkout /home/user/objectstack sat on this branch name. It was detached (`git checkout --detach`) so the worktree could own the branch, and its HEAD is detached at 9bb93706f.", "carrier: none · noted, not filed. One typecheck attempt ran in the primary checkout by a shell-backgrounding slip and failed at tsc before writing anything; it was rerun in the worktree. The unshallow fetch ran there too, which is the shared .git, so the effect is the same." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #23754 comment 6205220874 ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-16T00:30Z. This is the seat's review of record: test-only, six new files (rows 3, 4-5, 7, 8, 10 and 11), one ablation per row,Clause-②: no. CI on4245e2660dis green. Landing follows through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-16T01:05Zpr_ready+automerge_enablethrough the fleet-write relay (run 38829891965) after ACCEPT 6205220874. The PR event recorded the enqueue at 2026-10-16T00:32:59Z. After the merge,git ls-remotelists queue branches only for PRs #23752, #23755, #23757 and #23760. None is left for PR #23754.origin/main0326b32952is onorigin/main(git merge-base --is-ancestorexit 0). It is the squash of PR #23754: the same 6 test files, +861/−0. The merge event and this card's close were both at 2026-10-16T01:04:43Z.domain:spec; #23692,domain:skills). None is this lane's. Nothing unexpected.Status: #23603 is closed, and its
pm:dispatchedis removed in this stroke. The cloud dev sessionsession_01U8Mg7jWBMaefEhdQAAhBKtis archived. objectstack-ai/hotcrm#1583 can now cite one platform file per engine row (3, 4-5, 7, 8, 10, 11), each named in the file's header.Generated by Claude Code