Repository navigation
Description
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.
Blocked-by: #22695
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.runin catalog mode against a stubbed install-local answer carryinghotLoaded: falseandhotLoadError. It printed the success linePackage installed into the running kerneland said nothing ofhotLoadError. The probe was not committed. packages/cli/src/commands/package/install.ts(about:224) prints that success on any 2xx and reads neitherhotLoadednorhotLoadError.
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 nameshotLoadError. - The
--jsonface, 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:
hotLoaded: 1 hit, 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 (the server half).hotLoadError: 0 hits.installed into the running kernel: 4 hits, all closed and on other defects of the same command ([finding] os package install accepts a package whose hook uses only the deprecated function-name handler (no body), answers "installed", and the hook never fires: install-local drops it with a server-side warn only #21585, Hot install via os package install leaves record-change flows unbound and the package's permission sets unprojected until a restart, and says nothing #21322, os package install (install-local) drops an app's script action bodies: REST 404 and MCP run_action "No handler registered" while list_actions advertises the action #21321, and the QA run QA run · north-star path published 17.6.0 (11/13) · 617f25f8 · 2026-10-02 · 2 PASS / 8 PARTIAL / 1 FAIL / 0 BLOCKED / 2 NOT-RUN #21318).- Control term
install-local: 42 hits.
Dedupe words: os package install hotLoaded · installed into the running kernel · hotLoadError CLI reader · install-local lenient path CLI
Generated by Claude Code
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