---
id: 97eeb419-d05e-49b2-b23a-e1ccef967219
title: 'release install: scope generic copy out — placement belongs to the project''s installer'
state: closed
labels: []
assignees: []
milestone: null
created: 2026-09-09T00:41:14.175262663Z
updated: 2026-09-09T00:57:07.880076079Z
---
SOURCE: owner correction on #48 (2026-09-08), agreed: placement is
the PROJECT's job, not the forge's. #48 overgeneralized "artifact
exists" into "f0rge places it" — a Go/Python/Node binary in
$CARGO_HOME/bin is a cargo-ism injected into ecosystems that never
touched cargo. The forge must not invent placement.

KEEP from #48 (proven): resolution order (record sha > git tag >
main) and artifact STAGING (releases/build/<ver>/ holds the
project's built binary, produced by the project's own CI/build
script).

CORRECT: release install becomes resolve + stage + HAND OFF:
- if a project installer exists at a documented convention (e.g.
  install.sh at repo root, or releases/build/<ver>/install.sh —
  pick ONE, document in spec [release]), execute it argv-only with
  the staged artifact path; IT places the binary per its ecosystem
  (go install, venv, /usr/local/bin, whatever); agents write their
  project's installer and own it;
- if no installer: f0rge-self keeps its cargo install path (f0rge's
  installer IS cargo); foreign projects get a clear one-line
  message ("no installer for this project; write install.sh or use
  the project's documented install") + --dry-run shows the handoff;
- DELETE the generic copy-to-$CARGO_HOME/bin fallback for foreign
  projects.
- AGENTS.md Install section reworded to the scoped promise:
  f0rge release install = resolve+stage+run-the-project-installer.
DONE: go/python-style project with install.sh installs via ITS
script; f0rge self-installs via cargo; no generic copy; tests.
