Skip to content

feat(estate): settle workspace placement — external root, flat servers, submodule-only#47

Merged
rldyourmnd merged 13 commits into
mainfrom
docs/external-workspace-convention
Jul 26, 2026
Merged

feat(estate): settle workspace placement — external root, flat servers, submodule-only#47
rldyourmnd merged 13 commits into
mainfrom
docs/external-workspace-convention

Conversation

@rldyourmnd

Copy link
Copy Markdown
Collaborator

Three placement rules were undeclared or wrong. Each is now an ADR, routed into the skills that act on it, with the estate sources and Serena memory brought in line.

ADR 0025 — out-of-estate external root

Repositories owned by third-party accounts have no owner, installation, or selector here, so they cannot be classified or observed. They live in ${HOME}/Developer/external, unanchored, never a materialization target. Deliberately not added to workspace_roots: roots are reachable only via materialization.include[].workspace_root, so an unreferenced root is dead config implying GDS materializes there.

ADR 0026 — flat servers root

servers/nddev and servers/rldyourmnd were declared but never existed; every server checkout already lived flat in servers/. A device may not point two selectors at one root (GDS_DEVICE_WORKSPACE_ROOT_REUSED), so flat required merging portfolio:organization-servers + portfolio:personal-servers into one portfolio:servers. Both selectors keep their owner-scoped match, so a server-* fork still lands in its owner's fork portfolio.

ADR 0027 — submodule repositories get no standalone checkout

Six repositories existed as both a gitlink and a standalone checkout, making one stable ID resolve to two Git stores. Embedded placement also requires roles on both sides, so the control plane now declares superproject; nddev-browser gained role module plus the obligatory module block via NDDev-it-com/nddev-browser#17, picked up here as a gitlink advance.

Result

gds workspace audit over ~/Developer leaves blocked:

Finding Before After
GDS_CONTEXT_IDENTITY_CONFLICT 6 0
GDS_IDENTITY_INDEX_ID_CONFLICT 6 0
GDS_WORKSPACE_PLACEMENT_DRIFT 1 0
GDS_WORKSPACE_ROOT_NOT_READY 1 0
GDS_WORKSPACE_EMBEDDED_ROLE_INVALID 3 0

Remaining: GDS_WORKSPACE_ANCHOR_REQUIRED ×21 (the servers/ tree and external/, unanchored by design) and one GDS_WORKSPACE_SUPERPROJECT_NOT_DISCOVERED for nddev-stroyme, whose superproject is outside the audited set.

Verification

scripts/validate_ci_tier.sh pr-required exit 0, 64 checks, 0 failed. gds validate and gds memory validate 0 findings, 8/8 memories verified. Projections regenerated through plan/apply and the golden fixture refreshed; the memory provenance resync is the final commit.

Third-party collaboration checkouts have no owner, installation, or selector in
this estate, so they cannot be classified or materialized. Record the accepted
placement (${HOME}/Developer/external, unanchored, never a materialization
target) as ADR 0025 and route the affected skills to it.

- gds-orient: report an out-of-estate boundary as expected steady state
- gds-audit-estate: treat its GDS_WORKSPACE_ANCHOR_REQUIRED as accepted
- gds-materialize-workspace: exclude externally owned repositories
…ayout

Add ADR 0025 to the declared sources and state the invariant that an
externally owned repository has no portfolio, is never materialized, and
yields GDS_WORKSPACE_ANCHOR_REQUIRED as accepted steady state.
The per-owner servers/nddev and servers/rldyourmnd subroots were never
materialized; every server checkout already lived directly in
${HOME}/Developer/servers. A device may not assign one root to two selectors
(GDS_DEVICE_WORKSPACE_ROOT_REUSED), so a flat root requires one portfolio.

Replace portfolio:organization-servers and portfolio:personal-servers with a
shared portfolio:servers. Both selectors keep their own owner-scoped match, so
a fork named server-* still lands in its owner's fork portfolio.

Record the decision as ADR 0026 and update the core-estate-layout invariant.
Embedded placement requires the superproject to carry the superproject role
and the module to carry the module role (core/workspace/layout.go). The
control plane owns three gitlinks but declared only control-plane, so every
embedded module was reported GDS_WORKSPACE_EMBEDDED_ROLE_INVALID.
…e checkout

Six repositories existed as both a gitlink and a standalone checkout, making one
stable ID resolve to two Git stores and holding workspace audit in blocked with
twelve identity findings. Record the rule as ADR 0027 and route the skills to it.

- gds-manage-module: roles required on both sides; module role obliges a module block
- gds-materialize-workspace: never materialize a submodule-consumed repository
- gds-audit-estate: identity conflicts mean the standalone copy is the defect
Picks up NDDev-it-com/nddev-browser#17, which adds role module and the
required module block so embedded placement validates.
@rldyourmnd
rldyourmnd merged commit 78c56cf into main Jul 26, 2026
18 checks passed
@rldyourmnd
rldyourmnd deleted the docs/external-workspace-convention branch July 26, 2026 08:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant