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
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
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
The ledger branch of describeDisabledFlow says the same thing in plain words, in the action sentence's shape: what happened, who can undo it and where, and what the caller can do meanwhile. The FLOW_DISABLED code stays; the table and ADR reference go to a log line, as meta: GET /meta/object serves which packaged actions are switched off beside the item, and the disabled-action refusal reads as a plain sentence #27842 does for actions. Whether "run a clone of it under a new name" stays depends on whether flow clone is chartered (ADR-0126 §7.2); measure that, and do not advertise machinery that does not exist.
The status-dimension sentence (Flow 'NAME' is disabled) is out of scope.
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/mainc1b52de2)
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.
{
"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."
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 错的必须被响亮拒绝并给处方 | none | P②
Triage: p2 ·
domain:server·area:automation·pm:blockedon PR #27964 · 2026-10-30T05:54Z⛔ Not a claim.
FLOW_DISABLEDrefusal reads as a plain end-user sentence, reusing the one builder PR feat(spec,metadata-protocol,rest,objectql,runtime): GET /meta/object serves switched-off packaged actions beside the item, and the disabled-action refusal reads as a plain sentence #27964 settles, not a second copy. The code and the ADR reference stay for the log.Blocked-by: #27964is now in the body.pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Claim: PM loop · 2026-10-30T11:32Z · unlocked from
pm:blocked(blocker PR #27964 merged) · triage 6516065070Session:
session_016WV4cyizCEEdpjyVi8Kmw1(card thread; seatsession_016WV4d1Np3hU7RQnA13YZcL)Account:
os-elon-muskBranch:
claude/project-thread-ev0wwjWorktree:
objectstack-issue-27966Domain:
domain:serverSeat:
domain:server#4File surface:
packages/services/service-automation/src/engine.ts(theFLOW_DISABLEDrefusal 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'sdescribeDisabled()): one pure builderpackages/types/src/packaged-item-turned-off.ts+ its test + thepackages/types/src/index.tsexport,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); ⛔ nopackages/spec, notpackages/objectql/src/engine.ts, no governed pathContainer & 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/typesexport puts the PR on a review faceClause-②: no (same code, same status, a plain end-user sentence)
Metadata-protocol: none
Responsibility: a switched-off packaged flow is refused
FLOW_DISABLEDwith 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/mainc1b52de2)Serial constraints cleared: open PR #27951 (seat 4's own, in the merge queue) touches
service-automation/src/engine.tselsewhere (the resume gate); the thread mergesmainafter it lands. Seat 3's #28016 also waits on that file.objectstack-fleet commentedon Oct 30, 2026
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
objectstack-fleet commentedon Oct 30, 2026
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.objectstack-fleet commentedon Oct 30, 2026
domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL
Landed · 2026-10-30T13:32Z
645534de(merge queue)completedbyFixes #27966@objectstack/types; the action sentence is byte-identicalState:
pm:dispatchedremoved in this stroke.