Policy
Policies define architectural rules, standards, and constraints that your system must follow. They help enforce best practices, compliance requirements, and organizational standards directly in your architecture model.
Syntax
PolicyID = policy "Short policy statement" {
category "security"
enforcement "required"
description "Explain intent, scope, and rationale. Rules below are what get evaluated."
rule deny edge from { kind "external_api" } to { kind "database" }
}
Writing strong policies
- Make the title a testable statement ("DBs must be encrypted at rest")
- Set
categoryso policies can be grouped (security, compliance, performance, data, observability) - Pick
enforcementbased on impact (requiredfor must-fix,recommendedfor should-fix,optionalfor guidance) - Encode enforcement using
rule ...entries sosruja lintcan evaluate them - Use
except ...to record deliberate exceptions instead of relying on tribal knowledge
Simple Policy
import { * } from 'sruja.ai/stdlib'
SecurityPolicy = policy "Enforce TLS 1.3 for all external communications"
view index {
include *
}
Policy Fields
ID: Unique identifier for the policy (e.g.,SecurityPolicy,GDPR_Compliance)Description: Human-readable description of the policycategory(optional): Policy category (e.g., "security", "compliance", "performance")enforcement(optional): Enforcement level (required|recommended|optional). Synonyms are accepted:error/warn/info.description(optional): Detailed description within the policy body- Defaults:
categorydefaults togeneral,enforcementdefaults towarn
Editor and CI integration
- The VS Code extension surfaces policy nodes in the outline and shows lint violations as diagnostics.
- CI and CLI checks (lint/drift/compliance) treat
enforcementas severity (required→ error,recommended→ warning,optional→ info).
Example: Security Policies
import { * } from 'sruja.ai/stdlib'
TLSEnforcement = policy "All external communications must use TLS 1.3" {
category "security"
enforcement "required"
}
EncryptionAtRest = policy "Sensitive data must be encrypted at rest" {
category "security"
enforcement "required"
}
BankingApp = system "Banking App" {
API = container "API Service"
CustomerDB = database "Customer Database"
}
view index {
include *
}
Example: Compliance Policies
import { * } from 'sruja.ai/stdlib'
HIPAACompliance = policy "Must comply with HIPAA regulations" {
category "compliance"
enforcement "required"
description "All patient data must be encrypted and access logged"
}
DataRetention = policy "Medical records retained for 10 years" {
category "compliance"
enforcement "required"
}
view index {
include *
}
Policy Categories
Common policy categories include:
security: Security standards and practicescompliance: Regulatory and legal requirementsperformance: Performance standards and SLAsobservability: Monitoring, logging, and metrics requirementsarchitecture: Architectural patterns and principlesdata: Data handling and privacy requirements
Enforcement Levels
required: Policy must be followed (non-negotiable)recommended: Policy should be followed (best practice)optional: Policy is a guideline (suggested)
Benefits
- Documentation: Policies are part of your architecture, not separate documents
- Validation: Can be validated against actual implementations
- Communication: Clear standards for development teams
- Compliance: Track regulatory and organizational requirements
- Governance: Enforce architectural decisions and patterns
Policy Rules
Policies can include structured rules that are evaluated by the rule engine (deterministic; no ad-hoc phrase parsing).
Selectors
Policy rules match elements using selectors:
{
kind "database"
id "Shop.DB"
tag "production"
technology "PostgreSQL"
meta "owner" "team-payments"
}
Supported selector fields:
kind "..."— element kind (normalized: lowercase; spaces/hyphens become underscores)id "..."— element id (fully-qualified likeShop.DBor leaf id likeDB)tag "..."— required tag (can also be written as#tag/@tagon elements)technology "..."— matchestechnology "..."on elementsmeta "key" "value"— matchesmetadata { key "value" }on elements (value match is case-insensitive)
deny edge
Deny a class of edges by matching source and target selectors:
NoExtToDb = policy "External APIs must not call databases" {
category "security"
enforcement "required"
rule deny edge from { kind "external_api" } to { kind "database" }
}
When you run sruja lint or drift/compliance checks, the rule engine evaluates each edge in the graph; if an edge matches (source selector → target selector), a policy violation is reported.
You can also add:
except from { ... } to { ... }— allow a specific edge patternmessage "..."— override the default violation messagesuggest "..."— add one or more suggestions (repeatable)
NoServiceToDb = policy "Services must not call DBs" {
enforcement "required"
rule deny edge
from { kind "service" }
to { kind "database" }
except from { id "Checkout" } to { id "PaymentsDb" }
message "Direct DB access is forbidden"
suggest "Route via an API"
suggest "If intentional, add an exception"
}
require tags
Require one or more tags to exist on matched elements:
EncryptionPolicy = policy "DBs must be encrypted" {
enforcement "required"
rule require tags on { kind "database" } tags ["encrypted"]
}
Optional tail items:
except { ... }— exclude elements matching a selectormessage "..."/suggest "..."— same asdeny edge
require metadata
Require a metadata key (and optionally a specific value) on matched elements:
OwnershipPolicy = policy "Containers must declare owners" {
enforcement "recommended"
rule require metadata on { kind "container" } key "owner"
}
With a required value:
EnvPolicy = policy "Production containers must declare environment" {
enforcement "required"
rule require metadata on { kind "container" tag "production" } key "environment" value "prod"
}
require slo
Require an slo { ... } block on matched elements:
SloPolicy = policy "Production containers must have SLOs" {
enforcement "required"
rule require slo on { kind "container" tag "production" }
}
Evaluation
Policy evaluation is rule-based: the DSL is the way you author rules, and the evaluator runs them deterministically over the architecture graph. Policy titles/descriptions document intent; only rule ... entries are evaluated.