Skip to content

Studio Data › Actions: "Add field value" adds no row, so an update action's patch cannot be authored in Studio (the published action is a no-op) #26735

Closed

Description

@objectstack-fleet

Filing gate: ① product defect, reproduced, landing site named.
Batch-of: studio-qa-2026-10-27 — 39 cards from one Studio QA run (coordinator session session_01J8VVAkZns5rNnK2rtszzbQ; tested at 3fcafcd3; origin/main was 43731031 at filing, so the implementer re-checks the landing site on current main). The run record is the qa-run issue filed with this batch.

Symptom

The update-fields action can be created and published but never given any field to set from Studio.

Reproduction

  1. Data › Actions › an "Update fields" action › "Add field value" → no row appears (two sessions); draft stays patch: {}.
  2. Published "Mark done" does nothing until patch is set through the API.

Expected

The button adds an editable row held locally until a field is chosen, then commits.

Suspected landing site (the implementer verifies)

ActionDefaultInspector.tsx (~640-644 and ~831): commitPatch([...patchRows, ["", ""]]) drops the empty key immediately.

Filing facts

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — priority:p2 · domain:ui · area:studio · pm:queue (finding removed) · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T16:14Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2: "Add field value" adds no row, so an update action's patch cannot be authored in Studio and the published action is a no-op. Fix the row add, and pin a patch round-trip. From the studio-qa-2026-10-27 batch. Re-check the landing site on current main.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01QsR2jTfvjNTaR29ehLk26T
    Account: zhuangjianguo
    Branch: claude/project-thread-infmae (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: objectstack-issue-26735 (bundled with #26734: same inspector, one PR naming both)
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/packages/app-shell/src/views/metadata-admin/inspectors/ActionDefaultInspector.tsx, studio namespace en.ts/zh.ts only if a label is new, tests beside, one root changeset; ⛔ packages/spec/**, server packages, any new key, a runtime fallback for a typeless action (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; reason: the maintainer's standing rule 「只认领不需要 fable 的卡」, 2026-10-27T10:39Z), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the Studio action inspector (ui app-shell, this lane) drops the blank row "Add field value" adds, so an update action's patch cannot be authored · the platform path that may cover it: none, commitPatch is the only writer · reached by every update-fields action made in Studio
    Thread-read: 6447193000
    Premise: holds (commitPatch (ActionDefaultInspector.tsx:682-686) skips every key whose trim is empty, and the button (:938) commits ['', ''] on origin/main e9e344a9 at 2026-10-27T18:58Z)
    Serial constraints cleared: PR #26827 (same file) merged 18:57Z; no open PR touches the surface (scan of the 80 most recently updated open PRs 2026-10-27T18:58Z)

    Dispatched at 2026-10-27T19:00Z to the card thread on that branch; the order lives in the thread's opening message.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26735,
      "bundled": [26734],
      "status": "done",
      "branch": "claude/project-thread-infmae",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26877",
      "head": "a9ea11053b5dd2b4dd63d7d5671d4fe0de37fb1f",
      "session": "session_01QsR2jVG55iUTTWRd5tR6Di",
      "premise_still_valid": true,
      "summary": "Both premises held on e9e344a9. #26735: the field-value rows are now a list held in ActionDefaultInspector (stamped with the action, read only while its named rows equal the draft's patch); a row is written to patch once it names a field, a blank row is never written. #26734: the Type select shows only a stored type ('—' when none), and withScriptType adds type: 'script' to every script write on a typeless draft (What it does both ways, body, language, field value); panels still follow the spec's default route. Typed actions are written exactly as before. No spec, server, i18n or runtime change.",
      "tests": "New: ActionDefaultInspector.fieldValueRows-26735.test.tsx (5) and .scriptType-26734.test.tsx (6): Tests 11 passed (11). Main-tree check at a9ea1105: inspector replaced by its e9e344a9 blob (commitFieldValueRows count 1 -> 0 on disk), Tests 8 failed, 3 passed (the two typed-action controls and the spec reading); restored with git checkout HEAD, git diff HEAD empty. 26 files naming ActionDefaultInspector or ObjectActionsPanel: first run 2 failed / 224 passed (the two scriptBodyLanguage-11921 pins of the typeless switch's write, updated to expect type: 'script'), that file re-run 13/13. app-shell type-check via turbo: 64 tasks, VERDICT command-exit 0. eslint on 4 touched files: exit 0.",
      "gates": "dispatch-gates --commands at a9ea1105: 34 derived (5 paths, re-derived after the last commit: same list); all 34 exit 0, codes captured before any pipe, PR body as GITHUB_EVENT_PATH; ui vitest run scripts/: 178 passed, 2 skipped files. --ran: 34 run, 0 NOT-MEASURED. check:new-line-citations: 0 new. PR check-runs: in_progress at report time (CI is the reading for lint, type-check lanes, Test UI shards).",
      "line_budget": "6 files: inspector +65/-14, two new test files, 11921 test +3/-1, changeset",
      "files_changed": [
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ActionDefaultInspector.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ActionDefaultInspector.fieldValueRows-26735.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ActionDefaultInspector.scriptType-26734.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ActionDefaultInspector.scriptBodyLanguage-11921.test.tsx",
        ".changeset/26735-26734-action-field-values-and-type.md"
      ],
      "deviations": [
        "Main-tree check used a git show of the main blob plus a grep count, not ablation-replace.mjs; the subject is read from src (relative import), no dist involved.",
        "Narrowed app-shell run to the 26 files naming the touched component or its host panel; the rest is CI's Test UI."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — issue_read x4 (get and get_comments on both cards); no MCP GitHub write",
      "api_writes": "1 — fleet-write relay pr_create (run 40571333451; assignee zhuangjianguo), plus this os-dev-report comment via post-stamped",
      "open_questions": [
        {
          "question": "New's update skeleton (ObjectActionsPanel, outside this card's surface) leaves type off by its pin newActionPin, so the pinned Type select reads '—' beside the 'Pinned to script' hint until the first edit stores it. Seed type: 'script' there?",
          "options": ["A seed type: 'script' in the skeleton and flip newActionPin's not.toHaveProperty('type') (small follow-up card)", "B leave it: the first edit stores type, '—' is honest about the draft"],
          "recommendation": "A, because a stored row is what the console runs, and a skeleton that already carries its route leaves no window where Studio holds an action the console would refuse"
        }
      ],
      "out_of_scope_findings": [
        "class: b · Seam: spec:ActionSchema.type .default('script') → runtime: ui core ActionRunner executeActionSchema refuses an action with no type ('is not executable') · reach: QA G2, a typeless stored script action published from Studio sends no request while POST /api/v1/actions/OBJECT/NAME answers 200 · stored rows written before this PR stay typeless; the spec's default is not materialised on the stored row the console reads · dedupe words: action type default script stored row, typeless action not executable, materialise spec default on read"
      ]
    }

    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 portalbugSomething isn't workingdomain:uipm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions