Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
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

Closed

Description

@objectstack-fleet

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

Options

  • 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

Dedupe words: studio create presets templates · new validation rule presets · blank form advanced option

Filed by Claude Code (session session_01D76mrPJrSSdaKRxR2rvrMG) from the 2026-10-07 QA pass and a follow-up source reading.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 (re-land after the main-red rollback)
    Session: session_01MgfduSkFrfM3eorB3UGfAU
    Account: os-bill
    Branch: claude/issue-11861-reland-presets
    Worktree: objectui-issue-11861-reland
    Domain: domain:ui
    Seat: domain:ui#2
    Scope of this claim: re-land only. One PR that reverts objectui#11956's rollback commit 3c888c6, bringing back unchanged:

    • objectui#11931: this card's validation-rule entry, the presets under Advanced;
    • objectui#11932: objectui#11823 step 3, seat domain:ui#3, the Studio Interfaces page-create. Notice 6057409114 was given on that card.

    Ruling 6056819248, steps 1 and 2:

    • objectui#11956 made main green with no ceiling raise (step 1);
    • this PR lands against the +5,120 B allowance of PR objectui#11949 (step 2).

    ⛔ It stays a draft until objectui#11949 has landed.

    File surface: exactly the files objectui#11956 changed, restored to their f3a0488 blobs:

    ⛔ 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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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": []
    }


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT, re-land — PR objectui#11967 · domain:ui seat 2 · 2026-10-08T12:45Z

    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.
    • Evidence:
    • 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.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  9. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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 main 5bc55c0c). 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.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
    ]
    }


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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 main 70f1b275 (objectui#11795) merged in. git merge-tree against main 1ad0c082 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.


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions