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 }}
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
studio: every "New" entry opens on a blank technical form — offer 3–5 presets or templates first, with the full form under Advanced #11861
Filing gate ② — a product decision only the maintainer can make.
Who acts on it: objectui maintainer (Studio owner) — a product decision on the create-entry pattern. ⛔ Not a claim. Filed on the maintainer's word: 「以下「立卡」:每个"新建"入口先给 3–5 个常用预设或模板,再提供"高级"选项;所有地方以标签为主,机器名只作为次要信息。…」.
Maintainer quick-read
Should every Studio New entry open on 3–5 common presets or templates (each producing a working item), with the full technical form under Advanced? Today each entry opens on a blank form in the platform's own vocabulary.
Seen on 2026-10-07
Validations New ▾: "Script — CEL fail condition", "Cross-field — CEL over multiple fields" — no "Required when…", "Unique", "Date after…".
A — one pattern for every create entry (validation, automation, action, hook, field, permission set, package): a shared preset picker as the first step, presets as data so packages can contribute their own, Blank / Advanced last.
B — presets only for validations and automations, the two entries with the most jargon.
C — status quo.
Recommendation
A. The cards above fix individual defaults; this is the cross-cutting pattern they would hang from.
Environment
Source read on objectui main at 82500a7 and objectstack main at 033e5c53. Live observations are from the 2026-10-07 browser QA pass: examples/app-showcase booted with objectstack dev --ui --seed-admin (objectstack 879bd38c), console from objectui 179f6fe9, Chromium 141 at 1440×900, signed in as the seeded platform admin admin@objectos.ai.
Duplicate check
Semantic issue search on objectstack-ai/objectui (open and closed), validation rule presets required when unique date after instead of CEL templates for new items: 2 hits (0 open, 2 closed).
StudioDesignSurface.tsx, interfaceCreate.tsx and their pins;
content/docs/guide/console.md;
the two original changesets, 11861-validation-presets.md and 11823-page-create.md;
the removal of 11937-eager-budget-rollback.md, which this re-land supersedes.
⛔ Not on it:
any change beyond the restored blobs;
objectui#11861's automations and actions entries;
the ceiling;
objectui#11923's Runs on row (PR objectui#11945). Whichever of the two lands second merges main.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: S, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio: the validation presets (objectui#11931) and the Interfaces page-create (objectui#11932) were rolled back by the main-red fix objectui#11956 for 455 B of first-load bytes | ruling 6056819248 step 2's +5,120 B allowance | every Studio author adding a validation rule or a page
Thread-read: 6056180505
Serial constraints cleared: none blocking.
objectui#11949 (this seat, the allowance) must land first. That is an order, not a file conflict.
Open objectui PRs, read 2026-10-08T10:33Z: objectui#11945 (this seat) and objectui#11935 (another seat) touch ObjectValidationsPanel.tsx in other regions.
Why Clause-②: no: it restores two Clause-②: no changes byte for byte.
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-reland-presets",
"pr": "#11967",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "fb0c91d45",
"summary": "Re-land only. git revert 3c888c6, a single-parent squash so a plain revert, landed as 7eeffd2; its tree equals f3a0488's (011fe521e). main was then merged five times: 1c51e97, d73d987, 70e3d77, ccc2824 and 247f503. Draft PR objectui#11967: assignee os-bill, first line 'Part of #11861', objectui#11823 step 3 named with no closing keyword, 'Clause-②: no' at a line start, and the dispatch's held-as-draft line verbatim.",
"files_changed": [
"A .changeset/11823-page-create.md",
"A .changeset/11861-validation-presets.md",
"D .changeset/11937-eager-budget-rollback.md",
"M content/docs/guide/console.md",
"M packages/app-shell/src/views/metadata-admin/i18n.ts",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.newRuleWaits-11820.test.tsx",
"A packages/app-shell/src/views/studio-design/ObjectValidationsPanel.presets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.whenKey.test.tsx",
"A packages/app-shell/src/views/studio-design/StudioDesignSurface.interfacesCreatePage-11823.test.tsx",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
"M packages/app-shell/src/views/studio-design/interfaceCreate.test.tsx",
"M packages/app-shell/src/views/studio-design/interfaceCreate.tsx",
"A packages/app-shell/src/views/studio-design/validationPresets.ts",
"diff vs merge-base 247f503: 15 files, +1398 / -68; exactly the 15 paths 3c888c6 changed",
"blob check at fb0c91d: 12 of 15 equal their f3a0488 blob (the 11937 changeset is absent in both); the 3 that differ are i18n.ts, ObjectValidationsPanel.tsx and the newRuleWaits-11820 pin, all also changed on main after 3c888c6. Positive control: plugin-list ListView.tsx reads DIFF"
],
"conflicts": [
"objectui#11945, merged at 70e3d77: hunk 1 of 1 is the ObjectValidationsPanel.tsx import block. HEAD adds the validationPresets.js import; main adds ScriptValidationSchema and type ScriptValidationParsed from @objectstack/spec/data. Resolved by keeping both lines (spec import, then presets import). No other hunk conflicted.",
"objectui#11945, auto-merged: i18n.ts keeps the engine.studio.rules.event.delete row removed (en and zh) and keeps the 23 re-land keys. The newRuleWaits-11820 pin keeps the 'no Delete box' assertion and the re-land's lines. The Runs on row stays as 11945 made it (runsOnContract, ruleRunsOn, writeRunsOn; no EVENTS left).",
"objectui#11945 proof, for each of the 3 files: the changed lines of the merge vs 70e3d77 are IDENTICAL to the changed lines of 3c888c6..f3a0488; the changed lines of the merge vs the previous head 722a2d8 are IDENTICAL to d73d987..70e3d77. The control (the re-land lines vs the merge-vs-head lines) DIFFERS.",
"objectui#11935 (objectui#11894), merged at 247f503: 2 hunks in ObjectValidationsPanel.tsx. Both sides added the same FieldOpt member, type. (a) interface FieldOpt keeps one type, main's multiple and the re-land's system. main's doc comment gains one sentence naming the presets as the second reader of type; system keeps the re-land's own doc comment. (b) the readFields mapping keeps main's comment, one type line and main's multiple line, then a 2-line objectui#11861 comment and the re-land's system line.",
"objectui#11935, auto-merged: i18n.ts, where main's added rows and the re-land rows are both kept. Proof: the same changed-line comparison is IDENTICAL for i18n.ts in both directions. For ObjectValidationsPanel.tsx the only residual lines are the shared type member and line and the merged comment text."
],
"gates": [
"head for every gate below: fb0c91d",
"type-check (under the lock): turbo build of @object-ui/app-shell^... 'Tasks: 28 successful, 28 total', BUILD-CLOSURE-OK; pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json), TYPECHECK-OK; 'os-verify-lock: VERDICT command-exit 0'",
"vitest named batch 1, repo-root pnpm exec vitest run under the lock: 51 files. They are all 8 ObjectValidationsPanel* suites (including runsOn-11923 and typedEmptyOps-11894), column-identity.ratchet, the main pins ConditionBuilder.typedEmptyOps-11894, PagePreview.pageKind-11933 and SourcePageEditor.pageKind-11933, and importers of interfaceCreate or StudioDesignSurface. Result: 'Test Files 51 passed (51)', 'Tests 297 passed (297)', 'VERDICT command-exit 0'",
"vitest named batch 2: the remaining 47 importers of StudioDesignSurface. Result: 'Test Files 47 passed (47)', 'Tests 334 passed (334)', 'VERDICT command-exit 0'",
"vitest widened set: the 87 other test files that import validationPresets, ObjectValidationsPanel or metadata-admin/i18n. Result: 'Test Files 87 passed (87)', 'Tests 1103 passed (1103)', 'VERDICT command-exit 0'",
"check:i18n-keys exit 0: 'Every in-scope call-site key resolves against the en pack (3304 keys), ...'",
"check:i18n-designer-parity exit 0: 'Every en row has a zh row, and every shared row carries the same placeholders.'",
"check:i18n-drift exit 0: 'No en value changed in this range.' and 'Every changed designer-table en value was followed by its zh row.'",
"check-changeset-presence exit 0: '11 source file(s) of 1 released package(s) changed, and this change declares 2 changeset(s): .changeset/11823-page-create.md, .changeset/11861-validation-presets.md.'",
"check-changeset-fixed exit 0: 'All workspace packages are in the changeset fixed group.'",
"check-changeset-no-major exit 0: 'No changeset declares a major bump.'",
"check:changeset-claims exit 0: 'Every package declared across those 2 body(ies) is either not negated ...' and 'No pending changeset names a file this change touches.'",
"check:pending-changeset-literals exit 0: 'No test source names a pending changeset.'",
"check-changeset-overwrite exit 0 (report-only): 'Compared the working tree with 247f503 (merge-base with origin/main): 2 changeset(s) added, 0 modified, 1 deleted.' It lists 'D .changeset/11937-eager-budget-rollback.md', declared at base '@object-ui/app-shell: patch', 'GONE from the declaration: @object-ui/app-shell'. Reading: the gate's case 3, a changeset superseded by a replacement in the same change; app-shell still bumps through both restored changesets.",
"check:unreferenced-sources exit 0: 'OK Every shipped source file in every covered package is reachable.'",
"eslint, root eslint.config.js with no type-aware linting, on the 11 touched .ts/.tsx files: exit 0, 11 files, 0 errors, 22 warnings. The count is the same as on 7eeffd2, the f3a0488 tree; the repo sets no --max-warnings.",
"check-governed-queue-guard --test over the 15 paths: exit 0, 'NOT GOVERNED - 15 path(s) checked against 5 governed surface(s); none matched.'",
"NOT RUN, per the dispatch: the console build. CI's Bundle Analysis owns it. scripts/check-eager-closure-budget.mjs is not touched.",
"Reference read: the push CI of f3a0488 had 66 success, 6 skipped and 1 failure (Bundle Analysis), 73 of 73 check runs read."
],
"tests": "See gates. Earlier heads were green in the same way: 7eeffd2 (93 files, 579 tests); 96d6793 (180 files, 1682 tests, plus type-check); 722a2d8 (type-check plus 10 core files, 99 tests); 4191475 (type-check, 94 named files with 591 tests, 87 widened files with 1103 tests); 02ebca8 (type-check, 96 files with 600 tests). The widened set on 02ebca8 was not run (queue timeout) and was superseded by the run on fb0c91d.",
"deviations": [
"Dispatch step 2 expected git diff f3a0488 HEAD --stat to show the removal of .changeset/11937-eager-budget-rollback.md. On the revert commit it prints nothing: f3a0488 never had that file, because 3c888c6 added it. The removal shows in git diff 3c888c6 7eeffd29b.",
"main was merged five times, not once. objectui#11945 and objectui#11935 both landed while the gates ran, and both touch restored files. The final merge also changes 3 restored files beyond their f3a0488 blobs: main's content, plus conflict-resolution comment text written to keep both intents (see conflicts). The claim lists the file surface as 'restored to their f3a0488 blobs'.",
"main moved past 247f503 to ccddd11 (objectui#11961, #11962, #11944) before the PR opened. None of those touches the 15 paths, so they are not merged; the merge queue rebuilds on main.",
"The first merge commit was made from refs/remotes/origin/main, which a sibling session's fetch moved between my fetch and my merge. Its message named 60d11cd but it merged 1c51e97. The message was amended before any push, so no force-push. Later merges used private fetch refs, deleted at cleanup.",
"The PR body carries the dispatch's line 'Held as a draft until objectui#11949 ... lands.' verbatim. objectui#11949 was already on main (1c51e97) when the PR opened, so the next line says so.",
"Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session URL plus Co-authored-by: Claude). The harness's model-named Co-Authored-By line was not used, because the repo rule takes precedence.",
"Test scope was widened beyond the dispatch's named set: other importers of validationPresets, ObjectValidationsPanel and metadata-admin/i18n, plus main's pins next to each conflict.",
"The report's summary field is prose, as in the agent template; the dispatch asked for machine-checkable fields only."
],
"mcp_calls": "0",
"api_writes": "3, each one relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11967, read back 6007 of 6007 bytes identical; (2) label-write assign, POST /repos//issues/11967/assignees with os-bill, read back MATCHES; (3) this os-dev-report comment, POST /repos//issues/11861/comments. Also 7 git pushes of the branch, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": []
}
Implemented-by: os-dev subagent of session_01MgfduSkFrfM3eorB3UGfAU, branch claude/issue-11861-reland-presets, head fb0c91d. Report 6060133205.
Reviewed-by: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the branch, not against the report's prose.
What it is: the revert of objectui#11956's rollback 3c888c6. It brings back, unchanged in substance:
objectui#11931: this card's validation presets;
objectui#11932: objectui#11823 step 3, seat domain:ui#3, notified in 6057409114.
It follows ruling 6056819248: step 1 (main green with no raise) and step 2 (the +5,120 B allowance, objectui#11949) both landed first.
Checklist:
PR shape: draft, first line Part of #11861. objectui#11823 is named with no closing keyword. Clause-②: no is at the start of a line. The assignee is os-bill.
One sentence in the body is stale: "That card stays open". objectui#11823 is closed. It has no effect on landing.
Scope: exactly the 15 paths 3c888c6 changed, inside claim 6057967120.
12 of the 15 equal their f3a0488 blobs.
3 differ, because main changed them after the rollback: i18n.ts, ObjectValidationsPanel.tsx and the newRuleWaits-11820 pin.
Conflicts, resolved by keeping both intents:
objectui#11945: the import block keeps both the spec import and the presets import. The Runs on row stays as objectui#11945 made it, and the Delete row stays removed.
objectui#11935 (objectui#11894): FieldOpt keeps one type, main's multiple and the re-land's system.
The dev's changed-line comparison proves each side's hunks survive intact.
Changesets:11861-validation-presets.md and 11823-page-create.md are restored, and 11937-eager-budget-rollback.md is removed as superseded. check-changeset-overwrite reads this as its case 3, intended.
The i18n, changeset and unreferenced-source gates pass.
NOT governed.
First-load bytes: the budget bot reads 3309.2 KB against the 3312.0 KB ceiling, a PASS. This is the +873 B the rollback removed, now spent from the allowance as ruled.
CI:fb0c91d is running. The PR lands through the merge queue when every check is green. This card then returns to the queue for its automations and actions entries.
Re-landed: the validation-rule entry is on main again; automations and actions return to the queue · domain:ui seat 2 · 2026-10-08T13:16Z
Release: session_01MgfduSkFrfM3eorB3UGfAU (domain:ui seat 2, account os-bill) closes claim 6057967120. That claim was the re-land only.
Delivered. PR objectui#11967 (Part of #11861) merged as 7546570, checked on origin/main by content:
validationPresets.ts is back.
The New menu's presets sit beside objectui#11945's Runs on row (runsOnContract).
.changeset/11861-validation-presets.md and .changeset/11823-page-create.md are restored, and the rollback note 11937-eager-budget-rollback.md is gone.
objectui#11932 (objectui#11823 step 3, seat domain:ui#3) came back in the same PR, as noticed in 6057409114. The seat's review is 6060162753.
The first-load cost, +873 B, is spent from objectui#11942's allowance (ruling 6056819248). The budget bot read 3309.2 KB against the 3312.0 KB ceiling.
Remaining, for the next claims. Triage named these in 6051947408, each claimed separately:
Automations: the New entry for automations.
Actions: the New entry in ObjectActionsPanel.tsx. It is no longer serial: objectui#11921 landed as 7129cd5.
Each preset writes an item of a shape the spec already has, pinned through the spec's own schema. Clause-②: no still holds.
Labels: pm:dispatched → pm:queue. The assignee is cleared.
Claim: PM loop round 6
Session: session_01MgfduSkFrfM3eorB3UGfAU
Account: os-bill
Branch: claude/issue-11861-action-presets
Worktree: objectui-issue-11861c
Domain: domain:ui
Seat: domain:ui#2
Scope of this claim: the actions entry only, the third of the entries triage names (6051947408). The PR says Part of #11861. The automations entry stays for a later claim.
File surface (on 0c9fb8e):
packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx: the New entry and addAction (about :154–:215).
New opens on 3–5 presets, each producing a working action of a shape the spec's ActionSchema already accepts.
Today's single New (objectui#11820's "Update fields on this record" skeleton) becomes the first preset, or moves under Advanced. Its written shape stays unchanged.
At most one new module-private module beside it for the preset table, as objectui#11931's validationPresets.ts is.
Only new rows, en and zh, in app-shell's metadata-admin/i18n.ts, under the panel's existing prefix.
The tests beside these, and .changeset/11861-*.md.
⛔ Not on it:
ActionDefaultInspector.tsx (objectui#11921, landed), beyond reading its writers;
presets as data that packages can contribute (a published surface, which triage did not adopt);
any new action type or spec change;
the automations entry;
StudioDesignSurface.tsx;
packages/components/src/ui/** and packages/i18n/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: S, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio actions: New offers one technical skeleton with no common starting points | the spec's existing action shapes already express them | every Studio author adding an action, on the maintainer's word 「每个"新建"入口先给 3–5 个常用预设或模板,再提供"高级"选项」
Thread-read: 6060718304
Serial constraints cleared: none blocking.
objectui#11921 held ActionDefaultInspector.tsx. It landed as 7129cd5.
In-flight claims and open objectui PRs, read 2026-10-08T13:24Z: none touches ObjectActionsPanel.tsx.
First-load bytes: new designer-table rows are eager (objectui#11937's measurement). The budget is 3,391,484 with about 2.8 KB of headroom at objectui#11967. The dev reports the budget bot's reading.
Why Clause-②: no: Studio's create UX for existing action shapes, with presets kept in app-shell code. No export, prop, spec key or packages/i18n key.
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-action-presets",
"pr": "#11977",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "67e28442c",
"summary": "Actions entry only (Part of, not closing). Premise held on main d7e9e9a: New wrote the one objectui#11820 skeleton. New in ObjectActionsPanel now opens a menu of 4 presets from a module-private table, actionPresets.ts. (1) 'Change a picklist field': operation 'update' with params [{field}] on the object's first author picklist; never a system, hidden or read-only one. Written at once and labelled 'Change Status'; disabled with 'Needs a picklist field on this object.' when there is none. (2) to (4) 'Run a flow', 'Open a web page', 'Open a page in a dialog': flow, url and modal. The spec refuses these without a target, so the panel holds them, as Validations holds a new rule (objectui#11820). They are listed as 'Not saved — needs “Flow name”' with the engine.studio.held.line line; the real ActionDefaultInspector's own target input fills them; the first target writes the action; Delete drops it unsent; each stays on the object it was started on. The blank action, the objectui#11820 skeleton byte-for-byte and still named 'New action', is folded under Advanced. No preset writes a script. ActionSchema is not imported at runtime (first-load bytes, objectui#11921 precedent). The two written-out tables are re-derived from ActionSchema in the pin, in both directions: the types needing a target, and the param-field grammar. Budget bot on the PR merge ref: 3311.4 KB against the 3312.0 KB ceiling, PASS.",
"tests": "HEAD 67e2844 (git rev-parse --short HEAD after the last commit), all under the verify lock, 'VERDICT command-exit 0'. Named set, repo-root pnpm exec vitest run --maxWorkers=2, 23 files: 'Test Files 23 passed (23) / Tests 348 passed (348)'. The set is the new pin ObjectActionsPanel.presets-11861.test.tsx (26 tests), the objectui#11820 pin, every test naming ObjectActionsPanel, ActionDefaultInspector or actionPresets, column-identity.ratchet, and the 3 tests reading the designer-table source. Whole studio-design dir: 'Test Files 147 passed (147) / Tests 961 passed (961)'. pnpm --filter @object-ui/app-shell type-check ('tsc --noEmit && tsc -p tsconfig.test.json') exit 0, after turbo build of @object-ui/app-shell^... ('Tasks: 28 successful, 28 total'); tsc -p tsconfig.test.json --listFiles lists both pins and actionPresets.ts. Ablations, 6, through objectstack scripts/ablation-replace.mjs WRAP mode on 67e2844: each anchor x1 → x0, blob changed, restore proven (blob == HEAD, git diff HEAD empty); control 26/26 passed. (A1) hold replaced by 'if (true)' → '6 failed | 20 passed'. (A2) drop !f.system → '2 failed | 24 passed'. (A3) drop !f.readonly → '1 failed | 25 passed'. (A4) drop the PARAM_FIELD check → '5 failed | 21 passed'. (A5) drop the held list's object filter → '1 failed | 25 passed'. (A6) delete the api row of TARGET_INPUT_KEYS → '1 failed | 25 passed'. The same six read identically on ace58cb. An earlier union on ace58cb was also green (23/348, 147/961, type-check).",
"gates": [
"HEAD 67e2844: pnpm check:i18n-keys → exit 0 ('Every in-scope call-site key resolves against the en pack ...')",
"HEAD 67e2844: pnpm check:i18n-designer-parity → exit 0 ('Every en row has a zh row, and every shared row carries the same placeholders.')",
"HEAD 67e2844: pnpm check:i18n-drift → exit 0 ('No en value changed in this range.' / 'No designer-table en value changed in this range.')",
"HEAD 67e2844: pnpm check:i18n-dead-keys → exit 0",
"HEAD 67e2844: node scripts/check-changeset-presence.mjs → exit 0 ('5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11861-action-presets.md.')",
"HEAD 67e2844: node scripts/check-changeset-no-major.mjs → exit 0 ('No changeset declares a major bump.')",
"HEAD 67e2844: pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0')",
"HEAD 67e2844: pnpm check:control-bytes → exit 0 ('check-control-bytes: OK ...')",
"HEAD 67e2844: check:changeset-claims, check:pending-changeset-literals, check:unreferenced-sources ('OK Every shipped source file in every covered package is reachable.'), check:spec-symbols, check:esm-specifiers, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots, check:handler-key-reads, check:metadata-write-doors → all exit 0",
"HEAD 67e2844: pnpm exec eslint --format json on the 5 touched TS files (root eslint.config.js, no type-aware linting) → exit 0, 5 files, 0 errors, 0 warnings. The first commit e3c068f had 2 react-hooks/preserve-manual-memoization warnings that the base file lacked; fixed in ace58cb",
"CI budget bot on PR objectui#11977 (github-actions comment 2026-10-08T14:50:48Z): 'Eager closure (gzip, 337 chunks) 3311.4 KB, budget 3312.0 KB, Status PASS'. main proxy: the same bot read 3311.1 KB on objectui#11975, the last PR landed before this one opened (989b190). Delta about +0.3 KB; headroom left 0.6 KB. Local proxy: gzip -9 of i18n.ts +322 B for the 10 rows",
"NOT MEASURED: check:eager-locale-catalogues, reason: PREREQUISITE NOT MET (apps/console/dist/eager-closure.json absent, no console build here); CI Bundle Analysis owns it",
"NOT MEASURED: real-browser pass, reason: no objectstack backend serving Studio in this container; behaviour pinned in happy-dom with the real registered ActionDefaultInspector",
"CI on 67e2844 at report time: in_progress (Lint, Type Check, Test shards 1-8, Build & E2E, Bundle Analysis among them); not awaited beyond the budget bot, per the agent contract"
],
"files_changed": [
"A .changeset/11861-action-presets.md",
"M packages/app-shell/src/views/metadata-admin/i18n.ts (10 new keys under engine.studio.actions.*, en + zh)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx",
"A packages/app-shell/src/views/studio-design/actionPresets.ts (module-private, not on the package entry)",
"A packages/app-shell/src/views/studio-design/ObjectActionsPanel.presets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.newActionDefault-11820.test.tsx (helper only: click Advanced, then New action; no assertion changed)",
"diff vs d7e9e9a: 6 files, all inside the claim's file list; main's later commits (to 989b190) touch none of the 6 paths"
],
"deviations": [
"PR assignee NOT set. Command 'node /home/user/objectstack/scripts/pm/label-write.mjs --issue 11977 --repo objectstack-ai/objectui --assign os-bill' was refused by the Claude Code auto-mode classifier before it ran ('[External System Writes]'). Not retried by any other route; the seat assigns os-bill.",
"Region: the hold makes ObjectActionsPanel.tsx changes wider than the claim's ':154-:215' (New entry and addAction). The rest, all in the same file, is held-action state, patchSelected, removeAction, the list row marker and the detail pane's held line.",
"Reused keys: the Advanced fold reads the Validations menu's 'engine.studio.rules.advanced' row, and the blank action keeps 'engine.studio.actions.newLabel'. This follows the PM's 1.0 KB note; the first commit had 15 own keys, the final has 10 new keys.",
"H1 adjusted: (a) objectui#11820's skeleton went under Advanced (the claim's second option), because with an empty patch and no params a click is refused; 'Change a picklist field' is the update preset that works on click. (b) 'Open a form' is not offered: the editor's form-target picker lists view metadata names, and their fit to the spec's dotted form-view key is unverified. 'Open a page in a dialog' (modal, page names) is offered instead. (c) ActionSchema.safeParse is measured in the pin, not called at runtime.",
"No focus move into the editor's target input after a held preset: the input belongs to the registered ActionDefaultInspector, so the held line names it instead.",
"Docs-driven rule: content/docs/guide/console.md (Actions row) is outside the claim's file list and was not edited; it does not describe New today. A suggested sentence is in the PR body. packages/app-shell/README.md does not describe this menu.",
"Branch base d7e9e9a, not the dispatch's 0c9fb8e: main moved (objectui#11969) before the worktree was made.",
"Stray file: my shell wrote /tc.pid (6 bytes, one PID) at the filesystem root. The cause is a variable set inside a backgrounded '&&' list, which left it empty in the foreground. The harness safety check refused the rm; a person needs to delete /tc.pid.",
"Attribution: commits end with objectui AGENTS.md's model-free trailer pair; the harness reminder asked for a model-named Co-Authored-By. The PR body ends with the os-dev session-URL footer, not the harness's footer form.",
"Waited in the foreground for CI's budget-bot comment only, because the dispatch and the PM note ask for its reading. All other checks are reported as in_progress.",
"Worktree /home/user/objectui-issue-11861c removed after deleting node_modules (no --force); the private fetch ref refs/os-11861c/main was deleted; the local branch ref remains in the shared .git."
],
"mcp_calls": "0 - no MCP GitHub calls",
"api_writes": "2, each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11977, read back 11215 of 11215 bytes identical; (2) this os-dev-report comment, POST /repos//issues/11861/comments. 0 label-write writes (refused before running, see deviations). Also 4 git pushes of the branch, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · class a candidate without reach: ActionDefaultInspector's Type control writes { type } alone. Switching an existing action to url, flow, modal, form or api composes a draft that ActionSchema refuses at target, and the Data pillar's hold (objectui#11786) does not cover actions. Measured through ActionSchema only, not through a public entry · dedupe words: action type switch target refused · studio action incomplete held · inspector type control target",
"carrier: none (承接者:无) · noted, not filed · read-only inference: the action editor's form-target picker (TARGET_META_TYPE form → view) lists view metadata names. Whether those are the spec's dotted form-view keys is unverified · dedupe words: action form target picker view names · form view key dotted",
"carrier: the seat (docs-driven amendment) · noted, not filed: content/docs/guide/console.md Actions row does not describe New; suggested sentence in the PR body"
]
}
Review: ACCEPT — PR objectui#11977 (the actions entry, Part of) · domain:ui seat 2 · 2026-10-08T14:55Z
Implemented-by: os-dev subagent of session_01MgfduSkFrfM3eorB3UGfAU, branch claude/issue-11861-action-presets, head 67e2844. Report 6062576271.
Reviewed-by: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the branch diff, not against the report's prose.
Checklist:
PR shape: draft, first line Part of #11861, with no closing keyword. Clause-②: no is at the start of a line. The automations entry stays on the card.
Assignee not set: the dev's assignee write was refused by its permission layer. The seat does not perform a write its dev was refused; it is left to the maintainer.
Scope: 6 files, all on claim 6060859232's list:
ObjectActionsPanel.tsx;
the new module-private actionPresets.ts, which is not on the package entry;
10 new en/zh rows in metadata-admin/i18n.ts, under the panel's prefix;
the new pin;
a helper-only change to objectui#11820's pin, which now opens Advanced first, with no assertion changed;
the changeset.
Bounded in-place amendment, recorded: the claim named the New entry and addAction (about :154–:215). The held-action state, the list marker and the detail pane's held line in the same file go wider. That is what the dispatch's own rule requires: a preset that needs a target waits for it, as Validations holds a new rule. It is the same file and the same gate family, and no other claim holds the file.
Direction met (6051947408):New opens on 4 presets, with objectui#11820's skeleton, unchanged and still New action, under Advanced.
Change a picklist field writes operation: 'update' with params: [{ field }] on the object's first author picklist. It never picks a system, hidden or read-only field. It is disabled with a reason when the object has none.
Run a flow, Open a web page and Open a page in a dialog are held, unsent, until the inspector's own target input is filled, because ActionSchema refuses them without a target. Delete drops a held one unsent, and each stays on its own object.
No preset writes a script.
H1 adjustments, accepted:
Open a form is left out. The form-target picker lists view names, and their fit to the spec's dotted form-view key is unverified.
ActionSchema is not imported at runtime, following objectui#11921's precedent. The pin re-derives both written-out tables from it, in both directions.
Evidence:
The named set, 23 files and 348 tests, passes. The whole studio-design directory, 147 files and 961 tests, passes.
The type-check and the i18n checks pass, check:i18n-designer-parity and check:i18n-drift among them.
eslint reports 0 warnings.
Six ablations, one per load-bearing guard, each turn the pin red, and each restore was proven.
Changeset:@object-ui/app-shell: patch.
First-load bytes: the budget bot reads 3311.4 KB against the 3312.0 KB ceiling, a PASS, about +0.3 KB for the 10 rows. ⚠️ About 0.6 KB of objectui#11942's allowance remains after this. The next Studio row waits on objectui#11939's reclaim, per ruling A on objectui#11798.
CI:67e2844 is running. The PR lands through the merge queue when every check is green.
Out-of-scope notes (carrier: none):
ActionDefaultInspector's Type control writes { type } alone. So switching an existing action to url, flow, modal, form or api composes a draft that ActionSchema refuses at target, and no hold covers it. This was measured through the schema only, not at a public door.
content/docs/guide/console.md's Actions row does not describe New today, so nothing there is stale. The PR body carries a suggested sentence.
os-dev-report
{
"issue": 11861,
"status": "done",
"round": "seat fix round on PR objectui#11977 (CI Test shard 8/8 red at 67e2844)",
"branch": "claude/issue-11861-action-presets",
"pr": "#11977",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "f7ee6d938",
"summary": "Rename, not a re-point: actionPresets.ts exported an interface named PresetFieldOpt, which validationPresets.ts already owns on main. The two shapes differ, because the action one also reads readonly. It is now ActionPresetFieldOpt in actionPresets.ts, ObjectActionsPanel.tsx and the pin, with a docblock line saying why. KNOWN_COLLISIONS is not touched. main was not merged; no conflict forced it. PR body left as is.",
"gates": [
"HEAD f7ee6d9, one lock run, 'os-verify-lock: VERDICT command-exit 0'",
"pnpm exec vitest run scripts/tests/one-authority-per-exported-name-6273.test.ts → exit 0, 'Test Files 1 passed (1) / Tests 11 passed (11)'",
"named set, the 23 files of the first report (column-identity.ratchet among them) → exit 0, 'Test Files 23 passed (23) / Tests 348 passed (348)'",
"git grep -l 'one-authority\|ratchet' scripts/tests (45 paths: 44 tests plus the non-test helper scripts/tests/helpers/eslint-config-program.ts) → exit 0, 'Test Files 44 passed (44) / Tests 1763 passed (1763)'",
"turbo build of @object-ui/app-shell^... ('Tasks: 28 successful, 28 total'), then pnpm --filter @object-ui/app-shell type-check ('tsc --noEmit && tsc -p tsconfig.test.json') → exit 0",
"pnpm exec eslint on the 3 touched files → exit 0, 0 errors, 0 warnings; pnpm check:control-bytes → exit 0",
"CI on f7ee6d9: started by the push, not awaited"
],
"files_changed": [
"M packages/app-shell/src/views/studio-design/actionPresets.ts (rename + docblock)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx (rename)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.presets-11861.test.tsx (rename)"
],
"deviations": [
"The worktree was recreated at /home/user/objectui-issue-11861c on the existing branch at 67e2844 (checked against the remote head), after the first round removed it. It was removed again after this round."
],
"mcp_calls": "0",
"api_writes": "1, a fleet-write relay dispatch: this comment, POST /repos//issues/11861/comments. Plus 1 git push (f7ee6d9), which is not a REST write. Still open from round 1: the PR assignee (os-bill) is the seat's, since the classifier refused label-write.",
"open_questions": [],
"out_of_scope_findings": []
}
Partial landing: the actions entry is on main; the automations entry returns to the queue · domain:ui seat 2 · 2026-10-08T15:44Z
Release: session_01MgfduSkFrfM3eorB3UGfAU (domain:ui seat 2, account os-bill) closes claim 6060859232. That claim covered the actions entry only.
Delivered. PR objectui#11977 (Part of #11861) merged as d8be368, checked on origin/main by content:
New in ObjectActionsPanel opens on 4 presets from the module-private actionPresets.ts: Change a picklist field, Run a flow, Open a web page and Open a page in a dialog.
objectui#11820's blank action, unchanged, sits under Advanced.
A preset that needs a target is held, unsent, until the inspector's own target input is filled, because ActionSchema refuses it without one.
The seat's review is 6062623784. One fix round renamed the exported type to ActionPresetFieldOpt, because the one-authority ratchet (one-authority-per-exported-name-6273) refused a second PresetFieldOpt.
First-load bytes: the budget bot read 3311.4 KB against the 3312.0 KB ceiling, +0.3 KB for 10 designer rows. About 0.5 KB of objectui#11942's allowance is left once this seat's other landing PRs are counted.
Remaining, for the next claim: the New entry for automations, the last entry triage named in 6051947408. Its preset rows go into the same eager designer table, so the next claim measures them against the headroom left. If they do not fit, the entry waits for objectui#11939's reclaim, per ruling A on objectui#11798. Clause-②: no still holds.
Labels: pm:dispatched → pm:queue. The assignee is cleared.
Claim: PM loop round 3 (the automations entry only)
Session: session_01CGZy1BGCjdN5cXqL9cnvB8
Account: os-support-ai
Branch: claude/issue-11861-flow-presets
Worktree: objectui-issue-11861
Domain: domain:ui
Seat: domain:ui#3
File surface (line numbers on main5bc55c0c). This is the remainder seat 2 released in 6063611735: the New entry for automations, the last entry triage named in 6051947408. Validations (objectui#11931's validationPresets.ts) and actions (d8be368, actionPresets.ts) have landed.
packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx, only the New automation dialog and its create path:
NewFlowTrigger and newFlowTriggerFields (about :5749–:5775);
the dialog and doCreateFlow (about :5879–:6000).
New opens on 3–5 presets, each producing a working flow of a shape the spec's flow schema already accepts. Today's blank flow becomes one choice, or moves under Advanced, with its written shape unchanged.
At most one new module-private module beside it for the preset table, as validationPresets.ts and actionPresets.ts are. Its exported names must not collide with theirs (the one-authority ratchet one-authority-per-exported-name-6273 refused PresetFieldOpt once).
New en and zh rows in packages/app-shell/src/views/metadata-admin/i18n.ts, under the automations prefix.
The tests beside these, and .changeset/11861-*.md.
⛔ Not on it:
the flow canvas and designer bodies (metadata-admin/previews/FlowCanvas.tsx and the rest);
StudioDesignSurface.tsx's layout regions: the fold decision and the properties aside, which this seat's objectui#11795 holds in flight;
the actions and validations entries (landed);
presets as data that packages can contribute (a published surface, not adopted by triage);
the spec;
packages/components/src/ui/** and packages/i18n/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio Automations: New automation opens on a blank technical form, so an author starts from nothing where a working starter would do | the platform path: the New automation dialog (objectui#11788's trigger choice) and doCreateFlow, with presets in the shape the spec's flow schema accepts | every author creating an automation in Studio
Thread-read: 6063611735
Serial constraints cleared: declared, not blocking.
This seat's objectui#11795, in flight: it edits StudioDesignSurface.tsx's fold decision and properties aside (about :2888–:2906, :3756–:3769) and adds hint rows to metadata-admin/i18n.ts. This claim edits the New automation dialog region (about :5749–:6000) and adds automations rows. The regions differ, and whichever lands second merges main.
Open objectui PRs, read 2026-10-09T00:20Z: objectui#11982 (this seat, in the merge queue) changes one comment in each of those two files. No other open PR touches them.
First-load budget: these rows and the preset table sit in Studio's first-load text table. After objectui#11982's ruled re-pin (6070754914), "a fix that adds first-load bytes within the margin lands without a ruling". This PR lands after objectui#11982.
Why Clause-②: no: the preset table is module-private, the rows go to app-shell's unexported dictionary, and no prop, export, type or language-pack key changes. Any of those is a stop: the dev reports it before opening the PR, and the seat amends this line.
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-flow-presets",
"pr": "#12018",
"session": "session_01CGZy1BGCjdN5cXqL9cnvB8",
"premise_still_valid": true,
"head": "658db0b82",
"summary": "Automations entry, the card's last (PR first line 'Fixes #11861'). Premise held on main 4babf40: New automation asked for a name, then the Start node's whole trigger list with 'Choose later' first (objectui#11788). It now asks 'When it runs' with 4 presets from a module-private table, flowPresets.ts, the first chosen: when a record is created / updated / deleted (record-after-create/update/delete plus objectName) and when a button or another automation starts it (triggerType manual). Each preset is one of the Start node's own trigger options, sent through the unchanged doCreateFlow + withStartTrigger, so a preset flow is byte for byte the flow Advanced writes for that trigger (start + end, type autolaunched, status obsolete). A record preset shows the Start node's own Object field under it; with no object, Create sends nothing and the dialog says 'Choose the object it watches.' (which presets wait is read off the Object field's showWhen, not a second list). Advanced is the fifth choice: the objectui#11788 trigger form, unchanged, writing the blank flow byte for byte. No preset adds a step or writes a script. Zone 2 H2 partly falsified: the installed FlowSchema (spec 17.7.0) accepts every candidate, including a record trigger with no object, a schedule and an api trigger with no secret, so the hold criterion is the runtime (read in objectstack source): an absent object makes the record-change hook global (every object's records); scheduled work is off unless OS_AUTOMATION_SCHEDULED_WORK_ENABLED is switched on, so the PM's schedule candidate is not a working preset on a default deployment; api needs a secret the dialog does not ask for. Those stay under Advanced. H1, H3, H4 confirmed. Bundle Analysis on the PR: eager closure 3160.7 KB (gzip, 289 chunks) against the 3204.6 KB budget, PASS, inside objectui#11982's re-pinned margin.",
"tests": "Union at HEAD 658db0b (git rev-parse --short HEAD after the last commit, a merge of main 70f1b27), every run under os-verify-lock with 'VERDICT command-exit 0': [1] pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (BUILD-CLOSURE-OK) then pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json'; the test project includes src//*.test.tsx by pattern) → TYPECHECK-OK. [2] the whole studio-design directory, 156 files in two runs: 'Test Files 78 passed (78) / Tests 501 passed (501)' and 'Test Files 78 passed (78) / Tests 607 passed (607)'. [3] every other test importing the designer table, reading its source, or naming AutomationsPillar / flowPresets, 95 files in two runs: '48 passed (48) / 527 passed (527)' and '47 passed (47) / 894 passed (894)'. The same union was green on 650b0d0 before the merge (154 files / 1101 tests; 95 files / 1421 tests; type-check). New pin StudioDesignSurface.flowPresets-11861.test.tsx, 8 tests: opens on 3-5 presets with the first checked and the trigger form absent until Advanced; every preset is a Start node option and exactly the record ones are in the Object field's showWhen; per preset (4) the saved flow parses with FlowSchema, resolveFlowTriggerKind is record_change or none, nodes are exactly start and end, and it equals the flow Advanced writes for the same trigger and object; the hold (nothing sent, the line shown, then one save once the object is named); the control (Advanced on 'Choose later' equals a spelled-out literal of the objectui#11788 blank flow). Ablations through objectstack scripts/ablation-replace.mjs WRAP mode on 650b0d0, control 8/8 passed; each anchor x1 → x0, blob changed; each restore proven (blob == HEAD, git diff HEAD empty; after all legs both files BLOB-EQ-HEAD): A1 preset routed through the blank path (doCreateFlow(label, name, trigger) → null): 'Tests 5 failed | 3 passed (8)'; A2 hold removed (flowPresetTrigger returns the trigger without an object): '2 failed | 6 passed'; A3 Advanced routed through the preset path: '5 failed | 3 passed'. Expected direction (red) observed in all three. No dist build involved: the pin imports the surface and flowPresets by relative path.",
"gates": [
"HEAD 658db0b: pnpm check:i18n-keys → exit 0 ('Every in-scope call-site key resolves against the en pack (3307 keys), ...')",
"HEAD 658db0b: pnpm check:i18n-drift → exit 0 ('No en value changed in this range.' / 'No designer-table en value changed in this range.'; designer table: 6 key(s) added, 0 en values changed)",
"HEAD 658db0b: pnpm check:i18n-dead-keys → exit 0 (no new key listed)",
"HEAD 658db0b: pnpm check:i18n-designer-parity → exit 0 ('Every en row has a zh row, and every shared row carries the same placeholders.')",
"HEAD 658db0b: pnpm check:control-bytes → exit 0 ('check-control-bytes: OK (scanned 8141 tracked text file(s); skipped 85 binary).')",
"HEAD 658db0b: pnpm check:test-path-roots → exit 0 ('check-test-path-roots: OK ...')",
"HEAD 658db0b: pnpm check:changeset-claims → exit 0 ('No pending changeset names a file this change touches.')",
"HEAD 658db0b: pnpm check:pending-changeset-literals → exit 0",
"HEAD 658db0b: pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0')",
"HEAD 658db0b: pnpm check:unreferenced-sources → exit 0 ('OK Every shipped source file in every covered package is reachable.')",
"HEAD 658db0b: check:esm-specifiers, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:spec-symbols, check:handler-key-reads, check:metadata-write-doors → all exit 0",
"HEAD 658db0b: node scripts/check-changeset-presence.mjs → exit 0 ('6 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11861-flow-presets.md.'); check-changeset-no-major → exit 0 ('No changeset declares a major bump.'); check-changeset-fixed → exit 0; check-changeset-overwrite → exit 0 ('No pre-existing changeset was modified or deleted.')",
"HEAD 658db0b: node scripts/check-governed-queue-guard.mjs --test on the 7 paths → exit 0 ('NOT GOVERNED - 7 path(s) checked against 5 governed surface(s); none matched.')",
"HEAD 658db0b: pnpm exec eslint --format json on the 6 touched TS files → exit 0, 6 files, 0 errors, 13 warnings, all in StudioDesignSurface.tsx; the same file on main 70f1b27 carries the same 13 (and 13 on base 4babf40). Narrowing evidence: population from eslint.config.js files ['/.{ts,tsx}'], file count from the JSON output (6), and no type-aware linting (no parserOptions / project / projectService in the config), so this diff cannot move a verdict on an untouched file",
"CI Bundle Analysis on PR #12018 (check run 113625766322, conclusion success; budget-bot comment 6072427695): 'Eager closure (gzip, 289 chunks) 3160.7 KB', budget 3204.6 KB, Status PASS. Delta: no direct main reading; landed predecessors read 3160.1 KB (objectui#12015), 3160.3 KB (objectui#11997), 3160.2 KB (objectui#12016) on their own merge refs over the objectui#11982 baseline 3,235,899 B (3160.06 KB); summing their increments puts main at about 3160.5 KB, so this PR adds about +0.2 KB. Local proxy, gzip -9 of i18n.ts: +173 B for the 12 rows. Headroom left 43.9 KB of the 45,568 B margin ruled in 6070754914: within the margin, lands without a ruling",
"NOT MEASURED: check:readme-exports, reason: prerequisite not met (app-shell dist/index.d.ts not built: 'run pnpm build first'); no export, entry or README changed",
"NOT MEASURED: real-browser pass, reason: no objectstack backend serving Studio in this container; behaviour pinned in happy-dom through the real AutomationsPillar and CreateItemDialog",
"CI on 658db0b at report time: 26 success, 3 skipped, 13 in_progress (Test shards 1-8, Type Check, Lint, Build & E2E among them), 0 failed; not awaited beyond Bundle Analysis, per the agent contract"
],
"files_changed": [
"A .changeset/11861-flow-presets.md (@object-ui/app-shell: patch)",
"M packages/app-shell/src/views/metadata-admin/i18n.ts (6 new keys under engine.studio.auto., en + zh; Advanced reuses engine.studio.rules.advanced)",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the New automation dialog's extra and onSubmit, two state values, the New button's reset, one import)",
"A packages/app-shell/src/views/studio-design/flowPresets.ts (module-private, not on the package entry; exports FlowPreset, FLOW_PRESETS, flowPresetTrigger)",
"A packages/app-shell/src/views/studio-design/StudioDesignSurface.flowPresets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.newFlowTrigger-11788.test.tsx (helper only: choose Advanced before reading the trigger select; no assertion changed)",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.flowStatusTruth-11779.test.tsx (helper only: choose Advanced before Create; no assertion changed)",
"diff vs main 70f1b27: exactly these 7 paths, all inside claim 6071664220's file surface"
],
"deviations": [
"The hold is a refusal inside onSubmit shown through CreateItemDialog's existing error slot, not a disabled Create button: CreateItemDialog.tsx is not on the claim's file surface, so no prop was added to it.",
"Advanced is the dialog's fifth radio choice, which reveals the objectui#11788 form under it, rather than a chevron fold as in the Validations and Actions menus: in a dialog with one Create button a fold would need a second selection state. The word reuses engine.studio.rules.advanced, as the Actions menu does.",
"Zone 2 H2: the PM's schedule and screen candidates are not offered (scheduled work is off by default; a screen flow needs a step only the author can name). The four shipped presets are three record triggers and manual.",
"The brief describes objectui#11982 as in the merge queue; it had already landed as 4babf40, which is this branch's base. main was merged once more (70f1b27, objectui#11795, auto-merged, no conflict); main has since moved to 164f02c (objectui#11997, #12016), touching none of the 7 paths, so not merged.",
"The merge commit's message was amended before its first push to carry the trailer pair; no force-push.",
"Ablations ran on 650b0d0, before the merge; the merge changed none of the dialog lines. The full union was re-run on 658db0b.",
"Attribution: commits end with objectui AGENTS.md's model-free trailer pair (the harness reminder asked for a model-named Co-Authored-By line). The PR body ends with the os-dev session-URL footer, not the harness's footer form.",
"Waited in the foreground for the Bundle Analysis job only, because the dispatch asks for its reading. All other checks are reported as in_progress.",
"Docs-driven rule: neither content/docs/guide/console.md nor packages/app-shell/README.md describes the New automation dialog, so nothing there is stale; both are outside the claim and not edited. A suggested console-guide sentence is in the PR body.",
"Worktree /home/user/objectui-issue-11861 removed after deleting node_modules (no --force); the private fetch ref refs/os-11861-flow/main was deleted; the local branch ref remains in the shared .git."
],
"mcp_calls": "0 - no MCP GitHub calls",
"api_writes": "3, each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #12018, read back 8797 of 8797 bytes identical; (2) label-write assign, POST /repos//issues/12018/assignees with os-support-ai, read back MATCHES (labels untouched: tests, package: app-shell from labeler.yml); (3) this os-dev-report comment, POST /repos//issues/11861/comments. Also 3 git pushes of the branch (empty probe, 650b0d0, 658db0b), which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · docs drift, read-only: packages/app-shell/README.md's flow designer section says a start node 'deliberately stores no triggerType' and names its entry condition 'criteria'; the Start node's trigger select writes config.triggerType (objectui#11788 relies on it) and the inspector writes condition · dedupe words: app-shell README start node triggerType · flow designer start node criteria condition docs",
"carrier: none (承接者:无) · noted, not filed · boundary, not class c: the Advanced form (kept byte for byte as ordered) still saves a record trigger with no object, which the record-change trigger registers as a global hook (every object's records); FlowSchema accepts it. Read in source, not measured at a public door · dedupe words: record trigger no object global hook · flow start objectName missing record-change"
]
}
ACCEPT — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T01:48Z. PR objectui#12018 (the automations entry, the card's last), head 658db0b8.
PR shape:
Draft against main, with main70f1b275 (objectui#11795) merged in. git merge-tree against main1ad0c082 is clean.
First line Fixes #11861. Clause-②: no at line start.
The commits carry only the model-free trailer pair. Assignee os-support-ai.
Scope: 7 files, +529/−51, on the claim (6071664220). No governed path.
StudioDesignSurface.tsx, only inside AutomationsPillar: the New automation dialog, its two state values and the New button's reset, plus one import.
The new module-private flowPresets.ts.
6 new en and zh rows in metadata-admin/i18n.ts.
One new pin, and helper-only edits to two existing pins (choose Advanced first), with no assertion changed.
A patch changeset.
objectui#11795's layout regions are untouched.
Diff read (the seat's own):
New automation opens on 4 presets with the first one chosen: a record is created, updated or deleted, or a button or another automation starts it (manual).
Each preset is one of the Start node's own trigger choices, written where that field writes it, through the unchanged doCreateFlow and withStartTrigger. A preset flow is therefore byte for byte the flow Advanced writes for that trigger.
Record presets wait for the object: nothing is sent, and the dialog says so. Which presets wait is read off the Object field's showWhen, not kept as a second list.
Advanced is the objectui#11788 form, unchanged. No preset adds a step or writes a script.
Triage's direction honoured (6051947408): 3–5 working presets, the full form under Advanced. This was the last entry the card named, after validations (objectui#11931) and actions (d8be368).
Hypothesis falsified, accepted:
The installed FlowSchema accepts every candidate, so the hold criterion is the runtime, read in objectstack source.
A record trigger with no object becomes a global hook.
Scheduled work is off on a default deployment.
An api flow needs a secret the dialog does not ask for.
So the schedule, screen and api triggers stay under Advanced.
Pins and reverse verification (dev report 6072457933): 8 new pins. Each preset parses with FlowSchema, holds start and end only, and equals the Advanced flow for its trigger. The hold is pinned, and the Advanced control equals the objectui#11788 blank flow literally. Three ablations each went red in the expected direction, and each restore was proven (blob equals HEAD).
Tests: the whole studio-design directory (156 files) and every other importer of the designer table (95 files) passed on this head. The app-shell type-check exits 0.
Gates: CI on 658db0b8: 43 runs: 40 success, 3 skipped (Test (coverage), its shard template, dependabot), 0 failure. Bundle Analysis is success: 3160.7 KB against 3204.6 KB, about +0.2 KB, within the margin ruled in 6070754914. Mergeable state clean.
Contract review: not required (Clause-②: no).
Findings, recorded in the PR's Acceptance notes and not filed:
For triage:Advanced, kept byte for byte as ordered, still saves a record trigger with no object. The record-change trigger registers that as a global hook, run for every object's records, and FlowSchema accepts it. This was read in objectstack source, not measured at a public door, and it predates this change (objectui#11788).
packages/app-shell/README.md's flow designer section says the Start node "deliberately stores no triggerType" and names criteria. Both are stale in source; it is prose, for the next PR that touches the README.
Landing: ready + auto-merge through the queue, now. Its merge closes objectui#11861.
Landed — domain:ui seat 3, session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T02:08Z. PR objectui#12018 (the automations entry, the card's last) merged through the queue as f0268ad at 2026-10-09T02:07Z.
The merge:
One parent, 1ad0c082, an ancestor of origin/main.
The landed tree equals git merge-tree of that parent and the accepted head 658db0b8 (tree a39064d2 on both).
7 files, +529/−51.
Content check, 1ad0c082 → f0268ad, under packages/:
FLOW_PRESETS: 0 → 14.
flowPresetTrigger: 0 → 6.
engine.studio.auto.preset.needsObject: 0 → 6.
Control: packages/app-shell/src/views/studio-design/actionPresets.ts, the sibling entry's table, is byte-identical on both sides.
Closures: the PR's only closing keyword was Fixes #11861, and this merge closed objectui#11861 as completed at 02:07Z. pm:dispatched is removed in this pass.
The card is complete. All three entries triage named now open on presets:
validations (objectui#11931, seat 2);
actions (d8be368, seat 2);
automations (this one).
For triage, from the ACCEPT 6072591450:Advanced still saves a record trigger with no object, which the runtime registers as a global hook. This was read in source and not measured, and it predates this change.
Activity
objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 5 (re-land after the main-red rollback)
Session:
session_01MgfduSkFrfM3eorB3UGfAUAccount:
os-billBranch:
claude/issue-11861-reland-presetsWorktree:
objectui-issue-11861-relandDomain:
domain:uiSeat:
domain:ui#2Scope of this claim: re-land only. One PR that reverts objectui#11956's rollback commit
3c888c6, bringing back unchanged:domain:ui#3, the Studio Interfaces page-create. Notice6057409114was given on that card.Ruling
6056819248, steps 1 and 2:maingreen with no ceiling raise (step 1);⛔ It stays a draft until objectui#11949 has landed.
File surface: exactly the files objectui#11956 changed, restored to their
f3a0488blobs:ObjectValidationsPanel.tsx,validationPresets.tsand their four pins;metadata-admin/i18n.ts, with the rows objectui#11931 and feat(app-shell): Studio Interfaces pillar creates a page and opens it on source plus live preview (objectui#11823 step 3) #11932 added;StudioDesignSurface.tsx,interfaceCreate.tsxand their pins;content/docs/guide/console.md;11861-validation-presets.mdand11823-page-create.md;11937-eager-budget-rollback.md, which this re-land supersedes.⛔ Not on it:
main.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
S,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio: the validation presets (objectui#11931) and the Interfaces page-create (objectui#11932) were rolled back by the main-red fix objectui#11956 for 455 B of first-load bytes | ruling 6056819248 step 2's +5,120 B allowance | every Studio author adding a validation rule or a pageThread-read: 6056180505
Serial constraints cleared:
noneblocking.ObjectValidationsPanel.tsxin other regions.Why
Clause-②: no: it restores twoClause-②: nochanges byte for byte.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-reland-presets",
"pr": "#11967",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "fb0c91d45",
"summary": "Re-land only. git revert 3c888c6, a single-parent squash so a plain revert, landed as 7eeffd2; its tree equals f3a0488's (011fe521e). main was then merged five times: 1c51e97, d73d987, 70e3d77, ccc2824 and 247f503. Draft PR objectui#11967: assignee os-bill, first line 'Part of #11861', objectui#11823 step 3 named with no closing keyword, 'Clause-②: no' at a line start, and the dispatch's held-as-draft line verbatim.",
"files_changed": [
"A .changeset/11823-page-create.md",
"A .changeset/11861-validation-presets.md",
"D .changeset/11937-eager-budget-rollback.md",
"M content/docs/guide/console.md",
"M packages/app-shell/src/views/metadata-admin/i18n.ts",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.newRuleWaits-11820.test.tsx",
"A packages/app-shell/src/views/studio-design/ObjectValidationsPanel.presets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.tsx",
"M packages/app-shell/src/views/studio-design/ObjectValidationsPanel.whenKey.test.tsx",
"A packages/app-shell/src/views/studio-design/StudioDesignSurface.interfacesCreatePage-11823.test.tsx",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
"M packages/app-shell/src/views/studio-design/interfaceCreate.test.tsx",
"M packages/app-shell/src/views/studio-design/interfaceCreate.tsx",
"A packages/app-shell/src/views/studio-design/validationPresets.ts",
"diff vs merge-base 247f503: 15 files, +1398 / -68; exactly the 15 paths 3c888c6 changed",
"blob check at fb0c91d: 12 of 15 equal their f3a0488 blob (the 11937 changeset is absent in both); the 3 that differ are i18n.ts, ObjectValidationsPanel.tsx and the newRuleWaits-11820 pin, all also changed on main after 3c888c6. Positive control: plugin-list ListView.tsx reads DIFF"
],
"conflicts": [
"objectui#11945, merged at 70e3d77: hunk 1 of 1 is the ObjectValidationsPanel.tsx import block. HEAD adds the validationPresets.js import; main adds ScriptValidationSchema and type ScriptValidationParsed from @objectstack/spec/data. Resolved by keeping both lines (spec import, then presets import). No other hunk conflicted.",
"objectui#11945, auto-merged: i18n.ts keeps the engine.studio.rules.event.delete row removed (en and zh) and keeps the 23 re-land keys. The newRuleWaits-11820 pin keeps the 'no Delete box' assertion and the re-land's lines. The Runs on row stays as 11945 made it (runsOnContract, ruleRunsOn, writeRunsOn; no EVENTS left).",
"objectui#11945 proof, for each of the 3 files: the changed lines of the merge vs 70e3d77 are IDENTICAL to the changed lines of 3c888c6..f3a0488; the changed lines of the merge vs the previous head 722a2d8 are IDENTICAL to d73d987..70e3d77. The control (the re-land lines vs the merge-vs-head lines) DIFFERS.",
"objectui#11935 (objectui#11894), merged at 247f503: 2 hunks in ObjectValidationsPanel.tsx. Both sides added the same FieldOpt member, type. (a) interface FieldOpt keeps one type, main's multiple and the re-land's system. main's doc comment gains one sentence naming the presets as the second reader of type; system keeps the re-land's own doc comment. (b) the readFields mapping keeps main's comment, one type line and main's multiple line, then a 2-line objectui#11861 comment and the re-land's system line.",
"objectui#11935, auto-merged: i18n.ts, where main's added rows and the re-land rows are both kept. Proof: the same changed-line comparison is IDENTICAL for i18n.ts in both directions. For ObjectValidationsPanel.tsx the only residual lines are the shared type member and line and the merged comment text."
],
"gates": [
"head for every gate below: fb0c91d",
"type-check (under the lock): turbo build of @object-ui/app-shell^... 'Tasks: 28 successful, 28 total', BUILD-CLOSURE-OK; pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json), TYPECHECK-OK; 'os-verify-lock: VERDICT command-exit 0'",
"vitest named batch 1, repo-root pnpm exec vitest run under the lock: 51 files. They are all 8 ObjectValidationsPanel* suites (including runsOn-11923 and typedEmptyOps-11894), column-identity.ratchet, the main pins ConditionBuilder.typedEmptyOps-11894, PagePreview.pageKind-11933 and SourcePageEditor.pageKind-11933, and importers of interfaceCreate or StudioDesignSurface. Result: 'Test Files 51 passed (51)', 'Tests 297 passed (297)', 'VERDICT command-exit 0'",
"vitest named batch 2: the remaining 47 importers of StudioDesignSurface. Result: 'Test Files 47 passed (47)', 'Tests 334 passed (334)', 'VERDICT command-exit 0'",
"vitest widened set: the 87 other test files that import validationPresets, ObjectValidationsPanel or metadata-admin/i18n. Result: 'Test Files 87 passed (87)', 'Tests 1103 passed (1103)', 'VERDICT command-exit 0'",
"check:i18n-keys exit 0: 'Every in-scope call-site key resolves against the en pack (3304 keys), ...'",
"check:i18n-designer-parity exit 0: 'Every en row has a zh row, and every shared row carries the same placeholders.'",
"check:i18n-drift exit 0: 'No en value changed in this range.' and 'Every changed designer-table en value was followed by its zh row.'",
"check-changeset-presence exit 0: '11 source file(s) of 1 released package(s) changed, and this change declares 2 changeset(s): .changeset/11823-page-create.md, .changeset/11861-validation-presets.md.'",
"check-changeset-fixed exit 0: 'All workspace packages are in the changeset fixed group.'",
"check-changeset-no-major exit 0: 'No changeset declares a
majorbump.'","check:changeset-claims exit 0: 'Every package declared across those 2 body(ies) is either not negated ...' and 'No pending changeset names a file this change touches.'",
"check:pending-changeset-literals exit 0: 'No test source names a pending changeset.'",
"check-changeset-overwrite exit 0 (report-only): 'Compared the working tree with 247f503 (merge-base with origin/main): 2 changeset(s) added, 0 modified, 1 deleted.' It lists 'D .changeset/11937-eager-budget-rollback.md', declared at base '@object-ui/app-shell: patch', 'GONE from the declaration: @object-ui/app-shell'. Reading: the gate's case 3, a changeset superseded by a replacement in the same change; app-shell still bumps through both restored changesets.",
"check:unreferenced-sources exit 0: 'OK Every shipped source file in every covered package is reachable.'",
"eslint, root eslint.config.js with no type-aware linting, on the 11 touched .ts/.tsx files: exit 0, 11 files, 0 errors, 22 warnings. The count is the same as on 7eeffd2, the f3a0488 tree; the repo sets no --max-warnings.",
"check-governed-queue-guard --test over the 15 paths: exit 0, 'NOT GOVERNED - 15 path(s) checked against 5 governed surface(s); none matched.'",
"NOT RUN, per the dispatch: the console build. CI's Bundle Analysis owns it. scripts/check-eager-closure-budget.mjs is not touched.",
"Reference read: the push CI of f3a0488 had 66 success, 6 skipped and 1 failure (Bundle Analysis), 73 of 73 check runs read."
],
"tests": "See gates. Earlier heads were green in the same way: 7eeffd2 (93 files, 579 tests); 96d6793 (180 files, 1682 tests, plus type-check); 722a2d8 (type-check plus 10 core files, 99 tests); 4191475 (type-check, 94 named files with 591 tests, 87 widened files with 1103 tests); 02ebca8 (type-check, 96 files with 600 tests). The widened set on 02ebca8 was not run (queue timeout) and was superseded by the run on fb0c91d.",
"deviations": [
"Dispatch step 2 expected
git diff f3a0488 HEAD --statto show the removal of .changeset/11937-eager-budget-rollback.md. On the revert commit it prints nothing: f3a0488 never had that file, because 3c888c6 added it. The removal shows ingit diff 3c888c6 7eeffd29b.","main was merged five times, not once. objectui#11945 and objectui#11935 both landed while the gates ran, and both touch restored files. The final merge also changes 3 restored files beyond their f3a0488 blobs: main's content, plus conflict-resolution comment text written to keep both intents (see conflicts). The claim lists the file surface as 'restored to their f3a0488 blobs'.",
"main moved past 247f503 to ccddd11 (objectui#11961, #11962, #11944) before the PR opened. None of those touches the 15 paths, so they are not merged; the merge queue rebuilds on main.",
"The first merge commit was made from refs/remotes/origin/main, which a sibling session's fetch moved between my fetch and my merge. Its message named 60d11cd but it merged 1c51e97. The message was amended before any push, so no force-push. Later merges used private fetch refs, deleted at cleanup.",
"The PR body carries the dispatch's line 'Held as a draft until objectui#11949 ... lands.' verbatim. objectui#11949 was already on main (1c51e97) when the PR opened, so the next line says so.",
"Commit trailers use objectui AGENTS.md's model-free pair (Claude-Session URL plus Co-authored-by: Claude). The harness's model-named Co-Authored-By line was not used, because the repo rule takes precedence.",
"Test scope was widened beyond the dispatch's named set: other importers of validationPresets, ObjectValidationsPanel and metadata-admin/i18n, plus main's pins next to each conflict.",
"The report's summary field is prose, as in the agent template; the dispatch asked for machine-checkable fields only."
],
"mcp_calls": "0",
"api_writes": "3, each one relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11967, read back 6007 of 6007 bytes identical; (2) label-write assign, POST /repos//issues/11967/assignees with os-bill, read back MATCHES; (3) this os-dev-report comment, POST /repos//issues/11861/comments. Also 7 git pushes of the branch, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT, re-land — PR objectui#11967 ·
domain:uiseat 2 · 2026-10-08T12:45ZImplemented-by:
os-devsubagent ofsession_01MgfduSkFrfM3eorB3UGfAU, branchclaude/issue-11861-reland-presets, headfb0c91d. Report6060133205.Reviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the branch, not against the report's prose.What it is: the revert of objectui#11956's rollback
3c888c6. It brings back, unchanged in substance:domain:ui#3, notified in6057409114.It follows ruling
6056819248: step 1 (maingreen with no raise) and step 2 (the +5,120 B allowance, objectui#11949) both landed first.Checklist:
Part of #11861. objectui#11823 is named with no closing keyword.Clause-②: nois at the start of a line. The assignee isos-bill.3c888c6changed, inside claim6057967120.f3a0488blobs.mainchanged them after the rollback:i18n.ts,ObjectValidationsPanel.tsxand thenewRuleWaits-11820pin.FieldOptkeeps onetype,main'smultipleand the re-land'ssystem.11861-validation-presets.mdand11823-page-create.mdare restored, and11937-eager-budget-rollback.mdis removed as superseded.check-changeset-overwritereads this as its case 3, intended.ObjectValidationsPanel*suite including objectui#11945's and studio(condition builder): "is false / empty" compiles to!fieldand "is true / set" to a bare field — CEL refuses both on a non-boolean field, so a published validation rule blocks every matching write #11894's pins, every importer ofStudioDesignSurface,interfaceCreate,validationPresetsand the designer table, and the column-identity ratchet.fb0c91dis running. The PR lands through the merge queue when every check is green. This card then returns to the queue for its automations and actions entries.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Re-landed: the validation-rule entry is on
mainagain; automations and actions return to the queue ·domain:uiseat 2 · 2026-10-08T13:16ZRelease:
session_01MgfduSkFrfM3eorB3UGfAU(domain:uiseat 2, accountos-bill) closes claim6057967120. That claim was the re-land only.Delivered. PR objectui#11967 (
Part of #11861) merged as7546570, checked onorigin/mainby content:validationPresets.tsis back.runsOnContract)..changeset/11861-validation-presets.mdand.changeset/11823-page-create.mdare restored, and the rollback note11937-eager-budget-rollback.mdis gone.objectui#11932 (objectui#11823 step 3, seat
domain:ui#3) came back in the same PR, as noticed in6057409114. The seat's review is6060162753.The first-load cost, +873 B, is spent from objectui#11942's allowance (ruling
6056819248). The budget bot read 3309.2 KB against the 3312.0 KB ceiling.Remaining, for the next claims. Triage named these in
6051947408, each claimed separately:ObjectActionsPanel.tsx. It is no longer serial: objectui#11921 landed as7129cd5.Each preset writes an item of a shape the spec already has, pinned through the spec's own schema.
Clause-②: nostill holds.Labels:
pm:dispatched→pm:queue. The assignee is cleared.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 6
Session:
session_01MgfduSkFrfM3eorB3UGfAUAccount:
os-billBranch:
claude/issue-11861-action-presetsWorktree:
objectui-issue-11861cDomain:
domain:uiSeat:
domain:ui#2Scope of this claim: the actions entry only, the third of the entries triage names (
6051947408). The PR saysPart of #11861. The automations entry stays for a later claim.File surface (on
0c9fb8e):packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx: the New entry andaddAction(about:154–:215).ActionSchemaalready accepts.validationPresets.tsis.metadata-admin/i18n.ts, under the panel's existing prefix..changeset/11861-*.md.⛔ Not on it:
ActionDefaultInspector.tsx(objectui#11921, landed), beyond reading its writers;StudioDesignSurface.tsx;packages/components/src/ui/**andpackages/i18n/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
S,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio actions: New offers one technical skeleton with no common starting points | the spec's existing action shapes already express them | every Studio author adding an action, on the maintainer's word 「每个"新建"入口先给 3–5 个常用预设或模板,再提供"高级"选项」Thread-read: 6060718304
Serial constraints cleared:
noneblocking.ActionDefaultInspector.tsx. It landed as7129cd5.ObjectActionsPanel.tsx.Why
Clause-②: no: Studio's create UX for existing action shapes, with presets kept in app-shell code. No export, prop, spec key orpackages/i18nkey.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-action-presets",
"pr": "#11977",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "67e28442c",
"summary": "Actions entry only (Part of, not closing). Premise held on main d7e9e9a: New wrote the one objectui#11820 skeleton. New in ObjectActionsPanel now opens a menu of 4 presets from a module-private table, actionPresets.ts. (1) 'Change a picklist field': operation 'update' with params [{field}] on the object's first author picklist; never a system, hidden or read-only one. Written at once and labelled 'Change Status'; disabled with 'Needs a picklist field on this object.' when there is none. (2) to (4) 'Run a flow', 'Open a web page', 'Open a page in a dialog': flow, url and modal. The spec refuses these without a target, so the panel holds them, as Validations holds a new rule (objectui#11820). They are listed as 'Not saved — needs “Flow name”' with the engine.studio.held.line line; the real ActionDefaultInspector's own target input fills them; the first target writes the action; Delete drops it unsent; each stays on the object it was started on. The blank action, the objectui#11820 skeleton byte-for-byte and still named 'New action', is folded under Advanced. No preset writes a script. ActionSchema is not imported at runtime (first-load bytes, objectui#11921 precedent). The two written-out tables are re-derived from ActionSchema in the pin, in both directions: the types needing a target, and the param-field grammar. Budget bot on the PR merge ref: 3311.4 KB against the 3312.0 KB ceiling, PASS.",
"tests": "HEAD 67e2844 (git rev-parse --short HEAD after the last commit), all under the verify lock, 'VERDICT command-exit 0'. Named set, repo-root pnpm exec vitest run --maxWorkers=2, 23 files: 'Test Files 23 passed (23) / Tests 348 passed (348)'. The set is the new pin ObjectActionsPanel.presets-11861.test.tsx (26 tests), the objectui#11820 pin, every test naming ObjectActionsPanel, ActionDefaultInspector or actionPresets, column-identity.ratchet, and the 3 tests reading the designer-table source. Whole studio-design dir: 'Test Files 147 passed (147) / Tests 961 passed (961)'. pnpm --filter @object-ui/app-shell type-check ('tsc --noEmit && tsc -p tsconfig.test.json') exit 0, after turbo build of @object-ui/app-shell^... ('Tasks: 28 successful, 28 total'); tsc -p tsconfig.test.json --listFiles lists both pins and actionPresets.ts. Ablations, 6, through objectstack scripts/ablation-replace.mjs WRAP mode on 67e2844: each anchor x1 → x0, blob changed, restore proven (blob == HEAD, git diff HEAD empty); control 26/26 passed. (A1) hold replaced by 'if (true)' → '6 failed | 20 passed'. (A2) drop !f.system → '2 failed | 24 passed'. (A3) drop !f.readonly → '1 failed | 25 passed'. (A4) drop the PARAM_FIELD check → '5 failed | 21 passed'. (A5) drop the held list's object filter → '1 failed | 25 passed'. (A6) delete the api row of TARGET_INPUT_KEYS → '1 failed | 25 passed'. The same six read identically on ace58cb. An earlier union on ace58cb was also green (23/348, 147/961, type-check).",
"gates": [
"HEAD 67e2844: pnpm check:i18n-keys → exit 0 ('Every in-scope call-site key resolves against the en pack ...')",
"HEAD 67e2844: pnpm check:i18n-designer-parity → exit 0 ('Every en row has a zh row, and every shared row carries the same placeholders.')",
"HEAD 67e2844: pnpm check:i18n-drift → exit 0 ('No en value changed in this range.' / 'No designer-table en value changed in this range.')",
"HEAD 67e2844: pnpm check:i18n-dead-keys → exit 0",
"HEAD 67e2844: node scripts/check-changeset-presence.mjs → exit 0 ('5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11861-action-presets.md.')",
"HEAD 67e2844: node scripts/check-changeset-no-major.mjs → exit 0 ('No changeset declares a
majorbump.')","HEAD 67e2844: pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0')",
"HEAD 67e2844: pnpm check:control-bytes → exit 0 ('check-control-bytes: OK ...')",
"HEAD 67e2844: check:changeset-claims, check:pending-changeset-literals, check:unreferenced-sources ('OK Every shipped source file in every covered package is reachable.'), check:spec-symbols, check:esm-specifiers, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots, check:handler-key-reads, check:metadata-write-doors → all exit 0",
"HEAD 67e2844: pnpm exec eslint --format json on the 5 touched TS files (root eslint.config.js, no type-aware linting) → exit 0, 5 files, 0 errors, 0 warnings. The first commit e3c068f had 2 react-hooks/preserve-manual-memoization warnings that the base file lacked; fixed in ace58cb",
"CI budget bot on PR objectui#11977 (github-actions comment 2026-10-08T14:50:48Z): 'Eager closure (gzip, 337 chunks) 3311.4 KB, budget 3312.0 KB, Status PASS'. main proxy: the same bot read 3311.1 KB on objectui#11975, the last PR landed before this one opened (989b190). Delta about +0.3 KB; headroom left 0.6 KB. Local proxy: gzip -9 of i18n.ts +322 B for the 10 rows",
"NOT MEASURED: check:eager-locale-catalogues, reason: PREREQUISITE NOT MET (apps/console/dist/eager-closure.json absent, no console build here); CI Bundle Analysis owns it",
"NOT MEASURED: real-browser pass, reason: no objectstack backend serving Studio in this container; behaviour pinned in happy-dom with the real registered ActionDefaultInspector",
"CI on 67e2844 at report time: in_progress (Lint, Type Check, Test shards 1-8, Build & E2E, Bundle Analysis among them); not awaited beyond the budget bot, per the agent contract"
],
"files_changed": [
"A .changeset/11861-action-presets.md",
"M packages/app-shell/src/views/metadata-admin/i18n.ts (10 new keys under engine.studio.actions.*, en + zh)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx",
"A packages/app-shell/src/views/studio-design/actionPresets.ts (module-private, not on the package entry)",
"A packages/app-shell/src/views/studio-design/ObjectActionsPanel.presets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.newActionDefault-11820.test.tsx (helper only: click Advanced, then New action; no assertion changed)",
"diff vs d7e9e9a: 6 files, all inside the claim's file list; main's later commits (to 989b190) touch none of the 6 paths"
],
"deviations": [
"PR assignee NOT set. Command 'node /home/user/objectstack/scripts/pm/label-write.mjs --issue 11977 --repo objectstack-ai/objectui --assign os-bill' was refused by the Claude Code auto-mode classifier before it ran ('[External System Writes]'). Not retried by any other route; the seat assigns os-bill.",
"Region: the hold makes ObjectActionsPanel.tsx changes wider than the claim's ':154-:215' (New entry and addAction). The rest, all in the same file, is held-action state, patchSelected, removeAction, the list row marker and the detail pane's held line.",
"Reused keys: the Advanced fold reads the Validations menu's 'engine.studio.rules.advanced' row, and the blank action keeps 'engine.studio.actions.newLabel'. This follows the PM's 1.0 KB note; the first commit had 15 own keys, the final has 10 new keys.",
"H1 adjusted: (a) objectui#11820's skeleton went under Advanced (the claim's second option), because with an empty patch and no params a click is refused; 'Change a picklist field' is the update preset that works on click. (b) 'Open a form' is not offered: the editor's form-target picker lists view metadata names, and their fit to the spec's dotted form-view key is unverified. 'Open a page in a dialog' (modal, page names) is offered instead. (c) ActionSchema.safeParse is measured in the pin, not called at runtime.",
"No focus move into the editor's target input after a held preset: the input belongs to the registered ActionDefaultInspector, so the held line names it instead.",
"Docs-driven rule: content/docs/guide/console.md (Actions row) is outside the claim's file list and was not edited; it does not describe New today. A suggested sentence is in the PR body. packages/app-shell/README.md does not describe this menu.",
"Branch base d7e9e9a, not the dispatch's 0c9fb8e: main moved (objectui#11969) before the worktree was made.",
"Stray file: my shell wrote /tc.pid (6 bytes, one PID) at the filesystem root. The cause is a variable set inside a backgrounded '&&' list, which left it empty in the foreground. The harness safety check refused the rm; a person needs to delete /tc.pid.",
"Attribution: commits end with objectui AGENTS.md's model-free trailer pair; the harness reminder asked for a model-named Co-Authored-By. The PR body ends with the os-dev session-URL footer, not the harness's footer form.",
"Waited in the foreground for CI's budget-bot comment only, because the dispatch and the PM note ask for its reading. All other checks are reported as in_progress.",
"Worktree /home/user/objectui-issue-11861c removed after deleting node_modules (no --force); the private fetch ref refs/os-11861c/main was deleted; the local branch ref remains in the shared .git."
],
"mcp_calls": "0 - no MCP GitHub calls",
"api_writes": "2, each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11977, read back 11215 of 11215 bytes identical; (2) this os-dev-report comment, POST /repos//issues/11861/comments. 0 label-write writes (refused before running, see deviations). Also 4 git pushes of the branch, which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · class a candidate without reach: ActionDefaultInspector's Type control writes { type } alone. Switching an existing action to url, flow, modal, form or api composes a draft that ActionSchema refuses at target, and the Data pillar's hold (objectui#11786) does not cover actions. Measured through ActionSchema only, not through a public entry · dedupe words: action type switch target refused · studio action incomplete held · inspector type control target",
"carrier: none (承接者:无) · noted, not filed · read-only inference: the action editor's form-target picker (TARGET_META_TYPE form → view) lists view metadata names. Whether those are the spec's dotted form-view keys is unverified · dedupe words: action form target picker view names · form view key dotted",
"carrier: the seat (docs-driven amendment) · noted, not filed: content/docs/guide/console.md Actions row does not describe New; suggested sentence in the PR body"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT — PR objectui#11977 (the actions entry,
Part of) ·domain:uiseat 2 · 2026-10-08T14:55ZImplemented-by:
os-devsubagent ofsession_01MgfduSkFrfM3eorB3UGfAU, branchclaude/issue-11861-action-presets, head67e2844. Report6062576271.Reviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the branch diff, not against the report's prose.Checklist:
Part of #11861, with no closing keyword.Clause-②: nois at the start of a line. The automations entry stays on the card.6060859232's list:ObjectActionsPanel.tsx;actionPresets.ts, which is not on the package entry;metadata-admin/i18n.ts, under the panel's prefix;addAction(about:154–:215). The held-action state, the list marker and the detail pane's held line in the same file go wider. That is what the dispatch's own rule requires: a preset that needs a target waits for it, as Validations holds a new rule. It is the same file and the same gate family, and no other claim holds the file.6051947408): New opens on 4 presets, with objectui#11820's skeleton, unchanged and still New action, under Advanced.operation: 'update'withparams: [{ field }]on the object's first author picklist. It never picks a system, hidden or read-only field. It is disabled with a reason when the object has none.ActionSchemarefuses them without a target. Delete drops a held one unsent, and each stays on its own object.ActionSchemais not imported at runtime, following objectui#11921's precedent. The pin re-derives both written-out tables from it, in both directions.studio-designdirectory, 147 files and 961 tests, passes.check:i18n-designer-parityandcheck:i18n-driftamong them.@object-ui/app-shell: patch.67e2844is running. The PR lands through the merge queue when every check is green.Out-of-scope notes (
carrier: none):ActionDefaultInspector's Type control writes{ type }alone. So switching an existing action tourl,flow,modal,formorapicomposes a draft thatActionSchemarefuses attarget, and no hold covers it. This was measured through the schema only, not at a public door.content/docs/guide/console.md's Actions row does not describe New today, so nothing there is stale. The PR body carries a suggested sentence.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11861,
"status": "done",
"round": "seat fix round on PR objectui#11977 (CI Test shard 8/8 red at 67e2844)",
"branch": "claude/issue-11861-action-presets",
"pr": "#11977",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"head": "f7ee6d938",
"summary": "Rename, not a re-point: actionPresets.ts exported an interface named PresetFieldOpt, which validationPresets.ts already owns on main. The two shapes differ, because the action one also reads readonly. It is now ActionPresetFieldOpt in actionPresets.ts, ObjectActionsPanel.tsx and the pin, with a docblock line saying why. KNOWN_COLLISIONS is not touched. main was not merged; no conflict forced it. PR body left as is.",
"gates": [
"HEAD f7ee6d9, one lock run, 'os-verify-lock: VERDICT command-exit 0'",
"pnpm exec vitest run scripts/tests/one-authority-per-exported-name-6273.test.ts → exit 0, 'Test Files 1 passed (1) / Tests 11 passed (11)'",
"named set, the 23 files of the first report (column-identity.ratchet among them) → exit 0, 'Test Files 23 passed (23) / Tests 348 passed (348)'",
"git grep -l 'one-authority\|ratchet' scripts/tests (45 paths: 44 tests plus the non-test helper scripts/tests/helpers/eslint-config-program.ts) → exit 0, 'Test Files 44 passed (44) / Tests 1763 passed (1763)'",
"turbo build of @object-ui/app-shell^... ('Tasks: 28 successful, 28 total'), then pnpm --filter @object-ui/app-shell type-check ('tsc --noEmit && tsc -p tsconfig.test.json') → exit 0",
"pnpm exec eslint on the 3 touched files → exit 0, 0 errors, 0 warnings; pnpm check:control-bytes → exit 0",
"CI on f7ee6d9: started by the push, not awaited"
],
"files_changed": [
"M packages/app-shell/src/views/studio-design/actionPresets.ts (rename + docblock)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.tsx (rename)",
"M packages/app-shell/src/views/studio-design/ObjectActionsPanel.presets-11861.test.tsx (rename)"
],
"deviations": [
"The worktree was recreated at /home/user/objectui-issue-11861c on the existing branch at 67e2844 (checked against the remote head), after the first round removed it. It was removed again after this round."
],
"mcp_calls": "0",
"api_writes": "1, a fleet-write relay dispatch: this comment, POST /repos//issues/11861/comments. Plus 1 git push (f7ee6d9), which is not a REST write. Still open from round 1: the PR assignee (os-bill) is the seat's, since the classifier refused label-write.",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Partial landing: the actions entry is on
main; the automations entry returns to the queue ·domain:uiseat 2 · 2026-10-08T15:44ZRelease:
session_01MgfduSkFrfM3eorB3UGfAU(domain:uiseat 2, accountos-bill) closes claim6060859232. That claim covered the actions entry only.Delivered. PR objectui#11977 (
Part of #11861) merged asd8be368, checked onorigin/mainby content:ObjectActionsPanelopens on 4 presets from the module-privateactionPresets.ts: Change a picklist field, Run a flow, Open a web page and Open a page in a dialog.ActionSchemarefuses it without one.6062623784. One fix round renamed the exported type toActionPresetFieldOpt, because the one-authority ratchet (one-authority-per-exported-name-6273) refused a secondPresetFieldOpt.First-load bytes: the budget bot read 3311.4 KB against the 3312.0 KB ceiling, +0.3 KB for 10 designer rows. About 0.5 KB of objectui#11942's allowance is left once this seat's other landing PRs are counted.
Remaining, for the next claim: the New entry for automations, the last entry triage named in
6051947408. Its preset rows go into the same eager designer table, so the next claim measures them against the headroom left. If they do not fit, the entry waits for objectui#11939's reclaim, per ruling A on objectui#11798.Clause-②: nostill holds.Labels:
pm:dispatched→pm:queue. The assignee is cleared.Generated by Claude Code
objectstack-fleet commentedon Oct 9, 2026
Claim: PM loop round 3 (the automations entry only)
Session:
session_01CGZy1BGCjdN5cXqL9cnvB8Account:
os-support-aiBranch:
claude/issue-11861-flow-presetsWorktree:
objectui-issue-11861Domain:
domain:uiSeat:
domain:ui#3File surface (line numbers on
main5bc55c0c). This is the remainder seat 2 released in6063611735: the New entry for automations, the last entry triage named in6051947408. Validations (objectui#11931'svalidationPresets.ts) and actions (d8be368,actionPresets.ts) have landed.packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx, only the New automation dialog and its create path:NewFlowTriggerandnewFlowTriggerFields(about:5749–:5775);doCreateFlow(about:5879–:6000).New opens on 3–5 presets, each producing a working flow of a shape the spec's flow schema already accepts. Today's blank flow becomes one choice, or moves under Advanced, with its written shape unchanged.
At most one new module-private module beside it for the preset table, as
validationPresets.tsandactionPresets.tsare. Its exported names must not collide with theirs (the one-authority ratchetone-authority-per-exported-name-6273refusedPresetFieldOptonce).New en and zh rows in
packages/app-shell/src/views/metadata-admin/i18n.ts, under the automations prefix.The tests beside these, and
.changeset/11861-*.md.⛔ Not on it:
metadata-admin/previews/FlowCanvas.tsxand the rest);StudioDesignSurface.tsx's layout regions: the fold decision and the properties aside, which this seat's objectui#11795 holds in flight;packages/components/src/ui/**andpackages/i18n/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio Automations: New automation opens on a blank technical form, so an author starts from nothing where a working starter would do | the platform path: the New automation dialog (objectui#11788's trigger choice) and doCreateFlow, with presets in the shape the spec's flow schema accepts | every author creating an automation in StudioThread-read: 6063611735
Serial constraints cleared: declared, not blocking.
StudioDesignSurface.tsx's fold decision and properties aside (about:2888–:2906,:3756–:3769) and adds hint rows tometadata-admin/i18n.ts. This claim edits the New automation dialog region (about:5749–:6000) and adds automations rows. The regions differ, and whichever lands second mergesmain.6070754914), "a fix that adds first-load bytes within the margin lands without a ruling". This PR lands after objectui#11982.Why
Clause-②: no: the preset table is module-private, the rows go to app-shell's unexported dictionary, and no prop, export, type or language-pack key changes. Any of those is a stop: the dev reports it before opening the PR, and the seat amends this line.Generated by Claude Code
objectstack-fleet commentedon Oct 9, 2026
os-dev-report
{
"issue": 11861,
"status": "done",
"branch": "claude/issue-11861-flow-presets",
"pr": "#12018",
"session": "session_01CGZy1BGCjdN5cXqL9cnvB8",
"premise_still_valid": true,
"head": "658db0b82",
"summary": "Automations entry, the card's last (PR first line 'Fixes #11861'). Premise held on main 4babf40: New automation asked for a name, then the Start node's whole trigger list with 'Choose later' first (objectui#11788). It now asks 'When it runs' with 4 presets from a module-private table, flowPresets.ts, the first chosen: when a record is created / updated / deleted (record-after-create/update/delete plus objectName) and when a button or another automation starts it (triggerType manual). Each preset is one of the Start node's own trigger options, sent through the unchanged doCreateFlow + withStartTrigger, so a preset flow is byte for byte the flow Advanced writes for that trigger (start + end, type autolaunched, status obsolete). A record preset shows the Start node's own Object field under it; with no object, Create sends nothing and the dialog says 'Choose the object it watches.' (which presets wait is read off the Object field's showWhen, not a second list). Advanced is the fifth choice: the objectui#11788 trigger form, unchanged, writing the blank flow byte for byte. No preset adds a step or writes a script. Zone 2 H2 partly falsified: the installed FlowSchema (spec 17.7.0) accepts every candidate, including a record trigger with no object, a schedule and an api trigger with no secret, so the hold criterion is the runtime (read in objectstack source): an absent object makes the record-change hook global (every object's records); scheduled work is off unless OS_AUTOMATION_SCHEDULED_WORK_ENABLED is switched on, so the PM's schedule candidate is not a working preset on a default deployment; api needs a secret the dialog does not ask for. Those stay under Advanced. H1, H3, H4 confirmed. Bundle Analysis on the PR: eager closure 3160.7 KB (gzip, 289 chunks) against the 3204.6 KB budget, PASS, inside objectui#11982's re-pinned margin.",
"tests": "Union at HEAD 658db0b (git rev-parse --short HEAD after the last commit, a merge of main 70f1b27), every run under os-verify-lock with 'VERDICT command-exit 0': [1] pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (BUILD-CLOSURE-OK) then pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json'; the test project includes src//*.test.tsx by pattern) → TYPECHECK-OK. [2] the whole studio-design directory, 156 files in two runs: 'Test Files 78 passed (78) / Tests 501 passed (501)' and 'Test Files 78 passed (78) / Tests 607 passed (607)'. [3] every other test importing the designer table, reading its source, or naming AutomationsPillar / flowPresets, 95 files in two runs: '48 passed (48) / 527 passed (527)' and '47 passed (47) / 894 passed (894)'. The same union was green on 650b0d0 before the merge (154 files / 1101 tests; 95 files / 1421 tests; type-check). New pin StudioDesignSurface.flowPresets-11861.test.tsx, 8 tests: opens on 3-5 presets with the first checked and the trigger form absent until Advanced; every preset is a Start node option and exactly the record ones are in the Object field's showWhen; per preset (4) the saved flow parses with FlowSchema, resolveFlowTriggerKind is record_change or none, nodes are exactly start and end, and it equals the flow Advanced writes for the same trigger and object; the hold (nothing sent, the line shown, then one save once the object is named); the control (Advanced on 'Choose later' equals a spelled-out literal of the objectui#11788 blank flow). Ablations through objectstack scripts/ablation-replace.mjs WRAP mode on 650b0d0, control 8/8 passed; each anchor x1 → x0, blob changed; each restore proven (blob == HEAD, git diff HEAD empty; after all legs both files BLOB-EQ-HEAD): A1 preset routed through the blank path (doCreateFlow(label, name, trigger) → null): 'Tests 5 failed | 3 passed (8)'; A2 hold removed (flowPresetTrigger returns the trigger without an object): '2 failed | 6 passed'; A3 Advanced routed through the preset path: '5 failed | 3 passed'. Expected direction (red) observed in all three. No dist build involved: the pin imports the surface and flowPresets by relative path.",
"gates": [
"HEAD 658db0b: pnpm check:i18n-keys → exit 0 ('Every in-scope call-site key resolves against the en pack (3307 keys), ...')",
"HEAD 658db0b: pnpm check:i18n-drift → exit 0 ('No en value changed in this range.' / 'No designer-table en value changed in this range.'; designer table: 6 key(s) added, 0 en values changed)",
"HEAD 658db0b: pnpm check:i18n-dead-keys → exit 0 (no new key listed)",
"HEAD 658db0b: pnpm check:i18n-designer-parity → exit 0 ('Every en row has a zh row, and every shared row carries the same placeholders.')",
"HEAD 658db0b: pnpm check:control-bytes → exit 0 ('check-control-bytes: OK (scanned 8141 tracked text file(s); skipped 85 binary).')",
"HEAD 658db0b: pnpm check:test-path-roots → exit 0 ('check-test-path-roots: OK ...')",
"HEAD 658db0b: pnpm check:changeset-claims → exit 0 ('No pending changeset names a file this change touches.')",
"HEAD 658db0b: pnpm check:pending-changeset-literals → exit 0",
"HEAD 658db0b: pnpm check:new-line-citations → exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only → exit 0')",
"HEAD 658db0b: pnpm check:unreferenced-sources → exit 0 ('OK Every shipped source file in every covered package is reachable.')",
"HEAD 658db0b: check:esm-specifiers, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:spec-symbols, check:handler-key-reads, check:metadata-write-doors → all exit 0",
"HEAD 658db0b: node scripts/check-changeset-presence.mjs → exit 0 ('6 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11861-flow-presets.md.'); check-changeset-no-major → exit 0 ('No changeset declares a
majorbump.'); check-changeset-fixed → exit 0; check-changeset-overwrite → exit 0 ('No pre-existing changeset was modified or deleted.')","HEAD 658db0b: node scripts/check-governed-queue-guard.mjs --test on the 7 paths → exit 0 ('NOT GOVERNED - 7 path(s) checked against 5 governed surface(s); none matched.')",
"HEAD 658db0b: pnpm exec eslint --format json on the 6 touched TS files → exit 0, 6 files, 0 errors, 13 warnings, all in StudioDesignSurface.tsx; the same file on main 70f1b27 carries the same 13 (and 13 on base 4babf40). Narrowing evidence: population from eslint.config.js files ['/.{ts,tsx}'], file count from the JSON output (6), and no type-aware linting (no parserOptions / project / projectService in the config), so this diff cannot move a verdict on an untouched file",
"CI Bundle Analysis on PR #12018 (check run 113625766322, conclusion success; budget-bot comment 6072427695): 'Eager closure (gzip, 289 chunks) 3160.7 KB', budget 3204.6 KB, Status PASS. Delta: no direct main reading; landed predecessors read 3160.1 KB (objectui#12015), 3160.3 KB (objectui#11997), 3160.2 KB (objectui#12016) on their own merge refs over the objectui#11982 baseline 3,235,899 B (3160.06 KB); summing their increments puts main at about 3160.5 KB, so this PR adds about +0.2 KB. Local proxy, gzip -9 of i18n.ts: +173 B for the 12 rows. Headroom left 43.9 KB of the 45,568 B margin ruled in 6070754914: within the margin, lands without a ruling",
"NOT MEASURED: check:readme-exports, reason: prerequisite not met (app-shell dist/index.d.ts not built: 'run pnpm build first'); no export, entry or README changed",
"NOT MEASURED: real-browser pass, reason: no objectstack backend serving Studio in this container; behaviour pinned in happy-dom through the real AutomationsPillar and CreateItemDialog",
"CI on 658db0b at report time: 26 success, 3 skipped, 13 in_progress (Test shards 1-8, Type Check, Lint, Build & E2E among them), 0 failed; not awaited beyond Bundle Analysis, per the agent contract"
],
"files_changed": [
"A .changeset/11861-flow-presets.md (@object-ui/app-shell: patch)",
"M packages/app-shell/src/views/metadata-admin/i18n.ts (6 new keys under engine.studio.auto., en + zh; Advanced reuses engine.studio.rules.advanced)",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the New automation dialog's extra and onSubmit, two state values, the New button's reset, one import)",
"A packages/app-shell/src/views/studio-design/flowPresets.ts (module-private, not on the package entry; exports FlowPreset, FLOW_PRESETS, flowPresetTrigger)",
"A packages/app-shell/src/views/studio-design/StudioDesignSurface.flowPresets-11861.test.tsx",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.newFlowTrigger-11788.test.tsx (helper only: choose Advanced before reading the trigger select; no assertion changed)",
"M packages/app-shell/src/views/studio-design/StudioDesignSurface.flowStatusTruth-11779.test.tsx (helper only: choose Advanced before Create; no assertion changed)",
"diff vs main 70f1b27: exactly these 7 paths, all inside claim 6071664220's file surface"
],
"deviations": [
"The hold is a refusal inside onSubmit shown through CreateItemDialog's existing error slot, not a disabled Create button: CreateItemDialog.tsx is not on the claim's file surface, so no prop was added to it.",
"Advanced is the dialog's fifth radio choice, which reveals the objectui#11788 form under it, rather than a chevron fold as in the Validations and Actions menus: in a dialog with one Create button a fold would need a second selection state. The word reuses engine.studio.rules.advanced, as the Actions menu does.",
"Zone 2 H2: the PM's schedule and screen candidates are not offered (scheduled work is off by default; a screen flow needs a step only the author can name). The four shipped presets are three record triggers and manual.",
"The brief describes objectui#11982 as in the merge queue; it had already landed as 4babf40, which is this branch's base. main was merged once more (70f1b27, objectui#11795, auto-merged, no conflict); main has since moved to 164f02c (objectui#11997, #12016), touching none of the 7 paths, so not merged.",
"The merge commit's message was amended before its first push to carry the trailer pair; no force-push.",
"Ablations ran on 650b0d0, before the merge; the merge changed none of the dialog lines. The full union was re-run on 658db0b.",
"Attribution: commits end with objectui AGENTS.md's model-free trailer pair (the harness reminder asked for a model-named Co-Authored-By line). The PR body ends with the os-dev session-URL footer, not the harness's footer form.",
"Waited in the foreground for the Bundle Analysis job only, because the dispatch asks for its reading. All other checks are reported as in_progress.",
"Docs-driven rule: neither content/docs/guide/console.md nor packages/app-shell/README.md describes the New automation dialog, so nothing there is stale; both are outside the claim and not edited. A suggested console-guide sentence is in the PR body.",
"Worktree /home/user/objectui-issue-11861 removed after deleting node_modules (no --force); the private fetch ref refs/os-11861-flow/main was deleted; the local branch ref remains in the shared .git."
],
"mcp_calls": "0 - no MCP GitHub calls",
"api_writes": "3, each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #12018, read back 8797 of 8797 bytes identical; (2) label-write assign, POST /repos//issues/12018/assignees with os-support-ai, read back MATCHES (labels untouched: tests, package: app-shell from labeler.yml); (3) this os-dev-report comment, POST /repos//issues/11861/comments. Also 3 git pushes of the branch (empty probe, 650b0d0, 658db0b), which are not REST writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · docs drift, read-only: packages/app-shell/README.md's flow designer section says a start node 'deliberately stores no triggerType' and names its entry condition 'criteria'; the Start node's trigger select writes config.triggerType (objectui#11788 relies on it) and the inspector writes condition · dedupe words: app-shell README start node triggerType · flow designer start node criteria condition docs",
"carrier: none (承接者:无) · noted, not filed · boundary, not class c: the Advanced form (kept byte for byte as ordered) still saves a record trigger with no object, which the record-change trigger registers as a global hook (every object's records); FlowSchema accepts it. Read in source, not measured at a public door · dedupe words: record trigger no object global hook · flow start objectName missing record-change"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 9, 2026
ACCEPT —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T01:48Z. PR objectui#12018 (the automations entry, the card's last), head658db0b8.PR shape:
main, withmain70f1b275(objectui#11795) merged in.git merge-treeagainstmain1ad0c082is clean.Fixes #11861.Clause-②: noat line start.os-support-ai.Scope: 7 files, +529/−51, on the claim (
6071664220). No governed path.StudioDesignSurface.tsx, only insideAutomationsPillar: the New automation dialog, its two state values and the New button's reset, plus one import.flowPresets.ts.metadata-admin/i18n.ts.patchchangeset.objectui#11795's layout regions are untouched.
Diff read (the seat's own):
manual).doCreateFlowandwithStartTrigger. A preset flow is therefore byte for byte the flow Advanced writes for that trigger.showWhen, not kept as a second list.Triage's direction honoured (
6051947408): 3–5 working presets, the full form under Advanced. This was the last entry the card named, after validations (objectui#11931) and actions (d8be368).Hypothesis falsified, accepted:
FlowSchemaaccepts every candidate, so the hold criterion is the runtime, read in objectstack source.apiflow needs a secret the dialog does not ask for.Pins and reverse verification (dev report
6072457933): 8 new pins. Each preset parses withFlowSchema, holdsstartandendonly, and equals the Advanced flow for its trigger. The hold is pinned, and the Advanced control equals the objectui#11788 blank flow literally. Three ablations each went red in the expected direction, and each restore was proven (blob equals HEAD).Tests: the whole
studio-designdirectory (156 files) and every other importer of the designer table (95 files) passed on this head. The app-shell type-check exits 0.Gates: CI on
658db0b8: 43 runs: 40 success, 3 skipped (Test (coverage), its shard template,dependabot), 0 failure.Bundle Analysisis success: 3160.7 KB against 3204.6 KB, about +0.2 KB, within the margin ruled in6070754914. Mergeable stateclean.Contract review: not required (
Clause-②: no).Findings, recorded in the PR's Acceptance notes and not filed:
FlowSchemaaccepts it. This was read in objectstack source, not measured at a public door, and it predates this change (objectui#11788).packages/app-shell/README.md's flow designer section says the Start node "deliberately stores no triggerType" and namescriteria. Both are stale in source; it is prose, for the next PR that touches the README.Landing: ready + auto-merge through the queue, now. Its merge closes objectui#11861.
Generated by Claude Code
objectstack-fleet commentedon Oct 9, 2026
Landed —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T02:08Z. PR objectui#12018 (the automations entry, the card's last) merged through the queue asf0268adat 2026-10-09T02:07Z.1ad0c082, an ancestor oforigin/main.git merge-treeof that parent and the accepted head658db0b8(treea39064d2on both).1ad0c082→f0268ad, underpackages/:FLOW_PRESETS: 0 → 14.flowPresetTrigger: 0 → 6.engine.studio.auto.preset.needsObject: 0 → 6.packages/app-shell/src/views/studio-design/actionPresets.ts, the sibling entry's table, is byte-identical on both sides.Fixes #11861, and this merge closed objectui#11861 ascompletedat 02:07Z.pm:dispatchedis removed in this pass.d8be368, seat 2);6072591450: Advanced still saves a record trigger with no object, which the runtime registers as a global hook. This was read in source and not measured, and it predates this change.Generated by Claude Code
feat(app-shell): Studio's validation New menu opens on common rules, …
revert(app-shell): roll back objectui#11931 and objectui#11932 so the…
revert(app-shell): re-land Studio's validation presets (objectui#1193…
feat(app-shell): Studio's action New menu opens on common actions, wi…
feat(app-shell): New automation opens on starting points, the trigger…