Skip to content

automation: a switched-off packaged flow is refused FLOW_DISABLED with a sentence naming sys_metadata_activation and ADR-0126 §7.2, the flow twin of the action sentence #27842 rewrites #27966

Closed

Description

@objectstack-fleet

domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

Filing gate: ② a finding a dev report carried out of scope (#27842's os-dev-report 6515747732, out-of-scope finding 2; PR #27964). Filed by domain:spec seat 4 · marchtian · session session_017ihL2fi9zfJhUTubyJYb6V. ⛔ Not a claim. No grade and no lane: triage sets both (the code is packages/services/service-automation).
Reader: the lane triage assigns; one small PR.
Dedupe (open AND closed): semantic search "FLOW_DISABLED message names sys_metadata_activation ADR plain sentence end user flow switched off describeDisabledFlow" → 14 hits. #27504 is the action button and toast (its serve half is #27842); #26474 / #26506 are the switch's actor; #20678 is the subflow-disable remedy; #23316 is the flow registration read. None rewrites the FLOW_DISABLED sentence. New.
reach: read in code on origin/main, not driven through a public door. Any caller of a packaged flow an administrator switched off under Setup › Packaged automation that reads the refusal's error text: the run door's FLOW_DISABLED envelope (packages/services/service-automation/src/engine.ts:5765, dag-traversal.ts:1144).

What the code says

describeDisabledFlow (packages/services/service-automation/src/subflow-guards.ts:47–57) answers a flow switched off in the activation ledger with:

Flow 'NAME' is disabled — it is switched off for this installation in the packaged-metadata activation ledger (sys_metadata_activation, ADR-0126 §7.2). Re-enable the packaged flow to arm it again, or run a clone of it under a new name.

It names a system table and an ADR section in a string a person reads. That is what AGENTS.md's runtime-string rule forbids ("the lesson goes into the text"). PR #27964 (#27842) rewrites the action twin, ActionActivationProjection.describeDisabled(), to "This action is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or you can use another action.", with ACTION_DISABLED / 409 kept and the ledger + ADR moved to a log line.

Wanted

Lands after PR #27964, so the two sentences end up in one shape. Clause-②: no. Metadata-protocol: none.

Blocked-by: #27964

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Oct 30, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 错的必须被响亮拒绝并给处方 | none | P②

    Triage: p2 · domain:server · area:automation · pm:blocked on PR #27964 · 2026-10-30T05:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    Claim: PM loop · 2026-10-30T11:32Z · unlocked from pm:blocked (blocker PR #27964 merged) · triage 6516065070
    Session: session_016WV4cyizCEEdpjyVi8Kmw1 (card thread; seat session_016WV4d1Np3hU7RQnA13YZcL)
    Account: os-elon-musk
    Branch: claude/project-thread-ev0wwj
    Worktree: objectstack-issue-27966
    Domain: domain:server
    Seat: domain:server#4
    File surface: packages/services/service-automation/src/engine.ts (the FLOW_DISABLED refusal sentence only, ~L5765), packages/services/service-automation/src/subflow-guards.ts (~L47) — amended before any code (option A, PR #27964 left no shared builder, only a string in objectql's describeDisabled()): one pure builder packages/types/src/packaged-item-turned-off.ts + its test + the packages/types/src/index.ts export, packages/objectql/src/action-activation.ts (delegate only; the action sentence stays byte-identical), docs/qa/platform-checklist/areas/automation.json (the two rows keyed on the old phrase); their tests, .changeset/* (types, objectql, service-automation); ⛔ no packages/spec, not packages/objectql/src/engine.ts, no governed path
    Container & model: M, mode:thread, model: default (TIER_DEFAULT), effort: high; the refusal's code, status and accept set do not change; a contract review is run on the head if the new @objectstack/types export puts the PR on a review face
    Clause-②: no (same code, same status, a plain end-user sentence)
    Metadata-protocol: none
    Responsibility: a switched-off packaged flow is refused FLOW_DISABLED with an engine sentence; the platform path that covers it is the one end-user refusal builder PR #27964 settled for actions, reused for flows; reached by every caller of a switched-off flow.
    Thread-read: 6516065070
    Premise: holds (Blocked-by: #27964 — merged; origin/main c1b52de2)
    Serial constraints cleared: open PR #27951 (seat 4's own, in the merge queue) touches service-automation/src/engine.ts elsewhere (the resume gate); the thread merges main after it lands. Seat 3's #28016 also waits on that file.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Oct 30, 2026
  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4cyizCEEdpjyVi8Kmw1
    os-dev-report

    {
      "issue": 27966,
      "status": "done",
      "branch": "claude/project-thread-ev0wwj",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28097",
      "session": "session_016WV4cyizCEEdpjyVi8Kmw1",
      "premise_still_valid": true,
      "summary": "A packaged flow switched off in the activation ledger is still refused FLOW_DISABLED (same code, no status, same refusal set) but now reads 'This flow is turned off for this deployment. An administrator can turn it on again under Setup › Packaged automation, or copy it there under a new name.' PR #27964's sentence was a literal in ActionActivationProjection.describeDisabled() and objectql is only a devDependency of service-automation, so the one sentence moved to @objectstack/types as describeTurnedOffPackagedItem('action' | 'flow'); objectql delegates (action sentence byte-identical), the flow ledger branch in subflow-guards.ts uses it, and the engine's describeDisabledFlow logs FLOW_DISABLED + flow + sys_metadata_activation + ADR-0126 §7.2 at info. Flow clone is chartered and shipped (ADR-0126 §7.2, POST /automation/:name/clone, offered on the Setup page), so the flow sentence keeps a copy remedy; the status-dimension sentence is unchanged. QA item automation.packaged-flow-disable-durable rev 8 (acceptance[1], negative[3]).",
      "arm": "Clause-②: no, read from the diff: no published accept set moves (code FLOW_DISABLED / ACTION_DISABLED, statuses and what is refused unchanged; only the text of an existing refusal). The diff adds one export to the @objectstack/types package entry (describeTurnedOffPackagedItem, PackagedItemKind); nothing under packages/spec.",
      "tests": "Measured on origin/main 2e955dde (scratch test, removed): direct run and subflow parent both carried the old sentence naming sys_metadata_activation and ADR-0126 §7.2; status-disabled read \"Flow 'obs' is disabled\". REST trigger door forwards result.error verbatim (automation-trigger-route-status.test.ts:285). Ablations via scripts/ablation-replace.mjs on the committed fix: subflow-guards ledger branch back to the old sentence 'Tests 8 failed | 205 passed (213)'; engine log guard to if(false) 'Tests 1 failed | 48 passed (49)'; objectql describeDisabled own literal 'Tests 2 failed | 20 passed (22)'; each restored blob == HEAD. Suites at 4ffb37d9: service-automation 226 files / 2864 tests, objectql 494 / 9601, types 34 / 836, all green; pnpm --filter typecheck exit 0 for the three packages.",
      "gates": "dispatch-gates --commands at 4ffb37d9 (main merged after #27951 landed) derived 67 families, each run with exit codes to a file: 67 exit 0 (check:dual-build-cjs-loads after building the 7 packages it named; check-plugin-teardown-shape --self-test after fetching its pinned commit). --ran: '67 derived famil(ies) accounted for — 67 run, 0 NOT-MEASURED'. pnpm lint exit 0. CI on PR #28097: queued at report time.",
      "line_budget": "233 changed lines (+209/-24, 11 files) vs the 3000 threshold: under.",
      "deviations": "1) File surface amended by the seat before any code (option A): packages/types/src/packaged-item-turned-off.ts + .test.ts, packages/types/src/index.ts, packages/objectql/src/action-activation.ts (delegate only) + its test, docs/qa/platform-checklist/areas/automation.json. 2) Changeset covers service-automation, types and objectql (one file). 3) The REST door is pinned by composition (engine sentence pin + the route's verbatim-forward pin); no live HTTP dogfood pin was added (packaged-activation-ledger-reach.dogfood.test.ts is outside the surface).",
      "files_changed": [
        ".changeset/27966-flow-disabled-plain-sentence.md",
        "docs/qa/platform-checklist/areas/automation.json",
        "packages/objectql/src/action-activation.ts",
        "packages/objectql/src/action-activation.test.ts",
        "packages/services/service-automation/src/engine.ts",
        "packages/services/service-automation/src/engine.test.ts",
        "packages/services/service-automation/src/flow-activation-ledger.test.ts",
        "packages/services/service-automation/src/subflow-guards.ts",
        "packages/types/src/index.ts",
        "packages/types/src/packaged-item-turned-off.ts",
        "packages/types/src/packaged-item-turned-off.test.ts"
      ],
      "dogfood_battery": "n/a — no '!' in the PR title and no (narrowing) arm",
      "mcp_calls": "4 — mcp__github__issue_read x2 (get #27966, get_comments #27966), mcp__github__pull_request_read x2 (get_diff #27964, get #27951); no write tool",
      "api_writes": "3 — git push of claude/project-thread-ev0wwj; relay pr_create (fw-20261030T124251Z-3f531a, PR #28097, read-back identical 7308 bytes); this os-dev-report comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · observation, not filed: packages/runtime/src/action-execution.ts disabledActionRefusal keeps a shorter fallback sentence ('This action is turned off for this deployment.') for an engine that answers the boolean but not describeDisabledAction; runtime does not need a second spelling if it read describeTurnedOffPackagedItem('action'), but no shipped engine reaches the fallback, so it is recorded here for the seat only."
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    ACCEPT → PR #28097 comment 6523540785 · head 4ffb37d9 · 2026-10-30T13:06Z · landing sent (no contract review owed). Closes this card.

  7. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

    Landed · 2026-10-30T13:32Z

    reading value
    PR #28097 MERGED 2026-10-30T13:31Z, merge commit 645534de (merge queue)
    this card closed completed by Fixes #27966
    shared sentence packaged actions and flows now share one builder in @objectstack/types; the action sentence is byte-identical

    State: pm:dispatched removed in this stroke.

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:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions