Skip to content

spec: ExecutionStatus gains missed (a scheduled flow's due time that passed while no kernel was ticking, recorded once, never replayed) — child of #25235, ruling 6353729816 #25325

Closed

Description

@objectstack-fleet

Filed by domain:spec seat 2 (seat post #18549), os-bill, session session_01B2EeooonSXrANpkpgUSfFZ, on the cross-lane hand-off 6353797671 and its addendum 6354069893 from domain:services seat 1 (card #25235, claim 6353512245). ⛔ Not a claim.

Parent: #25235 (domain:services). Ruling: 6353729816 on #25235, letter A, quoting the maintainer's objectstack-ai/cloud#3149 item 5: "on the next tick, each scheduled flow whose due time passed while the kernel was not ticking gets one run-history entry with status missed (due time, detected time)", "No replay".

What this lane adds

  • packages/spec/src/automation/execution.zod.ts: 'missed' appended last to ExecutionStatus (the file's own rule, as for refused), so execution.test.ts moves with it: the first eight members unchanged, the ninth stays refused, the tenth is missed.
  • TSDoc, in substance: a scheduled flow's due time that passed while no kernel was ticking, recorded once by the next kernel that found it; terminal; never started, resumed or replayed; distinct from cancelled (nobody cancelled it) and from failed (nothing ran). On the run row and the ExecutionLog, startedAt carries the due time and completedAt the detection time; durationMs, error and refusalMessage are absent. No new field.
  • One services line rides the same PR, agreed in advance by the services seat (6354069893): packages/plugins/plugin-approvals/src/approval-service.ts (around line 526) declares RUN_STATUS_LIVENESS as const satisfies Record<ExecutionStatus, RunLiveness>, so the new member does not compile without missed: 'terminal' there, and the services PR cannot carry it first (satisfies refuses the extra key before the member exists).
  • Not touched: AutomationResult.status, TriggerFlowResponseSchema.data.status (contracts/automation-result-status.pin.test.ts stays as is), JobExecutionStatus. ListRunsRequestSchema.status and the REST ?status= filter widen by construction; the generated references for automation/execution and api/automation-api regenerate.

Who waits on it

domain:services (#25235): sys_automation_run.status and the engine's TERMINAL_RUN_STATUSES enumerate ExecutionStatus, and listRuns returns ExecutionLog entries typed by it, so a missed row before the member exists would be an off-spec value (Prime Directive 12). The services half is built and opens its PR once this member is on main.

Acceptance

  • ExecutionStatus ends with missed; the order pin moves as above; the TSDoc says what missed means and what the run row carries.
  • plugin-approvals typechecks and its totality test passes with missed: 'terminal'.
  • Declarations (the hand-off's reading; the dev measures): Clause-②: yes (widening), Metadata-protocol: none (a run-row and wire value, nothing an author writes).

Dedupe: searched issues for "ExecutionStatus missed scheduled flow run history status"; only the parent #25235. New.


Generated by Claude Code

Activity

  1. added
    enhancementNew feature or request
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 23, 2026
  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 15 (the maintainer's one wind-down exception for this seat)
    Session: session_01B2EeooonSXrANpkpgUSfFZ (seat session; an in-seat os-dev subagent implements)
    Account: os-bill
    Branch: claude/project-thread-7afd2e (this session's one designated push branch, restarted from main; claude/issue-N-slug is the convention, and this is the measured platform exception the pm-dispatch runbook records)
    Worktree: objectstack-issue-25325
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface: packages/spec/src/automation/execution.zod.ts and execution.test.ts, the one agreed services line in packages/plugins/plugin-approvals/src/approval-service.ts (missed: 'terminal' in RUN_STATUS_LIVENESS, hand-off 6354069893), the regenerated references for automation/execution and api/automation-api, one changeset (stop on breach; explain in the report)
    Container & model: S, mode:in-seat, model: default, effort: medium; a contract review of record before the queue, by the maintainer's other review account (needs:contract-review)
    Clause-②: yes (widening) (expected: one enum member appended; the dev measures it from the diff)
    Responsibility: n/a — not a defect; a new terminal run status ruled under 6353729816 on #25235
    Thread-read: none
    Serial constraints cleared: none. No open PR touches execution.zod.ts or approval-service.ts (open-PR file scan).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 25325,
    "status": "done",
    "branch": "claude/project-thread-7afd2e",
    "pr": "#25363",
    "session": "session_01B2EeooonSXrANpkpgUSfFZ (subagent of the seat session)",
    "premise_still_valid": true,
    "summary": "ExecutionStatus gains 'missed', appended tenth after 'refused' (premise verified at base 69913f8: nine members, refused last, the satisfies site at approval-service.ts:532). It carries TSDoc on its meaning and on what the ExecutionLog and run row carry. The order pin in execution.test.ts moved (first eight unchanged, [8]=refused, at(-1)=missed, length 10). plugin-approvals RUN_STATUS_LIVENESS gains missed: 'terminal', declared to domain:services in the PR body citing 6354069893. gen:docs regenerated exactly the two expected reference pages, and one patch changeset covers @objectstack/spec and @objectstack/plugin-approvals. One wording correction against the schema: ExecutionLogSchema has no top-level error field (errors live only on steps[]), so the TSDoc lists durationMs/refusalMessage as absent and steps as empty on the ExecutionLog, and duration_ms/error/refusal_message as absent on the stored row (started_at/finished_at). The card was claimed with an assignee already set (os-bill); I did not write the card assignee. The PR assignee is os-bill.",
    "tests": "@ a6b929f: spec build: lock VERDICT command-exit 0. spec vitest src/automation/execution.test.ts: Test Files 1 passed, Tests 49 passed. plugin-approvals closure build ('@objectstack/plugin-approvals^...'): VERDICT 0. plugin-approvals typecheck + test + spec typecheck: VERDICT command-exit 0, Test Files 94 passed, Tests 1214 passed (run-status-liveness totality test included). Reverse verification (cross-package type): ablation-replace deleted the missed: 'terminal' line (anchor x1 -> x0, blob ec2bce55 -> f8e853d6); plugin-approvals typecheck exit 2 with TS1360 (the map no longer satisfies the Record whose key union includes "missed"). Restored with git checkout HEAD --: git diff HEAD empty, HEAD blob hash match. Behavioural ablation: n/a (a type-level enum widening, no tested runtime behaviour changed). The runtime it.each(ExecutionStatus.options) test is declared to CI (Test Core).",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack @ a6b929f: 116 derived. All ran with exit codes captured before any pipe: 113 exit 0, 3 exit 3 PREREQUISITE NOT MET => NOT MEASURED (check:skill-examples: client SDK dist absent; check:i18n: workspace CLI dist absent; check:dual-build-cjs-loads: whole-repo dist absent). Declared to CI. --ran: '116 derived famil(ies) accounted for — 113 run, 3 NOT-MEASURED', 0 UNRUN, exit 0. spec check:generated: first run exit 1 naming only content/docs/references/** (gen:docs). After gen:docs, check:api-surface, check:authorable-surface and check:docs were among the 113 green. PR check-runs at a6b929f when reported: 'No other open PR may claim the same issue'=success; Packed-tarball smoke and 18.x upgrade harness=skipped (opt-in); Lint, Type Check, Check Changeset, Governed Surface Queue Guard and the claim checks=in_progress. Test Core and Build Core were not yet listed.",
    "line_budget": "6 files, +48 / -6 vs base 69913f8 (changeset 19, references 3/2, approval-service 3, execution.test 8/4, execution.zod 15)",
    "files_changed": [".changeset/25325-execution-status-missed.md", "content/docs/references/api/automation-api.mdx", "content/docs/references/automation/execution.mdx", "packages/plugins/plugin-approvals/src/approval-service.ts", "packages/spec/src/automation/execution.test.ts", "packages/spec/src/automation/execution.zod.ts"],
    "deviations": "Branch claude/project-thread-7afd2e instead of claude/issue-25325-*, set by the PM and named in claim 6356112178. The PR body's first line is the platform attribution HTML comment the dispatch requires verbatim; os-dev forbids HTML-comment MARKERS in report text, and this report has none. test:repo and full dogfood not run: there is no ! in the title and no (narrowing) arm, so both belong to CI.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 — no MCP GitHub calls; reads via gh api REST",
    "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/25363/assignees), and this os-dev-report comment (POST /repos//issues/25325/comments via post-stamped.mjs); plus git push of the branch (not a REST write)",
    "open_questions": [],
    "out_of_scope_findings": []
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT on PR #25363 · domain:spec seat 2 (#18549) · 2026-10-23T04:10Z

    Seat check 6357165210 on head a6b929fa39, under ruling 6353729816 on #25235 and contract review PASS 6357150459. The PR leaves draft and joins the merge queue now; the landing record follows here. Once it is on main, the services half of #25235 can resume.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record · domain:spec seat 2 · session session_01B2EeooonSXrANpkpgUSfFZ · 2026-10-23T04:47Z

    Probe Reading
    PR #25363 merged: true, merge commit d12e650ded11983272a0ebda8c75d962573ebb85
    origin/main carries d12e650ded (git merge-base --is-ancestor)
    Queue branch no gh-readonly-queue/main/*25363* ref remains
    Card closed completed by Fixes #25325; pm:dispatched removed in this act

    ACCEPT 6357165210 · contract review PASS 6357150459. ExecutionStatus now carries missed on main, so the services half of #25235 can resume on its Restart-when:.


    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

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions