chore: harden repository guardrails
This commit is contained in:
@@ -17,24 +17,36 @@ These rules map platform ownership to filesystem and package boundaries. The exe
|
||||
|
||||
- Core never imports a feature module, surface, Builder implementation, or app.
|
||||
- A module never imports Core implementations, another module, a surface, Builder code, or an app.
|
||||
- A module cannot contain `.tsx`, `.jsx`, `.css`, `.scss`, `.less`, `.vue`, or `.svelte` source
|
||||
and cannot depend on a UI framework. Modules expose data and behavior only.
|
||||
- A module cannot contain presentation source, including JSX/TSX, single-file components,
|
||||
Astro/Marko/MDX/HTML views, stylesheets, or SVG presentation assets, and cannot depend on UI
|
||||
frameworks or shared UI-role packages. Modules expose data and behavior only.
|
||||
- A surface never imports Core or a feature module. It uses public API/client contracts.
|
||||
- Separate surfaces do not import each other's internals.
|
||||
- Builder code composes contracts and surface renderer identifiers; it does not import module or
|
||||
surface internals.
|
||||
- Contract and SDK packages cannot depend upward on implementations.
|
||||
- Workspace package consumers use declared `exports`, not private subpaths.
|
||||
- Every internal dependency uses a `workspace:` range and every imported workspace package is
|
||||
declared by the consumer.
|
||||
- Workspace aliases are forbidden because they obscure package ownership in the dependency graph.
|
||||
- Workspace package names are unique and shared packages declare a recognized architectural role.
|
||||
- Circular source and workspace-package dependencies are rejected.
|
||||
- Cross-module data access uses services, events, capabilities, or opaque identifiers rather than
|
||||
direct table imports and foreign keys.
|
||||
|
||||
The boundary test suite includes intentionally invalid fixture graphs. This proves that the guard
|
||||
rejects forbidden dependency directions even before production packages fill every directory.
|
||||
rejects every currently machine-checkable repository rule even before production packages fill
|
||||
every directory. The UI guard rejects component, view, template, stylesheet, shared UI-role, and
|
||||
common UI-framework dependencies inside modules. This deny list is defense in depth; package
|
||||
review remains required when adopting a new frontend technology.
|
||||
|
||||
Cross-module table ownership, foreign keys, and schema namespace rules require Drizzle metadata
|
||||
and are intentionally deferred to the Phase 3 schema validator.
|
||||
|
||||
## Generated code
|
||||
|
||||
Generated artifacts are reproducible outputs with a named generator and validation step. A
|
||||
generated module bootstrap may import discovered module entry points at an application
|
||||
composition edge, but Core itself remains feature-agnostic. Generated files are never an excuse
|
||||
for a hand-maintained central module registry.
|
||||
generated module bootstrap under the root `generated/` boundary may import discovered module entry
|
||||
points, and apps may import that generated bootstrap. Handwritten app and Core code still cannot
|
||||
import feature modules directly. Generated files are never an excuse for a hand-maintained central
|
||||
module registry.
|
||||
|
||||
Reference in New Issue
Block a user