Amended by 0127: the category table is
replaced, with infrastructure and the placements recorded there.
Context
packages/ holds ten category folders. Nine of them contain only a .gitkeep; experience holds @stackra/brand. An
empty folder documents nothing a page cannot, and it suggests packages exist where none do. pnpm new already creates the
destination path recursively (tools/scripts/scaffold.mjs), so a category folder does not need to exist in advance.
Decision
- The ten categories stay the taxonomy: foundation, application, communication, cross-cutting, data, developer,
experience, runtime, security, state. They are listed in
/guides/packagesand inCATEGORIESintools/scripts/scaffold.mjs. - Empty category folders are deleted, with their
.gitkeepfiles. - A category folder is created with its first package, by
pnpm new <kind> <name> --category <c>. - The archetypes of 0004 are unchanged.
Consequences
ls packagesshows only what exists.- The taxonomy lives in two places (the guide and
CATEGORIES); they must agree.
Enforcement
tools/scripts/scaffold.mjs rejects a --category outside CATEGORIES. Planned — a validator check that every directory
under packages/ other than tooling contains at least one member, and that every category folder is in CATEGORIES.
Supersedes and sources
Supersedes: none. Amends: none — 0001 and 0004 require packages to sit in category folders but do not require empty ones. Applies 0004 decision 4 (“directories exist only when something real lives in them”) topackages/. Sources: owner decision in chat, 2026-10-19.