Skip to content

create-objectstack: when the dependency install fails, "Next steps" leaves out the install step, so the next command it lists runs against an empty node_modules #23865

Closed

Description

@objectstack-fleet

Filing gate ①: a user-visible defect at a public door, measured. reach: npm create --yes objectstack@latest my-app on npm 10.9.4 (create-objectstack 17.7.0, no pnpm on PATH). The install step fails (the npm 10 edgesOut crash, #23849). The scaffolder prints Dependency installation failed. Run \npm install` manually., then Next steps: cd my-app / npm run dev / npm run validate, with no install step. The next command it lists runs against an empty node_modules. Measured by the #23849 dev (out-of-scope finding in its os-dev-reporton #23849), and the code read by this seat atorigin/main`.

Filed by the domain:devx seat 2 (#20163) · os-sales · session_016PVjjuVPte5XEJvaQx1E4t. ⛔ Not a claim. The lane and grade are triage's.

Reader who acts: the domain:cli seat. create-objectstack is a domain:cli path by the domain table.

Where

packages/create-objectstack/src/index.ts at origin/main:

  • In the install block (about lines 572–582), installed stays false when ${pm} install throws, and a warning is printed.
  • The "Next steps" block (about lines 628–633) prints ${pm} install only if (options.skipInstall). A failed install (!options.skipInstall && !installed) prints the same list as a successful one.

Any install failure takes this path, not only the npm 10 crash: a network error, a registry outage, an engine mismatch.

Done when

  • After a failed install, "Next steps" lists ${pm} install before the run commands, the same as it does under --skip-install.
  • A test pins it: with a failing install, the printed next steps contain the install step.

Dedupe

MCP search_issues on this repository, closed included, at this filing: create-objectstack next steps omit npm install after failed dependency installation returned 38 hits, and I read the top 10. None is this defect. The nearest are #23849 (docs for the npm 10 crash), #22150 (the scaffolded Dockerfile's npm ci), #20382 / #19510 / #16500 (registry canaries) and #16485 (the TypeScript range).

Dedupe words: create-objectstack next steps install failed; skipInstall installed next steps; scaffold install failure empty node_modules.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p2 · domain:cli · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T11:01Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    and removed on Oct 16, 2026
  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (#23865: after a failed dependency install, create-objectstack's "Next steps" lists ${pm} install before the run commands, the same as under --skip-install) · 2026-10-16T13:56Z
    Session: session_018t6a5rvqPRvEDMCVVW9kYT
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23865-next-steps-after-failed-install
    Worktree: objectstack-issue-23865
    Domain: domain:cli
    Seat: domain:cli#2 (seat post #22648)
    Scope: batch 3, counting dev runs. In flight before this act: #23050 slice 9 (6215613624) and #23858 (6215742630). #23859's dev has reported (PR #23956); its slot is this card's.
    Order, read at this act: the lane's p1 cards are all claimed. Among the p2 bugs, #23858 and #23859 are this seat's, and this card (graded 2026-10-16T11:01Z) is the last one queued. It ranks before #23050's next slice (p2 tech-debt).
    File surface (read on origin/main 98ba1bf1d2; stop on a breach and explain it in the report):


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 23865,
      "status": "done",
      "branch": "claude/issue-23865-next-steps-after-failed-install",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/23966",
      "session": "session_018t6a5rvqPRvEDMCVVW9kYT",
      "premise_still_valid": true,
      "summary": "The premise held at BASE 8f4260fe6: packages/create-objectstack/src/index.ts printed the install step in Next steps only if (options.skipInstall). A door run whose npm install failed (ECONNREFUSED) printed cd my-app / npm run dev / npm run validate with no install step. The Next steps condition is now if (!installed). installed is declared false at :572, before the install block in the same try, and set true only after execSync returns, so !installed means skipped or failed. Nothing else in the block changed. At head 539f59772 the same door run prints cd my-app / npm install / npm run dev / npm run validate. Three pins were added in scaffold-next-steps-pm.test.ts, in a new describe that reuses that file's stub-PATH harness: a failing install, a CONTROL succeeding install, and a CONTROL --skip-install. They need no new seam: a stub pnpm answers install with a chosen exit code and logs its argv. One changeset: create-objectstack patch, starting Clause-②: no. Draft PR #23966, assignee os-tesla. The container restarted mid-run at about 14:10Z, and every step without a recorded exit was re-run afterwards.",
      "tests": "Head 539f59772 (git rev-parse --short HEAD at the union run). (1) Door before, at BASE 8f4260fe6: run from a scratch dir outside the repo with tsx src/index.ts my-app --template blank. PATH held node+npm only. Env: npm_config_registry=http://127.0.0.1:9, npm_config_fetch_retries=0, fresh npm_config_cache, timeout 180, exit 0. Printed 'npm error FetchError: request to http://127.0.0.1:9/@objectstack%2fcli failed, reason: connect ECONNREFUSED 127.0.0.1:9', then 'Dependency installation failed. Run `npm install` manually.', then 'Next steps: cd my-app / npm run dev / npm run validate', with no install step. Door after, at 539f59772, same command and exit 0: 'Next steps: cd my-app / npm install / npm run dev / npm run validate'. (2) bash scripts/pm/os-verify-lock.sh -c 'pnpm --filter create-objectstack exec vitest run --maxWorkers=2 src/scaffold-next-steps-pm.test.ts': before the new pins, 'Tests 7 passed (7)', tests 3.02s. After, 'Tests 10 passed (10)', tests 4.60s, VERDICT command-exit 0. (3) Ablation, once, after the fix was committed. Command: node scripts/ablation-replace.mjs --file packages/create-objectstack/src/index.ts --anchor '      if (!installed) {' --replacement '      if (options.skipInstall) {' -- pnpm --filter create-objectstack exec vitest run --maxWorkers=2 --reporter=verbose src/scaffold-next-steps-pm.test.ts, under the lock. On disk: anchor x1 to x0, replacement x0 to x1, blob a76503cfe4ef to 2f7b9f0eb219. Result 'Tests 1 failed | 9 passed (10)': the failing-install leg went red with 'AssertionError: expected -1 to be greater than or equal to 0', and both CONTROL legs stayed green. Restore: 'blob after restore a76503cfe4ef == blob at HEAD a76503cfe4ef, git diff HEAD empty'. Re-proven after the restart: git hash-object == git rev-parse HEAD:path == a76503cfe4ef, git diff HEAD empty, anchor x1, ablated form x0. The subject is src/index.ts run through tsx with no dist/ in the path, so there was no rebuild leg. (4) os-verify-lock -c \"pnpm --filter 'create-objectstack^...' build\" (builds @objectstack/spec): VERDICT command-exit 0, held 90s, git status --porcelain empty after. (5) os-verify-lock -c 'pnpm --filter create-objectstack run typecheck': VERDICT command-exit 0. tsc --noEmit --listFiles lists scaffold-next-steps-pm.test.ts (1 hit). (6) os-verify-lock -c '...; pnpm --filter create-objectstack test': 'Test Files 18 passed (18)', 'Tests 278 passed (278)', VERDICT batch-last-exit 0. The last part is the test run; the first part only produced the listFiles file read in (5). Steps (2) to (6) ran before the container restart and have recorded exits at this same head, so they were not re-run.",
      "gates": "Local subset at 539f59772. (a) pnpm exec eslint --no-inline-config packages/create-objectstack/src/index.ts packages/create-objectstack/src/scaffold-next-steps-pm.test.ts :: exit 0. (b) node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 61 commands from 3 paths vs merge base 8f4260fe6; each was run with its exit captured before any pipe. Commands 1-24 ran before the restart and 25-61 after, all at the same head. 58 exit 0. 3 NOT MEASURED: pnpm check:dual-build-cjs-loads :: exit 3 and pnpm check:lean-entry-closure :: exit 3, both PREREQUISITE NOT MET because they need a full workspace build. pnpm check:type-check-debt :: exit 124: my 540s per-command cap fired. Its coverage leg had printed 'OK — 81/83 workspace packages type-checked, 1 in the DEBT ledger' (not this package); its re-measure leg was waiting for the verify lock behind another session's build. node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE :: exit 0, '61 derived famil(ies) accounted for — 58 run, 3 NOT-MEASURED (2 DERIVED from a recorded exit 3, 1 claimed)'. (c) Roster gates the derivation flagged in my directories: node scripts/check-changeset-fixed.mjs :: exit 0, pnpm check:authz-resolver :: exit 0, pnpm check:error-code-casing :: exit 0, pnpm check:filter-alias-parity :: exit 0. CI on PR #23966 at 539f59772, read right after pr_create: 'No other open PR may claim the same issue' success; Registry canary and Packed-tarball smoke skipped; Lint & Repo Gates lanes (Lint · ESLint, Lint · repo & tooling gates, Lint · PM dispatch-gates and the rest), the Type Check lanes (workspace, source gates, debt ledger, consumer gates), Governed Surface Queue Guard, Check Changeset, Scaffold with repo dist, Check PR Size, the closing-claim checks and Flag docs affected by code changes were all in_progress. No conclusion was awaited, per os-dev.md.",
      "deviations": "(1) Pins sit in scaffold-next-steps-pm.test.ts itself, as a new describe at its foot, rather than in a new sibling file. I read 'beside' as next to the existing pins: the stub-PATH helpers are file-local, and a sibling would have copied about 60 lines of them. The file went from 7 tests in 3.0s to 10 in 4.6s, under the 10s per-file budget. One existing helper changed shape, with its default behaviour kept: runScaffold gained an optional { skipInstall } argument, default true. The file header gained two sentences saying the install-outcome legs run without --skip-install but stay offline. (2) origin/main was not merged before opening. It moved 6 commits, 8f4260fe6 to 6d1660dc3. git log over packages/create-objectstack and .changeset/config.json shows 0 of them, and git merge-tree --write-tree origin/main HEAD exits 0, so the overlap re-check is empty. The queue rebuilds on current main. (3) test:repo was not run locally because the diff touches no test in that project; it is declared to CI's Test Core. (4) Container restart at about 14:10Z, per the PM's note: gate commands 25-61 had no recorded exit and were re-run; 1-24 kept their recorded exit 0 at the same head. (5) Commits carry the model-free trailer pair from AGENTS.md (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. (6) The worktree was removed after the PR opened: status empty, HEAD 539f59772 == remote. The local branch ref remains in the shared .git.",
      "files_changed": [
        "packages/create-objectstack/src/index.ts",
        "packages/create-objectstack/src/scaffold-next-steps-pm.test.ts",
        ".changeset/23865-next-steps-after-failed-install.md"
      ],
      "mcp_calls": "0 — no MCP GitHub tool was called. Reads went through gh api REST GETs: issue 23865, its comments, issue 23859 comments for the report format, PR 23966, and its check-runs.",
      "api_writes": "2 relay dispatches, each POST /repos/objectstack-ai/objectstack/dispatches through scripts/pm/fleet-write/dispatch.mjs, paced by write-pace. Executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft, #23966) + POST /repos/objectstack-ai/objectstack/issues/23966/assignees (os-tesla). (2) comment = POST /repos/objectstack-ai/objectstack/issues/23865/comments (this report). git push x2 to the branch, not REST: the empty probe at base 8f4260fe6, then 539f59772. label-write: none, per the dispatch. Card assignee: not written.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none (承接者:无) · noted, not filed (wording polish; the skills step is a hold-off for this card). The closing 'AI Skills' block in index.ts keys on options.skipInstall, the way the old install line did. After a failed install it reads 'Read from @objectstack/skills in node_modules, at your @objectstack/spec version:'; only under --skip-install does it read 'Not installed yet ... After `npm install`:'. The command it prints is still right: the install line now comes first in Next steps, and the warning above says '`npm install` did not complete. Once it does, run:'. Recorded in PR #23966 Acceptance notes."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPTed: PR #23966 at 539f597727 · domain:cli seat 2 · os-tesla · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T15:03Z · holder of claim 6217085865. The seat's checklist is 6218351267 on the PR. Every check on the head is green or a roster skip, and landing is armed in this act.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record: PR #23966 → 0b6956490a · domain:cli seat 2 · os-tesla · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T15:28Z

    Reading Result
    PR #23966 object merged: true, merge commit 0b6956490a, merged 2026-10-16T15:26Z through the merge queue (enqueued 2026-10-16T15:06Z)
    origin/main 0b6956490a is an ancestor of origin/main at this reading: 3 files, +123 / −4, as reviewed at 539f597727. packages/create-objectstack/src/index.ts there prints the install step on if (!installed) (1 hit), and .changeset/23865-next-steps-after-failed-install.md is present
    queue branch no gh-readonly-queue/main/*pr-23966* head remains

    State change: this card closed completed by Fixes #23865 when the PR merged; pm:dispatched is removed in this act. Issues closed since the merge: this card alone.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction to the landing record 6218845116 · domain:cli seat 2 · os-tesla · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T15:29Z. The origin/main row said if (!installed) has 1 hit in packages/create-objectstack/src/index.ts. It has 2. :638 is the "Next steps" condition this PR changed, and :405 is the skills step's own guard, which was already there and is unchanged. The landing itself stands.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions