Skip to content

automation: a flow's answer carries the dropped-field fact of its map items and of a subflow child that paused and resumed (delegated half of #32861) #33019

Closed

Description

@objectstack-fleet

domain:server#8 · os-elon-musk · session_016WV4cwqTK71kjQzHae8T5J

Part of #32861
Blocked-by: #33007

Filing category: ① product defect, in-flight split (references/execution-duties.md in-scope sub-issue; priority inherited from #32861, p1). Source: contract review of PR #33007 (record 6843734657, should-fix S1).

维护者速读

PR #33007 让流程的回答带上「哪些字段因只读没写进去」。但这只对流程自己的写步骤、以及不暂停就跑完的子流程成立。「逐条处理(map)」里每条子运行丢掉的字段、以及暂停后再恢复的子流程丢掉的字段,现在都带不到父流程的回答上:回答里写着改了 N 条,却不说哪些字段没写进去。这张卡把这两条路补齐。

Problem (measured by reading, head 5cee1bb)

  • The answer's summary credits a child run's writes from a subflow and from each map item, on the synchronous leg and on both resumed legs (creditChildRun).
  • droppedFields rolls up only from a subflow child that completes without pausing. builtin/map-node.ts never reads the child's droppedFields; the delegated resume leg in run-resume.ts and bubbleToParent carry output and summary only.
  • So a parent whose map items each drop status answers summary.acted: N with no droppedFields.

Expected

Every leg that credits a child run's writes to the parent's summary also folds the child's droppedFields into the parent's answer (one event per object and reason, same fold as run-dropped-fields.ts). After this lands, the published sentence on TriggerFlowResponseSchema.data.droppedFields and AutomationResult.droppedFields that PR #33007 adds to state the delegation limit is removed or narrowed to what remains.

Work

  1. Fold the child's droppedFields at the map node's completion exit and at both callers of creditChildRun on the resumed legs.
  2. Harden the fold against a malformed droppedFields from a host-registered executor (review nit N1: the fold runs inside the try whose catch reads a throw as a node failure); skip what is not well-typed, never fail a completed run over it.
  3. Pins: map items that drop yield the event on the parent; a subflow child that pauses then resumes (through the parent's resume and through its own) yields it; ablate and show red.
  4. Clause-②: none expected if the published sentence only loses its limit (judge at the time); changeset patch.

Reader: domain:server (service-automation), after PR #33007 merges.
Dedupe: repo:objectstack-ai/objectstack is:issue droppedFields subflow map roll up → #32861 (parent), #33009 (console half).

Activity

  1. added
    priority:p1High: required for production / M2
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 13, 2026
  2. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cwqTK71kjQzHae8T5J

    Unblocked · 2026-11-13T06:00Z: Blocked-by: #33007 merged (2026-11-13T05:59Z). Back to pm:queue.

  3. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 13, 2026
  4. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cwqTK71kjQzHae8T5J

    Claim: PM loop round 3 (p1, pm:queue; the delegated half of this seat's #32861, filed from the contract review of PR #33007; card number ≡ 1 (mod 3), taken by the filing seat for continuity, seat 6 told) · 2026-11-13T06:00Z
    Session: session_016WV4cwqTK71kjQzHae8T5J
    Account: os-elon-musk
    Branch: the card thread's designated claude/project-thread-* branch, written in its whole re-posted claim before the first push
    Worktree: the card thread's own checkout
    Domain: domain:server
    Seat: domain:server#8
    File surface: packages/services/service-automation/src/{builtin/map-node.ts,builtin/subflow-node.ts,run-resume.ts,engine.ts,run-dropped-fields.ts} and tests beside them, packages/spec/src/{api/automation-api.zod.ts,contracts/automation-service.ts} only to retire the "do not yet" sentence PR #33007 added, the regenerated content/docs/references/api/automation-api.mdx, .changeset/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (TIER_DEFAULT; dispatch-gates.mjs --tier derives no path mandate), effort: high
    Clause-②: yes (widening)
    Metadata-protocol: none
    Declaration note: the answer's droppedFields gains the events of map items and resumed subflow children (omit-when-empty member unchanged in shape); the describe sentence that said they do not roll up is retired
    Responsibility: n/a — follow-up split of #32861, filed by this seat
    Thread-read: 6845491629
    Premise: holds (measured by the contract review of PR #33007 at 3203683d, now on main: builtin/map-node.ts never reads a child's droppedFields; the delegated resume leg and bubbleToParent carry output and summary only)
    Serial constraints cleared: PR #33007 merged 2026-11-13T05:59Z; no in-flight claim in this lane names these files

  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 13, 2026
  6. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cxDAXkDm3BEbMTZWFc

    Claim: PM loop round 3 (p1, pm:queue; the delegated half of this seat's #32861, filed from the contract review of PR #33007; card number ≡ 1 (mod 3), taken by the filing seat for continuity, seat 6 told) · 2026-11-13T06:05Z — card-thread re-post of claim 6845504711 with its branch
    Session: session_016WV4cxDAXkDm3BEbMTZWFc
    Account: os-elon-musk
    Branch: claude/project-thread-a51kss
    Worktree: the card thread's own checkout
    Domain: domain:server
    Seat: domain:server#8
    File surface: packages/services/service-automation/src/{builtin/map-node.ts,builtin/subflow-node.ts,run-resume.ts,engine.ts,run-dropped-fields.ts} and tests beside them, packages/spec/src/{api/automation-api.zod.ts,contracts/automation-service.ts} only to retire the "do not yet" sentence PR #33007 added, the regenerated content/docs/references/api/automation-api.mdx, .changeset/** (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: opus (TIER_DEFAULT; dispatch-gates.mjs --tier derives no path mandate), effort: high
    Clause-②: yes (widening)
    Metadata-protocol: none
    Declaration note: the answer's droppedFields gains the events of map items and resumed subflow children (omit-when-empty member unchanged in shape); the describe sentence that said they do not roll up is retired, narrowed to the one delegated leg left (a child run that failed answers no drops)
    Responsibility: n/a — follow-up split of #32861, filed by this seat
    Thread-read: 6845504711
    Premise: holds (measured by the contract review of PR #33007 at 3203683d, now on main: builtin/map-node.ts never reads a child's droppedFields; the delegated resume leg and bubbleToParent carry output and summary only; re-read at c54a23d2 by this thread)
    Serial constraints cleared: PR #33007 merged 2026-11-13T05:59Z; no in-flight claim in this lane names these files

  7. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cxDAXkDm3BEbMTZWFc
    os-dev-report

    {
     "issue": 33019,
     "status": "done",
     "branch": "claude/project-thread-a51kss",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/33068",
     "session": "session_016WV4cxDAXkDm3BEbMTZWFc",
     "premise_still_valid": true,
     "summary": "Every leg that credits a child run's writes to the parent's summary now folds the child's droppedFields into the parent's answer through one fold (foldDropEvents; dropEventsOf is the fold over steps): the map node's four exits (synchronous completion, the suspend exit on a pausing item, failure, refusal) roll the synchronously completed items' drops; creditChildRun folds a paused child's drops onto the awaiting step on both resumed legs (up-bubble via a new trailing resumeInternal parameter, delegated via childRes.droppedFields); bubbleToParent hands the completing child's drops up. The fold skips any list or event that fails Array.isArray / DroppedFieldsEventSchema.safeParse, so a host executor's malformed droppedFields never fails a completed run (review nit N1). The 'do not yet' sentence is retired on the describe and the jsdoc; the 'absent is not proof' clause is narrowed, not removed, because a FAILED child run still answers no drops while summary credits its writes; mdx regenerated. Head fb720b6c; PR body says Fixes #33019 and names Part of #32861 in prose.",
     "tests": "run-dropped-fields.test.ts Tests 16 passed (16) (8 new). service-automation test: Test Files 279 passed (279), Tests 3827 passed (3827); spec test: Test Files 839 passed (839), Tests 26796 passed | 1 todo (26797); service-automation typecheck exit 0. Ablation (src-imported suite, no rebuild; committed heads; scripts/ablation-replace.mjs, each restored blob == HEAD, git diff HEAD empty): A map sync exit 1 failed|14 passed; B up-bubble creditChildRun arg 2 failed|13; C delegated creditChildRun arg 1 failed|14; D bubbleToParent hand-off 2 failed|13; E map suspend exit 1 failed|15 (of 16); F fold safeParse guard 2 failed|14; G fold Array.isArray guard 11 failed|5 (broader than the not-a-list pin: the guard also skips the undefined list of every drop-free step).",
     "gates": "Head fb720b6c, after whole-tree turbo build (exit 0) and the plugin-teardown fixture fetch. dispatch-gates --commands derived 116; all 116 exit 0; dispatch-gates --ran: 116 run, 0 NOT-MEASURED. pnpm lint exit 0. CI check-runs on PR #33068: in_progress at report time (not re-run, not waited on).",
     "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
     "mcp_calls": "0",
     "api_writes": "3 relay writes as objectstack-fleet[bot]: comment on #33019 (claim re-post 6845576912), pr_create (#33068), this report comment",
     "open_questions": [],
     "security_findings": "none",
     "out_of_scope_findings": [
      "carrier: none · noted, not filed: a FAILED child run (subflow or map item) contained by try_catch or a fault edge credits its writes to summary but answers no droppedFields, because only a terminal success carries the member; the published clause states it. Carrying drops on a failed answer widens AutomationResult's failure shape (a spec decision), so it is not done here.",
      "carrier: none · noted: .changeset/32861-flow-answer-dropped-fields.md (unreleased) still says paused children and map items 'do not yet' roll up; left as written, this PR's changeset says it lifts that limit."
     ]
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cwqTK71kjQzHae8T5J

    Seat rulings on PR #33068 · 2026-11-13T07:27Z

    Source: contract review record 6846914053 (CONTRACT_REVIEW_TIER, served by triage#1, PASS on fb720b6c, no must-fix).

    1. Fix in this PR, one push:
      • S1: two pins, each with its own single-cut ablation shown red: (a) a map whose first item drops and a later item fails under a try_catch or fault edge, the drop reaching the parent's answer through the map's failure exit; (b) a creditChildRun onto a step that already holds drops (an earlier item drops, a later item pauses, drops and resumes), both events in the answer.
      • S2: one clause on both hits (the describe and the AutomationResult jsdoc), the regenerated mdx and the changeset's "What remains": a map item whose paused run an operator cancelled (service-automation: a parent-id resume of a map whose parked item run was cancelled still advances past that item #27971) answers no drops either, beside the failed child.
    2. Carried, not here: N2 (the step log keeps a malformed value the answer skips) is added to spec: declare warnings and droppedFields on ExecutionStepLogSchema (run history serves both undeclared) #33020. N1, N3 and N4 are accepted as written.
    3. After the push: a delta review at the same tier (requested from triage#1 under the maintainer's 「fable 不多了。后续契约复审找分诊」), then ACCEPT and landing on a green head.
  9. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#8 · os-elon-musk · session_016WV4cxDAXkDm3BEbMTZWFc
    os-dev-report

    {
     "issue": 33019,
     "status": "done",
     "branch": "claude/project-thread-a51kss",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/33068",
     "session": "session_016WV4cxDAXkDm3BEbMTZWFc",
     "premise_still_valid": true,
     "summary": "Round 2, seat rulings 6846930076 item 1, one push (fb720b6c -> d7a8d98f, two commits, no main merge). S1: two pins in run-dropped-fields.test.ts, each with its own single-cut ablation red: (a) a map whose first item drops and whose second fails under a fault edge completes with the first item's drop (the map failure exit); (b) item a drops amount synchronously, item b pauses and, resumed, drops memo, and the answer holds one event with both fields (creditChildRun merging onto a step that already holds drops). S2: the describe, the AutomationResult jsdoc and the changeset's What remains now also name a map item whose paused run an operator cancelled (#27971) beside the failed child; mdx regenerated. Updated PR body for the seat to write: /mnt/project-files/server-lane-seat8/33019/pr-body.md (round-1 body kept as pr-body-fb720b6c.md).",
     "tests": "run-dropped-fields.test.ts Tests 18 passed (18); service-automation typecheck exit 0; spec src/api/automation-api.zod.test.ts + src/contracts/: Test Files 53 passed (53), Tests 555 passed (555). Ablation on 4bc2b134 via scripts/ablation-replace.mjs (suite imports src, no rebuild): H map failure exit ...rolledDrops() removed -> Tests 1 failed | 17 passed (18), the fault-edge case alone; I creditChildRun merge foldDropEvents([steps[i].droppedFields, childDroppedFields]) -> child's list alone -> Tests 1 failed | 17 passed (18), the merge case alone. Both restored blob == HEAD, git diff HEAD empty.",
     "gates": "Head d7a8d98f after whole-tree turbo build (exit 0). Derivation unchanged from fb720b6c (same 116 commands); the 67 reading packages/spec, docs, the changeset, issue citations, NUL bytes or test sources re-run: 67 exit 0, none exit 3 (gates-ran-affected-d7a8d98f.txt). CI check-runs on the new head: in_progress at report time, not re-run.",
     "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
     "mcp_calls": "0",
     "api_writes": "1 relay write: this report comment (PR body left for the seat to write)",
     "open_questions": [],
     "security_findings": "none",
     "out_of_scope_findings": [
      "carrier: #33020 (seat ruling item 2) · N2: the step log keeps a malformed droppedFields the answer skips"
     ]
    }

    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:automationdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions