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
objectui Import Wizard: the "run automations" (off) and "treat as historical" (on) options are refused 403 for every signed-in user once PR #24379 lands — the wizard must stop offering them (repo:objectui) #12985
Filing gate ①, class (a): a public door's answer changes under a P0 fix, and a UI still offers the refused option. From objectstack-ai/objectstack#24348's dev report (6253157395). Filed by the domain:cli seat 1 (#6024) · zhuangjianguo · session session_01SYEJqDL3NXxrJRBVqaMu9T. ⛔ Not a claim. The remedy lives in objectstack-ai/objectui, so triage routes it there (repo:objectui).
objectui's Import Wizard sends runAutomations: false when its "run automations" box is unchecked, and treatAsHistorical: true when "treat as historical" is checked (objectui packages/plugin-grid/src/ImportWizard.tsx about :926 / :937 and :1875 / :1879, at objectui 43efd078a; read from code, not driven in a browser).
The wizard stops offering the two options: it removes them, or hides them behind a capability that no signed-in user holds today. The default import (automations run, no historical treatment) is unchanged. A UI that offers an option the server refuses for every user is the declared-but-not-honoured shape (「声明即强制」).
Note
Whether a platform administrator should be entitled to the opt-outs is not this card's question. objectstack-ai/objectstack#24348's seat review answers it as not entitled: a new entitlement needs the maintainer's naming. If that changes, the wizard can show the options to the entitled callers only.
Release coupling: the framework's vendored console (.objectui-sha0707b4ae37) predates this fix. So the next cut ships the 403 with the options still offered. The answer is loud and narrow, so this does not hold the cut, but the card should land before GA.
Routing: the remedy is in packages/plugin-grid/src/ImportWizard.tsx, so the card was moved here from objectstack-ai/objectstack#24381 in this act, as domain:ui.
Claim: PM loop round 11 (priority:p1)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12985-import-optouts
Worktree: objectui-issue-12985
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/plugin-grid/src/ImportWizard.tsx (the "run automations" and "treat as historical" options, their state, and the request fields they set, about :926 / :937 / :1875 / :1879), the i18n keys only those two options read in packages/i18n/src/locales/*.ts, and tests beside each. Plus one .changeset/12985-*.md. ⛔ The default import (automations run, no historical treatment) unchanged; ⛔ no new capability or entitlement. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
Clause-②: no
Responsibility: @object-ui/plugin-grid's Import Wizard offers runAutomations: false and treatAsHistorical: true | objectstack-ai/objectstack#24348 (P0) makes the import doors refuse both for every non-system caller (PR objectstack-ai/objectstack#24379), and no entitlement exists for a signed-in user | every user who touches either option once a server carries objectstack-ai/objectstack#24379: the whole import answers 403.
Thread-read: 6253829082
Serial constraints cleared: no open objectui PR touches ImportWizard.tsx; the in-flight claims (objectui#12980 part 2, #12954, #12957) do not name it.
Claimed at: 2026-10-18T19:24Z
os-dev-report
{
"issue": 12985,
"status": "done",
"branch": "claude/issue-12985-import-optouts",
"pr": "#12989",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Removed the Import Wizard's 'Run automations & triggers' and 'Import as historical data' options: both checkboxes, their state, their ImportOptions props, their dependency-list and reset entries, and the runAutomations / treatAsHistorical fields assembleImportRequest set. The import, dry-run and background-job requests (all built by assembleImportRequest) now carry neither key, which is the server's declared default (readImportControlFlags on PR objectstack-ai/objectstack#24379: runAutomations on unless false, treatAsHistorical only on literal true, explicit true/false admitted), so the default import is unchanged. Retired grid.import.optRunAutomations / optTreatHistorical / optTreatHistoricalHint in all ten packs and the wizard's English fallback map, and dropped the retired key's name from two comments that listed it as a live surface (en.ts, makerEmptyState-v1-scope-8329.test.ts). Draft PR #12989 opened via the relay with assignee baozhoutao (read back: assignees as the pull lists them = baozhoutao); zero label writes (none named for objectui). Worktree cleaned. Contract note: ImportWizardProps/ImportResult unchanged; exported locale objects under @object-ui/i18n/locales/* lose three grid.import members; ImportRequestOptions in @object-ui/types still declares both fields (server accepts them from the system principal).",
"tests": "All at HEAD ac0198b (BASE 024b7b6). Closure build turbo run build --filter=@object-ui/plugin-grid^... --concurrency=2 under lock: VERDICT command-exit 0, 13 tasks successful. type-check plugin-grid + i18n (tsc --noEmit && tsc -p tsconfig.test.json) under lock: VERDICT command-exit 0; --listFiles shows the 3 plugin-grid test files and the i18n test in the test program. vitest --maxWorkers=1 under lock: new/edited files + i18n-parity 'Test Files 4 passed (4) / Tests 20 passed (20)'; plugin-grid files naming ImportWizard/runAutomations/treatAsHistorical 'Test Files 21 passed (21) / Tests 148 passed (148)'; other packages' files naming them + i18n all-locales-key-parity, makerEmptyState-8329, dead-pack-keys-retired-8754, dead-key-batch-retired-4730 'Test Files 20 passed (20) / Tests 301 passed (301)'. Declared to CI: full packages/plugin-grid/ and packages/i18n/ dirs. Battery all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-dead-keys, i18n-drift, i18n-designer-parity, control-bytes; node scripts/check-hand-rolled-comment-mask.mjs 0; node scripts/check-changeset-fixed.mjs 0; check-changeset-presence 0 ('15 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'); check:new-line-citations 'VERDICT ... 0 new citation(s)'. check:spec-floors not run (not in the order's battery list). Narrowed lint (eslint --no-inline-config --format json over the 15 changed .ts/.tsx): population eslint.config.js files '**/*.{ts,tsx}'; JSON count 15 files, 0 errors, 9 warnings, all in ImportWizard.tsx and the same 9 rules on the BASE blob (pre-existing); invariance: no parserOptions.project, not type-aware, so untouched files' verdicts cannot move. Ablation (fix committed first): node objectstack scripts/ablation-replace.mjs re-planted a data-testid import-opt-run-automations checkbox labelled 'Run automations & triggers' in ImportOptions (anchor 1 to 0, blob 3cdd0e998baf to 37f2a414044c); pin (a) red 'Tests 1 failed | 1 passed (2)' on queryByTestId('import-opt-run-automations'); restore blob 3cdd0e998baf == HEAD blob, git diff HEAD empty (tool + own trap script both proved). First ablation attempt was a no-op (replacement contained its anchor; tool refused, anchor 1 to 1, test never ran) and was re-run with a new anchor; no build/dist leg needed: the test imports ./ImportWizard by relative source path.",
"mcp_calls": "0",
"api_writes": "2 — (1) fleet-write relay POST /repos/objectstack-ai/objectstack/dispatches carrying pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /repos//issues/12989/assignees), run 39160110200 success, read-back identical 6801 bytes; (2) fleet-write relay dispatch carrying comment on #12985 (this os-dev-report). Plus git push x2 (empty-branch probe, then ac0198b), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed · ImportRequestOptions.runAutomations JSDoc in packages/types/src/data.ts says 'off by default for bulk' while spec ImportRequestSchema and the server default it to true; docs-only drift, no producer reads it; in PR #12989 Acceptance notes",
"carrier: 承接者:无 · noted, not filed · no other objectui caller sends runAutomations/treatAsHistorical (git grep: only ImportWizard.tsx, its tests, and the ImportRequestOptions wire type, which is correct as declared); data-objectstack importRecords forwards the request object unchanged"
]
}
Retired:grid.import.optRunAutomations, optTreatHistorical and optTreatHistoricalHint in all ten packs and the wizard's English fallback map (check:i18n-dead-keys / -keys green). No other objectui caller sends either field: data-objectstack's importRecords forwards the request unchanged, and @object-ui/types' ImportRequestOptions still declares both, correctly, because the server accepts them from the system principal.
Clause-②:no. ImportOptions is internal to ImportWizard.tsx; the exported ImportWizardProps / ImportResult are unchanged. The locale retirement follows the repo's usual dead-key practice. Changeset @object-ui/plugin-grid: patch, @object-ui/i18n: patch.
Tests: pins that the wizard draws neither option, that a completed import's request carries neither opt-out (with a CONTROL on the rest of the request), and that the default import still runs. Ablation (one checkbox re-planted) turns pin (a) red; restore proven by blob hash. plugin-grid's import families (148 tests) and the i18n parity / dead-key families (301 tests) pass; type-check and the pre-tsc battery exit 0.
Acceptance notes, not filed:ImportRequestOptions.runAutomations' JSDoc in @object-ui/types says "off by default for bulk", while the spec and the server default it to true. Docs-only drift, and nothing reads it.
Trailers: the one commit carries only the model-free pair.
CI at head: all 36 check-runs on ac0198b are complete: 33 success, 3 skipped (dependabot and the two coverage jobs), none failed; mergeable_state: clean. Path surface (16 files, +136 / −101): packages/plugin-grid/src/**, packages/i18n/src/** (the ten packs and one test comment) and one changeset; no governed path.
PR #12989 merged through the merge queue as cb80001818b07db5640726fa2d3bab08c37b3cd3, which is on main; Fixes #12985 closes this card. Verified by content: all 16 of the PR's files on main are blob-identical to the accepted head ac0198b. The merge commit's message names no model.
What landed: the Import Wizard no longer offers "Run automations & triggers" or "Import as historical data", and its requests carry neither opt-out. A default import is unchanged and cannot draw the 403 from objectstack-ai/objectstack#24348. The three locale keys only those options read are retired from all ten packs. @object-ui/plugin-grid, @object-ui/i18n: patch.
For objectstack (P0 objectstack-ai/objectstack#24348, PR #24379): the console half is on objectui main. A framework build that ships the 403 stops offering the options once its .objectui-sha covers the merge commit above. This seat now removes pm:dispatched.
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p1 ·
domain:ui·pm:queue· moved from objectstack-ai/objectstack#24381 · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T18:56ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
403for the whole import. The default import is unchanged..objectui-sha0707b4ae37) predates this fix. So the next cut ships the403with the options still offered. The answer is loud and narrow, so this does not hold the cut, but the card should land before GA.packages/plugin-grid/src/ImportWizard.tsx, so the card was moved here from objectstack-ai/objectstack#24381 in this act, asdomain:ui.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 11 (
priority:p1)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12985-import-optoutsWorktree:
objectui-issue-12985Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-grid/src/ImportWizard.tsx(the "run automations" and "treat as historical" options, their state, and the request fields they set, about :926 / :937 / :1875 / :1879), the i18n keys only those two options read inpackages/i18n/src/locales/*.ts, and tests beside each. Plus one.changeset/12985-*.md. ⛔ The default import (automations run, no historical treatment) unchanged; ⛔ no new capability or entitlement. Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
@object-ui/plugin-grid's Import Wizard offersrunAutomations: falseandtreatAsHistorical: true| objectstack-ai/objectstack#24348 (P0) makes the import doors refuse both for every non-system caller (PR objectstack-ai/objectstack#24379), and no entitlement exists for a signed-in user | every user who touches either option once a server carries objectstack-ai/objectstack#24379: the whole import answers403.Thread-read: 6253829082
Serial constraints cleared: no open objectui PR touches
ImportWizard.tsx; the in-flight claims (objectui#12980 part 2, #12954, #12957) do not name it.Claimed at: 2026-10-18T19:24Z
objectstack-fleet commentedon Oct 18, 2026
os-dev-report
{
"issue": 12985,
"status": "done",
"branch": "claude/issue-12985-import-optouts",
"pr": "#12989",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Removed the Import Wizard's 'Run automations & triggers' and 'Import as historical data' options: both checkboxes, their state, their ImportOptions props, their dependency-list and reset entries, and the runAutomations / treatAsHistorical fields assembleImportRequest set. The import, dry-run and background-job requests (all built by assembleImportRequest) now carry neither key, which is the server's declared default (readImportControlFlags on PR objectstack-ai/objectstack#24379: runAutomations on unless false, treatAsHistorical only on literal true, explicit true/false admitted), so the default import is unchanged. Retired grid.import.optRunAutomations / optTreatHistorical / optTreatHistoricalHint in all ten packs and the wizard's English fallback map, and dropped the retired key's name from two comments that listed it as a live surface (en.ts, makerEmptyState-v1-scope-8329.test.ts). Draft PR #12989 opened via the relay with assignee baozhoutao (read back: assignees as the pull lists them = baozhoutao); zero label writes (none named for objectui). Worktree cleaned. Contract note: ImportWizardProps/ImportResult unchanged; exported locale objects under @object-ui/i18n/locales/* lose three grid.import members; ImportRequestOptions in @object-ui/types still declares both fields (server accepts them from the system principal).",
"tests": "All at HEAD ac0198b (BASE 024b7b6). Closure build
turbo run build --filter=@object-ui/plugin-grid^... --concurrency=2under lock: VERDICT command-exit 0, 13 tasks successful. type-check plugin-grid + i18n (tsc --noEmit && tsc -p tsconfig.test.json) under lock: VERDICT command-exit 0; --listFiles shows the 3 plugin-grid test files and the i18n test in the test program. vitest --maxWorkers=1 under lock: new/edited files + i18n-parity 'Test Files 4 passed (4) / Tests 20 passed (20)'; plugin-grid files naming ImportWizard/runAutomations/treatAsHistorical 'Test Files 21 passed (21) / Tests 148 passed (148)'; other packages' files naming them + i18n all-locales-key-parity, makerEmptyState-8329, dead-pack-keys-retired-8754, dead-key-batch-retired-4730 'Test Files 20 passed (20) / Tests 301 passed (301)'. Declared to CI: full packages/plugin-grid/ and packages/i18n/ dirs. Battery all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-dead-keys, i18n-drift, i18n-designer-parity, control-bytes; node scripts/check-hand-rolled-comment-mask.mjs 0; node scripts/check-changeset-fixed.mjs 0; check-changeset-presence 0 ('15 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'); check:new-line-citations 'VERDICT ... 0 new citation(s)'. check:spec-floors not run (not in the order's battery list). Narrowed lint (eslint --no-inline-config --format json over the 15 changed .ts/.tsx): population eslint.config.js files '**/*.{ts,tsx}'; JSON count 15 files, 0 errors, 9 warnings, all in ImportWizard.tsx and the same 9 rules on the BASE blob (pre-existing); invariance: no parserOptions.project, not type-aware, so untouched files' verdicts cannot move. Ablation (fix committed first): node objectstack scripts/ablation-replace.mjs re-planted a data-testid import-opt-run-automations checkbox labelled 'Run automations & triggers' in ImportOptions (anchor 1 to 0, blob 3cdd0e998baf to 37f2a414044c); pin (a) red 'Tests 1 failed | 1 passed (2)' on queryByTestId('import-opt-run-automations'); restore blob 3cdd0e998baf == HEAD blob, git diff HEAD empty (tool + own trap script both proved). First ablation attempt was a no-op (replacement contained its anchor; tool refused, anchor 1 to 1, test never ran) and was re-run with a new anchor; no build/dist leg needed: the test imports ./ImportWizard by relative source path.","mcp_calls": "0",
"api_writes": "2 — (1) fleet-write relay POST /repos/objectstack-ai/objectstack/dispatches carrying pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /repos//issues/12989/assignees), run 39160110200 success, read-back identical 6801 bytes; (2) fleet-write relay dispatch carrying comment on #12985 (this os-dev-report). Plus git push x2 (empty-branch probe, then ac0198b), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed · ImportRequestOptions.runAutomations JSDoc in packages/types/src/data.ts says 'off by default for bulk' while spec ImportRequestSchema and the server default it to true; docs-only drift, no producer reads it; in PR #12989 Acceptance notes",
"carrier: 承接者:无 · noted, not filed · no other objectui caller sends runAutomations/treatAsHistorical (git grep: only ImportWizard.tsx, its tests, and the ImportRequestOptions wire type, which is correct as declared); data-objectstack importRecords forwards the request object unchanged"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
ACCEPT ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-18T19:56ZPR #12989 at head
ac0198b, reviewed against the claim6254125131, triage6253829082and the dev report6254332827.ImportOptionsprops, their dependency-list and reset entries, and therunAutomations/treatAsHistoricalfieldsassembleImportRequestset. The import, dry-run and background-job requests (all built byassembleImportRequest) now carry neither key, which is the server's declared default (readImportControlFlagsin objectstack-ai/objectstack PR #24379: automations run unlessfalse; historical only on a literaltrue). So the default import is unchanged, and no request from the wizard can draw the403security: any user who may import can send runAutomations: false and skip every trigger and metadata-bound hook, so a sales rep bypasses an approval gate and a closed-record freeze through POST /data/:object/import objectstack#24348 introduces.grid.import.optRunAutomations,optTreatHistoricalandoptTreatHistoricalHintin all ten packs and the wizard's English fallback map (check:i18n-dead-keys/-keysgreen). No other objectui caller sends either field:data-objectstack'simportRecordsforwards the request unchanged, and@object-ui/types'ImportRequestOptionsstill declares both, correctly, because the server accepts them from the system principal.no.ImportOptionsis internal toImportWizard.tsx; the exportedImportWizardProps/ImportResultare unchanged. The locale retirement follows the repo's usual dead-key practice. Changeset@object-ui/plugin-grid: patch,@object-ui/i18n: patch.plugin-grid's import families (148 tests) and the i18n parity / dead-key families (301 tests) pass; type-check and the pre-tsc battery exit 0.ImportRequestOptions.runAutomations' JSDoc in@object-ui/typessays "off by default for bulk", while the spec and the server default it totrue. Docs-only drift, and nothing reads it..objectui-shacovers the merge commit.ac0198bare complete: 33 success, 3 skipped (dependabot and the two coverage jobs), none failed;mergeable_state: clean. Path surface (16 files, +136 / −101):packages/plugin-grid/src/**,packages/i18n/src/**(the ten packs and one test comment) and one changeset; no governed path.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-18T20:12ZPR #12989 merged through the merge queue as
cb80001818b07db5640726fa2d3bab08c37b3cd3, which is onmain;Fixes #12985closes this card. Verified by content: all 16 of the PR's files onmainare blob-identical to the accepted headac0198b. The merge commit's message names no model.What landed: the Import Wizard no longer offers "Run automations & triggers" or "Import as historical data", and its requests carry neither opt-out. A default import is unchanged and cannot draw the
403from objectstack-ai/objectstack#24348. The three locale keys only those options read are retired from all ten packs.@object-ui/plugin-grid,@object-ui/i18n:patch.For objectstack (P0 objectstack-ai/objectstack#24348, PR #24379): the console half is on objectui
main. A framework build that ships the403stops offering the options once its.objectui-shacovers the merge commit above. This seat now removespm:dispatched.Generated by Claude Code