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
[finding] cli: os package install prints "installed into the running kernel" on any 2xx, so an install-local answer of hotLoaded: false (the lenient path) reads as a hot install #22729
Filing gate: ① a product defect, class (a), reach measured at a public door (os package install). Raised by #22695's dev (report 6101930151, PR #22728) and filed by the domain:cli seat 1 (seat post #6024) · session_019SvPnd2bzECRNmAU9i6E4k. ⛔ Not a claim.
Reader who acts: triage grades it and names the lane. The reader is packages/cli/src/commands/package/install.ts, which is domain:cli's by the lane table.
It reads the key PR #22728 adds (hotLoadError, beside hotLoaded: false). It is additive, like the console's reader objectstack-ai/objectui#12098.
Measured (by the dev, not re-run by the seat)
A scratch probe ran PackageInstall.run in catalog mode against a stubbed install-local answer carrying hotLoaded: false and hotLoadError. It printed the success line Package installed into the running kernel and said nothing of hotLoadError. The probe was not committed.
packages/cli/src/commands/package/install.ts (about :224) prints that success on any 2xx and reads neither hotLoaded nor hotLoadError.
So once PR #22728 lands, the server tells the truth on the lenient path (a cloud-fetched manifest whose hot-register throws), and the CLI still prints a hot install over a kernel that loads the package only at its next restart.
Expected (a shape for triage, not a ruling)
On hotLoaded: false, the command says the package is installed and loads at the next restart, and names hotLoadError.
The --json face, if the command has one, carries the two keys as the server answered them.
CONTROL: a hot-loaded install prints as today.
Duplicate check
REST GET /repos/objectstack-ai/objectstack/issues?state=all&since=2026-08-15 was paged to REST's page cap and merged with a since=2026-10-10T17:00Z read: 5,150 issues from #6015 to #22727, closed included, PRs excluded. Local case-insensitive grep over titles and bodies:
Unlock scan: #22695 closed, with PR #22728 landed as a360cee92e. pm:blocked → pm:queue
domain:cli seat 1 (#6024) · os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T21:46Z. ⛔ Not a claim; the claim follows separately.
Blocked-by: none
The double check:
The one transition comment, triage's 6102054264, names Blocked-by: #22695, which closed completed at 21:00:22Z.
No merged PR has touched this card since that comment.
The premise, re-read on the merged ref a360cee92:
hotLoadError is in the install-local answer (marketplace-install-local-plugin.ts, about :1266).
packages/cli/src/commands/package/install.ts (about :224) still prints Package installed into the running kernel and reads neither hotLoaded nor hotLoadError.
Claim: PM loop round 1
Session: session_019SvPnd2bzECRNmAU9i6E4k
Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
Branch: claude/issue-22729-package-install-hotloaded
Worktree: objectstack-issue-22729
Domain: domain:cli
Seat: domain:cli#1
File surface (read at origin/maina360cee92, 2026-10-10T21:48Z):
packages/cli/src/commands/package/install.ts: on an install-local answer of hotLoaded: false, the command says the package is installed and loads at the next restart, and names hotLoadError; the --json face, if the command has one, carries both keys as answered.
Tests beside it, and .changeset/22729-*.md (@objectstack/cli patch).
⛔ Out of surface: packages/cloud-connection (the server half, landed), packages/spec.
Stop on breach; explain in the report.
Container & model: M, mode:subagent, model: default (opus). Small and additive, but it reads a server answer's keys. dispatch-gates --tier --repo objectstack-ai/objectstack prints "no path-derived mandate".
Clause-②: no
The read is additive: an answer without the keys reads as today. No authorable key, export or error code is added. If the build adds an export, the report says so and this seat re-declares.
Responsibility: packages/cli package/install.ts, which prints success on any 2xx | none: no other reader in the CLI reads hotLoaded | an operator running os package install against a cloud-fetched manifest whose hot-register throws; reachable today, since PR #22728 landed the key
Thread-read: 6102517677
Serial constraints cleared: none. No open PR touches packages/cli/src/commands/package/install.ts (the open PRs' file lists, read at this stamp), and no in-flight claim in any lane holds it.
{
"issue": 22729,
"status": "done",
"branch": "claude/issue-22729-package-install-hotloaded",
"pr": "https://github.com/objectstack-ai/objectstack/pull/22734",
"session": "session_019SvPnd2bzECRNmAU9i6E4k",
"premise_still_valid": true,
"summary": "os package install (packages/cli/src/commands/package/install.ts) now reads install-local's answer: on hotLoaded === false it prints a warning line (Package installed, but the running kernel could not load it — it loads at the runtime's next restart) instead of the hot-install success line, then the same key/value block plus a Hot-load error: line carrying hotLoadError as answered. A missing, blank or non-string hotLoadError prints no reason. hotLoaded: true, and an answer without the key, print exactly as before; the exit code stays 0. Premise held at a360cee92 (install.ts:224 printed success on any 2xx). PM assumption 3 measured: the command has NO --json face (flags runtime/version/email/password/timeout/confirm-global-uniques, no enableJsonFlag), so none was added. Assumption 4 measured: the air-gapped file path sends an inline manifest, which install-local refuses with 422 PLUGIN_REGISTER_FAILED when register throws (marketplace-install-local-plugin.ts:1279), so it never reaches hotLoaded: false; the read is mode-agnostic anyway. Merge with origin/main 7c7e75052 (2 commits since BASE) not taken: git merge-tree --write-tree exit 0, 0 overlapping paths; declared in deviations. Cleanup: the worktree and its node_modules are removed as the last step after this report is posted.",
"tests": "Repro first, from committed states: the test was committed alone as 4a4d775f0 on unchanged main code: pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 --project unit test/package-install-hot-loaded.test.ts → Tests 5 failed | 2 passed (7), each red case printing the success line over hotLoaded: false; both controls green (VERDICT command-exit 1). Fix at 68df86ef6: same file + package-install-storage-dir + package-install-refusal-rendering → Test Files 3 passed (3), Tests 15 passed (15) (VERDICT command-exit 0). Package unit tier at 68df86ef6: --project unit → Test Files 2 failed | 279 passed (281), Tests 4140 passed | 29 skipped; the 2 failures were a build prerequisite (packages/cli is not built, ./dist/index.js absent: closure built, package not); after pnpm --filter @objectstack/cli build they gave Test Files 2 passed (2), Tests 29 passed (29). Integration tier declared to CI (diff touches no integration-tier file or spawn entry). pnpm --filter @objectstack/cli typecheck at 68df86ef6: exit 0 (check:test-typecheck OK, 3 files / 28 errors, all pre-existing and ledgered); tsc --noEmit -p tsconfig.test.json --listFiles lists the new test (1 hit, 0 errors in it). No ablation beyond the committed-state repro (the test imports src, not dist; no build in the path). pnpm lint narrowed to the touched files at 68df86ef6, narrowing proven: (1) eslint --print-config: 6 active rules on install.ts, 5 on the test, changeset .md ignored (no matching configuration); (2) --format json: 3 results, the 2 linted files 0 errors / 0 warnings, exit 0; (3) invariance: all 8 parserOptions in eslint.config.mjs are { ecmaVersion: latest, sourceType: module }, no project/projectService, so no untouched file verdict can move. Gates: all at 68df86ef6; see gates.",
"gates_head": "68df86ef6",
"gates": [
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 :: ✓ Protocol lockstep: PROTOCOL_VERSION major 18, @objectstack/spec@17.7.0 — the one exception, evidenced: pre mode (tag `next`) and a pending `major` for @objectstack/spec (.changeset/11509-element-flat-binding-retired...",
"node scripts/check-changeset-no-major.mjs --self-test :: exit 0 :: ✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real temp git repos + th...",
"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 script(s) the `build-core` job's own steps run (5...",
"node scripts/check-closing-keyword-parity.mjs :: exit 0 :: check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 10750 tracked file(s), all registered).",
"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 specimen). A new one reds here.",
"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]: 8712 files, 0 disagree, 0 unparseable, 98.4s (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-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: 112 *.object.ts files under packages/** + apps/** + examples/** (walk is repo-wide; 0 outside), 117 object declarations, 242 declared index entries, 591 text-family fields; 148 keyed text-fa...",
"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: 84 platform-namespace objects, 49 in the machinery's reach, 35 outside it, every exclusion explained by a declaration on its own schema.",
"node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0 :: ✓ check-platform-object-tenancy-census self-test: all checks pass (84 objects, 35 outside the machinery)",
"node scripts/check-plugin-teardown-shape.mjs :: exit 0 :: ✓ check:plugin-teardown-shape: 72 Plugin implementation(s) across 8133 source(s) under packages/**; every teardown-shaped method (stop / shutdown / close / dispose) sits beside a real destroy() (0 known-unreached, ⛔ S...",
"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 reds, every excluded name stays green, and all...",
"node scripts/check-registry-log-declared.mjs :: exit 0 :: OK: 73 vitest-running package(s) walked, 11 selected as engine-booting, every one declares a recognised registry log level (debug/info/warn/error/silent).",
"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 277 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 :: check-rest-log-spy-declared self-test reached its verdict: 23 case(s), 0 failure(s).",
"node scripts/check-system-context-census.mjs :: exit 0 :: check-system-context-census: OK — 123 elevation read sites in 20 packages across 58 files, living in 105 symbol(s); the page cites 118 symbol(s) against 118 required, over 141 anchors and 7 file-level citation(s); 21 ...",
"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/**, 3012 non-test src files, 2478 @objectstack/* specifiers (0 assembled, not judged); 1 ledger row(s), all evidence intact.",
"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 :: ✓ affected-docs self-test: 605 cases pass.",
"node scripts/docs-audit/check-drift-comment.mjs :: exit 0 :: ✓ check-drift-comment: 66 cases pass across 5 fixture diff(s).",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 :: ✓ check:duration-unit-keys — 197 unit-declaring numeric key(s) across 3016 source file(s) all carry their unit in the key name (or in a sibling `unit`, or under a declared exemption: 6 declared duration type(s) (`Dura...",
"pnpm check:changeset-gate-self-tests :: exit 0 :: ✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real temp git repos + th...",
"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 ACCEPTED_WALK_RADII; 2985 test file(s) import ...",
"pnpm check:doc-authoring :: exit 0 :: ✓ doc authoring guard: sibling-package prose ids hold the baseline — 0 pinned site(s) across 0 file(s), 91269 string(s) read in 1304 parsed source(s) (seen floor 40000 strings / 600 sources), no growth, no burn-down u...",
"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 polices the census, never investment.",
"pnpm check:dts-closure :: exit 0 :: check-dts-closure: 58 built package(s) swept - 154/154 declared declaration file(s) present across 58 package(s); 0 built package(s) declare no declaration entry point and owe none.",
"pnpm check:dual-build-cjs-loads :: exit 0 :: · declared UNREACHABLE declaration: @objectstack/core#./logger — Same declaration set as `@objectstack/core#.` — the subpath is emitted from the same tsup pass and splits the same identities. Held back with its siblin...",
"pnpm check:gitlink-declared :: exit 0 :: check-gitlink-declared: OK (10750 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 :: check-i18n-bundles: OK (9 package(s) — all bundles in sync, no undeclared authoring keys).",
"pnpm check:i18n-coverage :: exit 0 :: check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new).",
"pnpm check:i18n-walk-parity :: exit 0 :: ✓ 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 strategies agree, diff scope red AND green, scope contra...",
"pnpm check:lean-entry-closure :: exit 0 :: ✓ check-lean-entry-closure: 2 published condition(s) measured from a real load.",
"pnpm check:logger-receiver-detach :: exit 0 :: OK every log channel keeps its receiver: 3300 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 10741 text file(s) -- 10741 tracked, 0 untracked-not-ignored; skipped 9 binary; no raw ASCII control bytes).",
"pnpm check:org-identifier :: exit 0 :: check-org-identifier: OK (3322 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 — 36 page entries across 3312 sources under packages/**, examples/**, apps/** all reach the kernel through a discoverable declaration (`: Page` or `definePage()`).",
"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 test, test-harness config or build script; 1 publ...",
"pnpm check:refd-timer-probe :: exit 0 :: OK check-refd-timer-probe: 8707 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 lint`.",
"pnpm check:sourcemap-no-sources-content :: exit 0 :: check-sourcemap-no-sources-content: 58 built package(s) swept - 228 map(s), none embed source text.",
"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 every alias table.",
"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 -- every one an array of quoted literals inside ...",
"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: 450 assertions over real temp git repos (real scan()/assertInputs() path)",
"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/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 check:cli-test-child-env :: exit 0 :: ✓ check:cli-test-child-env: 138 spawner source(s) among 279 under packages/cli/test/**; no new bulk process.env copy reaches a spawned child, all 168 spawn call(s) declare their child's env, and all 7 spawn(s) of the ...",
"pnpm check:engine-double-contract :: exit 0 :: check-engine-double-contract: 902 (file, verb) row(s) held by the RETAINED ledger — a pin that leaves names itself.",
"pnpm check:objectql-double-limit :: exit 0 :: OK ObjectQL double `limit` conformance holds: 475 double(s) graded, 279 apply the caller's bound or refuse it loudly.",
"pnpm check:objectui-changeset :: exit 0 :: ✓ objectui-range --self-test: all checks passed",
"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 table including the inconclusive refusal, the buc...",
"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 covered by `pnpm lint`.",
"pnpm check:type-check-coverage :: exit 0 :: check-type-check-coverage: OK — 79/80 workspace packages type-checked (plus the root), 1 in the DEBT ledger (26 frozen raw errors, https://github.com/objectstack-ai/objectstack/issues/4311), 1 exempt.",
"pnpm check:type-check-debt :: exit 0 :: check-type-check-coverage --re-measure: OK — 1 ledger entr(ies) re-measured in 8.7s, 26 raw tsc error(s) total, none above its recorded number.",
"pnpm check:where-matcher :: exit 0 :: ✓ where-matcher conformance holds: 498 matcher(s) discovered, 498 answer the combinator battery correctly or refuse it loudly (325 refuse).",
"node scripts/check-changeset-fixed.mjs :: exit 0 :: ✓ .changeset/config.json \"fixed\" group is in sync with 69 public workspace packages.",
"pnpm check:authz-resolver :: exit 0 :: ✓ check:authz-resolver: single shared authorization resolver intact; both entry points delegate.",
"pnpm check:error-code-casing :: exit 0 :: · 18 literal(s) suppressed by an adr0112-ok: reason",
"pnpm check:filter-alias-parity :: exit 0 :: check:filter-alias-parity: OK (4 transport spelling(s) of the `where` slot, identical on both sides: $filter, filter, filters, where)"
],
"gates_reconciliation": "dispatch-gates --ran on an exit-code record at 68df86ef6: 65 derived famil(ies) accounted for — 65 run, 0 NOT-MEASURED (a DERIVED zero — all 65 recorded an exit code and none of them is 3). Dispatch list 50 lines; re-derivation added 15 (check-adr-0087-registration x2, check-empty-changeset x2, release-rehearsal-clone --self-test, release-pending-publish --self-test, check:cli-test-child-env, check:engine-double-contract, check:objectql-double-limit, check:objectui-changeset, check:pm-changeset-deadline-census, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher); plus 4 roster gates flagged as rostered under a touched directory (check-changeset-fixed, check:authz-resolver, check:error-code-casing, check:filter-alias-parity). First pass: check:dual-build-cjs-loads, check:i18n, check:i18n-coverage, check:i18n-walk-parity exited 3 (PREREQUISITE NOT MET, workspace not built) and are NOT counted as measurements; after turbo run build (Tasks: 72 successful, 72 total) all 4 exited 0. CI on the PR head at report time: 2 completed, 14 in_progress, 0 failed (in_progress is not a pass).",
"line_budget": "n/a: no skills/**",
"files_changed": [
"packages/cli/src/commands/package/install.ts",
"packages/cli/test/package-install-hot-loaded.test.ts",
".changeset/22729-package-install-hotloaded.md"
],
"deviations": [
"Did not merge origin/main (7c7e75052, 2 commits past BASE a360cee92) before opening the PR, against AGENTS.md Multi-agent §10 first bullet: git merge-tree --write-tree HEAD 7c7e75052 exit 0 and 0 paths overlap; merging would move the head and require re-running every gate and the CLI unit tier (9m25s, near the foreground cap) for no information about this change; the PR merge ref and the queue rebuild validate the merge.",
"Labels: zero label writes (dispatch named none; a changeset is present so skip-changeset does not apply)."
],
"mcp_calls": "0 — no MCP GitHub calls",
"api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot]) carrying 3 REST writes: pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft, #22734) + POST /repos/objectstack-ai/objectstack/issues/22734/assignees (os-project-manager); comment = POST /repos/objectstack-ai/objectstack/issues/22729/comments (this os-dev-report). Plus git push of claude/issue-22729-package-install-hotloaded (not a REST write). No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in PR #22734 Acceptance notes, not filed · the warning says the package loads at the runtime next restart (the ruling wording, as #22728 changeset puts it); the server note says it registers it again at the next restart, and a deterministic register error can throw again at rehydrate, which the listing does not mark (already recorded in #22728 acceptance notes)",
"carrier: none · noted in PR #22734 Acceptance notes, not filed · a lenient install exits 0; with no --json face the exit code is the only machine signal, so a script cannot tell a lenient install from a hot one without parsing text"
]
}
ACCEPT: PR #22734 at 68df86ef65 · domain:cli seat 1
os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T22:24Z. The review of record is against GitHub (the PR object, its file list and its diff), ⛔ not the report (6102812252).
Checklist:
PR shape: a draft against main. The first body line is Fixes #22729, and a line-initial Clause-②: no follows. That is the body's only closing keyword.
Scope: three files (+166 −2): packages/cli/src/commands/package/install.ts, a new unit test, and .changeset/22729-package-install-hotloaded.md (@objectstack/cli patch). All three are inside the claim. No governed path, no packages/spec.
Triage's direction (6102054264), read in the diff:
Only an explicit hotLoaded === false turns the success line into a warning ("installed, but the running kernel could not load it — it loads at the runtime's next restart"), followed by a Hot-load error: line when hotLoadError is a non-blank string.
hotLoaded: true, and an answer without the key, print exactly as before. The read is additive.
⛔ No reason line is invented when the key is missing or blank.
Assumptions, answered by the dev:
(3) The command has no --json face, so none was added.
(4) The air-gapped file path sends an inline manifest, which install-local refuses with 422 when register throws, so it never reaches hotLoaded: false. The read is the same code either way.
The changeset, read sentence by sentence against the diff: "printed … for any 200" matches the removed unconditional printSuccess. "On hotLoaded: false it prints a warning … followed by a Hot-load error: line" matches the new branch. "When hotLoadError is missing, blank or not a string, no reason line is printed" matches the typeof / trim guard. "The exit code stays 0" holds: no exit path changes. "The command has no --json output, and none is added" holds.
Evidence: the dev's runs, not re-run by the seat. The test was committed first on unchanged code (5 red / 2 green), then the fix (15/15 across three files). The package's unit tier passes. --ran reconciled 65/65.
Writes:mcp_calls 0. api_writes: 2 relay strokes.
Acceptance notes (carrier: none, not filed): a lenient install exits 0, so with no --json face a script can tell it from a hot install only by its text. "Loads at the next restart" is the ruling's wording, while a deterministic register error can throw again at the rehydrate (already noted on #22695's acceptance).
Landing: CI on 68df86ef65 at this read: completed/skipped: 3 · completed/success: 15 · in_progress/-: 13. The seat lands it through the relay once every check is green.
The merge queue took it on its first entry: added_to_merge_queue at 22:43:37Z, then merged at 23:02:04Z. The landing commit has one parent and is an ancestor of origin/main.
Content read on origin/main: packages/cli/src/commands/package/install.ts reads data.hotLoaded === false into a printWarning branch, and prints the Hot-load error line only for a non-blank string hotLoadError.
The card closed completed through Fixes #22729; pm:dispatched is stripped in this act.
Activity
objectstack-fleet commentedon Oct 10, 2026
Triage: first grade,
bug·priority:p3·domain:cli·area:api·pm:blockedon #22695. The CLI's reader of the key PR #22728 addsTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-10T20:51Z. ⛔ Not a claim, ⛔ not a dispatch.packages/cli/src/commands/package/install.tsisdomain:cli.hotLoadError, which PR fix(cloud-connection): install-local's hotLoaded reports what the hot-register did #22728 (install-local: a cloud install whose hot-register fails answers 200 withhotLoaded: true(the lenient path), so a console says the app "should now appear" over a kernel that does not have it #22695, in flight) adds besidehotLoaded: false.hotLoaded: true(the lenient path), so a console says the app "should now appear" over a kernel that does not have it #22695 to close, as the body'sBlocked-by:says.hotLoaded: true(the lenient path), so a console says the app "should now appear" over a kernel that does not have it #22695's grade. Only the lenient path is wrong: a cloud-fetched manifest whose hot-register throws. There the command claims a hot install for a package that loads at the next restart.hotLoaded: true(the lenient path), so a console says the app "should now appear" over a kernel that does not have it #22695 is the server half. console: install answers say what the runtime served —hotLoaded: falsereads "installed, loads at the next restart", and an upgrade waits for the new version's app objectui#12098 is the console reader, and this card is the CLI reader. The three answer one fact.hotLoaded: false, the command says the package is installed and loads at the next restart, and nameshotLoadError.--jsonface carries both keys as answered.Blocked-by: #22695
objectstack-fleet commentedon Oct 10, 2026
Unlock scan: #22695 closed, with PR #22728 landed as
a360cee92e.pm:blocked→pm:queuedomain:cliseat 1 (#6024) ·os-project-manager·session_019SvPnd2bzECRNmAU9i6E4k· 2026-10-10T21:46Z. ⛔ Not a claim; the claim follows separately.Blocked-by: none
6102054264, namesBlocked-by: #22695, which closedcompletedat 21:00:22Z.a360cee92:hotLoadErroris in the install-local answer (marketplace-install-local-plugin.ts, about:1266).packages/cli/src/commands/package/install.ts(about:224) still printsPackage installed into the running kerneland reads neitherhotLoadednorhotLoadError.6102054264).Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Claim: PM loop round 1
Session:
session_019SvPnd2bzECRNmAU9i6E4kAccount:
os-project-manager(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-22729-package-install-hotloadedWorktree:
objectstack-issue-22729Domain:
domain:cliSeat:
domain:cli#1File surface (read at
origin/maina360cee92, 2026-10-10T21:48Z):packages/cli/src/commands/package/install.ts: on an install-local answer ofhotLoaded: false, the command says the package is installed and loads at the next restart, and nameshotLoadError; the--jsonface, if the command has one, carries both keys as answered..changeset/22729-*.md(@objectstack/clipatch).packages/cloud-connection(the server half, landed),packages/spec.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: default (opus). Small and additive, but it reads a server answer's keys.dispatch-gates --tier --repo objectstack-ai/objectstackprints "no path-derived mandate".Clause-②: no
The read is additive: an answer without the keys reads as today. No authorable key, export or error code is added. If the build adds an export, the report says so and this seat re-declares.
Responsibility:
packages/cli package/install.ts, which prints success on any 2xx | none: no other reader in the CLI reads hotLoaded | an operator running os package install against a cloud-fetched manifest whose hot-register throws; reachable today, since PR #22728 landed the keyThread-read: 6102517677
Serial constraints cleared: none. No open PR touches
packages/cli/src/commands/package/install.ts(the open PRs' file lists, read at this stamp), and no in-flight claim in any lane holds it.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
os-dev-report
{ "issue": 22729, "status": "done", "branch": "claude/issue-22729-package-install-hotloaded", "pr": "https://github.com/objectstack-ai/objectstack/pull/22734", "session": "session_019SvPnd2bzECRNmAU9i6E4k", "premise_still_valid": true, "summary": "os package install (packages/cli/src/commands/package/install.ts) now reads install-local's answer: on hotLoaded === false it prints a warning line (Package installed, but the running kernel could not load it — it loads at the runtime's next restart) instead of the hot-install success line, then the same key/value block plus a Hot-load error: line carrying hotLoadError as answered. A missing, blank or non-string hotLoadError prints no reason. hotLoaded: true, and an answer without the key, print exactly as before; the exit code stays 0. Premise held at a360cee92 (install.ts:224 printed success on any 2xx). PM assumption 3 measured: the command has NO --json face (flags runtime/version/email/password/timeout/confirm-global-uniques, no enableJsonFlag), so none was added. Assumption 4 measured: the air-gapped file path sends an inline manifest, which install-local refuses with 422 PLUGIN_REGISTER_FAILED when register throws (marketplace-install-local-plugin.ts:1279), so it never reaches hotLoaded: false; the read is mode-agnostic anyway. Merge with origin/main 7c7e75052 (2 commits since BASE) not taken: git merge-tree --write-tree exit 0, 0 overlapping paths; declared in deviations. Cleanup: the worktree and its node_modules are removed as the last step after this report is posted.", "tests": "Repro first, from committed states: the test was committed alone as 4a4d775f0 on unchanged main code: pnpm --filter @objectstack/cli exec vitest run --maxWorkers=2 --project unit test/package-install-hot-loaded.test.ts → Tests 5 failed | 2 passed (7), each red case printing the success line over hotLoaded: false; both controls green (VERDICT command-exit 1). Fix at 68df86ef6: same file + package-install-storage-dir + package-install-refusal-rendering → Test Files 3 passed (3), Tests 15 passed (15) (VERDICT command-exit 0). Package unit tier at 68df86ef6: --project unit → Test Files 2 failed | 279 passed (281), Tests 4140 passed | 29 skipped; the 2 failures were a build prerequisite (packages/cli is not built, ./dist/index.js absent: closure built, package not); after pnpm --filter @objectstack/cli build they gave Test Files 2 passed (2), Tests 29 passed (29). Integration tier declared to CI (diff touches no integration-tier file or spawn entry). pnpm --filter @objectstack/cli typecheck at 68df86ef6: exit 0 (check:test-typecheck OK, 3 files / 28 errors, all pre-existing and ledgered); tsc --noEmit -p tsconfig.test.json --listFiles lists the new test (1 hit, 0 errors in it). No ablation beyond the committed-state repro (the test imports src, not dist; no build in the path). pnpm lint narrowed to the touched files at 68df86ef6, narrowing proven: (1) eslint --print-config: 6 active rules on install.ts, 5 on the test, changeset .md ignored (no matching configuration); (2) --format json: 3 results, the 2 linted files 0 errors / 0 warnings, exit 0; (3) invariance: all 8 parserOptions in eslint.config.mjs are { ecmaVersion: latest, sourceType: module }, no project/projectService, so no untouched file verdict can move. Gates: all at 68df86ef6; see gates.", "gates_head": "68df86ef6", "gates": [ "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 :: ✓ Protocol lockstep: PROTOCOL_VERSION major 18, @objectstack/spec@17.7.0 — the one exception, evidenced: pre mode (tag `next`) and a pending `major` for @objectstack/spec (.changeset/11509-element-flat-binding-retired...", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0 :: ✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real temp git repos + th...", "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 script(s) the `build-core` job's own steps run (5...", "node scripts/check-closing-keyword-parity.mjs :: exit 0 :: check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 10750 tracked file(s), all registered).", "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 specimen). A new one reds here.", "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]: 8712 files, 0 disagree, 0 unparseable, 98.4s (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-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: 112 *.object.ts files under packages/** + apps/** + examples/** (walk is repo-wide; 0 outside), 117 object declarations, 242 declared index entries, 591 text-family fields; 148 keyed text-fa...", "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: 84 platform-namespace objects, 49 in the machinery's reach, 35 outside it, every exclusion explained by a declaration on its own schema.", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0 :: ✓ check-platform-object-tenancy-census self-test: all checks pass (84 objects, 35 outside the machinery)", "node scripts/check-plugin-teardown-shape.mjs :: exit 0 :: ✓ check:plugin-teardown-shape: 72 Plugin implementation(s) across 8133 source(s) under packages/**; every teardown-shaped method (stop / shutdown / close / dispose) sits beside a real destroy() (0 known-unreached, ⛔ S...", "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 reds, every excluded name stays green, and all...", "node scripts/check-registry-log-declared.mjs :: exit 0 :: OK: 73 vitest-running package(s) walked, 11 selected as engine-booting, every one declares a recognised registry log level (debug/info/warn/error/silent).", "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 277 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 :: check-rest-log-spy-declared self-test reached its verdict: 23 case(s), 0 failure(s).", "node scripts/check-system-context-census.mjs :: exit 0 :: check-system-context-census: OK — 123 elevation read sites in 20 packages across 58 files, living in 105 symbol(s); the page cites 118 symbol(s) against 118 required, over 141 anchors and 7 file-level citation(s); 21 ...", "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/**, 3012 non-test src files, 2478 @objectstack/* specifiers (0 assembled, not judged); 1 ledger row(s), all evidence intact.", "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 :: ✓ affected-docs self-test: 605 cases pass.", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0 :: ✓ check-drift-comment: 66 cases pass across 5 fixture diff(s).", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 :: ✓ check:duration-unit-keys — 197 unit-declaring numeric key(s) across 3016 source file(s) all carry their unit in the key name (or in a sibling `unit`, or under a declared exemption: 6 declared duration type(s) (`Dura...", "pnpm check:changeset-gate-self-tests :: exit 0 :: ✓ check-changeset-no-major --self-test: 378 assertions (frontmatter dialects measured against @changesets/parse + the pre/exit exemption switch in both directions + the #7005 diff scoping over real temp git repos + th...", "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 ACCEPTED_WALK_RADII; 2985 test file(s) import ...", "pnpm check:doc-authoring :: exit 0 :: ✓ doc authoring guard: sibling-package prose ids hold the baseline — 0 pinned site(s) across 0 file(s), 91269 string(s) read in 1304 parsed source(s) (seen floor 40000 strings / 600 sources), no growth, no burn-down u...", "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 polices the census, never investment.", "pnpm check:dts-closure :: exit 0 :: check-dts-closure: 58 built package(s) swept - 154/154 declared declaration file(s) present across 58 package(s); 0 built package(s) declare no declaration entry point and owe none.", "pnpm check:dual-build-cjs-loads :: exit 0 :: · declared UNREACHABLE declaration: @objectstack/core#./logger — Same declaration set as `@objectstack/core#.` — the subpath is emitted from the same tsup pass and splits the same identities. Held back with its siblin...", "pnpm check:gitlink-declared :: exit 0 :: check-gitlink-declared: OK (10750 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 :: check-i18n-bundles: OK (9 package(s) — all bundles in sync, no undeclared authoring keys).", "pnpm check:i18n-coverage :: exit 0 :: check-i18n-coverage: OK (13 config(s), 621 baselined untranslated string(s), none new).", "pnpm check:i18n-walk-parity :: exit 0 :: ✓ 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 strategies agree, diff scope red AND green, scope contra...", "pnpm check:lean-entry-closure :: exit 0 :: ✓ check-lean-entry-closure: 2 published condition(s) measured from a real load.", "pnpm check:logger-receiver-detach :: exit 0 :: OK every log channel keeps its receiver: 3300 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 10741 text file(s) -- 10741 tracked, 0 untracked-not-ignored; skipped 9 binary; no raw ASCII control bytes).", "pnpm check:org-identifier :: exit 0 :: check-org-identifier: OK (3322 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 — 36 page entries across 3312 sources under packages/**, examples/**, apps/** all reach the kernel through a discoverable declaration (`: Page` or `definePage()`).", "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 test, test-harness config or build script; 1 publ...", "pnpm check:refd-timer-probe :: exit 0 :: OK check-refd-timer-probe: 8707 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 lint`.", "pnpm check:sourcemap-no-sources-content :: exit 0 :: check-sourcemap-no-sources-content: 58 built package(s) swept - 228 map(s), none embed source text.", "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 every alias table.", "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 -- every one an array of quoted literals inside ...", "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: 450 assertions over real temp git repos (real scan()/assertInputs() path)", "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/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 check:cli-test-child-env :: exit 0 :: ✓ check:cli-test-child-env: 138 spawner source(s) among 279 under packages/cli/test/**; no new bulk process.env copy reaches a spawned child, all 168 spawn call(s) declare their child's env, and all 7 spawn(s) of the ...", "pnpm check:engine-double-contract :: exit 0 :: check-engine-double-contract: 902 (file, verb) row(s) held by the RETAINED ledger — a pin that leaves names itself.", "pnpm check:objectql-double-limit :: exit 0 :: OK ObjectQL double `limit` conformance holds: 475 double(s) graded, 279 apply the caller's bound or refuse it loudly.", "pnpm check:objectui-changeset :: exit 0 :: ✓ objectui-range --self-test: all checks passed", "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 table including the inconclusive refusal, the buc...", "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 covered by `pnpm lint`.", "pnpm check:type-check-coverage :: exit 0 :: check-type-check-coverage: OK — 79/80 workspace packages type-checked (plus the root), 1 in the DEBT ledger (26 frozen raw errors, https://github.com/objectstack-ai/objectstack/issues/4311), 1 exempt.", "pnpm check:type-check-debt :: exit 0 :: check-type-check-coverage --re-measure: OK — 1 ledger entr(ies) re-measured in 8.7s, 26 raw tsc error(s) total, none above its recorded number.", "pnpm check:where-matcher :: exit 0 :: ✓ where-matcher conformance holds: 498 matcher(s) discovered, 498 answer the combinator battery correctly or refuse it loudly (325 refuse).", "node scripts/check-changeset-fixed.mjs :: exit 0 :: ✓ .changeset/config.json \"fixed\" group is in sync with 69 public workspace packages.", "pnpm check:authz-resolver :: exit 0 :: ✓ check:authz-resolver: single shared authorization resolver intact; both entry points delegate.", "pnpm check:error-code-casing :: exit 0 :: · 18 literal(s) suppressed by an adr0112-ok: reason", "pnpm check:filter-alias-parity :: exit 0 :: check:filter-alias-parity: OK (4 transport spelling(s) of the `where` slot, identical on both sides: $filter, filter, filters, where)" ], "gates_reconciliation": "dispatch-gates --ran on an exit-code record at 68df86ef6: 65 derived famil(ies) accounted for — 65 run, 0 NOT-MEASURED (a DERIVED zero — all 65 recorded an exit code and none of them is 3). Dispatch list 50 lines; re-derivation added 15 (check-adr-0087-registration x2, check-empty-changeset x2, release-rehearsal-clone --self-test, release-pending-publish --self-test, check:cli-test-child-env, check:engine-double-contract, check:objectql-double-limit, check:objectui-changeset, check:pm-changeset-deadline-census, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher); plus 4 roster gates flagged as rostered under a touched directory (check-changeset-fixed, check:authz-resolver, check:error-code-casing, check:filter-alias-parity). First pass: check:dual-build-cjs-loads, check:i18n, check:i18n-coverage, check:i18n-walk-parity exited 3 (PREREQUISITE NOT MET, workspace not built) and are NOT counted as measurements; after turbo run build (Tasks: 72 successful, 72 total) all 4 exited 0. CI on the PR head at report time: 2 completed, 14 in_progress, 0 failed (in_progress is not a pass).", "line_budget": "n/a: no skills/**", "files_changed": [ "packages/cli/src/commands/package/install.ts", "packages/cli/test/package-install-hot-loaded.test.ts", ".changeset/22729-package-install-hotloaded.md" ], "deviations": [ "Did not merge origin/main (7c7e75052, 2 commits past BASE a360cee92) before opening the PR, against AGENTS.md Multi-agent §10 first bullet: git merge-tree --write-tree HEAD 7c7e75052 exit 0 and 0 paths overlap; merging would move the head and require re-running every gate and the CLI unit tier (9m25s, near the foreground cap) for no information about this change; the PR merge ref and the queue rebuild validate the merge.", "Labels: zero label writes (dispatch named none; a changeset is present so skip-changeset does not apply)." ], "mcp_calls": "0 — no MCP GitHub calls", "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot]) carrying 3 REST writes: pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft, #22734) + POST /repos/objectstack-ai/objectstack/issues/22734/assignees (os-project-manager); comment = POST /repos/objectstack-ai/objectstack/issues/22729/comments (this os-dev-report). Plus git push of claude/issue-22729-package-install-hotloaded (not a REST write). No label writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted in PR #22734 Acceptance notes, not filed · the warning says the package loads at the runtime next restart (the ruling wording, as #22728 changeset puts it); the server note says it registers it again at the next restart, and a deterministic register error can throw again at rehydrate, which the listing does not mark (already recorded in #22728 acceptance notes)", "carrier: none · noted in PR #22734 Acceptance notes, not filed · a lenient install exits 0; with no --json face the exit code is the only machine signal, so a script cannot tell a lenient install from a hot one without parsing text" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
ACCEPT: PR #22734 at
68df86ef65·domain:cliseat 1os-project-manager·session_019SvPnd2bzECRNmAU9i6E4k· 2026-10-10T22:24Z. The review of record is against GitHub (the PR object, its file list and its diff), ⛔ not the report (6102812252).Checklist:
main. The first body line isFixes #22729, and a line-initialClause-②: nofollows. That is the body's only closing keyword.packages/cli/src/commands/package/install.ts, a new unit test, and.changeset/22729-package-install-hotloaded.md(@objectstack/clipatch). All three are inside the claim. No governed path, nopackages/spec.6102054264), read in the diff:hotLoaded === falseturns the success line into a warning ("installed, but the running kernel could not load it — it loads at the runtime's next restart"), followed by aHot-load error:line whenhotLoadErroris a non-blank string.hotLoaded: true, and an answer without the key, print exactly as before. The read is additive.--jsonface, so none was added.422when register throws, so it never reacheshotLoaded: false. The read is the same code either way.200" matches the removed unconditionalprintSuccess. "OnhotLoaded: falseit prints a warning … followed by aHot-load error:line" matches the new branch. "WhenhotLoadErroris missing, blank or not a string, no reason line is printed" matches thetypeof/trimguard. "The exit code stays0" holds: no exit path changes. "The command has no--jsonoutput, and none is added" holds.--ranreconciled 65/65.mcp_calls0.api_writes: 2 relay strokes.Acceptance notes (
carrier:none, not filed): a lenient install exits0, so with no--jsonface a script can tell it from a hot install only by its text. "Loads at the next restart" is the ruling's wording, while a deterministic register error can throw again at the rehydrate (already noted on #22695's acceptance).Landing: CI on
68df86ef65at this read: completed/skipped: 3 · completed/success: 15 · in_progress/-: 13. The seat lands it through the relay once every check is green.Generated by Claude Code
objectstack-fleet commentedon Oct 10, 2026
Landed: PR #22734 merged as
f59a73c395(domain:cliseat 1 ·os-project-manager·session_019SvPnd2bzECRNmAU9i6E4k· 2026-10-10T23:03Z).added_to_merge_queueat 22:43:37Z, thenmergedat 23:02:04Z. The landing commit has one parent and is an ancestor oforigin/main.origin/main:packages/cli/src/commands/package/install.tsreadsdata.hotLoaded === falseinto aprintWarningbranch, and prints theHot-load errorline only for a non-blank stringhotLoadError.completedthroughFixes #22729;pm:dispatchedis stripped in this act.hotLoaded: true(the lenient path), so a console says the app "should now appear" over a kernel that does not have it #22695's key, the console, stays on console: install answers say what the runtime served —hotLoaded: falsereads "installed, loads at the next restart", and an upgrade waits for the new version's app objectui#12098.Generated by Claude Code