Skip to content

chore(blueprint): add A-600 external runtime dependency shims#48

Open
mellanon wants to merge 1 commit intomainfrom
feat/a-600-external-deps
Open

chore(blueprint): add A-600 external runtime dependency shims#48
mellanon wants to merge 1 commit intomainfrom
feat/a-600-external-deps

Conversation

@mellanon
Copy link
Copy Markdown
Collaborator

@mellanon mellanon commented Apr 7, 2026

Summary

Adds A-600 External runtime dependency shims to blueprint.yaml as a planned iteration-10 feature, depending on A-100 (manifest format) and A-101 (install pipeline).

A-600 is the structural fix for the gap surfaced by today's grove-bot/Luna outage: arc-installed long-running processes (grove-bot, future bots) inherit a stripped PATH from launchd/nohup/system services, so Bun.spawn(["claude", ...]) in grove/src/bot/lib/cc-session.ts:115 hits ENOENT even though claude is installed on the machine — just not in any directory the bot's PATH sees.

Full design and acceptance criteria are in #47. This PR is blueprint-only — it does not implement A-600, just makes it visible on the dependency graph.

What this PR contains

- id: A-600
  name: External runtime dependency shims
  status: planned
  iteration: 10
  effort: m
  issue: 47
  depends: [A-100, A-101]
  description: "externalDeps[] manifest field + install postcheck. arc detects
    external binaries (claude, gh, bun, etc.) declared by a package, finds them
    across known paths (native installer, npm, fnm, homebrew), and creates
    shims in paths.shimDir (~/bin) so spawned subprocesses on stripped PATH
    (launchd, nohup, system services) can resolve them. Includes arc doctor
    command for first-run diagnosis. Closes the DD-72 gap surfaced by
    2026-04-07 grove-bot/Luna outage where Bun.spawn(['claude', ...]) hit
    ENOENT because the bot inherited a minimal PATH without ~/.local/bin."

Verification

$ BLUEPRINT_DEV_ROOT=/tmp/bp-test bun run src/cli.ts lint
✓ All checks passed.

$ BLUEPRINT_DEV_ROOT=/tmp/bp-test bun run src/cli.ts ready --repo arc
Ready to start (6):
  [ready] arc/A-600 External runtime dependency shims
  [ready] arc/A-400 Runtime enforcement (SecurityValidator)
  [ready] arc/A-401 metafactory registry source
  [ready] arc/A-406 SHA-256 registry verification
  [ready] arc/A-500 Remote package info
  [ready] arc/A-402 Version pinning

(Lint run via /tmp/bp-test symlink farm with arc pointing at this worktree branch — same pattern used for grove#171 and meta-factory#67 launch-plan imports.)

Connection to launch plan

A-600 is a DD-72 prerequisite, not a launch blocker. We worked around today's incident with a one-off ~/bin/claude symlink, and Luna is functional again. But A-600 is the right structural fix and should land in iteration 10 alongside the launch plan, ideally before grove's first non-founder install (grove:S2-11).

Cross-stream context: see meta-factory docs/critical-path-to-launch.md and the launch-plan blueprint imports in:

  • the-metafactory/grove#171 (Stream B — grove launch features S1-* + S2-10..12)
  • the-metafactory/meta-factory#67 (Stream C — metafactory launch features S2-01..32)

Test plan

  • blueprint lint clean
  • blueprint ready --repo arc shows A-600
  • No new orphans, no missing deps
  • Reviewer agrees A-600 is correctly framed (this is a planning PR — implementation is a separate PR)

Refs #47

Adds A-600 to the arc blueprint as a planned iteration-10 feature.
externalDeps[] manifest field + install postcheck + arc doctor, so
arc-installed long-running processes (grove-bot, etc.) can resolve
external binaries like `claude` even when launched from a context
with a stripped PATH (launchd, nohup, system services).

Surfaced by 2026-04-07 grove-bot/Luna outage: Bun.spawn(["claude", ...])
hit ENOENT in cc-session.ts because the bot's inherited PATH did not
include ~/.local/bin where the native installer drops claude.

Worked around with a manual symlink (~/bin/claude → ~/.local/bin/claude).
A-600 is the structural fix.

Refs #47
@mellanon mellanon added infrastructure Cross-cutting infrastructure work future Planned but not yet scheduled labels Apr 7, 2026
@mellanon
Copy link
Copy Markdown
Collaborator Author

mellanon commented Apr 7, 2026

Code Review — 6-Lens Analysis

PR: chore(blueprint): add A-600 external runtime dependency shims
Scope: 10-line addition to blueprint.yaml (planning entry only, no implementation code)


Lens Results

Lens Findings Verdict
CodeQuality 0 critical, 0 warning, 0 suggestion, 1 nit PASS
Security N/A — no code execution surfaces PASS
Hardening N/A — no API/middleware/server code PASS
Architecture 0 findings — follows existing YAML structure PASS
EcosystemCompliance 0 critical, 0 warning, 0 suggestion, 0 nit PASS
Performance N/A — no runtime code PASS
Duplication 0 findings — A-600 is unique in the graph PASS

Per-Lens Details

CodeQuality

  • nit: effort and issue are used here for the first time in this repo's blueprint.yaml. All prior features (A-100 through A-500) lack these fields. Both fields are schema-valid (blueprint/src/schema.ts defines them as optional), so this is fine — but it creates a mild inconsistency. Backfilling existing features is a separate concern and not blocking.

Security / Hardening / Performance

All three lenses are not applicable. This PR modifies only a YAML planning file with zero runtime code, zero endpoints, zero user input handling, and zero resource management.

Architecture

The new entry follows the existing pattern:

  • Correct id series (A-600, after A-500)
  • depends: [A-100, A-101] correctly roots at the manifest format and install pipeline (both done)
  • iteration: 10 positions it appropriately in the roadmap timeline
  • status: planned is correct for a blueprint-only PR

EcosystemCompliance

  • Commit message: chore(blueprint): add A-600 external runtime dependency shims — correct conventional commit format
  • PR title matches commit headline
  • Issue feat(A-600): externalDeps shims so spawned bots find claude on stripped PATH #47 is properly referenced (Refs #47 in commit body, issue: 47 in the YAML entry)
  • Labels infrastructure + future are appropriate for a planned infrastructure feature
  • No CLAUDE.md or arc-manifest.yaml changes needed (this adds no implementation)
  • effort: m is a valid T-shirt size per schema

Duplication

Searched the blueprint for overlapping features. A-600 is distinct:

  • A-102 covers provides.cli[] shim generation for arc-installed package CLIs
  • A-600 extends this to external binaries declared via externalDeps[] — different concern, correct separation

Verdict: APPROVE

Clean blueprint addition. The feature is well-scoped, correctly positioned in the dependency graph, and the PR is thoroughly documented with incident context, design rationale, and acceptance criteria in issue #47. No code to review — this is planning only.

Copy link
Copy Markdown
Collaborator Author

@mellanon mellanon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6-lens code review complete. Clean blueprint-only addition — no code changes, all fields schema-valid, correct dependency graph positioning, thorough issue documentation. Verdict: APPROVE (submitted as comment due to self-authorship constraint).

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

Labels

future Planned but not yet scheduled infrastructure Cross-cutting infrastructure work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant