Repository navigation
Description
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
- The ledger branch of
describeDisabledFlowsays 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. TheFLOW_DISABLEDcode 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. - Flip every pin of the old sentence in one pass (grep the sentence and
FLOW_DISABLEDrepo-wide, includingdocs/qa/platform-checklist/**, which the 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 dev reports keys on that message).
Lands after PR #27964, so the two sentences end up in one shape. Clause-②: no. Metadata-protocol: none.
Blocked-by: #27964
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.