# The naming rules The [naming standard](../../../../standards/docs/standards/naming.md) opens with **cross-cutting principles** that apply in every context, then pins concrete conventions per language and per domain. Learn the principles; they explain the conventions. ## The principles that decide most names - **Consistency over preference.** Pick one convention per context and lint it; uniformity beats any single "best" casing. - **No stutter.** Never repeat the namespace, package, or type in a member name - `bufio.Reader`, not `bufio.BufReader`. - **No redundant prefix.** The hierarchy already disambiguates, so drop the `cogitave-` echo inside a `cogitave/` namespace. The exception is a *flat global* namespace where a prefix avoids collision - `COG_` env vars, `com.cogitave.*` event types, `cogitave:` tag keys. - **Casing by role, not habit.** `UpperCamelCase`, `snake_case`, and `SCREAMING_SNAKE_CASE` are assigned by an identifier's role in each language. - **Immutable IDs; mutable facts in metadata.** Bake only permanent attributes into a name. Environment, owner, and cost go in tags and labels - never the name. - **Machine-enforceable.** Every rule maps to a linter or policy gate. ## Naming the things you will touch first **Repos.** Plain, lowercase **kebab-case** keywords - `bootstrap`, `core`, `standards`, `agents`, `infra`. **No redundant `cogitave-` prefix**: the org already provides the namespace. A product family takes its own prefix as it grows (`yuva-sdk`, `namzu-runtime`). Tiers such as `self`, `public`, and `internal` are `estate.yaml` metadata **values**, never folders or repo names - do not name a repo `internal` or `public`. **UIDs.** Dotted, immutable, globally unique - `cogitave..`. A doc's URL may change; the UID never does. **Code identifiers.** Cased by role in each language: Rust uses `snake_case` for functions and `UpperCamelCase` for types, with **acronyms as one word** (`Uuid`, `Http`, `Mcp`); Go uses `MixedCaps` and keeps initialisms uniform (`ID`, `URL`, `ServeHTTP`, never `Url`/`Id`); TypeScript uses `PascalCase` types and `camelCase` values with **no `I`-prefix on interfaces**. **Files.** TypeScript files are **kebab-case** (`mcp-client.ts`) with `PascalCase` symbols inside; Rust files are `snake_case.rs` where file equals module. Repo-root markers are UPPERCASE (`README.md`, `LICENSE`, `CHANGELOG.md`, `CODEOWNERS`). **Branches.** `type/ISSUE-ID-kebab-description`, lowercase, a single `/`, the **type drawn from the Conventional Commits vocabulary** - for example `feat/COG-417-mcp-stream-cancel`. The commit and version semantics behind that type are owned by [commits-versioning](../../../../standards/docs/standards/commits-versioning.md). > [!TIP] > When two guides disagree, the naming standard makes one opinionated, linted > choice and cites its source. You do not have to arbitrate - follow the > standard's choice and the gate will confirm it.