summary:~/Code is a recursive tree of @org dirs — producer namespaces holding kind-orgs of independent git repos — that mirrors each producer's forge; tools resolve projects by walking it and cutting at repo boundaries.
rationale:"Producer is the PRIMARY partition, kind is secondary. The path mirrors that producer's forge — ~/Code/<producer>/<kind-org>/<repo> <-> <producer-forge>/<kind-org>/<repo>."
@ct/@platform, @ct/@developer — each the workspace checkout of the matching forge org.
rationale:Producer is stable; license/distribution is not. A project released OSS later still belongs to its producer namespace — organize by who builds it, not by how it ships. Default to @quinn when no distinct company/product producer applies. "lilith"/"egirl" are NOT producers — they are version names of the ct platform lineage (see platform_versions). One forge per producer keeps creds/projects isolated and the workspace<->forge mirror exact.
@platform = the core platform product, kept as VERSIONED GENERATIONS (current + archived);
@developer = dev-infra / meta repos (conventions, tooling).
rationale:An app is a deployable composition that CONSUMES packages; a package is a library CONSUMED BY apps. The role determines the kind-org, regardless of which producer or forge owns it.
- id:platform_versions
level:should
text:>
@platform holds successive generations of the core platform, not a single repo. Older
generations are archived (on the forge and as read-only checkouts); exactly one is the
live current. New platform generations are added beside the old, never overwritten.
text:Each project under a kind-org is its own independent git repo. Never nest one repo inside another's working tree, and never assume a single monorepo at the root or at a producer namespace.
rationale:Repos are cloned/forge-managed per-project; cross-repo coupling is HTTP/registry, not filesystem. A producer namespace that is itself a repo (rather than a plain container) cannot host sibling repos — make it a container (cf. @lilith).
- id:scope_by_boundary
level:must
text:>
Resolve an @org by the NEAREST enclosing repo / producer boundary, never by matching
the name alone. A @packages or @applications dir INSIDE a repo's working tree is
repo-local (a workspace member), NOT a workspace org. Tree-walkers must cut at .git
boundaries.
rationale:"@applications / @packages recur as both top-level kind-orgs and repo-internal workspace folders; name-only resolution conflates them."
- id:package_tiers
level:should
text:>
Place a library by its consumer reach, in three tiers:
(1) app-private — consumed by ONE app -> lives in <app>/@packages/;
(2) producer-shared — consumed by >=2 apps of one producer -> lives in that producer's
@packages (e.g. @ct/@packages);
(3) cross-producer — consumed beyond one producer (workspace-wide tooling, foundational
scopes) -> lives in the top-level @packages.
rationale:Promotes a package no further than its actual reach; avoids both premature sharing and hidden cross-producer coupling.
text:A deployable project owns its infra via a root .infra.yaml (see convention:infra-manifest). Shared infra (e.g. the managed PG cluster) is data-sourced, not owned per-project.
rationale:Catch-all shared infra repos (uvlava-style) are superseded by per-project ownership.