init
This commit is contained in:
commit
41481636d8
12 changed files with 2126 additions and 0 deletions
179
AGENTS.md
Normal file
179
AGENTS.md
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
# AGENTS
|
||||||
|
|
||||||
|
## Operational Guidance for Autonomous Agents Using specification (ABC Specification)
|
||||||
|
|
||||||
|
MUST USE `index.md` as entrypoint for specification and subsequent referenced
|
||||||
|
documents within.
|
||||||
|
|
||||||
|
### Purpose of this document
|
||||||
|
|
||||||
|
This document defines how an autonomous agent must operate when using the
|
||||||
|
Abstract Base Cloud (ABC) Specification (specification) as the authoritative
|
||||||
|
source of truth. It does not redefine, summarize, or restate the ABC Pattern.
|
||||||
|
Its purpose is to establish procedures, behaviors, and decision rules that
|
||||||
|
ensure all agent actions remain compliant with the specification.
|
||||||
|
|
||||||
|
### How to Read and Interpret spec.txt
|
||||||
|
|
||||||
|
1. Treat specification as canonical; all definitions, rules, and schemas
|
||||||
|
originate there.
|
||||||
|
2. When encountering ambiguity, defer to specification rather than internal
|
||||||
|
heuristics.
|
||||||
|
3. When interpreting any rule:
|
||||||
|
- Use the identifiers in specification as binding references.
|
||||||
|
- Do not reinterpret or rephrase the rule; apply it operationally.
|
||||||
|
4. When a task requires clarification, locate the relevant section in
|
||||||
|
specification and apply its constraints directly.
|
||||||
|
|
||||||
|
### How to Apply the ABC Normative Rules
|
||||||
|
|
||||||
|
1. Use normative rules as constraints on generation and transformation.
|
||||||
|
2. For any action:
|
||||||
|
: - Identify which normative rules apply.
|
||||||
|
- Enforce them mechanically.
|
||||||
|
3. When generating constructs:
|
||||||
|
: - Ensure hierarchy, relationships, interfaces, and data flow conform to
|
||||||
|
normative rules.
|
||||||
|
4. When routing data:
|
||||||
|
: - Apply downward and upward flow rules exactly as defined.
|
||||||
|
5. When evaluating a user request:
|
||||||
|
: - Reject or correct requests that would violate normative rules.
|
||||||
|
|
||||||
|
### How to Apply the ABC Validation Rules
|
||||||
|
|
||||||
|
1. Treat validation rules as mechanical checks.
|
||||||
|
2. For any ABC architecture:
|
||||||
|
: - Validate structure.
|
||||||
|
- Validate contracts.
|
||||||
|
- Validate data flow.
|
||||||
|
- Validate instantiation semantics.
|
||||||
|
3. When a violation is detected:
|
||||||
|
: - Identify the violated rule by its identifier.
|
||||||
|
- Provide a corrective action path.
|
||||||
|
4. Never modify validation rules; only apply them.
|
||||||
|
|
||||||
|
### SECTION 5 — How to Use the ABC Schema
|
||||||
|
|
||||||
|
1. Use the schema as the machine-readable representation of an ABC architecture.
|
||||||
|
2. When generating or transforming architectures:
|
||||||
|
: - Produce JSON that conforms exactly to the schema.
|
||||||
|
3. When validating:
|
||||||
|
: - Apply schema constraints before normative or validation rules.
|
||||||
|
4. When consuming the schema:
|
||||||
|
: - Use `$defs` to resolve construct types, contracts, and rule bindings.
|
||||||
|
5. Never alter the schema; only instantiate or validate against it.
|
||||||
|
|
||||||
|
### How to Use the Code Generation Profiles
|
||||||
|
|
||||||
|
1. Profiles define how to map ABC constructs into specific IaC tools.
|
||||||
|
2. When generating code:
|
||||||
|
: - Select the appropriate profile.
|
||||||
|
- Apply profile rules exactly as written in specification.
|
||||||
|
3. When a profile conflicts with user instructions:
|
||||||
|
: - The profile takes precedence.
|
||||||
|
4. When generating code:
|
||||||
|
: - Use the ABC hierarchy as the structural backbone.
|
||||||
|
- Use Input/Output Contracts as the only wiring mechanism.
|
||||||
|
5. Never invent new profile rules; only apply those defined in specification.
|
||||||
|
|
||||||
|
### Operational Procedures for Construct Creation
|
||||||
|
|
||||||
|
1. Determine the construct type.
|
||||||
|
2. Create the construct with:
|
||||||
|
: - A unique ID.
|
||||||
|
- A valid parent (except ApplicationStack).
|
||||||
|
- A complete Input Contract.
|
||||||
|
- A complete Output Contract.
|
||||||
|
3. Instantiate children strictly top-down.
|
||||||
|
4. Ensure no lateral references are introduced.
|
||||||
|
5. Enforce immutability of Input Contracts.
|
||||||
|
|
||||||
|
### Operational Procedures for Data Flow Wiring
|
||||||
|
|
||||||
|
1. For downward flow:
|
||||||
|
: - Pass only the required subset of parent inputs/outputs.
|
||||||
|
- Ensure all downward values originate from the parent’s declared contracts.
|
||||||
|
2. For upward flow:
|
||||||
|
: - Expose only declared outputs.
|
||||||
|
- Aggregate or transform outputs only at the parent level.
|
||||||
|
3. Never allow:
|
||||||
|
: - Sibling-to-sibling communication.
|
||||||
|
- Access to undeclared values.
|
||||||
|
- Implicit or hidden data flow.
|
||||||
|
|
||||||
|
### Operational Procedures for Validation
|
||||||
|
|
||||||
|
1. Validate in this order:
|
||||||
|
: - Schema conformance.
|
||||||
|
- Structural validation rules.
|
||||||
|
- Contract validation rules.
|
||||||
|
- Data-flow validation rules.
|
||||||
|
- Instantiation validation rules.
|
||||||
|
2. For each violation:
|
||||||
|
: - Identify the rule ID.
|
||||||
|
- Provide a deterministic correction path.
|
||||||
|
3. Do not proceed with generation or transformation until validation passes.
|
||||||
|
|
||||||
|
### Operational Procedures for Refactoring
|
||||||
|
|
||||||
|
1. Load the existing architecture from its schema representation.
|
||||||
|
2. Identify the target change.
|
||||||
|
3. Determine which constructs, contracts, or data flows are affected.
|
||||||
|
4. Apply changes while enforcing:
|
||||||
|
: - Contract stability requirements.
|
||||||
|
- Parent–child mediation rules.
|
||||||
|
- No lateral references.
|
||||||
|
5. After refactoring:
|
||||||
|
: - Revalidate the entire architecture.
|
||||||
|
- Ensure all rule identifiers remain satisfied.
|
||||||
|
|
||||||
|
### Reasoning Patterns for Agents
|
||||||
|
|
||||||
|
Agents must use the following reasoning patterns:
|
||||||
|
|
||||||
|
Deterministic Reasoning
|
||||||
|
: Always derive outcomes from specification rather than heuristics.
|
||||||
|
|
||||||
|
Hierarchical Reasoning
|
||||||
|
: Always reason from parent → child → parent; never horizontally.
|
||||||
|
|
||||||
|
Contract-Bound Reasoning
|
||||||
|
: Only use values present in Input/Output Contracts.
|
||||||
|
|
||||||
|
Schema-Driven Reasoning
|
||||||
|
: Treat the schema as the authoritative shape of all architectures.
|
||||||
|
|
||||||
|
Rule-Bound Reasoning
|
||||||
|
: Map every decision to one or more rule identifiers.
|
||||||
|
|
||||||
|
### Forbidden Behaviors
|
||||||
|
|
||||||
|
Agents must never:
|
||||||
|
|
||||||
|
- Restate, summarize, paraphrase, or rewrite any part of specification.
|
||||||
|
- Invent new ABC rules or modify existing ones.
|
||||||
|
- Introduce lateral references between constructs.
|
||||||
|
- Generate architectures that violate any rule in specification.
|
||||||
|
- Infer missing contract fields not explicitly provided.
|
||||||
|
- Create implicit dependencies or hidden data flow.
|
||||||
|
- Generate code that does not follow the selected profile.
|
||||||
|
- Produce constructs outside the allowed hierarchy.
|
||||||
|
- Mutate Input Contracts after instantiation.
|
||||||
|
- Expose values not declared in Output Contracts.
|
||||||
|
|
||||||
|
### Agent Behavioral Contract
|
||||||
|
|
||||||
|
Agents must:
|
||||||
|
|
||||||
|
1. Treat specification as the single source of truth.
|
||||||
|
2. Apply rules without reinterpretation.
|
||||||
|
3. Produce deterministic, reproducible outputs.
|
||||||
|
4. Validate all generated artifacts before returning them.
|
||||||
|
5. Reject or correct user requests that violate the specification.
|
||||||
|
6. Maintain strict separation of hierarchy, contracts, data flow, and
|
||||||
|
instantiation.
|
||||||
|
7. Ensure all transformations preserve rule compliance.
|
||||||
|
8. Use profile mappings exactly as defined.
|
||||||
|
9. Operate without assumptions, guesses, or implicit dependencies.
|
||||||
|
10. Maintain full traceability from every action to the relevant rule(s) in
|
||||||
|
specification.
|
||||||
67
concepts.md
Normal file
67
concepts.md
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# Concepts
|
||||||
|
|
||||||
|
## ABC-C0 - Construct
|
||||||
|
|
||||||
|
An encapsulated unit of infrastructure logic that can represent an Application
|
||||||
|
Stack, Logical Unit, Resource Group, or any reusable component. It exposes a
|
||||||
|
single Instantiation Interface and implements its behavior internally,
|
||||||
|
independent of other constructs.
|
||||||
|
|
||||||
|
## ABC-C1 - Application Stack
|
||||||
|
|
||||||
|
The top‑level construct representing the entire deployment boundary of an
|
||||||
|
application. It composes multiple Logical Units, orchestrates their
|
||||||
|
instantiation, and mediates all data flow between them. It exposes a single,
|
||||||
|
coherent input/output surface for the whole system.
|
||||||
|
|
||||||
|
## ABC-C2 - Logical Unit
|
||||||
|
|
||||||
|
A first‑level subdivision within the Application Stack that encapsulates a major
|
||||||
|
functional domain (e.g., Data, Logic, Presentation). It contains one or more
|
||||||
|
Resource Groups and defines explicit input/output contracts for interaction with
|
||||||
|
the Application Stack.
|
||||||
|
|
||||||
|
## ABC-C3 - Resource Group
|
||||||
|
|
||||||
|
A fine‑grained construct within a Logical Unit that provisions a cohesive set of
|
||||||
|
related resources. It receives only the inputs it requires from its parent
|
||||||
|
Logical Unit and returns outputs upward; it never communicates directly with
|
||||||
|
sibling Resource Groups.
|
||||||
|
|
||||||
|
## ABC-C4 - Input Contract
|
||||||
|
|
||||||
|
A formally defined set of parameters that a Construct (ABC‑C0) MUST receive from
|
||||||
|
its parent. It specifies all required configuration, contextual values, and
|
||||||
|
dependencies needed for correct instantiation. It prohibits implicit or global
|
||||||
|
state; every dependency must appear explicitly in this contract.
|
||||||
|
|
||||||
|
## ABC-C5 - Output Contract
|
||||||
|
|
||||||
|
A formally defined set of values that a Construct (ABC‑C0) MUST expose upward to
|
||||||
|
its parent. It represents the complete set of externally consumable identifiers,
|
||||||
|
endpoints, or computed values produced by the construct. It ensures that all
|
||||||
|
upward dependencies are explicit and traceable.
|
||||||
|
|
||||||
|
## ABC-C6 - Instantiation Interface
|
||||||
|
|
||||||
|
The single, explicit mechanism through which a Construct (ABC‑C0) is created and
|
||||||
|
provided with its Input Contract (ABC‑C4). It defines how callers supply inputs
|
||||||
|
and how the construct exposes its Output Contract (ABC‑C5). The interface is
|
||||||
|
stable, minimal, and framework‑agnostic, ensuring that internal implementation
|
||||||
|
details never leak into parent constructs.
|
||||||
|
|
||||||
|
## ABC-C7 - Capturing Down
|
||||||
|
|
||||||
|
A parent‑to‑child data‑flow mechanism in which a Construct (ABC‑C0) provides its
|
||||||
|
children with the exact subset of inputs they require. It ensures that all
|
||||||
|
downward dependencies are explicit, scoped, and passed only through the child’s
|
||||||
|
Input Contract (ABC‑C4). No child may access parent state except through this
|
||||||
|
mechanism.
|
||||||
|
|
||||||
|
## ABC-C8 - Bubbling Up
|
||||||
|
|
||||||
|
A child‑to‑parent data‑flow mechanism in which a Construct (ABC‑C0) exposes its
|
||||||
|
outputs exclusively through its Output Contract (ABC‑C5). Parents receive these
|
||||||
|
outputs, may aggregate or transform them, and may optionally pass them further
|
||||||
|
down to other children via Capturing Down. No lateral or implicit communication
|
||||||
|
is permitted.
|
||||||
347
example.md
Normal file
347
example.md
Normal file
|
|
@ -0,0 +1,347 @@
|
||||||
|
# Canonical Example
|
||||||
|
|
||||||
|
This example demonstrates how the ABC Pattern structures a real application
|
||||||
|
using only:
|
||||||
|
|
||||||
|
* Constructs (ABC‑C0)
|
||||||
|
* Application Stack (ABC‑C1)
|
||||||
|
* Logical Units (ABC‑C2)
|
||||||
|
* Resource Groups (ABC‑C3)
|
||||||
|
* Input/Output Contracts (ABC‑C4, ABC‑C5)
|
||||||
|
* Instantiation Interface (ABC‑C6)
|
||||||
|
* Capturing Down (ABC‑C7)
|
||||||
|
* Bubbling Up (ABC‑C8)
|
||||||
|
|
||||||
|
Every interaction is explicit. Every dependency is visible. Nothing leaks
|
||||||
|
sideways.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
We model a classic 3‑tier architecture:
|
||||||
|
|
||||||
|
* Data Tier - database + storage
|
||||||
|
* Logic Tier - compute + messaging
|
||||||
|
* Presentation Tier - CDN + web frontend
|
||||||
|
|
||||||
|
Each tier is a Logical Unit (ABC‑C2).
|
||||||
|
|
||||||
|
Each component inside a tier is a Resource Group (ABC‑C3).
|
||||||
|
|
||||||
|
The Application Stack (ABC‑C1) composes them, wires them, and exposes the final
|
||||||
|
outputs.
|
||||||
|
|
||||||
|
## Conceptual Diagram
|
||||||
|
|
||||||
|
```default
|
||||||
|
┌──────────────────────────────┐
|
||||||
|
│ Application Stack │
|
||||||
|
│ (ABC‑C1) │
|
||||||
|
└─────────────┬────────────────┘
|
||||||
|
│
|
||||||
|
┌──────────────────────┼────────────────────────┐
|
||||||
|
│ │ │
|
||||||
|
┌───────▼────────┐ ┌───────▼────────┐ ┌─────────▼────────┐
|
||||||
|
│ DataUnit │ │ LogicUnit │ │ PresentationUnit │
|
||||||
|
│ (C2) │ │ (C2) │ │ (C2) │
|
||||||
|
└───────┬────────┘ └───────┬────────┘ └────────┬─────────┘
|
||||||
|
│ │ │
|
||||||
|
│ │ ┌────────│──────┐
|
||||||
|
┌────▼─────┐ ┌────▼─────┐ ┌────▼──────┐ ┌──────▼─────┐
|
||||||
|
│StorageGrp│ │ComputeGrp│ │WebAppGrp │ │ CDNGrp │
|
||||||
|
│ (C3) │ │ (C3) │ │ (C3) │ │ (C3) │
|
||||||
|
└──────────┘ └──────────┘ └───────────┘ └────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Application Stack (ABC‑C1)
|
||||||
|
|
||||||
|
The Application Stack is the root construct.
|
||||||
|
|
||||||
|
It has no parent and defines the deployment boundary.
|
||||||
|
|
||||||
|
### Responsibilities
|
||||||
|
|
||||||
|
* Instantiate each Logical Unit (ABC‑R1).
|
||||||
|
* Provide downward inputs (ABC‑F1).
|
||||||
|
* Receive upward outputs (ABC‑F2).
|
||||||
|
* Route outputs between Logical Units (ABC‑R44).
|
||||||
|
* Expose a final Output Contract representing the whole system.
|
||||||
|
|
||||||
|
### Input Contract (ABC‑C4)
|
||||||
|
|
||||||
|
The Application Stack receives only global configuration:
|
||||||
|
|
||||||
|
```default
|
||||||
|
AppStackInputs:
|
||||||
|
environment: string
|
||||||
|
region: string
|
||||||
|
global_tags: map<string,string>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output Contract (ABC‑C5)
|
||||||
|
|
||||||
|
The Application Stack exposes:
|
||||||
|
|
||||||
|
```default
|
||||||
|
AppStackOutputs:
|
||||||
|
frontend_url: string
|
||||||
|
api_endpoint: string
|
||||||
|
```
|
||||||
|
|
||||||
|
These values originate from the Presentation and Logic tiers, respectively.
|
||||||
|
|
||||||
|
## Logical Units (ABC‑C2)
|
||||||
|
|
||||||
|
Each Logical Unit encapsulates a functional domain.
|
||||||
|
|
||||||
|
They do not know about each other.
|
||||||
|
|
||||||
|
They communicate only through the Application Stack.
|
||||||
|
|
||||||
|
We define three:
|
||||||
|
|
||||||
|
* DataUnit
|
||||||
|
* LogicUnit
|
||||||
|
* PresentationUnit
|
||||||
|
|
||||||
|
Each has its own Input/Output Contracts and internal Resource Groups.
|
||||||
|
|
||||||
|
### Data Logical Unit (ABC‑C2)
|
||||||
|
|
||||||
|
#### Purpose
|
||||||
|
|
||||||
|
Provide persistent storage and database capabilities.
|
||||||
|
|
||||||
|
#### Resource Groups (ABC‑C3)
|
||||||
|
|
||||||
|
* StorageGroup - object storage
|
||||||
|
* DatabaseGroup - relational database
|
||||||
|
|
||||||
|
#### Input Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
DataUnitInputs:
|
||||||
|
environment: string
|
||||||
|
region: string
|
||||||
|
storage_class: string
|
||||||
|
db_engine: string
|
||||||
|
db_instance_size: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Output Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
DataUnitOutputs:
|
||||||
|
storage_bucket_name: string
|
||||||
|
database_endpoint: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Internal Wiring
|
||||||
|
|
||||||
|
* StorageGroup produces `storage_bucket_name`.
|
||||||
|
* DatabaseGroup produces `database_endpoint`.
|
||||||
|
* DataUnit aggregates both and bubbles them up (ABC‑F2).
|
||||||
|
|
||||||
|
#### NOTE
|
||||||
|
* StorageGroup and DatabaseGroup do not know about each other (ABC‑R10).
|
||||||
|
* All configuration flows downward from DataUnit (ABC‑F1).
|
||||||
|
|
||||||
|
### Logic Logical Unit (ABC‑C2)
|
||||||
|
|
||||||
|
#### Purpose
|
||||||
|
|
||||||
|
Provide compute and messaging capabilities for the application backend.
|
||||||
|
|
||||||
|
#### Resource Groups
|
||||||
|
|
||||||
|
* ComputeGroup - application compute (e.g., functions, containers)
|
||||||
|
* MessagingGroup - queue or pub/sub system
|
||||||
|
|
||||||
|
#### Input Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
LogicUnitInputs:
|
||||||
|
environment: string
|
||||||
|
region: string
|
||||||
|
compute_size: string
|
||||||
|
message_retention: number
|
||||||
|
database_endpoint: string # Provided by DataUnit via AppStack
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Output Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
LogicUnitOutputs:
|
||||||
|
api_endpoint: string
|
||||||
|
message_queue_url: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Internal Wiring
|
||||||
|
|
||||||
|
* ComputeGroup receives `database_endpoint` via Capturing Down (ABC‑F1).
|
||||||
|
* MessagingGroup is independent.
|
||||||
|
* LogicUnit aggregates outputs and bubbles them up.
|
||||||
|
|
||||||
|
#### NOTE
|
||||||
|
* LogicUnit does not know where the database came from.
|
||||||
|
* It only knows it received a database_endpoint in its Input Contract
|
||||||
|
(ABC‑R22).
|
||||||
|
|
||||||
|
### Presentation Logical Unit (ABC‑C2)
|
||||||
|
|
||||||
|
#### Purpose
|
||||||
|
|
||||||
|
Serve the frontend and expose the public entry point.
|
||||||
|
|
||||||
|
#### Resource Groups
|
||||||
|
|
||||||
|
* CDNGroup - global content distribution
|
||||||
|
* WebAppGroup - static or dynamic frontend
|
||||||
|
|
||||||
|
#### Input Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
PresentationUnitInputs:
|
||||||
|
environment: string
|
||||||
|
region: string
|
||||||
|
frontend_assets_bucket: string
|
||||||
|
api_endpoint: string # Provided by LogicUnit via AppStack
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Output Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
PresentationUnitOutputs:
|
||||||
|
frontend_url: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Internal Wiring
|
||||||
|
|
||||||
|
* WebAppGroup receives `api_endpoint` via Capturing Down.
|
||||||
|
* CDNGroup receives the output of WebAppGroup.
|
||||||
|
* PresentationUnit bubbles up the final `frontend_url`.
|
||||||
|
|
||||||
|
## Resource Groups (ABC‑C3)
|
||||||
|
|
||||||
|
Each Resource Group is a small, focused construct with:
|
||||||
|
|
||||||
|
* A minimal Input Contract
|
||||||
|
* A minimal Output Contract
|
||||||
|
* No knowledge of siblings
|
||||||
|
* No access to parent state except via inputs
|
||||||
|
* No side effects during instantiation (ABC‑R33)
|
||||||
|
|
||||||
|
### Example: Database Group
|
||||||
|
|
||||||
|
#### Input Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
DatabaseGroupInputs:
|
||||||
|
db_engine: string
|
||||||
|
db_instance_size: string
|
||||||
|
environment: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Output Contract
|
||||||
|
|
||||||
|
```default
|
||||||
|
DatabaseGroupOutputs:
|
||||||
|
database_endpoint: string
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Instantiation Interface
|
||||||
|
|
||||||
|
```default
|
||||||
|
new DatabaseGroup(DatabaseGroupInputs) -> DatabaseGroupOutputs
|
||||||
|
```
|
||||||
|
|
||||||
|
This pattern repeats for all Resource Groups.
|
||||||
|
|
||||||
|
## Full Data Flow (ABC‑F1 and ABC‑F2)
|
||||||
|
|
||||||
|
The complete data flow includes:
|
||||||
|
|
||||||
|
* AppStack → Logical Units
|
||||||
|
* Logical Units → Resource Groups
|
||||||
|
* Resource Groups → Logical Units
|
||||||
|
* Logical Units → AppStack
|
||||||
|
|
||||||
|
This is the full vertical chain required by the ABC Pattern.
|
||||||
|
|
||||||
|
### Downward Flow (Capturing Down — ABC‑F1)
|
||||||
|
|
||||||
|
1. AppStack → DataUnit
|
||||||
|
: * `environment`
|
||||||
|
* `region`
|
||||||
|
* `storage_class`
|
||||||
|
* `db_engine`
|
||||||
|
* `db_instance_size`
|
||||||
|
2. DataUnit → StorageGroup
|
||||||
|
: * `environment`
|
||||||
|
* `region`
|
||||||
|
* `storage_class`
|
||||||
|
3. DataUnit → DatabaseGroup
|
||||||
|
: * `environment`
|
||||||
|
* `db_engine`
|
||||||
|
* `db_instance_size`
|
||||||
|
4. AppStack → LogicUnit
|
||||||
|
> * `environment`
|
||||||
|
> * `region`
|
||||||
|
> * `compute_size`
|
||||||
|
> * `message_retention`
|
||||||
|
> * `database_endpoint` (bubbled up from DataUnit)
|
||||||
|
5. LogicUnit → ComputeGroup
|
||||||
|
: * `environment`
|
||||||
|
* `compute_size`
|
||||||
|
* `database_endpoint`
|
||||||
|
6. LogicUnit → MessagingGroup
|
||||||
|
: * `environment`
|
||||||
|
* `message_retention`
|
||||||
|
7. AppStack → PresentationUnit
|
||||||
|
: * `environment`
|
||||||
|
* `region`
|
||||||
|
* `frontend_assets_bucket`
|
||||||
|
* `api_endpoint` (bubbled up from LogicUnit)
|
||||||
|
8. PresentationUnit → WebAppGroup
|
||||||
|
: * `environment`
|
||||||
|
* `frontend_assets_bucket`
|
||||||
|
* `api_endpoint`
|
||||||
|
9. PresentationUnit → CDNGroup
|
||||||
|
: * `environment`
|
||||||
|
* `webapp_origin_url` (bubbled up from WebAppGroup)
|
||||||
|
|
||||||
|
### Upward Flow (Bubbling Up — ABC‑F2)
|
||||||
|
|
||||||
|
1. StorageGroup → DataUnit
|
||||||
|
: * `storage_bucket_name`
|
||||||
|
2. DatabaseGroup → DataUnit
|
||||||
|
: * `database_endpoint`
|
||||||
|
3. DataUnit → AppStack
|
||||||
|
: * `storage_bucket_name`
|
||||||
|
* `database_endpoint`
|
||||||
|
4. ComputeGroup → LogicUnit
|
||||||
|
: * `api_endpoint`
|
||||||
|
5. MessagingGroup → LogicUnit
|
||||||
|
: * `message_queue_url`
|
||||||
|
6. LogicUnit → AppStack
|
||||||
|
: * `api_endpoint`
|
||||||
|
* `message_queue_url`
|
||||||
|
7. WebAppGroup → PresentationUnit
|
||||||
|
: * `webapp_origin_url`
|
||||||
|
8. CDNGroup → PresentationUnit
|
||||||
|
: * `frontend_url`
|
||||||
|
9. PresentationUnit → AppStack
|
||||||
|
: * `frontend_url`
|
||||||
|
|
||||||
|
## Rationale
|
||||||
|
|
||||||
|
This example demonstrates:
|
||||||
|
|
||||||
|
* Strict encapsulation
|
||||||
|
* Explicit dependencies
|
||||||
|
* No lateral references
|
||||||
|
* Deterministic wiring
|
||||||
|
* Testability at every level
|
||||||
|
* Predictable evolution
|
||||||
|
* Agent‑friendly structure
|
||||||
|
|
||||||
|
It is the canonical reference for all profiles (CDK, Terraform, etc.).
|
||||||
85
index.md
Normal file
85
index.md
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Abstract Base Cloud
|
||||||
|
|
||||||
|
The ABC Pattern is a universal architectural model for structuring cloud
|
||||||
|
infrastructure in a way that is predictable, explicit, and safe for automated
|
||||||
|
reasoning. It defines a small set of composable building blocks and a strict set
|
||||||
|
of rules governing how those blocks relate, communicate, and evolve. The result
|
||||||
|
is an architecture that is easy to understand, easy to validate, and easy to
|
||||||
|
generate or transform using both human and machine agents.
|
||||||
|
|
||||||
|
ABC is intentionally tool‑agnostic and cloud‑agnostic. It does not prescribe
|
||||||
|
specific services, resource types, or implementation languages. Instead, it
|
||||||
|
defines a semantic architecture model that can be mapped onto any
|
||||||
|
infrastructure-as-code system, including imperative tools (such as CDK) and
|
||||||
|
declarative tools (such as Terraform).
|
||||||
|
|
||||||
|
At its core, ABC is built on three foundational ideas:
|
||||||
|
|
||||||
|
**1. A strict hierarchical structure**
|
||||||
|
Every ABC architecture is composed of three construct types:
|
||||||
|
|
||||||
|
* ApplicationStack — the root of the system
|
||||||
|
* Logical Units — functional domains
|
||||||
|
* Resource Groups — cohesive clusters of cloud resources
|
||||||
|
|
||||||
|
This hierarchy forms a strict tree with no lateral references, ensuring clarity
|
||||||
|
and isolation.
|
||||||
|
|
||||||
|
**2. Explicit contracts and deterministic data flow**
|
||||||
|
|
||||||
|
Every construct defines:
|
||||||
|
|
||||||
|
* an Input Contract (what it needs)
|
||||||
|
* an Output Contract (what it produces)
|
||||||
|
|
||||||
|
Data flows only in two directions:
|
||||||
|
|
||||||
|
* Capturing Down — parents pass data to children
|
||||||
|
* Bubbling Up — children return data to parents
|
||||||
|
|
||||||
|
This eliminates hidden dependencies and makes the architecture fully analyzable.
|
||||||
|
|
||||||
|
**3. A stable foundation for automation**
|
||||||
|
|
||||||
|
Because ABC is explicit, typed, and deterministic, it is uniquely suited for:
|
||||||
|
|
||||||
|
* automated code generation
|
||||||
|
* architecture validation
|
||||||
|
* refactoring and transformation
|
||||||
|
* multi‑cloud portability
|
||||||
|
* agent‑driven reasoning
|
||||||
|
|
||||||
|
ABC is designed to be the intermediate representation (IR) for infrastructure,
|
||||||
|
something like the “AST of cloud architecture”.
|
||||||
|
|
||||||
|
## Purpose and Philosophy
|
||||||
|
|
||||||
|
The ABC Pattern exists to solve a fundamental problem in cloud architecture:
|
||||||
|
infrastructure is too implicit.
|
||||||
|
|
||||||
|
* Dependencies are hidden.
|
||||||
|
* Data flow is unclear.
|
||||||
|
* Modules are entangled.
|
||||||
|
* Refactoring is risky.
|
||||||
|
* Automation is fragile.
|
||||||
|
|
||||||
|
ABC replaces this with a model that is:
|
||||||
|
|
||||||
|
* explicit,
|
||||||
|
* typed,
|
||||||
|
* hierarchical,
|
||||||
|
* deterministic,
|
||||||
|
* verifiable, and
|
||||||
|
* portable
|
||||||
|
|
||||||
|
It is designed to be understood by humans, validated by tools, and generated by
|
||||||
|
agents.
|
||||||
|
|
||||||
|
## Content
|
||||||
|
|
||||||
|
* [Concepts](concepts.md)
|
||||||
|
* [Abstract Model](model.md)
|
||||||
|
* [Rules](rules/index.md)
|
||||||
|
* [Schema](schema.md)
|
||||||
|
* [Canonical Example](example.md)
|
||||||
|
* [Profiles](profiles/index.md)
|
||||||
177
model.md
Normal file
177
model.md
Normal file
|
|
@ -0,0 +1,177 @@
|
||||||
|
# Abstract Model
|
||||||
|
|
||||||
|
## Hierarchy Model
|
||||||
|
|
||||||
|
The ABC Pattern defines a strict three‑layer hierarchy of constructs (ABC‑C0):
|
||||||
|
|
||||||
|
* Application Stack (ABC‑C1) — the root deployment boundary.
|
||||||
|
* Logical Units (ABC‑C2) — first‑level domains within the application.
|
||||||
|
* Resource Groups (ABC‑C3) — fine‑grained functional clusters inside each
|
||||||
|
Logical Unit.
|
||||||
|
|
||||||
|
This hierarchy is **strictly vertical**.
|
||||||
|
|
||||||
|
Every construct belongs to exactly one parent, and no construct may exist
|
||||||
|
outside this tree.
|
||||||
|
|
||||||
|
The hierarchy expresses **encapsulation**:
|
||||||
|
|
||||||
|
* ABC‑C1 encapsulates the entire application.
|
||||||
|
* ABC‑C2 encapsulates domain‑level concerns.
|
||||||
|
* ABC‑C3 encapsulates resource‑level concerns.
|
||||||
|
|
||||||
|
Each layer exposes its behavior exclusively through its Instantiation Interface
|
||||||
|
(ABC‑C6) and its Input/Output Contracts (ABC‑C4, ABC‑C5).
|
||||||
|
|
||||||
|
## Relationship Semantics
|
||||||
|
|
||||||
|
The ABC Pattern enforces a parent–child‑only relationship model.
|
||||||
|
|
||||||
|
### Allowed relationships
|
||||||
|
|
||||||
|
A parent construct MAY instantiate children using the child’s Instantiation
|
||||||
|
Interface (ABC‑C6).
|
||||||
|
|
||||||
|
A child MAY expose outputs upward via its Output Contract (ABC‑C5).
|
||||||
|
|
||||||
|
A parent MAY route outputs from one child to another via Capturing Down
|
||||||
|
(ABC‑C7).
|
||||||
|
|
||||||
|
### Forbidden relationships
|
||||||
|
|
||||||
|
* **No lateral references:**
|
||||||
|
- Resource Groups (ABC‑C3) may not reference each other directly.
|
||||||
|
- Logical Units (ABC‑C2) may not reference each other directly.
|
||||||
|
* **No implicit dependencies:**
|
||||||
|
- A construct may not read global state, shared variables, or parent
|
||||||
|
internals.
|
||||||
|
* **No hidden communication channels:**
|
||||||
|
- All data must flow through Input/Output Contracts.
|
||||||
|
|
||||||
|
These constraints ensure loose coupling, testability, and predictable
|
||||||
|
composition.
|
||||||
|
|
||||||
|
## Interface Semantics
|
||||||
|
|
||||||
|
Every construct (ABC‑C0) defines two explicit interfaces:
|
||||||
|
|
||||||
|
### Input Contract (ABC‑C4)
|
||||||
|
|
||||||
|
The complete set of parameters required for instantiation.
|
||||||
|
A construct MUST NOT depend on any value not present in its Input Contract.
|
||||||
|
|
||||||
|
### Output Contract (ABC‑C5)
|
||||||
|
|
||||||
|
The complete set of values the construct exposes upward.
|
||||||
|
A construct MUST NOT leak internal state except through this contract.
|
||||||
|
|
||||||
|
### Interface Binding
|
||||||
|
|
||||||
|
When a parent instantiates a child:
|
||||||
|
|
||||||
|
1. The parent supplies the child’s Input Contract.
|
||||||
|
2. The child returns its Output Contract.
|
||||||
|
3. The parent may:
|
||||||
|
|
||||||
|
> * consume the outputs,
|
||||||
|
> * aggregate them,
|
||||||
|
> * or pass them down to other children.
|
||||||
|
|
||||||
|
This creates a **closed, explicit dependency graph** with no hidden edges.
|
||||||
|
|
||||||
|
## Instantiation Semantics
|
||||||
|
|
||||||
|
The Instantiation Interface (ABC‑C6) is the single mechanism through which a
|
||||||
|
construct is created.
|
||||||
|
|
||||||
|
It has three properties:
|
||||||
|
|
||||||
|
* **Stability** - The interface remains stable even if internal implementation
|
||||||
|
changes.
|
||||||
|
* **Minimality** - Only the Input Contract is accepted; no additional
|
||||||
|
parameters.
|
||||||
|
* **Purity** - Instantiation has no side effects beyond constructing the child.
|
||||||
|
|
||||||
|
Instantiation is always **top‑down**:
|
||||||
|
|
||||||
|
* ABC‑C1 instantiates ABC‑C2 constructs.
|
||||||
|
* ABC‑C2 instantiates ABC‑C3 constructs.
|
||||||
|
* No construct may instantiate its parent or siblings.
|
||||||
|
|
||||||
|
This ensures deterministic composition and predictable dependency flow.
|
||||||
|
|
||||||
|
## Data Flow Semantics
|
||||||
|
|
||||||
|
Data flows vertically through two complementary mechanisms:
|
||||||
|
|
||||||
|
### ABC‑F1 — Capturing Down (maps to ABC‑C7)
|
||||||
|
|
||||||
|
A parent passes scoped inputs to its children.
|
||||||
|
|
||||||
|
This mechanism ensures:
|
||||||
|
|
||||||
|
* Children receive only what they need.
|
||||||
|
* No child can access parent state implicitly.
|
||||||
|
* Parents mediate all cross‑domain dependencies.
|
||||||
|
|
||||||
|
### ABC‑F2 — Bubbling Up (maps to ABC‑C8)
|
||||||
|
|
||||||
|
A child exposes outputs upward to its parent.
|
||||||
|
|
||||||
|
This mechanism ensures:
|
||||||
|
|
||||||
|
* All produced values are explicit.
|
||||||
|
* Parents can aggregate or route outputs.
|
||||||
|
* No child communicates directly with siblings.
|
||||||
|
|
||||||
|
### Routing Semantics
|
||||||
|
|
||||||
|
Parents MAY:
|
||||||
|
|
||||||
|
* **Consume** outputs (e.g., store them).
|
||||||
|
* **Transform** outputs (e.g., wrap them in a composite object).
|
||||||
|
* **Re‑expose** outputs upward.
|
||||||
|
* **Pass** outputs downward to other children.
|
||||||
|
|
||||||
|
Children MAY not route data themselves.
|
||||||
|
|
||||||
|
## Conceptual Diagram
|
||||||
|
|
||||||
|
```default
|
||||||
|
Application Stack (ABC‑C1)
|
||||||
|
│
|
||||||
|
├── Logical Unit: Data (ABC‑C2)
|
||||||
|
│ ├── Resource Group: Storage (ABC‑C3)
|
||||||
|
│ └── Resource Group: Database (ABC‑C3)
|
||||||
|
│
|
||||||
|
├── Logical Unit: Logic (ABC‑C2)
|
||||||
|
│ ├── Resource Group: Compute (ABC‑C3)
|
||||||
|
│ └── Resource Group: Messaging (ABC‑C3)
|
||||||
|
│
|
||||||
|
└── Logical Unit: Presentation (ABC‑C2)
|
||||||
|
├── Resource Group: CDN (ABC‑C3)
|
||||||
|
└── Resource Group: WebApp (ABC‑C3)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Downward arrows** represent Capturing Down (ABC‑F1).
|
||||||
|
|
||||||
|
**Upward arrows** represent Bubbling Up (ABC‑F2).
|
||||||
|
|
||||||
|
No horizontal arrows exist.
|
||||||
|
|
||||||
|
## Rationale & Design Intent
|
||||||
|
|
||||||
|
The ABC Pattern enforces a strict, explicit, and testable structure for cloud
|
||||||
|
infrastructure code.
|
||||||
|
|
||||||
|
* **Encapsulation** ensures each construct hides its internal details.
|
||||||
|
* **Explicit interfaces** eliminate hidden dependencies.
|
||||||
|
* **Loose coupling** prevents cross‑domain entanglement.
|
||||||
|
* **Reusability** emerges from stable Instantiation Interfaces.
|
||||||
|
* **Testability** is guaranteed because each construct can be instantiated with
|
||||||
|
mock inputs.
|
||||||
|
* **Scalability** follows naturally from the ability to evolve constructs
|
||||||
|
independently.
|
||||||
|
|
||||||
|
This model is intentionally tool‑agnostic so it can be mapped cleanly to CDK,
|
||||||
|
Terraform, Pulumi, or any imperative, as well as declarative IaC framework.
|
||||||
378
profiles/cdk-ts.md
Normal file
378
profiles/cdk-ts.md
Normal file
|
|
@ -0,0 +1,378 @@
|
||||||
|
# CDK TypeScript Profile
|
||||||
|
|
||||||
|
## Concept → CDK Mapping
|
||||||
|
|
||||||
|
| ABC Concept | Meaning | CDK Mapping |
|
||||||
|
|---------------|-------------------------|-----------------------------------------|
|
||||||
|
| ABC‑C0 | Construct | `Construct` subclass |
|
||||||
|
| ABC‑C1 | Application Stack | `Stack` subclass |
|
||||||
|
| ABC‑C2 | Logical Unit (LU) | `Construct` subclass with LU semantics |
|
||||||
|
| ABC‑C3 | Resource Group (RG) | `Construct` subclass with RG semantics |
|
||||||
|
| ABC‑C4 | Input Contract | TypeScript interface (`InputContract`) |
|
||||||
|
| ABC‑C5 | Output Contract | TypeScript interface (`OutputContract`) |
|
||||||
|
| ABC‑C6 | Instantiation Interface | Constructor (`scope`, `id`, `inputs`) |
|
||||||
|
| ABC‑C7 | Capturing Down | Passing inputs to children |
|
||||||
|
| ABC‑C8 | Bubbling Up | Exposing outputs upward |
|
||||||
|
|
||||||
|
*ABC* itself remains naming‑agnostic; this profile defines CDK‑idiomatic
|
||||||
|
conventions.
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
These are profile‑specific rules for CDK-Typescript users.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R1 (SHOULD)
|
||||||
|
|
||||||
|
The directory structure SHOULD reflect the ABC hierarchy:
|
||||||
|
|
||||||
|
Application Stack → Logical Units → Resource Groups.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R2 (SHOULD)
|
||||||
|
|
||||||
|
Each Logical Unit SHOULD reside in its own top‑level directory:
|
||||||
|
|
||||||
|
```default
|
||||||
|
src/
|
||||||
|
app-stack.ts
|
||||||
|
data/
|
||||||
|
logic/
|
||||||
|
presentation/
|
||||||
|
```
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R3 (SHOULD)
|
||||||
|
|
||||||
|
Each Resource Group SHOULD reside inside its parent Logical Unit:
|
||||||
|
|
||||||
|
```default
|
||||||
|
src/data/storage/
|
||||||
|
src/data/database/
|
||||||
|
```
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R4 (SHOULD)
|
||||||
|
|
||||||
|
Each construct directory SHOULD contain an index.ts exporting the construct.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R5 (SHOULD)
|
||||||
|
|
||||||
|
File and directory names SHOULD follow CDK naming conventions.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R6 (MAY)
|
||||||
|
|
||||||
|
Modules MAY split into multiple files if needed, as long as they remain in the
|
||||||
|
same directory.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R7 (SHOULD)
|
||||||
|
|
||||||
|
Each construct module SHOULD define its own `InputContract` and
|
||||||
|
`OutputContract`.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R8 (SHOULD)
|
||||||
|
|
||||||
|
Within a module, contracts SHOULD be named simply `InputContract` and
|
||||||
|
`OutputContract`.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R9 (SHOULD)
|
||||||
|
|
||||||
|
When importing contracts from another module, they SHOULD be aliased:
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R10 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST be instantiated using a single InputContract object.
|
||||||
|
|
||||||
|
Also see ABC‑R30/32.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R11 (MUST)
|
||||||
|
|
||||||
|
All cross‑construct wiring MUST occur in the parent construct.
|
||||||
|
|
||||||
|
Also see ABC‑R44.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R12 (SHOULD)
|
||||||
|
|
||||||
|
Imported contracts SHOULD be aliased to descriptive names.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R13 (SHOULD)
|
||||||
|
|
||||||
|
Contracts SHOULD be co‑located with their construct modules.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R14 (SHOULD)
|
||||||
|
|
||||||
|
Generated code SHOULD mirror the ABC hierarchy in structure and composition.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R15 (SHOULD)
|
||||||
|
|
||||||
|
Construct internals SHOULD NOT be accessed except through outputs.
|
||||||
|
|
||||||
|
### ABC-PROFILE-CDKTS‑R16 (SHOULD)
|
||||||
|
|
||||||
|
Constructs SHOULD be generated in ABC order: Resource Groups → Logical Units →
|
||||||
|
Application Stack.
|
||||||
|
|
||||||
|
## Base ABC Classes for Typescript-CDK
|
||||||
|
|
||||||
|
### Core Types
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
export interface InputContract {}
|
||||||
|
export interface OutputContract {}
|
||||||
|
|
||||||
|
export interface HasOutputs<TOutputs extends OutputContract> {
|
||||||
|
readonly outputs: TOutputs;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Application Stack Base
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Stack, StackProps } from 'aws-cdk-lib';
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { OutputContract } from './core-types';
|
||||||
|
|
||||||
|
export abstract class ABCApplicationStack<
|
||||||
|
TOutputs extends OutputContract = OutputContract
|
||||||
|
> extends Stack {
|
||||||
|
public abstract readonly outputs: TOutputs;
|
||||||
|
|
||||||
|
protected constructor(scope: Construct, id: string, props?: StackProps) {
|
||||||
|
super(scope, id, props);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logical Unit Base
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { InputContract, OutputContract, HasOutputs } from './core-types';
|
||||||
|
|
||||||
|
export abstract class ABCLogicalUnit<
|
||||||
|
TInputs extends InputContract,
|
||||||
|
TOutputs extends OutputContract
|
||||||
|
> extends Construct implements HasOutputs<TOutputs> {
|
||||||
|
public abstract readonly outputs: TOutputs;
|
||||||
|
protected readonly inputs: TInputs;
|
||||||
|
|
||||||
|
protected constructor(scope: Construct, id: string, inputs: TInputs) {
|
||||||
|
super(scope, id);
|
||||||
|
this.inputs = Object.freeze({ ...inputs }) as TInputs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Group Base
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { InputContract, OutputContract, HasOutputs } from './core-types';
|
||||||
|
|
||||||
|
export abstract class ABCResourceGroup<
|
||||||
|
TInputs extends InputContract,
|
||||||
|
TOutputs extends OutputContract
|
||||||
|
> extends Construct implements HasOutputs<TOutputs> {
|
||||||
|
public abstract readonly outputs: TOutputs;
|
||||||
|
protected readonly inputs: TInputs;
|
||||||
|
|
||||||
|
protected constructor(scope: Construct, id: string, inputs: TInputs) {
|
||||||
|
super(scope, id);
|
||||||
|
this.inputs = Object.freeze({ ...inputs }) as TInputs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Logical Units & Resource Groups (Canonical Example)
|
||||||
|
|
||||||
|
Below is the full 3‑tier example implemented in CDK.
|
||||||
|
|
||||||
|
### Data Logical Unit
|
||||||
|
|
||||||
|
```default
|
||||||
|
src/data/index.ts
|
||||||
|
src/data/storage/index.ts
|
||||||
|
src/data/database/index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { ABCLogicalUnit } from '../abc/logical-unit';
|
||||||
|
import { StorageGroup } from './storage';
|
||||||
|
import { DatabaseGroup } from './database';
|
||||||
|
|
||||||
|
export interface InputContract {
|
||||||
|
environment: string;
|
||||||
|
region: string;
|
||||||
|
storageClass: string;
|
||||||
|
dbEngine: string;
|
||||||
|
dbInstanceSize: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OutputContract {
|
||||||
|
storageBucketName: string;
|
||||||
|
databaseEndpoint: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DataUnit extends ABCLogicalUnit<InputContract, OutputContract> {
|
||||||
|
public readonly outputs: OutputContract;
|
||||||
|
|
||||||
|
constructor(scope: Construct, id: string, inputs: InputContract) {
|
||||||
|
super(scope, id, inputs);
|
||||||
|
|
||||||
|
const storage = new StorageGroup(this, 'Storage', {
|
||||||
|
environment: inputs.environment,
|
||||||
|
region: inputs.region,
|
||||||
|
storageClass: inputs.storageClass,
|
||||||
|
});
|
||||||
|
|
||||||
|
const database = new DatabaseGroup(this, 'Database', {
|
||||||
|
environment: inputs.environment,
|
||||||
|
dbEngine: inputs.dbEngine,
|
||||||
|
dbInstanceSize: inputs.dbInstanceSize,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.outputs = {
|
||||||
|
storageBucketName: storage.outputs.storageBucketName,
|
||||||
|
databaseEndpoint: database.outputs.databaseEndpoint,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Storage Resource Group
|
||||||
|
|
||||||
|
```default
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { ABCResourceGroup } from '../../abc/resource-group';
|
||||||
|
|
||||||
|
export interface InputContract {
|
||||||
|
environment: string;
|
||||||
|
region: string;
|
||||||
|
storageClass: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OutputContract {
|
||||||
|
storageBucketName: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StorageGroup extends ABCResourceGroup<InputContract, OutputContract> {
|
||||||
|
public readonly outputs: OutputContract;
|
||||||
|
|
||||||
|
constructor(scope: Construct, id: string, inputs: InputContract) {
|
||||||
|
super(scope, id, inputs);
|
||||||
|
|
||||||
|
this.outputs = {
|
||||||
|
storageBucketName: 'bucket-name-placeholder',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Database Resource Group
|
||||||
|
|
||||||
|
```default
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { ABCResourceGroup } from '../../abc/resource-group';
|
||||||
|
|
||||||
|
export interface InputContract {
|
||||||
|
environment: string;
|
||||||
|
dbEngine: string;
|
||||||
|
dbInstanceSize: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OutputContract {
|
||||||
|
databaseEndpoint: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DatabaseGroup extends ABCResourceGroup<InputContract, OutputContract> {
|
||||||
|
public readonly outputs: OutputContract;
|
||||||
|
|
||||||
|
constructor(scope: Construct, id: string, inputs: InputContract) {
|
||||||
|
super(scope, id, inputs);
|
||||||
|
|
||||||
|
this.outputs = {
|
||||||
|
databaseEndpoint: 'db-endpoint-placeholder',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Logic Logical Unit
|
||||||
|
|
||||||
|
```default
|
||||||
|
src/logic/index.ts
|
||||||
|
src/logic/compute/index.ts
|
||||||
|
src/logic/messaging/index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
Compute Resource Group and Messaging Resource Group follow the same pattern.
|
||||||
|
|
||||||
|
### Presentation Logical Unit
|
||||||
|
|
||||||
|
```default
|
||||||
|
src/presentation/index.ts
|
||||||
|
src/presentation/webapp/index.ts
|
||||||
|
src/presentation/cdn/index.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
WebApp Resource Group and CDN Resource Group follow the same pattern.
|
||||||
|
|
||||||
|
## Application Stack
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import { Construct } from 'constructs';
|
||||||
|
import { ABCApplicationStack } from './abc/application-stack';
|
||||||
|
import { DataUnit } from './data';
|
||||||
|
import type { InputContract as DataUnitInput } from './data';
|
||||||
|
import { LogicUnit } from './logic';
|
||||||
|
import type { InputContract as LogicUnitInput } from './logic';
|
||||||
|
import { PresentationUnit } from './presentation';
|
||||||
|
import type { InputContract as PresentationUnitInput } from './presentation';
|
||||||
|
|
||||||
|
export interface InputContract {
|
||||||
|
environment: string;
|
||||||
|
region: string;
|
||||||
|
globalTags?: Record<string, string>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OutputContract {
|
||||||
|
frontendUrl: string;
|
||||||
|
apiEndpoint: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class AppStack extends ABCApplicationStack<OutputContract> {
|
||||||
|
public readonly outputs: OutputContract;
|
||||||
|
|
||||||
|
constructor(scope: Construct, id: string, inputs: InputContract) {
|
||||||
|
super(scope, id);
|
||||||
|
|
||||||
|
const dataInputs: DataUnitInput = {
|
||||||
|
environment: inputs.environment,
|
||||||
|
region: inputs.region,
|
||||||
|
storageClass: 'STANDARD',
|
||||||
|
dbEngine: 'postgres',
|
||||||
|
dbInstanceSize: 'db.t3.micro',
|
||||||
|
};
|
||||||
|
const dataUnit = new DataUnit(this, 'DataUnit', dataInputs);
|
||||||
|
|
||||||
|
const logicInputs: LogicUnitInput = {
|
||||||
|
environment: inputs.environment,
|
||||||
|
region: inputs.region,
|
||||||
|
computeSize: 'small',
|
||||||
|
messageRetention: 1209600,
|
||||||
|
databaseEndpoint: dataUnit.outputs.databaseEndpoint,
|
||||||
|
};
|
||||||
|
const logicUnit = new LogicUnit(this, 'LogicUnit', logicInputs);
|
||||||
|
|
||||||
|
const presentationInputs: PresentationUnitInput = {
|
||||||
|
environment: inputs.environment,
|
||||||
|
region: inputs.region,
|
||||||
|
frontendAssetsBucket: dataUnit.outputs.storageBucketName,
|
||||||
|
apiEndpoint: logicUnit.outputs.apiEndpoint,
|
||||||
|
};
|
||||||
|
const presentationUnit = new PresentationUnit(this, 'PresentationUnit', presentationInputs);
|
||||||
|
|
||||||
|
this.outputs = {
|
||||||
|
frontendUrl: presentationUnit.outputs.frontendUrl,
|
||||||
|
apiEndpoint: logicUnit.outputs.apiEndpoint,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
21
profiles/index.md
Normal file
21
profiles/index.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Profiles
|
||||||
|
|
||||||
|
Profiles define how the ABC Pattern maps onto specific IaC tools. Each profile
|
||||||
|
introduces additional rules, conventions, and examples tailored to the target
|
||||||
|
system.
|
||||||
|
|
||||||
|
Profiles use identifiers of the form:
|
||||||
|
|
||||||
|
```default
|
||||||
|
ABC-PROFILE-<PROFILE>-R#
|
||||||
|
```
|
||||||
|
|
||||||
|
Current profiles include:
|
||||||
|
|
||||||
|
* imperative, object‑oriented implementations
|
||||||
|
* declarative module‑based implementation
|
||||||
|
|
||||||
|
Profiles demonstrate that ABC is not tied to any particular paradigm.
|
||||||
|
|
||||||
|
* [CDK TypeScript Profile](cdk-ts.md)
|
||||||
|
* [Terraform Profile](tf.md)
|
||||||
199
profiles/tf.md
Normal file
199
profiles/tf.md
Normal file
|
|
@ -0,0 +1,199 @@
|
||||||
|
# Terraform Profile
|
||||||
|
|
||||||
|
## Concept → Terraform Mapping
|
||||||
|
|
||||||
|
| ABC Concept | Meaning | Terraform Mapping |
|
||||||
|
|---------------|-------------------------|----------------------------------------------------|
|
||||||
|
| ABC‑C0 | Construct | Terraform module |
|
||||||
|
| ABC‑C1 | Application Stack | Root Terraform module |
|
||||||
|
| ABC‑C2 | Logical Unit | Child module representing a domain |
|
||||||
|
| ABC‑C3 | Resource Group | Submodule representing a cohesive resource cluster |
|
||||||
|
| ABC‑C4 | Input Contract | variables.tf in a module |
|
||||||
|
| ABC‑C5 | Output Contract | outputs.tf in a module |
|
||||||
|
| ABC‑C6 | Instantiation Interface | `module "" { ... }` block |
|
||||||
|
| ABC‑C7 | Capturing Down | Passing variables from parent to child module |
|
||||||
|
| ABC‑C8 | Bubbling Up | Exposing outputs from child modules to parent |
|
||||||
|
|
||||||
|
## Proile Rules
|
||||||
|
|
||||||
|
Terraform profile rules follow the canonical identifier format:
|
||||||
|
|
||||||
|
```default
|
||||||
|
ABC-PROFILE-TF-R#
|
||||||
|
```
|
||||||
|
|
||||||
|
These rules are profile‑specific, not core ABC rules.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R1 (SHOULD)
|
||||||
|
|
||||||
|
Each ABC construct SHOULD be implemented as a Terraform module.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R2 (SHOULD)
|
||||||
|
|
||||||
|
The directory structure SHOULD reflect the ABC hierarchy:
|
||||||
|
|
||||||
|
```default
|
||||||
|
root/
|
||||||
|
main.tf
|
||||||
|
data/
|
||||||
|
main.tf
|
||||||
|
storage/
|
||||||
|
main.tf
|
||||||
|
database/
|
||||||
|
main.tf
|
||||||
|
logic/
|
||||||
|
main.tf
|
||||||
|
presentation/
|
||||||
|
main.tf
|
||||||
|
```
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R3 (SHOULD)
|
||||||
|
|
||||||
|
Each module SHOULD contain:
|
||||||
|
|
||||||
|
* main.tf
|
||||||
|
* variables.tf (InputContract)
|
||||||
|
* outputs.tf (OutputContract)
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R4 (MUST)
|
||||||
|
|
||||||
|
Module inputs MUST be declared exclusively in variables.tf.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R5 (MUST)
|
||||||
|
|
||||||
|
Module outputs MUST be declared exclusively in outputs.tf.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R6 (MUST)
|
||||||
|
|
||||||
|
Modules MUST NOT reference parent or sibling modules directly; all data MUST
|
||||||
|
flow through variables and outputs.
|
||||||
|
|
||||||
|
(This enforces ABC‑R22, ABC‑R40, ABC‑R42.)
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R7 (MUST)
|
||||||
|
|
||||||
|
Modules MUST be instantiated using a module “<name>” { … } block with explicit
|
||||||
|
variable assignments.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R8 (MUST)
|
||||||
|
|
||||||
|
Modules MUST NOT read Terraform state from other modules except via outputs.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R9 (MUST)
|
||||||
|
|
||||||
|
Capturing Down MUST be implemented by passing parent variables or outputs into
|
||||||
|
child module inputs.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R10 (MUST)
|
||||||
|
|
||||||
|
Bubbling Up MUST be implemented by exposing child module outputs and re‑exposing
|
||||||
|
them in the parent module if needed.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R11 (MUST)
|
||||||
|
|
||||||
|
Resource definitions MUST reside only in Resource Group modules (ABC‑C3).
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R12 (MUST)
|
||||||
|
|
||||||
|
Logical Units MUST NOT contain Terraform resources directly.
|
||||||
|
|
||||||
|
### ABC-PROFILE-TF-R13 (SHOULD)
|
||||||
|
|
||||||
|
Logical Units SHOULD only orchestrate child modules and expose aggregated
|
||||||
|
outputs.
|
||||||
|
|
||||||
|
## Canonical Example
|
||||||
|
|
||||||
|
A minimal 3‑tier ABC architecture in Terraform.
|
||||||
|
|
||||||
|
### Application Stack
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "data" {
|
||||||
|
source = "./data"
|
||||||
|
environment = var.environment
|
||||||
|
region = var.region
|
||||||
|
}
|
||||||
|
|
||||||
|
module "logic" {
|
||||||
|
source = "./logic"
|
||||||
|
environment = var.environment
|
||||||
|
region = var.region
|
||||||
|
database_endpoint = module.data.database_endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
module "presentation" {
|
||||||
|
source = "./presentation"
|
||||||
|
environment = var.environment
|
||||||
|
region = var.region
|
||||||
|
frontend_assets_bucket = module.data.storage_bucket_name
|
||||||
|
api_endpoint = module.logic.api_endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
output "frontend_url" {
|
||||||
|
value = module.presentation.frontend_url
|
||||||
|
}
|
||||||
|
|
||||||
|
output "api_endpoint" {
|
||||||
|
value = module.logic.api_endpoint
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
variable "environment" { type = string }
|
||||||
|
variable "region" { type = string }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Logical Unit
|
||||||
|
|
||||||
|
```default
|
||||||
|
module "storage" {
|
||||||
|
source = "./storage"
|
||||||
|
environment = var.environment
|
||||||
|
region = var.region
|
||||||
|
storage_class = var.storage_class
|
||||||
|
}
|
||||||
|
|
||||||
|
module "database" {
|
||||||
|
source = "./database"
|
||||||
|
environment = var.environment
|
||||||
|
db_engine = var.db_engine
|
||||||
|
db_instance_size = var.db_instance_size
|
||||||
|
}
|
||||||
|
|
||||||
|
output "storage_bucket_name" {
|
||||||
|
value = module.storage.bucket_name
|
||||||
|
}
|
||||||
|
|
||||||
|
output "database_endpoint" {
|
||||||
|
value = module.database.endpoint
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```default
|
||||||
|
variable "environment" { type = string }
|
||||||
|
variable "region" { type = string }
|
||||||
|
variable "storage_class" { type = string }
|
||||||
|
variable "db_engine" { type = string }
|
||||||
|
variable "db_instance_size" { type = string }
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Storage Resource Group
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
resource "aws_s3_bucket" "bucket" {
|
||||||
|
bucket = "${var.environment}-storage"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
variable "environment" { type = string }
|
||||||
|
variable "region" { type = string }
|
||||||
|
variable "storage_class" { type = string }
|
||||||
|
```
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
output "bucket_name" {
|
||||||
|
value = aws_s3_bucket.bucket.bucket
|
||||||
|
}
|
||||||
|
```
|
||||||
21
rules/index.md
Normal file
21
rules/index.md
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Rules
|
||||||
|
|
||||||
|
The ABC Pattern is defined and enforced through two complementary rule families:
|
||||||
|
|
||||||
|
* [Normative Rules](normative.md)
|
||||||
|
* [Validation Rules](validation.md)
|
||||||
|
|
||||||
|
Together, these rule sets establish the semantic, structural, and mechanical
|
||||||
|
guarantees that make ABC architectures predictable, verifiable, and safe for
|
||||||
|
automated reasoning and transformation.
|
||||||
|
|
||||||
|
Although closely related, the two rule families serve distinct purposes:
|
||||||
|
|
||||||
|
**Normative Rules** define the semantic contract of the ABC Pattern. They
|
||||||
|
specify what MUST, SHOULD, or MAY be true in any ABC‑compliant architecture,
|
||||||
|
independent of implementation language, cloud provider, or IaC tool.
|
||||||
|
|
||||||
|
**Validation Rules** define the mechanical checks required to verify that an ABC
|
||||||
|
architecture conforms to the Normative Rules and the ABC Schema. Where Normative
|
||||||
|
Rules describe what must be true, Validation Rules describe how to detect
|
||||||
|
violations.
|
||||||
273
rules/normative.md
Normal file
273
rules/normative.md
Normal file
|
|
@ -0,0 +1,273 @@
|
||||||
|
# Normative Rules
|
||||||
|
|
||||||
|
The ABC Pattern is defined by a set of Normative Rules that establish the
|
||||||
|
structural, behavioral, and data‑flow guarantees of the architecture. These
|
||||||
|
rules are the foundation that makes ABC:
|
||||||
|
|
||||||
|
* predictable
|
||||||
|
* composable
|
||||||
|
* verifiable
|
||||||
|
* agent‑friendly
|
||||||
|
* implementation‑agnostic
|
||||||
|
|
||||||
|
Normative Rules describe what MUST or SHOULD be true in any ABC‑compliant
|
||||||
|
architecture, regardless of the underlying cloud provider, IaC tool, or
|
||||||
|
programming language. They are not suggestions or stylistic preferences; they
|
||||||
|
are the semantic constraints that ensure ABC constructs behave consistently and
|
||||||
|
safely.
|
||||||
|
|
||||||
|
Each rule is assigned a canonical identifier of the form:
|
||||||
|
|
||||||
|
```default
|
||||||
|
ABC-R#
|
||||||
|
```
|
||||||
|
|
||||||
|
This identifier is stable, unique, and referenced throughout:
|
||||||
|
|
||||||
|
* the ABC Schema
|
||||||
|
* validation rules
|
||||||
|
* implementation profiles (e.g., CDKTS, Terraform)
|
||||||
|
* agent guidance
|
||||||
|
* tooling and linters
|
||||||
|
|
||||||
|
## Hierarchy Rules
|
||||||
|
|
||||||
|
These define the allowed structure of an ABC architecture, including the roles
|
||||||
|
and relationships of ApplicationStacks, Logical Units, and Resource Groups.
|
||||||
|
|
||||||
|
### ABC‑R1 (MUST)
|
||||||
|
|
||||||
|
An Application Stack (ABC‑C1) MUST contain one or more Logical Units (ABC‑C2).
|
||||||
|
|
||||||
|
### ABC‑R2 (MUST)
|
||||||
|
|
||||||
|
A Logical Unit (ABC‑C2) MUST contain one or more Resource Groups (ABC‑C3).
|
||||||
|
|
||||||
|
### ABC‑R3 (MUST)
|
||||||
|
|
||||||
|
Every Construct (ABC‑C0) MUST have exactly one parent, except the Application
|
||||||
|
Stack (ABC‑C1), which has none.
|
||||||
|
|
||||||
|
### ABC‑R4 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST form a strict tree hierarchy with no cycles.
|
||||||
|
|
||||||
|
### ABC‑R5 (SHOULD)
|
||||||
|
|
||||||
|
Logical Units (ABC‑C2) SHOULD represent coherent functional domains.
|
||||||
|
|
||||||
|
### ABC‑R6 (MAY)
|
||||||
|
|
||||||
|
Resource Groups (ABC‑C3) MAY be nested further if the implementation framework
|
||||||
|
supports sub‑constructs, provided all other rules remain satisfied.
|
||||||
|
|
||||||
|
## Relationship Rules
|
||||||
|
|
||||||
|
Specify how constructs relate to one another, including parent‑child
|
||||||
|
constraints, allowed dependencies, and prohibited lateral references.
|
||||||
|
|
||||||
|
### ABC‑R10 (MUST)
|
||||||
|
|
||||||
|
A Resource Group (ABC‑C3) MUST NOT reference another Resource Group directly.
|
||||||
|
|
||||||
|
### ABC‑R11 (MUST)
|
||||||
|
|
||||||
|
A Logical Unit (ABC‑C2) MUST NOT reference another Logical Unit directly.
|
||||||
|
|
||||||
|
### ABC‑R12 (MUST)
|
||||||
|
|
||||||
|
A Construct (ABC‑C0) MUST NOT access parent state except through Capturing Down
|
||||||
|
(ABC‑F1).
|
||||||
|
|
||||||
|
### ABC‑R13 (MUST)
|
||||||
|
|
||||||
|
A Construct (ABC‑C0) MUST NOT access sibling state under any circumstances.
|
||||||
|
|
||||||
|
### ABC‑R14 (MUST)
|
||||||
|
|
||||||
|
All cross‑domain communication MUST be mediated by the parent construct.
|
||||||
|
|
||||||
|
### ABC‑R15 (SHOULD)
|
||||||
|
|
||||||
|
Constructs SHOULD minimize the number of outputs they expose to reduce coupling.
|
||||||
|
|
||||||
|
### ABC‑R16 (MAY)
|
||||||
|
|
||||||
|
A parent MAY aggregate outputs from multiple children before re‑exposing them.
|
||||||
|
|
||||||
|
## Interface Rules
|
||||||
|
|
||||||
|
Define the semantics of Input and Output Contracts, including immutability,
|
||||||
|
explicitness, and the boundaries they enforce.
|
||||||
|
|
||||||
|
### ABC‑R20 (MUST)
|
||||||
|
|
||||||
|
Every Construct (ABC‑C0) MUST define an Input Contract (ABC‑C4).
|
||||||
|
|
||||||
|
### ABC‑R21 (MUST)
|
||||||
|
|
||||||
|
Every Construct (ABC‑C0) MUST define an Output Contract (ABC‑C5), even if empty.
|
||||||
|
|
||||||
|
### ABC‑R22 (MUST)
|
||||||
|
|
||||||
|
A Construct MUST NOT depend on any value not present in its Input Contract.
|
||||||
|
|
||||||
|
### ABC‑R23 (MUST)
|
||||||
|
|
||||||
|
A Construct MUST NOT expose any value not present in its Output Contract.
|
||||||
|
|
||||||
|
### ABC‑R24 (MUST)
|
||||||
|
|
||||||
|
Input Contracts MUST be immutable after instantiation.
|
||||||
|
|
||||||
|
### ABC‑R25 (SHOULD)
|
||||||
|
|
||||||
|
Output Contracts SHOULD be minimal and stable across versions.
|
||||||
|
|
||||||
|
### ABC‑R26 (MAY)
|
||||||
|
|
||||||
|
A Construct MAY expose composite outputs if they simplify parent‑level wiring.
|
||||||
|
|
||||||
|
## Instantiation Rules
|
||||||
|
|
||||||
|
Specify how constructs are created, how inputs are provided, and how
|
||||||
|
instantiation must avoid side effects or hidden dependencies.
|
||||||
|
|
||||||
|
### ABC‑R30 (MUST)
|
||||||
|
|
||||||
|
A Construct (ABC‑C0) MUST be instantiated exclusively through its Instantiation
|
||||||
|
Interface (ABC‑C6).
|
||||||
|
|
||||||
|
### ABC‑R31 (MUST)
|
||||||
|
|
||||||
|
Instantiation MUST be top‑down: parents instantiate children; children MUST NOT
|
||||||
|
instantiate parents or siblings.
|
||||||
|
|
||||||
|
### ABC‑R32 (MUST)
|
||||||
|
|
||||||
|
The Instantiation Interface MUST accept only the Input Contract (ABC‑C4) and no
|
||||||
|
additional parameters.
|
||||||
|
|
||||||
|
### ABC‑R33 (MUST)
|
||||||
|
|
||||||
|
Instantiation MUST NOT produce side effects beyond constructing the child.
|
||||||
|
|
||||||
|
### ABC‑R34 (SHOULD)
|
||||||
|
|
||||||
|
Instantiation Interfaces SHOULD remain stable across minor revisions.
|
||||||
|
|
||||||
|
### ABC‑R35 (MAY)
|
||||||
|
|
||||||
|
Constructs MAY provide optional parameters in the Input Contract if defaults are
|
||||||
|
well‑defined.
|
||||||
|
|
||||||
|
## Data Flow Rules
|
||||||
|
|
||||||
|
Formalize the two fundamental ABC data‑flow mechanisms:
|
||||||
|
|
||||||
|
* Capturing Down (parent → child)
|
||||||
|
* Bubbling Up (child → parent)
|
||||||
|
|
||||||
|
These rules ensure that all communication flows through the parent construct,
|
||||||
|
eliminating ambiguity and hidden coupling.
|
||||||
|
|
||||||
|
### ABC‑R40 (MUST)
|
||||||
|
|
||||||
|
All downward data flow MUST occur through Capturing Down (ABC‑F1).
|
||||||
|
|
||||||
|
### ABC‑R41 (MUST)
|
||||||
|
|
||||||
|
All upward data flow MUST occur through Bubbling Up (ABC‑F2).
|
||||||
|
|
||||||
|
### ABC‑R42 (MUST)
|
||||||
|
|
||||||
|
A Construct MUST NOT read values from its parent except those explicitly passed
|
||||||
|
via Capturing Down.
|
||||||
|
|
||||||
|
### ABC‑R43 (MUST)
|
||||||
|
|
||||||
|
A Construct MUST NOT write values to its parent except through Bubbling Up.
|
||||||
|
|
||||||
|
### ABC‑R44 (MUST)
|
||||||
|
|
||||||
|
Parents MUST mediate all routing of outputs between children.
|
||||||
|
|
||||||
|
### ABC‑R45 (SHOULD)
|
||||||
|
|
||||||
|
Parents SHOULD avoid passing unnecessary outputs downward to reduce coupling.
|
||||||
|
|
||||||
|
### ABC‑R46 (MAY)
|
||||||
|
|
||||||
|
Parents MAY transform outputs before passing them down.
|
||||||
|
|
||||||
|
## Encapsulation & Testability Rules
|
||||||
|
|
||||||
|
Ensure that constructs remain isolated, testable, and free from cross‑cutting
|
||||||
|
concerns. These rules prevent leakage of internal details and enforce strict
|
||||||
|
boundaries.
|
||||||
|
|
||||||
|
### ABC‑R50 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST encapsulate all internal implementation details.
|
||||||
|
|
||||||
|
### ABC‑R51 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST be instantiable in isolation using mock Input Contracts.
|
||||||
|
|
||||||
|
### ABC‑R52 (SHOULD)
|
||||||
|
|
||||||
|
Constructs SHOULD avoid exposing internal resource identifiers unless required.
|
||||||
|
|
||||||
|
### ABC‑R53 (SHOULD)
|
||||||
|
|
||||||
|
Constructs SHOULD minimize internal state to simplify testing.
|
||||||
|
|
||||||
|
### ABC‑R54 (MAY)
|
||||||
|
|
||||||
|
Constructs MAY provide diagnostic outputs if they do not violate encapsulation.
|
||||||
|
|
||||||
|
## Evolution & Change Management Rules
|
||||||
|
|
||||||
|
Define how ABC architectures evolve safely over time, including versioning,
|
||||||
|
contract stability, and backward‑compatible changes.
|
||||||
|
|
||||||
|
### ABC‑R60 (MUST)
|
||||||
|
|
||||||
|
If a child’s Output Contract changes, the parent MUST adapt explicitly.
|
||||||
|
|
||||||
|
### ABC‑R61 (MUST)
|
||||||
|
|
||||||
|
Breaking changes to Input Contracts MUST be versioned or documented.
|
||||||
|
|
||||||
|
### ABC‑R62 (SHOULD)
|
||||||
|
|
||||||
|
Constructs SHOULD maintain backward compatibility where feasible.
|
||||||
|
|
||||||
|
### ABC‑R63 (SHOULD)
|
||||||
|
|
||||||
|
Parents SHOULD validate child outputs before routing them.
|
||||||
|
|
||||||
|
### ABC‑R64 (MAY)
|
||||||
|
|
||||||
|
Constructs MAY deprecate fields gradually before removal.
|
||||||
|
|
||||||
|
## Optional Flexibility Rules
|
||||||
|
|
||||||
|
Provide non‑mandatory guidance that enhances clarity, maintainability, or
|
||||||
|
ergonomics without affecting correctness. These rules are advisory and may be
|
||||||
|
adopted at the discretion of the implementation or team.
|
||||||
|
|
||||||
|
### ABC‑R70 (MAY)
|
||||||
|
|
||||||
|
Logical Units MAY be composed dynamically if the framework supports it, provided
|
||||||
|
all other rules remain satisfied.
|
||||||
|
|
||||||
|
### ABC‑R71 (MAY)
|
||||||
|
|
||||||
|
Resource Groups MAY be reused across Logical Units if instantiated
|
||||||
|
independently.
|
||||||
|
|
||||||
|
### ABC‑R72 (MAY)
|
||||||
|
|
||||||
|
The Application Stack MAY expose a composite Output Contract aggregating all
|
||||||
|
Logical Unit outputs.
|
||||||
155
rules/validation.md
Normal file
155
rules/validation.md
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
# Validation Rules
|
||||||
|
|
||||||
|
The ABC Validation Rules define the mechanical checks required to verify that an
|
||||||
|
ABC architecture conforms to the ABC Schema and the normative rules of the
|
||||||
|
specification. These rules are intended for:
|
||||||
|
|
||||||
|
* automated validators
|
||||||
|
* linters
|
||||||
|
* compilers
|
||||||
|
* agent‑driven code generation
|
||||||
|
* CI/CD enforcement
|
||||||
|
|
||||||
|
Validation Rules are **not** conceptual rules; they are operational constraints
|
||||||
|
that ensure an ABC description is structurally correct and unambiguous.
|
||||||
|
|
||||||
|
Validation Rules follow the canonical identifier format:
|
||||||
|
|
||||||
|
```default
|
||||||
|
ABC-VALID-R#
|
||||||
|
```
|
||||||
|
|
||||||
|
They are grouped into:
|
||||||
|
|
||||||
|
* Structural Validation
|
||||||
|
* Contract Validation
|
||||||
|
* Data‑Flow Validation
|
||||||
|
* Hierarchy Validation
|
||||||
|
* Profile‑Specific Validation (optional)
|
||||||
|
|
||||||
|
## Structural Validation Rules
|
||||||
|
|
||||||
|
These rules ensure the ABC hierarchy is well‑formed.
|
||||||
|
|
||||||
|
### ABC-VALID-R1 (MUST)
|
||||||
|
|
||||||
|
Every construct MUST have exactly one parent, except the ApplicationStack which
|
||||||
|
MUST have none.
|
||||||
|
|
||||||
|
### ABC-VALID-R2 (MUST)
|
||||||
|
|
||||||
|
The hierarchy MUST follow the pattern:
|
||||||
|
`ApplicationStack → LogicalUnit → ResourceGroup`.
|
||||||
|
|
||||||
|
### ABC-VALID-R3 (MUST)
|
||||||
|
|
||||||
|
Construct trees MUST NOT contain cycles.
|
||||||
|
|
||||||
|
### ABC-VALID-R4 (MUST)
|
||||||
|
|
||||||
|
Construct IDs MUST be unique within the architecture.
|
||||||
|
|
||||||
|
### ABC-VALID-R5 (MUST)
|
||||||
|
|
||||||
|
Construct types MUST be one of:
|
||||||
|
ApplicationStack, LogicalUnit, ResourceGroup.
|
||||||
|
|
||||||
|
### ABC-VALID-R6 (MUST)
|
||||||
|
|
||||||
|
ResourceGroups MUST NOT have children.
|
||||||
|
|
||||||
|
### ABC-VALID-R7 (MUST)
|
||||||
|
|
||||||
|
LogicalUnits MUST NOT have parents that are not ApplicationStacks.
|
||||||
|
|
||||||
|
### ABC-VALID-R8 (MUST)
|
||||||
|
|
||||||
|
ResourceGroups MUST NOT have parents that are not LogicalUnits.
|
||||||
|
|
||||||
|
## Contract Validation Rules
|
||||||
|
|
||||||
|
These rules ensure Input/Output Contracts are well‑defined and consistent.
|
||||||
|
|
||||||
|
### ABC-VALID-R10 (MUST)
|
||||||
|
|
||||||
|
Every construct MUST define both an InputContract and an OutputContract.
|
||||||
|
|
||||||
|
### ABC-VALID-R11 (MUST)
|
||||||
|
|
||||||
|
InputContracts MUST be immutable after instantiation.
|
||||||
|
|
||||||
|
### ABC-VALID-R12 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT reference values not present in their InputContract.
|
||||||
|
|
||||||
|
### ABC-VALID-R13 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT expose outputs not declared in their OutputContract.
|
||||||
|
|
||||||
|
### ABC-VALID-R14 (SHOULD)
|
||||||
|
|
||||||
|
OutputContracts SHOULD be minimal and stable across versions.
|
||||||
|
|
||||||
|
### ABC-VALID-R15 (MUST)
|
||||||
|
|
||||||
|
InputContracts MUST NOT reference parent or sibling constructs directly.
|
||||||
|
|
||||||
|
### ABC-VALID-R16 (MUST)
|
||||||
|
|
||||||
|
OutputContracts MUST NOT expose internal implementation details (e.g., resource
|
||||||
|
objects).
|
||||||
|
|
||||||
|
## Data‑Flow Validation Rules
|
||||||
|
|
||||||
|
These rules enforce Capturing Down and Bubbling Up.
|
||||||
|
|
||||||
|
### ABC-VALID-R20 (MUST)
|
||||||
|
|
||||||
|
All downward references MUST originate from:
|
||||||
|
|
||||||
|
* parent.InputContract
|
||||||
|
* parent.OutputContract
|
||||||
|
|
||||||
|
### ABC-VALID-R21 (MUST)
|
||||||
|
|
||||||
|
All upward references MUST originate from:
|
||||||
|
|
||||||
|
* child.OutputContract
|
||||||
|
|
||||||
|
### ABC-VALID-R22 (MUST)
|
||||||
|
|
||||||
|
No lateral data flow is permitted between siblings.
|
||||||
|
|
||||||
|
### ABC-VALID-R23 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT read values from grandparents or ancestors except through
|
||||||
|
parent‑mediated Capturing Down.
|
||||||
|
|
||||||
|
### ABC-VALID-R24 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT write values to ancestors except through Bubbling Up.
|
||||||
|
|
||||||
|
### ABC-VALID-R25 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT read or write values from siblings or cousins.
|
||||||
|
|
||||||
|
## Instantiation Validation Rules
|
||||||
|
|
||||||
|
These rules ensure constructs are instantiated correctly.
|
||||||
|
|
||||||
|
### ABC-VALID-R30 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST be instantiated using the Instantiation Interface:
|
||||||
|
(scope, id, inputs).
|
||||||
|
|
||||||
|
### ABC-VALID-R31 (MUST)
|
||||||
|
|
||||||
|
Instantiation MUST NOT accept parameters outside the InputContract.
|
||||||
|
|
||||||
|
### ABC-VALID-R32 (MUST)
|
||||||
|
|
||||||
|
Instantiation MUST NOT produce side effects beyond constructing children.
|
||||||
|
|
||||||
|
### ABC-VALID-R33 (MUST)
|
||||||
|
|
||||||
|
Constructs MUST NOT mutate their InputContract after instantiation.
|
||||||
224
schema.md
Normal file
224
schema.md
Normal file
|
|
@ -0,0 +1,224 @@
|
||||||
|
# Schema
|
||||||
|
|
||||||
|
The ABC Schema is the authoritative, machine‑readable definition of the ABC
|
||||||
|
Pattern. It formalizes:
|
||||||
|
|
||||||
|
* Construct types
|
||||||
|
* Hierarchy rules
|
||||||
|
* Contract requirements
|
||||||
|
* Data‑flow semantics
|
||||||
|
* Instantiation constraints
|
||||||
|
* Validation rules
|
||||||
|
* Profile extension hooks
|
||||||
|
|
||||||
|
The schema is expressed as a single JSON Schema document, making it suitable
|
||||||
|
for:
|
||||||
|
|
||||||
|
* Linting
|
||||||
|
* Static analysis
|
||||||
|
* Code generation
|
||||||
|
* Agent reasoning
|
||||||
|
* Architecture validation
|
||||||
|
* Profile extension (CDKTS, Terraform, Pulumi, etc.)
|
||||||
|
|
||||||
|
This schema is intentionally strict. It defines the shape of an ABC
|
||||||
|
architecture, not the cloud resources themselves. Profiles map this schema to
|
||||||
|
concrete IaC implementations.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$id": "https://schema.tiararodney.com/abc/abc.schema.json",
|
||||||
|
"title": "ABC Schema",
|
||||||
|
"description": "The canonical machine-readable schema for the ABC Pattern.",
|
||||||
|
"type": "object",
|
||||||
|
|
||||||
|
"properties": {
|
||||||
|
"version": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Schema version identifier."
|
||||||
|
},
|
||||||
|
|
||||||
|
"constructs": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "List of constructs in the ABC architecture.",
|
||||||
|
"items": { "$ref": "#/$defs/Construct" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"required": ["version", "constructs"],
|
||||||
|
|
||||||
|
"$defs": {
|
||||||
|
|
||||||
|
"Construct": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "A construct in the ABC hierarchy.",
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique identifier for the construct."
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["ApplicationStack", "LogicalUnit", "ResourceGroup"],
|
||||||
|
"description": "Construct type (ABC-C1, C2, or C3)."
|
||||||
|
},
|
||||||
|
"parent": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"description": "Parent construct ID. Null only for ApplicationStack."
|
||||||
|
},
|
||||||
|
"inputs": {
|
||||||
|
"$ref": "#/$defs/InputContract"
|
||||||
|
},
|
||||||
|
"outputs": {
|
||||||
|
"$ref": "#/$defs/OutputContract"
|
||||||
|
},
|
||||||
|
"children": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string" },
|
||||||
|
"description": "IDs of child constructs."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["id", "type", "inputs", "outputs", "children"],
|
||||||
|
"allOf": [
|
||||||
|
{ "$ref": "#/$defs/HierarchyRules" },
|
||||||
|
{ "$ref": "#/$defs/ContractRules" },
|
||||||
|
{ "$ref": "#/$defs/DataFlowRules" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"InputContract": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "ABC-C4 Input Contract.",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": ["string", "number", "boolean", "object", "array", "null"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"OutputContract": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "ABC-C5 Output Contract.",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": ["string", "number", "boolean", "object", "array", "null"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"HierarchyRules": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Hierarchy validation rules.",
|
||||||
|
"properties": {},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"if": { "properties": { "type": { "const": "ApplicationStack" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"parent": { "type": "null" }
|
||||||
|
},
|
||||||
|
"errorMessage": {
|
||||||
|
"parent": "ABC-R3: ApplicationStack MUST have no parent."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": { "properties": { "type": { "const": "LogicalUnit" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"children": {
|
||||||
|
"minItems": 1,
|
||||||
|
"errorMessage": "ABC-R2: Logical Units MUST contain one or more Resource Groups."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": { "properties": { "type": { "const": "ResourceGroup" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"children": {
|
||||||
|
"maxItems": 0,
|
||||||
|
"errorMessage": "ABC-R10: Resource Groups MUST NOT contain child constructs."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"ContractRules": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Contract validation rules.",
|
||||||
|
"properties": {},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"inputs": {
|
||||||
|
"type": "object",
|
||||||
|
"errorMessage": "ABC-R24: Input Contracts MUST be immutable objects."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"outputs": {
|
||||||
|
"type": "object",
|
||||||
|
"errorMessage": "ABC-R23: Output Contracts MUST be declared explicitly."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"DataFlowRules": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Data flow validation rules.",
|
||||||
|
"properties": {},
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"if": { "properties": { "type": { "const": "LogicalUnit" } } },
|
||||||
|
"then": {
|
||||||
|
"properties": {
|
||||||
|
"inputs": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## How Profiles Extend This Schema
|
||||||
|
|
||||||
|
Profiles (e.g., Typescript CDK, Terraform) extend the monolithic schema using
|
||||||
|
JSON Schema’s allOf mechanism.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"$id": "https://schema.tiararodney.com/abc/profile/cdkts.schema.json",
|
||||||
|
"title": "ABC CDK TypeScript Profile",
|
||||||
|
"allOf": [
|
||||||
|
{ "$ref": "https://abc-spec.org/schema/abc-schema.json" }
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"cdkts": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "CDKTS-specific rules and metadata."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## How The Schema is Consumed
|
||||||
|
|
||||||
|
1. **Generate ABC structures from natural language**
|
||||||
|
The schema defines the allowed constructs and relationships.
|
||||||
|
2. **Validate the architecture**
|
||||||
|
The schema + validation rules ensure correctness.
|
||||||
|
3. **Compile into IaC**
|
||||||
|
Profiles map the schema to CDK, Terraform, Pulumi, etc.
|
||||||
|
4. **Refactor architectures**
|
||||||
|
Agents can safely transform the schema because the rules are explicit.
|
||||||
|
5. **Generate documentation**
|
||||||
|
The schema is a perfect source for diagrams and docs.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue