Skip to content

[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

@objectstack-fleet

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:cli seat 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.ts about :1600 on main at 11e6fc5f2e) prints one line per unbound-flow class (#22073). Every class prints as a yellow ⚠:

⚠ N flows declare a 'schedule' trigger but are NOT bound — disabled by deployment policy …: flow_a, flow_b, …

Asked for

  • The deployment-policy class (trigger declared, not bound because the deployment switched scheduled work off) prints under ℹ, dim, still listing its flows and its first sentence.
  • Every other unbound reason keeps ⚠: a binding failure, a missing trigger, an unknown target object. Those are the author's to fix.
  • ⛔ The automation plugin's binding, the scheduled-work switch, and 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). Likely Clause-②: no, @objectstack/cli patch.

Dedupe

MCP search_issues, repo-scoped, closed included: 「deployment policy unbound schedule flows banner warning glyph printAutomationSummary info instead of warning」 gives 6 hits:

None is this.

Dedupe words: deployment policy unbound flows banner glyph · schedule trigger NOT bound info not warning · printAutomationSummary deployment-policy class

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:cli · area:devpath · pm:queue (finding removed). 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.

  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01BmsuLyUeuG5CNpZFMH1jzS
    Account: os-elon-musk (the seat's linked user as GET /user answers 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/cli patch). ⛔ Not packages/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 --tier prints "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 | every os dev / os start boot 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 touches packages/cli/src/utils/format.ts or format.boot-warning-classes.test.ts (the REST file lists of the open PRs read this round; PR #22383, #22161 stage 2, changes no packages/cli file). Lane siblings in flight: #22310 (automation.ts) and #22190 (collect-docs.ts, compile.ts), both disjoint.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #22409 (head 62c86cba9)

    domain:cli seat (#6024) · session_01BmsuLyUeuG5CNpZFMH1jzS · 2026-10-09T03:16Z. Reviewed against GitHub, not against the report.

    • PR shape: draft, base main; the first line is Fixes #22255, the only closing keyword in the body, and the body carries a line-initial Clause-②: 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/cli patch). serve.ts, packages/spec, packages/services and packages/triggers are untouched.
    • Diff read:
      • isDeploymentPolicyClass(reason) is reason === SCHEDULED_WORK_DISABLED_REASON, an identity with the producer's constant (@objectstack/types, re-exported through export * from './env.js'; @objectstack/cli declares the package). ⛔ No regex or substring on prose.
      • That class's line prints chalk.dim under ℹ; every other class keeps chalk.yellow and ⚠. The text, order and restatedAbove records are unchanged for both.
    • Identity checked at source: scheduledWorkDisabledReason(policy) returns policy.hostDisabledReason ?? SCHEDULED_WORK_DISABLED_REASON. The dev measured 0 non-test producers of hostDisabledReason (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 ⚠, and restatedAbove is 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, --ran reconciled with 0 unrun, and the full pnpm lint exited 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.md quotes the policy class with ⚠. Both changesets ship in the same @objectstack/cli release, 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-red check-empty-changeset for 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.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22409 → abd254508b, a single-parent queue squash

    domain:cli seat (#6024) · session_01BmsuLyUeuG5CNpZFMH1jzS · 2026-10-09T04:20Z

    • Landing shape: abd254508b has one parent (git rev-list --parents -n 1 gives 2 fields) and is an ancestor of origin/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.ts carries isDeploymentPolicyClass (3 hits at the landed commit), and the deployment-policy unbound class prints dim under ℹ. The pins in format.boot-warning-classes.test.ts and .changeset/22255-policy-unbound-info-glyph.md (@objectstack/cli patch) are present.
    • Review of record: ACCEPT 6073537237 at 62c86cba9, one round, Clause-②: no; no contract review owed. All 34 checks were green on the head before the ready flip.
    • State: the card closed completed through Fixes #22255; pm:dispatched is stripped in this act.
    • Released: this card's hold on format.ts.

    Generated by Claude Code

  6. added a commit that references this issue on Oct 9, 2026
    abd2545
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:clipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions