feat(estate): settle workspace placement — external root, flat servers, submodule-only#47
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 toworkspace_roots: roots are reachable only viamaterialization.include[].workspace_root, so an unreferenced root is dead config implying GDS materializes there.ADR 0026 — flat servers root
servers/nddevandservers/rldyourmndwere declared but never existed; every server checkout already lived flat inservers/. A device may not point two selectors at one root (GDS_DEVICE_WORKSPACE_ROOT_REUSED), so flat required mergingportfolio:organization-servers+portfolio:personal-serversinto oneportfolio:servers. Both selectors keep their owner-scopedmatch, so aserver-*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-browsergained rolemoduleplus the obligatorymoduleblock via NDDev-it-com/nddev-browser#17, picked up here as a gitlink advance.Result
gds workspace auditover~/Developerleavesblocked:GDS_CONTEXT_IDENTITY_CONFLICTGDS_IDENTITY_INDEX_ID_CONFLICTGDS_WORKSPACE_PLACEMENT_DRIFTGDS_WORKSPACE_ROOT_NOT_READYGDS_WORKSPACE_EMBEDDED_ROLE_INVALIDRemaining:
GDS_WORKSPACE_ANCHOR_REQUIRED×21 (theservers/tree andexternal/, unanchored by design) and oneGDS_WORKSPACE_SUPERPROJECT_NOT_DISCOVEREDfornddev-stroyme, whose superproject is outside the audited set.Verification
scripts/validate_ci_tier.sh pr-requiredexit 0, 64 checks, 0 failed.gds validateandgds memory validate0 findings, 8/8 memories verified. Projections regenerated through plan/apply and the golden fixture refreshed; the memory provenance resync is the final commit.