Repository navigation
[finding] cli(banner): flows unbound only because the deployment switched scheduled work off still print as a yellow ⚠ in the boot banner's Flows section — the last alarm lines on the showcase, none actionable #22255
Description
Activity
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsTriage: first grade,
bug·priority:p3·domain:cli·area:devpath·pm:queue(findingremoved). Direction: the deployment-policy class prints underℹ; every other unbound reason keeps⚠Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T10:01Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/cli/src/utils/format.ts(printAutomationSummary) ⇒domain:cli; rationale: the glyph is this lane's printer.- Execution, not a re-ruling. The maintainer's later direction on [maintainer] dev-mode noise budget: a blank project written verbatim from the tutorial boots with 4 WARN lines and only one needs the author's hand — expected degradations to info, stacks only at debug, the actionable line highlighted with a one-line fix #22160, 「预期中的降级记 info」, covers this class. A switch the deployment turned off by its documented default is an expected degradation. boot output: the "schedule trigger is NOT bound" sentence (~600 chars) prints twice for every scheduled flow — 16 of an 8-flow app's boot lines — and the loopback OAuth-over-HTTP warning fires on every localhost boot; one summary line per warning class #22073's one-line-per-class shape stays; only this class's glyph changes.
- Pin: beside boot output: the "schedule trigger is NOT bound" sentence (~600 chars) prints twice for every scheduled flow — 16 of an 8-flow app's boot lines — and the loopback OAuth-over-HTTP warning fires on every localhost boot; one summary line per warning class #22073's class pins. The policy class is dim
ℹwith its flows listed. Control: a binding failure keeps⚠.
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingand removed
on Oct 8, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01BmsuLyUeuG5CNpZFMH1jzS
Account:os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22255-policy-unbound-info-glyph
Worktree:objectstack-issue-22255
Domain:domain:cli
Seat:domain:cli#1
File surface:packages/cli/src/utils/format.ts(printAutomationSummary's unbound-class loop),packages/cli/src/utils/format.boot-warning-classes.test.ts, and.changeset/22255-*.md(@objectstack/clipatch). ⛔ Notpackages/cli/src/commands/serve.ts, where the summary is built: PR #22381 holds that file. Stop on breach; explain in the report.
Container & model:S, not mechanical,mode:subagent,model: default (opus).dispatch-gates --tierprints "no path-derived mandate". Telling the policy class apart without matching on prose is a design judgment.
Clause-②: no
Responsibility:packages/cli/src/utils/format.ts(printAutomationSummary, this lane's printer) prints the yellow warning glyph | none:service-automation's own per-flow warning is already withheld from Boot diagnostics | everyos dev/os startboot of an app with scheduled flows on the default deployment policy reaches it; it is used today (the showcase boot was measured)
Thread-read: 6057431712
Serial constraints cleared: no open PR touchespackages/cli/src/utils/format.tsorformat.boot-warning-classes.test.ts(the REST file lists of the open PRs read this round; PR #22383, #22161 stage 2, changes nopackages/clifile). Lane siblings in flight: #22310 (automation.ts) and #22190 (collect-docs.ts,compile.ts), both disjoint.
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 22255, "status": "done", "branch": "claude/issue-22255-policy-unbound-info-glyph", "pr": "https://github.com/objectstack-ai/objectstack/pull/22409", "session": "session_01BmsuLyUeuG5CNpZFMH1jzS — the dispatching PM session's id (mode:subagent: this run shares the parent's session)", "premise_still_valid": true, "summary": "printAutomationSummary (packages/cli/src/utils/format.ts) now prints an unbound-flow class whose reason is the deployment's scheduled-work sentence dim under ℹ (count, trigger type, first sentence and flow list kept); every other class keeps its yellow ⚠, and text, order and the records handed back as restatedAbove are unchanged. The class is recognised by identity, reason === SCHEDULED_WORK_DISABLED_REASON from @objectstack/types, never by prose. Measured (H2 confirmed): the engine records scheduledWorkDisabledReason(policy) of the refusing reading, and on every env-resolved policy that is the constant byte for byte (resolveScheduledWorkPolicy never sets hostDisabledReason; 0 non-test producers of hostDisabledReason in the tree vs 4 test hits as control). So no structured kind was needed: serve.ts (PR #22381) and packages/spec untouched (H3 fork not reached). H1 confirmed as stated; H4 holds (restated records pushed for both glyphs, pinned). Public door measured: objectstack dev --seed-admin --fresh on examples/app-showcase prints both policy lines with SGR dim under ℹ and Boot diagnostics still reads '(2 more already listed above)'. Worktree and its node_modules removed after the PR opened; my showcase server (pid 16073, port 38421) stopped, tempdir gone.", "tests": "All at head 62c86cba9 (base 11d119ab1). (1) Closure build: os-verify-lock -c \"pnpm turbo run build --filter='@objectstack/cli^...' --concurrency=2\" — 'Tasks: 58 successful, 58 total' · VERDICT command-exit 0. (2) Target: pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 src/utils/format.boot-warning-classes.test.ts — 'Test Files 1 passed (1) · Tests 21 passed (21)' · VERDICT command-exit 0. (3) Unit layer: pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 — 'Test Files 270 passed (270) · Tests 3971 passed (3971)' · VERDICT command-exit 0. Integration layer declared to CI (diff reaches no integration file, no spawn entry). (4) pnpm --filter @objectstack/cli typecheck — exit 0; tsc --noEmit then check:test-typecheck: 'OK — @objectstack/cli's test layer compiles under packages/cli/tsconfig.test.json'. (5) pnpm lint (full, eslint . --no-inline-config) — exit 0, no findings (not narrowed). (6) Ablation on the committed fix via scripts/ablation-replace.mjs inside the lock with built-in restore: leg 1 identity forced false (anchor 1 to 0, blob 5804f510beed to 8418782e4e04) — 'Tests 3 failed | 18 passed (21)': the real-boot ℹ pin, the first-sentence pin, the dim/ℹ pin; leg 2 identity replaced by reason.includes('disabled by deployment policy') (blob to fd68dbfd63fd) — 'Tests 1 failed | 20 passed (21)': the identity pin. Both restores: blob after restore == HEAD 5804f510beed, git diff HEAD empty. Direction as predicted (turn red). Subject resolves to src (relative ./format.js through vitest), so no dist rebuild in either leg. (7) Public door: showcase boot raw capture line 43-44 open with ESC[2m and read 'ℹ 1 flow declares a 'time_relative'|'schedule' trigger but is NOT bound — disabled by deployment policy — …'.", "mcp_calls": "0", "api_writes": "3 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by the fleet-write relay as objectstack-fleet[bot]: (a) pr_create = POST /repos/objectstack-ai/objectstack/pulls (PR 22409, draft, body read back 7624/7624 bytes identical); (b) label-write --assign os-elon-musk = POST /repos/objectstack-ai/objectstack/issues/22409/assignees (read-back MATCHES; 0 labels written); (c) this os-dev-report = POST /repos/objectstack-ai/objectstack/issues/22255/comments. Plus 2 git push (not REST).", "gates": [ "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0 :: ✓ check-adr-0087-registration: this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen).", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0 :: ✓ check-adr-0087-registration --self-test: 441 assertions over real temp git repos (real scan()/assertInputs() path)", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 :: ✓ This diff introduces no `major` bump.", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0 :: ✓ check-changeset-no-major --self-test: 339 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #", "node scripts/check-ci-filter-parity.mjs :: exit 0 :: OK: all 20 build input(s) turbo.json declares outside the packages (itself, 2 globalDependencies, and every `$TURBO_ROOT$` input of a build Build Core runs) and all 11 sc", "node scripts/check-closing-keyword-parity.mjs :: exit 0 :: • packages/spec/src/migrations/registry.ts -- 2379111 bytes exceeds the sweep's 2097152-byte cutoff for UNREGISTERED files", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 :: ✓ check-closing-keyword-parity --self-test: 40 assertions, 5 mutations of the shipped parsers each driven to red.", "node scripts/check-comment-mask-adoption.mjs :: exit 0 :: OK check:comment-mask-adoption — 14 private comment-stripper(s) under packages/** + examples/**, all 14 recorded and every recorded row still reached (13 unconverted, 1 ", "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0 :: PASS check-comment-mask-adoption --self-test (0 failure(s))", "node scripts/check-comment-mask-corpus.mjs :: exit 0 :: ✓ comment-mask corpus sweep [scripts/js-comment-mask.mjs]: 8499 files, 0 disagree, 0 unparseable, 194.5s (comparator self-test: 26 cases pass).", "node scripts/check-dts-emitted.mjs --self-test :: exit 0 :: check-dts-emitted self-test: all assertions passed.", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0 :: ✓ No changeset from the merge base modified or deleted by this diff (#17712).", "node scripts/check-empty-changeset.mjs --self-test :: exit 0 :: ✓ check-empty-changeset --self-test: 170 assertions over real temp git repos (real scan() path)", "node scripts/check-issue-citations.mjs :: exit 0 :: ✅ check-issue-citations: every citation this change adds resolves (or is a declared cross-repo reference).", "node scripts/check-keyed-text-bounds.mjs :: exit 0 :: ✓ check:keyed-text-bounds: 111 *.object.ts files under packages/** + apps/** + examples/** (walk is repo-wide; 0 outside), 116 object declarations, 241 declared index ent", "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0 :: PASS check-keyed-text-bounds --self-test (0 failure(s))", "node scripts/check-platform-object-tenancy-census.mjs :: exit 0 :: ✓ platform-object tenancy census matches the tree: 83 platform-namespace objects, 48 in the machinery's reach, 35 outside it, every exclusion explained by a declaration o", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0 :: ✓ check-platform-object-tenancy-census self-test: all checks pass (83 objects, 35 outside the machinery)", "node scripts/check-plugin-teardown-shape.mjs :: exit 0 :: ✓ check:plugin-teardown-shape: 69 Plugin implementation(s) across 7923 source(s) under packages/**; every teardown-shaped method (stop / shutdown / close / dispose) sits ", "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0 :: ✓ check-plugin-teardown-shape self-test: 48 cases pass (real pre-#10375 fixture reds, the repaired file and both delegating-alias directions stay green, every roster name", "node scripts/check-registry-log-declared.mjs :: exit 0 :: examples/app-showcase — S1 constructs a SchemaRegistry in its tests", "node scripts/check-registry-log-declared.mjs --self-test :: exit 0 :: self-test OK: 16 cases + level-vocabulary read + population declaration + real-tree selection floor.", "node scripts/check-rest-log-spy-declared.mjs :: exit 0 :: OK: 30 of 270 test file(s) beside packages/rest/src/log.ts observe the fault log, and every one of them declares its own OS_REST_LOG level.", "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0 :: ✓ the real tree yields a NON-EMPTY observer population that is a strict subset of its test files", "node scripts/check-system-context-census.mjs :: exit 0 :: check-system-context-census: OK — 118 elevation read sites in 20 packages across 55 files, living in 101 symbol(s); the page cites 114 symbol(s) against 114 required, ove", "node scripts/check-system-context-census.mjs --self-test :: exit 0 :: check-system-context-census --self-test: all cases passed", "node scripts/check-undeclared-dep-imports.mjs :: exit 0 :: ✓ check:undeclared-dep-imports: 80 workspace packages under packages/** + apps/** + examples/**, 2951 non-test src files, 2398 @objectstack/* specifiers (0 assembled, not", "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0 :: PASS check-undeclared-dep-imports --self-test (0 failure(s))", "node scripts/docs-audit/check-affected-docs.mjs :: exit 0 :: → the unreachable rows themselves: this command with --json", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0 :: ✓ check-drift-comment: 66 cases pass across 5 fixture diff(s).", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0 :: ✓ self-test passed", "node scripts/release-pending-publish.mjs --self-test :: exit 0 :: ✓ release-pending-publish self-test: 92 cases across 22 batteries pass.", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 :: ✓ check:duration-unit-keys — 197 unit-declaring numeric key(s) across 2955 source file(s) all carry their unit in the key name (or in a sibling `unit`, or under a declare", "pnpm check:changeset-gate-self-tests :: exit 0 :: ✓ check-changeset-no-major --self-test: 339 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #", "pnpm check:cross-package-test-inputs :: exit 0 :: OK: 30 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob (6 of them on a split \"test:repo\" task); 13 walked root(s) judged, 3 on", "pnpm check:doc-authoring :: exit 0 :: ✓ doc authoring guard: sibling-package prose ids hold the baseline — 0 pinned site(s) across 0 file(s), 89472 string(s) read in 1283 parsed source(s) (seen floor 40000 st", "pnpm check:driver-memory-census :: exit 0 :: check-driver-memory-census: OK — every declaration is ledgered, every ledger entry is live, and every ruled file states \"#6664 census: 2 ruled consumers\". This gate polic", "pnpm check:engine-double-contract :: exit 0 :: check-engine-double-contract: OK — 990 pinned, 129 in the DEBT ledger, 3 exempt.", "pnpm check:gitlink-declared :: exit 0 :: check-gitlink-declared: OK (10388 index entries -- 0 gitlink(s) at mode 160000; no .gitmodules in the index, so nothing is declared; nothing to declare).", "pnpm check:i18n :: exit 0 (first run exit 3: PREREQUISITE NOT MET while the closure build was in flight; re-run after build) :: check-i18n-bundles: OK (9 package(s) — all bundles in sync, no undeclared authoring keys).", "pnpm check:i18n-coverage :: exit 0 (first run exit 3: PREREQUISITE NOT MET while the closure build was in flight; re-run after build) :: check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new).", "pnpm check:i18n-walk-parity :: exit 0 (first run exit 3: PREREQUISITE NOT MET while the closure build was in flight; re-run after build) :: ✓ check-i18n-walk-parity: 11 declared group(s), 9 walked, 2 exempted — every declared group has an extractor face.", "pnpm check:issue-citations :: exit 0 :: ✅ check-issue-citations --self-test: grammar narrowed, every spelling enumerated, qualifier a closed set of repositories, four 404 causes kept apart, both board strategie", "pnpm check:logger-receiver-detach :: exit 0 :: OK every log channel keeps its receiver: 3234 non-test TS file(s) walked, 0 detach(es) on the 5 declared receiver-sensitive sink spelling(s).", "pnpm check:nul-bytes :: exit 0 :: check-nul-bytes: OK (scanned 10379 text file(s) -- 10379 tracked, 0 untracked-not-ignored; skipped 9 binary; no raw ASCII control bytes).", "pnpm check:objectql-double-limit :: exit 0 :: OK ObjectQL double `limit` conformance holds: 471 double(s) graded, 274 apply the caller's bound or refuse it loudly.", "pnpm check:objectui-changeset :: exit 0 :: ✓ objectui-range --self-test: all checks passed", "pnpm check:org-identifier :: exit 0 :: check-org-identifier: OK (3256 author-facing source file(s), 18 session binding(s) resolved, no removed session.tenantId alias).", "pnpm check:page-declaration-shape :: exit 0 :: check-page-declaration-shape: OK — 34 page entries across 3246 sources under packages/**, examples/**, apps/** all reach the kernel through a discoverable declaration (`:", "pnpm check:pm-changeset-deadline-census :: exit 0 :: ✓ changeset-deadline-census --self-test: all cases passed across 5 batteries (what counts as a named target, the controls that make a zero a reading, the verdict truth ta", "pnpm check:query-options-erasure :: exit 0 :: ✓ query-options-erasure ratchet holds: 65 unswept non-test site(s) in 17 file(s), none new, and every file measured parsed. Every other non-test file under packages/ is c", "pnpm check:refd-timer-probe :: exit 0 :: OK check-refd-timer-probe: 8494 source file(s) swept; the process-global timer probe is read in packages/qa/refd-timer-testkit/src/index.ts and nowhere else.", "pnpm check:slot-lookup :: exit 0 :: ✓ slot-lookup ratchet holds: 104 unswept site(s) in 25 file(s), none new, and every file in the population parsed. Every other file under packages/ is covered by `pnpm li", "pnpm check:test-source-alias :: exit 0 :: check-test-source-alias OK — 73 packages with tests scanned; 60 registered as still resolving a workspace dep through `dist/`; 53 published subpath(s) resolved through ev", "pnpm check:tier-file-adoption :: exit 0 :: OK: 80 workspace package(s) walked, 82 nightly-tier test file(s) on disk (82 e2e, 0 live), owned by 1 package(s); every one reads OS_TEST_TIERS.", "pnpm check:watch-hint-literal :: exit 0 :: ✓ check-watch-hint-literal: 72 declaration(s) across 4 rostered name(s) -- ROOT_DIR_WATCH_HINTS 48, ROOT_FILE_WATCH_HINTS 13, ROOT_WATCH_HINTS 3, DECLARED_WATCH_HINTS 8 -", "pnpm check:where-matcher :: exit 0 :: ✓ where-matcher conformance holds: 492 matcher(s) discovered, 492 answer the combinator battery correctly or refuse it loudly (321 refuse).", "pnpm check:dts-closure :: exit 0 :: check-dts-closure self-test: all assertions passed.", "pnpm check:dual-build-cjs-loads :: exit 0 (first run exit 3: PREREQUISITE NOT MET while the closure build was in flight; re-run after build) :: ✓ check:dual-build-cjs-loads — 107 published require entry point(s) across 66 package(s) load; 717 emitted CommonJS file(s) parse; 1 cross-format behaviour probe(s) agree", "pnpm check:lean-entry-closure :: exit 0 :: ✓ check-lean-entry-closure: 2 published condition(s) measured from a real load.", "pnpm check:published-files :: exit 0 :: ✓ check:published-files — 69 publishable package(s) of 80 workspace member(s) declare a `files` whitelist that covers every entry point plus CHANGELOG.md and admits no te", "pnpm check:sourcemap-no-sources-content :: exit 0 :: check-sourcemap-no-sources-content self-test: all assertions passed.", "pnpm check:type-check-coverage :: exit 0 :: ⚠ The delta is information, not a verdict — this population grows AND shrinks for good reasons, and only the floors decide.", "pnpm check:type-check-debt :: exit 0 :: check-type-check-coverage --re-measure: OK — 1 ledger entr(ies) re-measured in 240.3s, 26 raw tsc error(s) total, none above its recorded number.", "pnpm --filter @objectstack/cli typecheck :: exit 0 :: check:test-typecheck: OK — @objectstack/cli's test layer compiles under packages/cli/tsconfig.test.json", "pnpm lint :: exit 0 :: (no output — zero findings)", "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran-exits :: exit 0 :: ✓ dispatch-gates --ran: 64 derived famil(ies) accounted for — 64 run, 0 NOT-MEASURED (a DERIVED zero — all 64 recorded an exit code and none of them is 3)." ], "gates_note": "Verdict = the gate's own pass line where its output tail carried one, else the tail's last line; every exit captured before any pipe. Re-derivation after the last commit (no paths) matched the PM lead exactly (same 64 families; change set .changeset/22255-policy-unbound-info-glyph.md, format.boot-warning-classes.test.ts, format.ts). CI at report time: 31 check runs on 62c86cba9 — 11 success, 3 skipped, 17 in_progress, 0 failed (in_progress, not waited on).", "line_budget": "none set; +173 / -7 over 3 files (format.ts +46/-6, format.boot-warning-classes.test.ts +116/-1, changeset +11/-0)", "files_changed": [ ".changeset/22255-policy-unbound-info-glyph.md", "packages/cli/src/utils/format.boot-warning-classes.test.ts", "packages/cli/src/utils/format.ts" ], "deviations": [ "Closure build spelled pnpm turbo run build --filter='@objectstack/cli^...' --concurrency=2 (turbo, shared cache) instead of the role file's pnpm --filter '@objectstack/cli^...' build; same closure (58 tasks).", "4 gates (check:i18n, check:i18n-coverage, check:i18n-walk-parity, check:dual-build-cjs-loads) first exited 3 (PREREQUISITE NOT MET — they ran while the closure build was still in flight); re-run after the build, all exit 0. Not failures; recorded with their final exit.", "Commit trailer: the AGENTS.md model-free pair (Co-authored-by: Claude / Claude-Session), not the harness reminder's model-named Co-Authored-By; PR footer in the AGENTS.md session-URL form, not the harness reminder's form. Both per the role file's precedence clause." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · docs/qa/platform-checklist/areas/platform-core.json acceptance[2].verify still describes the policy lines as '⚠ … disabled by deployment policy'; after this PR they print ℹ. Clause unchanged and still holds; internal checklist prose, not published · noted in PR Acceptance notes, not filed", "carrier: none (承接者:无) · pending .changeset/22073-boot-warning-one-line-per-class.md quotes the policy class with ⚠; this PR's changeset states the move to ℹ and both ship in the same release. Amending the earlier entry before release is a seat call · noted in PR Acceptance notes, not filed", "carrier: none (承接者:无) · a host-injected per-kernel ScheduledWorkPolicy with its own hostDisabledReason keeps ⚠ (not the documented default; printer cannot know the sentence). Dormant for this banner: 0 non-test producers (control: 4 test hits). Distinguishing it would need a structured kind on the audit row (spec contract + serve.ts) · noted in PR Acceptance notes, not filed" ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsACCEPT: PR #22409 (head
62c86cba9)domain:cliseat (#6024) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-09T03:16Z. Reviewed against GitHub, not against the report.- PR shape: draft, base
main; the first line isFixes #22255, the only closing keyword in the body, and the body carries a line-initialClause-②: no. Three files,+173 / -7, all inside the claim's surface:format.ts,format.boot-warning-classes.test.ts, and.changeset/22255-policy-unbound-info-glyph.md(@objectstack/clipatch).serve.ts,packages/spec,packages/servicesandpackages/triggersare untouched. - Diff read:
isDeploymentPolicyClass(reason)isreason === SCHEDULED_WORK_DISABLED_REASON, an identity with the producer's constant (@objectstack/types, re-exported throughexport * from './env.js';@objectstack/clideclares the package). ⛔ No regex or substring on prose.- That class's line prints
chalk.dimunderℹ; every other class keepschalk.yellowand⚠. The text, order andrestatedAboverecords are unchanged for both.
- Identity checked at source:
scheduledWorkDisabledReason(policy)returnspolicy.hostDisabledReason ?? SCHEDULED_WORK_DISABLED_REASON. The dev measured 0 non-test producers ofhostDisabledReason(4 test hits as the control), so on every env-resolved policy the equality is exact. A host-supplied sentence keeps⚠, which is the loud direction. - Triage direction met: only this class's glyph changes, and boot output: the "schedule trigger is NOT bound" sentence (~600 chars) prints twice for every scheduled flow — 16 of an 8-flow app's boot lines — and the loopback OAuth-over-HTTP warning fires on every localhost boot; one summary line per warning class #22073's one-line-per-class shape stays. The pin sits beside boot output: the "schedule trigger is NOT bound" sentence (~600 chars) prints twice for every scheduled flow — 16 of an 8-flow app's boot lines — and the loopback OAuth-over-HTTP warning fires on every localhost boot; one summary line per warning class #22073's class pins. Controls: a binding failure and a missing trigger keep
⚠, andrestatedAboveis unchanged. - Spot-checked: the ablations turn red in the predicted direction. Forcing the identity false fails 3 of 21; replacing it with a substring match fails the identity pin (1 of 21). The public door was measured on the showcase boot: both policy lines open with the dim escape under
ℹ. - Gates: the dev's union at
62c86cba9(the PR's current head) was 64 of 64 exit 0,--ranreconciled with 0 unrun, and the fullpnpm lintexited 0. CI: in progress at this read (18 success, 3 skipped, 10 running, 0 failed). Landing waits for every check to be green. - Out of scope,
Acceptance notes(none rises to the filing gate):- The pending
.changeset/22073-boot-warning-one-line-per-class.mdquotes the policy class with⚠. Both changesets ship in the same@objectstack/clirelease, and this one states the move toℹ, so the compiled entry reads correctly in order. The seat does not amend the earlier changeset, because a deliberate correction would re-redcheck-empty-changesetfor no reader gain. docs/qa/platform-checklist/areas/platform-core.json's verify prose still names⚠for these lines. It is internal checklist text, not published (domain:devx's; no carrier).- A host-injected policy with its own reason keeps
⚠. It is dormant: there is no non-test producer.
- The pending
Generated by Claude Code
- PR shape: draft, base
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded: PR #22409 →
abd254508b, a single-parent queue squashdomain:cliseat (#6024) ·session_01BmsuLyUeuG5CNpZFMH1jzS· 2026-10-09T04:20Z- Landing shape:
abd254508bhas one parent (git rev-list --parents -n 1gives 2 fields) and is an ancestor oforigin/main. It entered the merge queue at 2026-10-09T03:47Z and merged at 2026-10-09T04:17Z, on that first entry. - Content on
origin/main:packages/cli/src/utils/format.tscarriesisDeploymentPolicyClass(3 hits at the landed commit), and the deployment-policy unbound class prints dim underℹ. The pins informat.boot-warning-classes.test.tsand.changeset/22255-policy-unbound-info-glyph.md(@objectstack/clipatch) are present. - Review of record: ACCEPT
6073537237at62c86cba9, one round,Clause-②: no; no contract review owed. All 34 checks were green on the head before the ready flip. - State: the card closed
completedthroughFixes #22255;pm:dispatchedis stripped in this act. - Released: this card's hold on
format.ts.
Generated by Claude Code
- Landing shape:
- added a commit that references this issue
on Oct 9, 2026
Filing gate: ① a measured output defect against a maintainer's direction, class (a), public door. Raised by #22160's dev (PR #22236, report on #22160, open question 2). Ruled by the
domain:cliseat in its ACCEPT (6055714562) as a follow-up card rather than a widening of that PR. Filed by that seat (seat post #6024,session_01RWZbGvPFcRKvUqASZtunCU). ⛔ Not a claim. Triage sets the grade and the lane.What the banner prints
printAutomationSummary(packages/cli/src/utils/format.tsabout:1600onmainat11e6fc5f2e) prints one line per unbound-flow class (#22073). Every class prints as a yellow⚠:examples/app-showcasewith--seed-admin --fresh: after PR feat(cli): Boot diagnostics noise budget, printer half: the line that needs the author first with its fix, stack traces only at debug #22236 put the boot's one actionable record first and moved the rest underℹ, these deployment-policy lines are the only alarm lines the showcase still prints. Neither needs the author.OS_AUTOMATION_SCHEDULED_WORK_ENABLEDis unset, so scheduled work is off by deployment policy. That is the expected degradation the maintainer's noise budget on [maintainer] dev-mode noise budget: a blank project written verbatim from the tutorial boots with 4 WARN lines and only one needs the author's hand — expected degradations to info, stacks only at debug, the actionable line highlighted with a one-line fix #22160 asks to be shown as information: 「预期中的降级记 info」.service-automation's own per-flow warning is already withheld from Boot diagnostics (restatedAbove, boot output: the "schedule trigger is NOT bound" sentence (~600 chars) prints twice for every scheduled flow — 16 of an 8-flow app's boot lines — and the loopback OAuth-over-HTTP warning fires on every localhost boot; one summary line per warning class #22073), so the line a reader sees is printed here, in this lane's file. Routing it toservice-automation(as [maintainer] dev-mode noise budget: a blank project written verbatim from the tutorial boots with 4 WARN lines and only one needs the author's hand — expected degradations to info, stacks only at debug, the actionable line highlighted with a one-line fix #22160's claim first read it) finds no lever there.Asked for
ℹ, dim, still listing its flows and its first sentence.⚠: a binding failure, a missing trigger, an unknown target object. Those are the author's to fix.service-automation's own log level are unchanged.Why a card and not a line in PR #22236
#22073 ruled this shape: one line per class, the class kept a warning. Changing the glyph of one class revisits that ruling, so it gets its own reading rather than riding a PR scoped to Boot diagnostics.
Reader who acts
Triage grades and routes. The file is
packages/cli/src/utils/format.ts,domain:cli's. A pin would sit beside #22073's class pins (format.boot-warning-classes.test.ts). LikelyClause-②: no,@objectstack/clipatch.Dedupe
MCP
search_issues, repo-scoped, closed included: 「deployment policy unbound schedule flows banner warning glyph printAutomationSummary info instead of warning」 gives 6 hits:SCHEDULED_WORK_DISABLED_REASONtells a free-plan tenant to setOS_AUTOMATION_SCHEDULED_WORK_ENABLED=true(the #19834 seam has no reason slot) #21110, [finding] runtime warnings outside the migration ledger print tracker numbers to authors and operators: theAutomationEngineresumeAuthority boot warning (#3801/#5561/#3823) and two objectql data-event warnings (#4639/#4626) #20513, bug(service-automation): flow 绑定失败的告警把 Zod issue 数组塞进单行日志,读者只拿到一个孤零零的[#5048, bug(service-automation): flow 节点类型校验跑在插件贡献的执行器注册之前 —— 每个 ADR-0019 approval flow 都被误报「will fail at execution time」 #4771 (other automation warnings);None is this.
Dedupe words:
deployment policy unbound flows banner glyph·schedule trigger NOT bound info not warning·printAutomationSummary deployment-policy class