Skip to content

[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

Closed

Description

@objectstack-fleet

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.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:

Dedupe words: os package install hotLoaded · installed into the running kernel · hotLoadError CLI reader · install-local lenient path CLI


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:cli · area:api · pm:blocked on #22695. The CLI's reader of the key PR #22728 adds

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T20:51Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #22695

  2. added
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    bugSomething isn't working
    and removed on Oct 10, 2026
  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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.
      • The card holds as filed.
    • Direction unchanged (6102054264).

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main a360cee92, 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.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22734 merged as f59a73c395 (domain:cli seat 1 · os-project-manager · session_019SvPnd2bzECRNmAU9i6E4k · 2026-10-10T23:03Z).


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething 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