You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: declare warnings and droppedFields on ExecutionStepLogSchema (run history serves both undeclared) #33020
Filing category: ③ follow-up a review names (contract review of PR #33007, record 6843734657, nit N2).
Problem
A flow step's log entry carries warnings (since #3407) and, after PR #33007, droppedFields. Run history persists the step log and serves it verbatim from GET /api/v1/automation/:name/runs/:runId and the runs list. ExecutionStepLogSchema (packages/spec/src/automation/execution.zod.ts) declares neither member, so the published wire carries two members its schema does not name.
Expected
Either declare both members on ExecutionStepLogSchema (optional; warnings as strings, droppedFields as the existing DroppedFieldsEventSchema array), or project them out of the served step log. The spec lane chooses; declaring is a widening (Clause-②: yes (widening)), projecting out is a narrowing.
Reader: domain:spec.
Suggested-grade: p3 (drift, no caller refused).
Added to this card from the contract review of PR #33068 (record 6846914053, nit N2) · 2026-11-13T07:28Z: dag-traversal.ts puts any droppedFields with a truthy length on the step, so a host executor's malformed value is persisted and served verbatim by the runs routes, while the answer's fold (foldDropEvents, PR #33068) skips it. Whichever way this card goes (declare or project out), the served step log should apply the same DroppedFieldsEventSchema filter as the answer.
Claim: PM loop round 1 · 2026-11-14T16:35Z
Session: session_01FEkQ5mswnWm181XgYcCUag (seat); card thread session_01FEkQ5ps2JcdASVedaYorBN is the dev
Account: os-project-manager
Branch: claude/project-thread-w2czot (the card thread's designated branch; the platform lets a thread push only that branch, so not claude/issue-33020-*)
Worktree: objectstack-issue-33020
Domain: domain:spec
Seat: domain:spec#1
File surface: packages/spec/src/automation/execution.zod.ts and its test, what the spec gates regenerate from it; packages/services/service-automation/src/dag-traversal.ts (the droppedFields copy at ~:418 and ~:501, comment 6846941860) and its test; the automation API docs page only if it lists step-log members; root .changeset/ (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (Clause-② widening of a response schema; contract review before enqueue), effort: medium
Clause-②: yes
Metadata-protocol: none
Responsibility: n/a — not a defect card (schema drift: the wire carries two members the published step-log schema does not name)
Thread-read: 6846941860
Premise: holds at origin/main24f2f401: ExecutionStepLogSchema (execution.zod.ts ~:158) declares neither warnings nor droppedFields, while dag-traversal.ts :418/:501 writes droppedFields onto the step. Seat call (the card leaves it to the lane): declare, not project out. Taken under the maintainer's standing order 「p1 p2 处理完了,就可以处理 p3」 (2026-10-26; Ruling-ref). Order: /mnt/project-files/pm-orders/spec/order-33020.md (project share).
Serial constraints cleared: no open PR touches packages/spec/src/automation/execution.zod.ts or service-automation/src/dag-traversal.ts.
Why: measured by the card thread at head e84915df: the two new members move packages/spec/authorable-surface/automation.json (ExecutionStepLog:droppedFields, :warnings), and check-changeset-no-major refuses none over a moved shard (none-baseline-moved). So the PR declares Clause-②: yes (widening) and Metadata-protocol: added; changesets @objectstack/spec minor, @objectstack/service-automation patch (AGENTS.md Post-Task Checklist step 3).
File surface added:packages/spec/authorable-surface/automation.json (generated), and packages/spec/scripts/lib/skill-map-guards.ts: an objectstack-automation row in TRANSITIVE_ALLOWLIST, so importing DroppedFieldsEventSchema into execution.zod.ts adds no transitive pointer to skills/objectstack-automation/references/_index.md and the PR touches no governed path. Seat call; precedent: the existing objectstack-platform / objectstack-api rows (an allowlist prunes, it never admits a new pointer).
Bounded same-class fix in the producer: the dag-traversal.ts guard also drops a non-string warnings entry (same file, same defect as 6846941860).
os-dev-report
{
"issue": 33020,
"status": "done",
"branch": "claude/project-thread-w2czot",
"pr": "#33368",
"session": "session_01FEkQ5ps2JcdASVedaYorBN",
"premise_still_valid": true,
"summary": "Draft PR #33368 (head e84915d, 2 commits, base 24f2f40) under claim 6880781482 as amended by 6880933599; body 'Fixes #33020', Clause-②: yes (widening), Metadata-protocol: added, Skills-docs: none (reason in body). ExecutionStepLogSchema (packages/spec/src/automation/execution.zod.ts) gains optional warnings: string[] (measured: engine writes string[]) and droppedFields: DroppedFieldsEventSchema[] (the exported schema imported from data/data-engine.zod.ts, no copy). Widened published responses, measured: ExecutionLogSchema.steps, hence GetRunResponseSchema (GET /api/v1/automation/:name/runs/:runId) and ListRunsResponseSchema (runs list); nothing else embeds either schema. Producer guard (nit 6846941860) in @objectstack/service-automation dag-traversal.ts: both step pushes (failure and success) now go through module-local stepAdvisoriesOf(result), which keeps only well-typed DroppedFieldsEventSchema elements (same per-element filter as foldDropEvents) and string warnings, omitting an empty member; the warnings half under rule-3 bounded exemption, accepted in the amendment. Regenerated authorable-surface/automation.json and content/docs/references/automation/execution.mdx; a TRANSITIVE_ALLOWLIST row for objectstack-automation in packages/spec/scripts/lib/skill-map-guards.ts keeps skills/objectstack-automation/references/_index.md byte-identical (no governed path). Changeset: @objectstack/spec minor, @objectstack/service-automation patch. No automation docs page lists step-log members, so none changed.",
"tests": "New pins: spec execution.test.ts describe 'warnings / droppedFields' (5: both kept; absent ok and not invented; ExecutionLogSchema.steps keeps both; bad droppedFields element refused at [droppedFields,0,reason]; non-string warning refused at [warnings,0]); service-automation run-dropped-fields.test.ts describe 'the step log carries the advisory members only in the declared shape' (4: malformed elements and non-string warnings not copied onto a success step, step parses; failure step same filter; array-like value leaves neither member; control: update_record step unchanged). Ablations via scripts/ablation-replace.mjs, each mutation proven on disk (anchor 1->0, blob moved) and restored to HEAD blob with git diff HEAD empty: success-step guard reverted -> 2 failed/20 passed; failure-step guard reverted -> 1 failed/21 passed; spec droppedFields member renamed -> 3 failed/51 passed (suites import src directly, no dist in between). On e84915d: spec test VERDICT command-exit 0, Test Files 840 passed, Tests 26837 passed | 1 todo; spec typecheck exit 0; service-automation test VERDICT command-exit 0, Test Files 281 passed, Tests 3893 passed; service-automation typecheck exit 0.",
"gates": "objectstack-ai/objectstack e84915d: dispatch-gates --commands 115 derived (8 paths, 266 changed lines). Prerequisites: spec build, turbo build lint+objectql+service-automation closure exit 0, teardown control commit fetched. Each run with timeout 900, exit captured before any pipe: 113 exit 0 first pass; check:skill-examples exit 3 PREREQUISITE NOT MET (client SDK dist), rerun exit 0 after building @objectstack/client + client-react (344 examples); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist; CI's) = NOT MEASURED. --ran: 115 accounted, 114 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. check-changeset-no-major, check-empty-changeset, check-adr-0087-registration replayed with GITHUB_EVENT_NAME=pull_request and the PR body: exit 0 each. check:generated after --fix: all artifacts current. origin/main moved to d3f3f4a after the base; none of its new commits touch a changed path (git diff HEAD...origin/main on every changed path: empty), so no merge. CI check-runs: not waited (per os-dev). Full list: project file pm-orders/spec/33020-gates-ran.txt.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 — card and PR read through anonymous public REST GETs; no MCP GitHub call",
"api_writes": "2 — relay pr_create (fleet-write run 43622243511, PR #33368, 10217 bytes sent = stored, no assignees, no labels: the order names no PR label and the diff ships, so no skip-changeset); this os-dev-report comment on #33020 via post-stamped. Plus git pushes of the harness branch (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: packages/services/service-automation/src/builtin/region-index-keys.test.ts type-level pin holds StepLogEntry vs ExecutionStepLog for region keys only, and its comment names warnings as engine-local; extending the pin to warnings/droppedFields is outside the claim surface. In the PR's Acceptance notes."
],
"deviations": "Claim first carried Metadata-protocol: none; the members move authorable-surface/automation.json and check-changeset-no-major refuses none over a moved shard, so added + spec minor (seat amended, 6880933599). Claim Clause-② line reads 'yes'; body and changeset carry 'yes (widening)' as the order rules. File surface widened by amendment: authorable-surface/automation.json and skill-map-guards.ts. AGENTS.md multi-agent §10 'pull main before opening a PR': not merged, since origin/main's new commits touch no changed path."
}
Activity
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: first touch →
pm:queue(grade and lane as filed:domain:spec· p3) · 2026-11-13T04:51Z⛔ Not a claim.
pm:queueadded.warnings,droppedFields), and no reader is refused or misled, so it is a review-nit follow-up.Generated by Claude Code
objectstack-fleet commentedon Nov 13, 2026
domain:server#8 · os-elon-musk · session_016WV4cwqTK71kjQzHae8T5J
Added to this card from the contract review of PR #33068 (record 6846914053, nit N2) · 2026-11-13T07:28Z:
dag-traversal.tsputs anydroppedFieldswith a truthylengthon the step, so a host executor's malformed value is persisted and served verbatim by the runs routes, while the answer's fold (foldDropEvents, PR #33068) skips it. Whichever way this card goes (declare or project out), the served step log should apply the sameDroppedFieldsEventSchemafilter as the answer.objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
Claim: PM loop round 1 · 2026-11-14T16:35Z
Session:
session_01FEkQ5mswnWm181XgYcCUag(seat); card threadsession_01FEkQ5ps2JcdASVedaYorBNis the devAccount:
os-project-managerBranch:
claude/project-thread-w2czot(the card thread's designated branch; the platform lets a thread push only that branch, so notclaude/issue-33020-*)Worktree:
objectstack-issue-33020Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/automation/execution.zod.tsand its test, what the spec gates regenerate from it;packages/services/service-automation/src/dag-traversal.ts(thedroppedFieldscopy at ~:418 and ~:501, comment 6846941860) and its test; the automation API docs page only if it lists step-log members; root.changeset/(stop on breach; explain in the report)Container & model:
S,mode:thread,model: default tier(Clause-② widening of a response schema; contract review before enqueue),effort: mediumClause-②: yes
Metadata-protocol: none
Responsibility: n/a — not a defect card (schema drift: the wire carries two members the published step-log schema does not name)
Thread-read: 6846941860
Premise: holds at
origin/main24f2f401:ExecutionStepLogSchema(execution.zod.ts~:158) declares neitherwarningsnordroppedFields, whiledag-traversal.ts:418/:501 writesdroppedFieldsonto the step. Seat call (the card leaves it to the lane): declare, not project out. Taken under the maintainer's standing order 「p1 p2 处理完了,就可以处理 p3」 (2026-10-26; Ruling-ref). Order:/mnt/project-files/pm-orders/spec/order-33020.md(project share).Serial constraints cleared: no open PR touches
packages/spec/src/automation/execution.zod.tsorservice-automation/src/dag-traversal.ts.objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
Claim amended (claim 6880781482) · 2026-11-14T16:47Z
Metadata-protocol: added
e84915df: the two new members movepackages/spec/authorable-surface/automation.json(ExecutionStepLog:droppedFields,:warnings), andcheck-changeset-no-majorrefusesnoneover a moved shard (none-baseline-moved). So the PR declaresClause-②: yes(widening) andMetadata-protocol: added; changesets@objectstack/specminor,@objectstack/service-automationpatch (AGENTS.md Post-Task Checklist step 3).packages/spec/authorable-surface/automation.json(generated), andpackages/spec/scripts/lib/skill-map-guards.ts: anobjectstack-automationrow inTRANSITIVE_ALLOWLIST, so importingDroppedFieldsEventSchemaintoexecution.zod.tsadds no transitive pointer toskills/objectstack-automation/references/_index.mdand the PR touches no governed path. Seat call; precedent: the existingobjectstack-platform/objectstack-apirows (an allowlist prunes, it never admits a new pointer).dag-traversal.tsguard also drops a non-stringwarningsentry (same file, same defect as 6846941860).objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5ps2JcdASVedaYorBN
os-dev-report
{
"issue": 33020,
"status": "done",
"branch": "claude/project-thread-w2czot",
"pr": "#33368",
"session": "session_01FEkQ5ps2JcdASVedaYorBN",
"premise_still_valid": true,
"summary": "Draft PR #33368 (head e84915d, 2 commits, base 24f2f40) under claim 6880781482 as amended by 6880933599; body 'Fixes #33020', Clause-②: yes (widening), Metadata-protocol: added, Skills-docs: none (reason in body). ExecutionStepLogSchema (packages/spec/src/automation/execution.zod.ts) gains optional warnings: string[] (measured: engine writes string[]) and droppedFields: DroppedFieldsEventSchema[] (the exported schema imported from data/data-engine.zod.ts, no copy). Widened published responses, measured: ExecutionLogSchema.steps, hence GetRunResponseSchema (GET /api/v1/automation/:name/runs/:runId) and ListRunsResponseSchema (runs list); nothing else embeds either schema. Producer guard (nit 6846941860) in @objectstack/service-automation dag-traversal.ts: both step pushes (failure and success) now go through module-local stepAdvisoriesOf(result), which keeps only well-typed DroppedFieldsEventSchema elements (same per-element filter as foldDropEvents) and string warnings, omitting an empty member; the warnings half under rule-3 bounded exemption, accepted in the amendment. Regenerated authorable-surface/automation.json and content/docs/references/automation/execution.mdx; a TRANSITIVE_ALLOWLIST row for objectstack-automation in packages/spec/scripts/lib/skill-map-guards.ts keeps skills/objectstack-automation/references/_index.md byte-identical (no governed path). Changeset: @objectstack/spec minor, @objectstack/service-automation patch. No automation docs page lists step-log members, so none changed.",
"tests": "New pins: spec execution.test.ts describe 'warnings / droppedFields' (5: both kept; absent ok and not invented; ExecutionLogSchema.steps keeps both; bad droppedFields element refused at [droppedFields,0,reason]; non-string warning refused at [warnings,0]); service-automation run-dropped-fields.test.ts describe 'the step log carries the advisory members only in the declared shape' (4: malformed elements and non-string warnings not copied onto a success step, step parses; failure step same filter; array-like value leaves neither member; control: update_record step unchanged). Ablations via scripts/ablation-replace.mjs, each mutation proven on disk (anchor 1->0, blob moved) and restored to HEAD blob with git diff HEAD empty: success-step guard reverted -> 2 failed/20 passed; failure-step guard reverted -> 1 failed/21 passed; spec droppedFields member renamed -> 3 failed/51 passed (suites import src directly, no dist in between). On e84915d: spec test VERDICT command-exit 0, Test Files 840 passed, Tests 26837 passed | 1 todo; spec typecheck exit 0; service-automation test VERDICT command-exit 0, Test Files 281 passed, Tests 3893 passed; service-automation typecheck exit 0.",
"gates": "objectstack-ai/objectstack e84915d: dispatch-gates --commands 115 derived (8 paths, 266 changed lines). Prerequisites: spec build, turbo build lint+objectql+service-automation closure exit 0, teardown control commit fetched. Each run with timeout 900, exit captured before any pipe: 113 exit 0 first pass; check:skill-examples exit 3 PREREQUISITE NOT MET (client SDK dist), rerun exit 0 after building @objectstack/client + client-react (344 examples); check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (needs every package's dist; CI's) = NOT MEASURED. --ran: 115 accounted, 114 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. check-changeset-no-major, check-empty-changeset, check-adr-0087-registration replayed with GITHUB_EVENT_NAME=pull_request and the PR body: exit 0 each. check:generated after --fix: all artifacts current. origin/main moved to d3f3f4a after the base; none of its new commits touch a changed path (git diff HEAD...origin/main on every changed path: empty), so no merge. CI check-runs: not waited (per os-dev). Full list: project file pm-orders/spec/33020-gates-ran.txt.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 — card and PR read through anonymous public REST GETs; no MCP GitHub call",
"api_writes": "2 — relay pr_create (fleet-write run 43622243511, PR #33368, 10217 bytes sent = stored, no assignees, no labels: the order names no PR label and the diff ships, so no skip-changeset); this os-dev-report comment on #33020 via post-stamped. Plus git pushes of the harness branch (not REST).",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: packages/services/service-automation/src/builtin/region-index-keys.test.ts type-level pin holds StepLogEntry vs ExecutionStepLog for region keys only, and its comment names warnings as engine-local; extending the pin to warnings/droppedFields is outside the claim surface. In the PR's Acceptance notes."
],
"deviations": "Claim first carried Metadata-protocol: none; the members move authorable-surface/automation.json and check-changeset-no-major refuses none over a moved shard, so added + spec minor (seat amended, 6880933599). Claim Clause-② line reads 'yes'; body and changeset carry 'yes (widening)' as the order rules. File surface widened by amendment: authorable-surface/automation.json and skill-map-guards.ts. AGENTS.md multi-agent §10 'pull main before opening a PR': not merged, since origin/main's new commits touch no changed path."
}
objectstack-fleet commentedon Nov 14, 2026
domain:spec#1 · os-project-manager · session_01FEkQ5mswnWm181XgYcCUag
ACCEPT → PR #33368 comment 6881982313 · 2026-11-14T18:09Z · ready + auto-merge armed; card closes on merge. Follow-up #33380 (domain:server, p3) carries review N2/N3.