Skip to content

[decision] Does the v5.0 projectenvironment rename extend to the API surface — client.projects.* and the res.project / res.projects response fields? #12473

Description

@os-litant

Filed unassigned and unlabelled by the domain:cli seat (#6024), session session_01UjujZN219uFzBhSYfMykCd. ⛔ Not graded, not routed — and ⛔ not a card an execution seat can answer: it is a breaking public-API decision.

⚠️This seat owed this card at #12153's acceptance and did not file it. Triage flagged the omission on #12432 ("expected from the cli seat at #12153 acceptance per the cross-repo follow-up rule"). Filed now, late, and recorded as late so the gap is visible rather than tidied away.

What is settled, and what is not

Settled. ADR-0006 renamed projectenvironment at v5.0 with no aliases, and AGENTS.md states "Project now only means the npm/monorepo sense." Three PRs have carried that through the CLI:

Not settled, and deliberately fenced out of all three:

surfacewhere
client.projects.*@objectstack/client SDK method names
res.project / res.projectscontrol-plane response fields
packages/client/src/index.ts:1814Provision a new project — the SDK JSDoc that travels with the above

Each of the three cards named these as out of scope for the same reason: they are API surface in other packages, not CLI wording.

Why this needs a human, ⛔ not a seat

Renaming any of them is a breaking change to a published contract with a migration story:

  • client.projects.* is a published SDK method namespace — renaming breaks every caller, and an alias is exactly what ADR-0006 says the rename does not get.
  • res.project / res.projects are control-plane wire fields. The producer is the cloud control plane, not this repo, so this is also a cross-repo coordination question (objectstack-ai/cloud), not a local rename.

⇒ Squarely on the maintainer floor: protocol / public-contract change, plus a cross-repo producer. ⛔ No execution seat should decide it, and ⛔ no code PR should quietly start it.

The options, as this seat understands them

  1. Rename with a breaking major — the SDK namespace and the wire fields both move to environments / environment. Consistent with ADR-0006's no-alias rule; costs a coordinated cloud-side change and a migration entry.
  2. Rename the SDK only, leave the wire fields — the CLI already maps between them (res?.project feeding os environments show). Cheaper, but leaves the contract half-renamed and the mapping permanent.
  3. Leave both, and record the boundary — declare that the rename was scoped to the CLI's user-facing vocabulary and that project survives deliberately on the API surface. Costs nothing today; requires the boundary to be written down where the next reader of ADR-0006 will find it, or this question returns every few months.

This seat states no recommendation — with a cross-repo producer and a published namespace in play, a recommendation from the lane that keeps tripping over the drift is not worth much. What the seat can say is that option 3 is not free: the cost is a documented boundary, and its absence is what has produced three cards in three days.

Why it is worth a card rather than leaving it implicit

The drift is generative: #10967, #12153, #12432 and #12464 are four cards in the same week, each fixing one axis of one rename, each correctly fencing out the API surface, and none able to close the question. Until it is answered, every future reader of a project-spelled identifier next to an environment-spelled one files another.

Refs

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions