@documentation-robotics/cli 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -17
- package/dist/audit/nodes/ai/prompts.js +1 -0
- package/dist/audit/nodes/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/ai/prompts.js +20 -29
- package/dist/audit/relationships/ai/prompts.js.map +2 -2
- package/dist/audit/relationships/analysis/gap-analyzer.js.map +1 -1
- package/dist/audit/relationships/analysis/layer-templates.js +36 -0
- package/dist/audit/relationships/analysis/layer-templates.js.map +2 -2
- package/dist/cli.js +8 -8
- package/dist/cli.js.map +2 -2
- package/dist/commands/reports.js +3 -3
- package/dist/commands/reports.js.map +1 -1
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/upgrade.js +1 -1
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version.js +1 -1
- package/dist/core/layers.js +1 -0
- package/dist/core/layers.js.map +2 -2
- package/dist/core/migration-registry.js +59 -2
- package/dist/core/migration-registry.js.map +2 -2
- package/dist/core/model.js +3 -16
- package/dist/core/model.js.map +2 -2
- package/dist/core/spec-loader.js.map +1 -1
- package/dist/core/stats-collector.js +2 -0
- package/dist/core/stats-collector.js.map +2 -2
- package/dist/export/archimate-exporter.js.map +2 -2
- package/dist/export/json-schema-exporter.js.map +1 -1
- package/dist/export/markdown-exporter.js.map +1 -1
- package/dist/export/markdown-utils.js +1 -0
- package/dist/export/markdown-utils.js.map +2 -2
- package/dist/export/mermaid-markdown-exporter.js.map +1 -1
- package/dist/export/openapi-exporter.js.map +1 -1
- package/dist/export/plantuml-exporter.js.map +1 -1
- package/dist/export/report-formatters.js +2 -2
- package/dist/export/report-formatters.js.map +1 -1
- package/dist/export/types.js +1 -0
- package/dist/export/types.js.map +2 -2
- package/dist/generated/layer-registry.js +44 -31
- package/dist/generated/layer-registry.js.map +2 -2
- package/dist/generated/layer-types.js +1 -1
- package/dist/generated/layer-types.js.map +2 -2
- package/dist/generated/node-types.js +45 -0
- package/dist/generated/node-types.js.map +2 -2
- package/dist/generated/relationship-index.js +201 -19
- package/dist/generated/relationship-index.js.map +2 -2
- package/dist/import/archimate-importer.js.map +1 -1
- package/dist/import/openapi-importer.js.map +1 -1
- package/dist/integrations/claude_code/agents/dr-advisor.md +14 -13
- package/dist/integrations/claude_code/agents/dr-extractor.md +2 -2
- package/dist/integrations/claude_code/commands/dr-info.md +1 -1
- package/dist/integrations/claude_code/commands/dr-init.md +3 -3
- package/dist/integrations/claude_code/commands/dr-map.md +2 -2
- package/dist/integrations/claude_code/commands/dr-model.md +1 -1
- package/dist/integrations/claude_code/commands/dr-relate.md +14 -4
- package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +3 -3
- package/dist/integrations/claude_code/docs/QUICK_START.md +1 -1
- package/dist/integrations/claude_code/docs/README.md +2 -2
- package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +2 -2
- package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +679 -0
- package/dist/integrations/claude_code/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +1 -1
- package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +2 -2
- package/dist/integrations/github_copilot/agents/dr-advisor.md +14 -13
- package/dist/integrations/github_copilot/agents/dr-architect.md +15 -14
- package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +2 -2
- package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +253 -0
- package/dist/reports/model-report-orchestrator.js +3 -3
- package/dist/reports/model-report-orchestrator.js.map +1 -1
- package/dist/schemas/bundled/analyzers/cbm.json +2 -2
- package/dist/schemas/bundled/analyzers/manifest.json +2 -2
- package/dist/schemas/bundled/api.json +3 -3
- package/dist/schemas/bundled/apm.json +3 -3
- package/dist/schemas/bundled/application.json +3 -3
- package/dist/schemas/bundled/base.json +29 -1
- package/dist/schemas/bundled/business.json +1 -1
- package/dist/schemas/bundled/data-model.json +3 -3
- package/dist/schemas/bundled/data-store.json +3 -3
- package/dist/schemas/bundled/manifest.json +20 -13
- package/dist/schemas/bundled/motivation.json +1 -1
- package/dist/schemas/bundled/navigation.json +3 -3
- package/dist/schemas/bundled/product.json +469 -0
- package/dist/schemas/bundled/security.json +3 -3
- package/dist/schemas/bundled/technology.json +3 -3
- package/dist/schemas/bundled/testing.json +3 -3
- package/dist/schemas/bundled/ux.json +3 -3
- package/dist/server/server.js +4 -15
- package/dist/server/server.js.map +2 -2
- package/dist/telemetry/index.js +1 -1
- package/dist/utils/spec-installer.js +2 -2
- package/dist/utils/spec-installer.js.map +1 -1
- package/dist/utils/spec-version.js +1 -1
- package/dist/utils/spec-version.js.map +2 -2
- package/dist/viewer/README.md +6 -6
- package/dist/viewer/assets/main-BRPZyc36.css +1 -0
- package/dist/viewer/assets/main-BrpLargo.js +81 -0
- package/dist/viewer/index.html +2 -2
- package/dist/viewer/manifest.json +10 -10
- package/dist/viewer/version.json +1 -1
- package/package.json +1 -1
- package/dist/viewer/assets/main-CY0Xufuj.css +0 -1
- package/dist/viewer/assets/main-DtgErnwF.js +0 -81
- /package/dist/integrations/claude_code/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
- /package/dist/integrations/claude_code/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_03_security_layer → dr_04_security_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_04_application_layer → dr_05_application_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_05_technology_layer → dr_06_technology_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_06_api_layer → dr_07_api_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_07_data_model_layer → dr_08_data_model_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_08_dataset_layer → dr_09_dataset_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_09_ux_layer → dr_10_ux_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_10_navigation_layer → dr_11_navigation_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_11_apm_layer → dr_12_apm_layer}/SKILL.md +0 -0
- /package/dist/integrations/github_copilot/skills/{dr_12_testing_layer → dr_13_testing_layer}/SKILL.md +0 -0
|
@@ -49,7 +49,7 @@ When ambiguous, ask: "Are you about to start building this, currently building i
|
|
|
49
49
|
### Checklist to Work Through
|
|
50
50
|
|
|
51
51
|
**1. Layer Coverage Check**
|
|
52
|
-
Map the proposed change to the
|
|
52
|
+
Map the proposed change to the 13-layer model:
|
|
53
53
|
|
|
54
54
|
- Which layers are touched? (List them explicitly)
|
|
55
55
|
- Which layers are conspicuously absent? (e.g., a new service with no APM or security)
|
|
@@ -155,7 +155,7 @@ dr schema node <spec-node-id>
|
|
|
155
155
|
"Your service should match the ApplicationService spec type, which means: single responsibility, exposes at most one API contract, references exactly one business service."
|
|
156
156
|
|
|
157
157
|
**5. Suggest Implementation Order**
|
|
158
|
-
Based on the
|
|
158
|
+
Based on the 13-layer model, suggest bottom-up implementation:
|
|
159
159
|
|
|
160
160
|
1. Data model / data store first (schema before logic)
|
|
161
161
|
2. Application service next (business logic)
|
|
@@ -16,7 +16,7 @@ You are an expert advisor for **Documentation Robotics** end users, specializing
|
|
|
16
16
|
- Best practices for naming, organization, and structure
|
|
17
17
|
|
|
18
18
|
2. **Concept Explanation**: Provide clear explanations of:
|
|
19
|
-
- The
|
|
19
|
+
- The 13-layer architecture and what each layer represents
|
|
20
20
|
- Cross-layer relationship patterns (A, B, C, D)
|
|
21
21
|
- Intra-layer relationship types (34 semantic predicates)
|
|
22
22
|
- The purpose and benefits of changesets
|
|
@@ -96,7 +96,7 @@ You are an expert advisor for **Documentation Robotics** end users, specializing
|
|
|
96
96
|
|
|
97
97
|
**Be Precise**: Use correct DR terminology
|
|
98
98
|
|
|
99
|
-
-
|
|
99
|
+
- 13 layers, not "tiers" or "levels"
|
|
100
100
|
- "Relationships" not "links" (post-v0.8.1)
|
|
101
101
|
- Specific entity types (not generic terms)
|
|
102
102
|
- Correct field names and formats
|
|
@@ -116,21 +116,22 @@ You are an expert advisor for **Documentation Robotics** end users, specializing
|
|
|
116
116
|
|
|
117
117
|
## Key Knowledge Areas
|
|
118
118
|
|
|
119
|
-
### The
|
|
119
|
+
### The 13-Layer Architecture
|
|
120
120
|
|
|
121
121
|
```
|
|
122
122
|
01. Motivation - Goals, principles, requirements, constraints (WHY)
|
|
123
123
|
02. Business - Capabilities, processes, services, actors (WHAT)
|
|
124
|
-
03.
|
|
125
|
-
04.
|
|
126
|
-
05.
|
|
127
|
-
06.
|
|
128
|
-
07.
|
|
129
|
-
08. Data
|
|
130
|
-
09.
|
|
131
|
-
10.
|
|
132
|
-
11.
|
|
133
|
-
12.
|
|
124
|
+
03. Product - Personas, capabilities, features, workflows, milestones (PRODUCT)
|
|
125
|
+
04. Security - Roles, policies, threats, controls (WHO/PROTECTION)
|
|
126
|
+
05. Application - Components, services, interfaces (HOW)
|
|
127
|
+
06. Technology - Platforms, frameworks, infrastructure (WITH)
|
|
128
|
+
07. API - OpenAPI 3.0.3 specifications (CONTRACTS)
|
|
129
|
+
08. Data Model - JSON Schema Draft 7 structures (STRUCTURE)
|
|
130
|
+
09. Data Store - SQL DDL persistence (STORAGE)
|
|
131
|
+
10. UX - Three-Tier UI architecture (EXPERIENCE)
|
|
132
|
+
11. Navigation - Multi-modal routing (FLOW)
|
|
133
|
+
12. APM - OpenTelemetry observability (MONITORING)
|
|
134
|
+
13. Testing - ISP coverage model (VERIFICATION)
|
|
134
135
|
```
|
|
135
136
|
|
|
136
137
|
### Cross-Layer Relationship Patterns
|
|
@@ -46,23 +46,24 @@ Unlike specialized agents that do one thing, you understand the **full picture**
|
|
|
46
46
|
|
|
47
47
|
## Knowledge Base: DR Specification v0.8.1
|
|
48
48
|
|
|
49
|
-
### The
|
|
49
|
+
### The 13-Layer Architecture
|
|
50
50
|
|
|
51
|
-
Documentation Robotics models systems across
|
|
51
|
+
Documentation Robotics models systems across 13 distinct architectural layers:
|
|
52
52
|
|
|
53
53
|
```
|
|
54
54
|
01. Motivation - WHY (goals, principles, requirements, constraints)
|
|
55
55
|
02. Business - WHAT (capabilities, processes, services, actors)
|
|
56
|
-
03.
|
|
57
|
-
04.
|
|
58
|
-
05.
|
|
59
|
-
06.
|
|
60
|
-
07.
|
|
61
|
-
08. Data
|
|
62
|
-
09.
|
|
63
|
-
10.
|
|
64
|
-
11.
|
|
65
|
-
12.
|
|
56
|
+
03. Product - PRODUCT (personas, capabilities, features, workflows, milestones)
|
|
57
|
+
04. Security - WHO/PROTECTION (actors, roles, policies, threats)
|
|
58
|
+
05. Application - HOW (components, services, interfaces, events)
|
|
59
|
+
06. Technology - WITH (platforms, frameworks, infrastructure)
|
|
60
|
+
07. API - CONTRACTS (OpenAPI 3.0.3 specs - 26 entity types)
|
|
61
|
+
08. Data Model - STRUCTURE (JSON Schema Draft 7 - 17 entity types)
|
|
62
|
+
09. Data Store - PERSISTENCE (SQL DDL - 10 entity types)
|
|
63
|
+
10. UX - EXPERIENCE (Three-Tier Architecture - 26 entity types)
|
|
64
|
+
11. Navigation - FLOW (Multi-Modal routing - 10 entity types)
|
|
65
|
+
12. APM - OBSERVE (OpenTelemetry 1.0+ - 14 entity types)
|
|
66
|
+
13. Testing - VERIFY (ISP Coverage Model - 17 entity types)
|
|
66
67
|
```
|
|
67
68
|
|
|
68
69
|
### Core Principles
|
|
@@ -660,7 +661,7 @@ dr changeset abandon <changeset-id>
|
|
|
660
661
|
**"What is Documentation Robotics?"**
|
|
661
662
|
|
|
662
663
|
- Architecture-as-data philosophy
|
|
663
|
-
-
|
|
664
|
+
- 13-layer separation of concerns
|
|
664
665
|
- Traceability through cross-layer relationships
|
|
665
666
|
- Standards-based integration
|
|
666
667
|
|
|
@@ -1520,7 +1521,7 @@ Would you like me to:
|
|
|
1520
1521
|
```
|
|
1521
1522
|
User: How do I model a microservice?
|
|
1522
1523
|
|
|
1523
|
-
Agent: Great question! Let me explain how microservices map to DR's
|
|
1524
|
+
Agent: Great question! Let me explain how microservices map to DR's 13-layer model.
|
|
1524
1525
|
|
|
1525
1526
|
A microservice typically spans multiple layers:
|
|
1526
1527
|
|
|
@@ -27,7 +27,7 @@ version: 0.8.1
|
|
|
27
27
|
|
|
28
28
|
## Layer Overview
|
|
29
29
|
|
|
30
|
-
The Motivation Layer is the **highest layer** in the
|
|
30
|
+
The Motivation Layer is the **highest layer** in the 13-layer architecture and provides governance to all other layers. It describes:
|
|
31
31
|
|
|
32
32
|
- **WHY** - The reasons and drivers behind architectural decisions
|
|
33
33
|
- **WHO** - Stakeholders with interests in the outcome
|
|
@@ -115,7 +115,7 @@ This layer uses **ArchiMate 3.2 Motivation Layer** standard without custom exten
|
|
|
115
115
|
| **Layer 4 (Application)** | ApplicationService supports Goals, delivers Value, governed by Principles; ApplicationFunction fulfills Requirements |
|
|
116
116
|
| **Layer 5 (Technology)** | TechnologyService supports Goals, governed by Principles; Node fulfills Requirements, constrained by Constraints |
|
|
117
117
|
| **Layer 6 (API)** | Operation supports Goals (x-supports-goals), fulfills Requirements, governed by Principles, constrained by Constraints |
|
|
118
|
-
| **Layer 7-
|
|
118
|
+
| **Layer 7-13** | All layers can reference Principles, Constraints, Requirements, Goals for governance and traceability |
|
|
119
119
|
|
|
120
120
|
**Design Pattern:** Lower layers "look up" to the Motivation layer to justify WHY they exist and WHAT value they deliver.
|
|
121
121
|
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: LAYER_03_PRODUCT
|
|
3
|
+
description: Expert knowledge for Product Layer modeling in Documentation Robotics
|
|
4
|
+
triggers:
|
|
5
|
+
[
|
|
6
|
+
"product",
|
|
7
|
+
"feature",
|
|
8
|
+
"persona",
|
|
9
|
+
"capability",
|
|
10
|
+
"milestone",
|
|
11
|
+
"user workflow",
|
|
12
|
+
"product roadmap",
|
|
13
|
+
"product planning",
|
|
14
|
+
"product management"
|
|
15
|
+
]
|
|
16
|
+
version: 0.8.4
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Product Layer Skill
|
|
20
|
+
|
|
21
|
+
**Layer Number:** 03
|
|
22
|
+
**Specification:** Metadata Model Spec v0.8.4
|
|
23
|
+
**Purpose:** Defines product personas, capabilities, features, user workflows, and milestones that represent what the product does and for whom.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Layer Overview
|
|
28
|
+
|
|
29
|
+
The Product Layer captures the **product management dimension** of architecture:
|
|
30
|
+
|
|
31
|
+
- **WHO** - Personas and target user archetypes
|
|
32
|
+
- **WHAT** - Capabilities and features the product delivers
|
|
33
|
+
- **HOW** - User workflows describing how users accomplish goals
|
|
34
|
+
- **WHEN** - Milestones representing delivery roadmap
|
|
35
|
+
- **WHY** - Linkage to business goals and requirements
|
|
36
|
+
|
|
37
|
+
This layer uses a **custom specification** designed for product planning, prioritization, and user-centric modeling — distinct from Business layer (organization-internal processes) and UX layer (UI/interface design).
|
|
38
|
+
|
|
39
|
+
**Key Innovation:** Bridges strategic intent (Motivation layer) and organizational structure (Business layer) with externally-facing product value planning and delivery.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Entity Types
|
|
44
|
+
|
|
45
|
+
> **CLI Introspection:** Run `dr schema types product` for the authoritative, always-current list of node types.
|
|
46
|
+
> Run `dr schema node <type-id>` for full attribute details on any type.
|
|
47
|
+
|
|
48
|
+
| Entity Type | Description | Key Attributes |
|
|
49
|
+
| ---------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
50
|
+
| **Persona** | User archetype with shared goals, behaviors, pain points | category (primary, secondary, served, negative), proficiency (novice, intermediate, advanced, expert) |
|
|
51
|
+
| **Capability** | Product ability independent of implementation | status (proposed, planned, developing, delivered, deprecated), properties |
|
|
52
|
+
| **Feature** | User-visible unit of functionality delivering capabilities | priority (critical, high, medium, low, informational), status, size (xs, s, m, l, xl) |
|
|
53
|
+
| **UserWorkflow** | Sequence of user-facing steps to accomplish a goal | complexity (simple, moderate, complex), properties |
|
|
54
|
+
| **Milestone** | Time-bound delivery target grouping features/capabilities | status (proposed, planned, active, completed, cancelled) |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Intra-Layer Relationships
|
|
59
|
+
|
|
60
|
+
The Product layer models product structure and planning via these core relationships:
|
|
61
|
+
|
|
62
|
+
| Source | Predicate | Destination | Cardinality | Rationale |
|
|
63
|
+
| ---------------------- | --------------- | -------------------- | ------------ | ---------------------------------------------- |
|
|
64
|
+
| `product.capability` | `aggregates` | `product.capability` | many-to-many | Capability decomposition into sub-capabilities |
|
|
65
|
+
| `product.feature` | `realizes` | `product.capability` | many-to-many | Feature delivers a capability |
|
|
66
|
+
| `product.feature` | `serves` | `product.persona` | many-to-many | Feature targets a persona |
|
|
67
|
+
| `product.feature` | `scheduled-for` | `product.milestone` | many-to-many | Feature assigned to delivery milestone |
|
|
68
|
+
| `product.capability` | `scheduled-for` | `product.milestone` | many-to-many | Capability assigned to milestone |
|
|
69
|
+
| `product.userworkflow` | `serves` | `product.persona` | many-to-many | Workflow designed for a persona |
|
|
70
|
+
| `product.userworkflow` | `composes` | `product.feature` | many-to-many | Workflow composed of features |
|
|
71
|
+
| `product.milestone` | `precedes` | `product.milestone` | many-to-many | Milestone sequencing |
|
|
72
|
+
| `product.feature` | `depends-on` | `product.feature` | many-to-many | Feature dependency |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Cross-Layer References
|
|
77
|
+
|
|
78
|
+
### Outgoing References (Product → Motivation)
|
|
79
|
+
|
|
80
|
+
Product layer references Motivation layer to justify product decisions with strategic goals:
|
|
81
|
+
|
|
82
|
+
| Predicate | Source | Target | Rationale |
|
|
83
|
+
| ---------------- | ------------ | ----------- | -------------------------------------------- |
|
|
84
|
+
| `realizes` | Persona | Stakeholder | Persona concretizes stakeholder archetypes |
|
|
85
|
+
| `satisfies` | Feature | Requirement | Feature satisfies business/user requirements |
|
|
86
|
+
| `supports` | Capability | Goal | Capability supports strategic goals |
|
|
87
|
+
| `delivers` | UserWorkflow | Outcome | Workflow delivers business outcomes |
|
|
88
|
+
| `delivers-value` | Feature | Value | Feature delivers business value |
|
|
89
|
+
| `fulfills` | Capability | Requirement | Capability fulfills requirements |
|
|
90
|
+
|
|
91
|
+
### Outgoing References (Product → Business)
|
|
92
|
+
|
|
93
|
+
Product layer references Business layer to align with organizational services and roles:
|
|
94
|
+
|
|
95
|
+
| Predicate | Source | Target | Rationale |
|
|
96
|
+
| ------------ | ------------ | ---------------- | --------------------------------------- |
|
|
97
|
+
| `realizes` | Feature | BusinessService | Feature realizes a business service |
|
|
98
|
+
| `aggregates` | UserWorkflow | BusinessProcess | Workflow aggregates business processes |
|
|
99
|
+
| `realizes` | Capability | BusinessFunction | Capability realizes a business function |
|
|
100
|
+
| `serves` | Persona | BusinessRole | Persona is served by a business role |
|
|
101
|
+
|
|
102
|
+
### Incoming References (Lower Layers → Product)
|
|
103
|
+
|
|
104
|
+
Higher layers (Security through Testing) reference Product layer for feature-level concerns:
|
|
105
|
+
|
|
106
|
+
- Application → Feature: Application components implement features
|
|
107
|
+
- UX → Feature: UI views render features
|
|
108
|
+
- Testing → Feature: Test cases validate features
|
|
109
|
+
- API → Feature: API operations expose features
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Persona Definition
|
|
114
|
+
|
|
115
|
+
A Persona is a **user archetype** representing a class of users with shared goals, behaviors, and pain points.
|
|
116
|
+
|
|
117
|
+
**Distinction from Stakeholder (Motivation layer):**
|
|
118
|
+
|
|
119
|
+
- **Stakeholder** - Organizational relationship (internal/external/regulatory/customer)
|
|
120
|
+
- **Persona** - Behavioral archetype with usage patterns and proficiency levels
|
|
121
|
+
|
|
122
|
+
**Categories:**
|
|
123
|
+
|
|
124
|
+
- **Primary** - Core user the product is designed for
|
|
125
|
+
- **Secondary** - Important but not primary user
|
|
126
|
+
- **Served** - User who benefits indirectly
|
|
127
|
+
- **Negative** - User archetype the product explicitly doesn't serve
|
|
128
|
+
|
|
129
|
+
**Proficiency Levels:**
|
|
130
|
+
|
|
131
|
+
- **Novice** - First-time users, minimal technical background
|
|
132
|
+
- **Intermediate** - Recurring users with some experience
|
|
133
|
+
- **Advanced** - Power users with domain expertise
|
|
134
|
+
- **Expert** - Specialists who push product limits
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Capability Definition
|
|
139
|
+
|
|
140
|
+
A Capability is an **ability the product possesses**, independent of how it's implemented.
|
|
141
|
+
|
|
142
|
+
**Distinction from BusinessFunction (Business layer):**
|
|
143
|
+
|
|
144
|
+
- **BusinessFunction** - Internal organizational grouping of behavior
|
|
145
|
+
- **Capability** - Externally-facing product ability
|
|
146
|
+
|
|
147
|
+
**Lifecycle Statuses:**
|
|
148
|
+
|
|
149
|
+
- **Proposed** - Idea under evaluation
|
|
150
|
+
- **Planned** - Scheduled for development
|
|
151
|
+
- **Developing** - Currently being built
|
|
152
|
+
- **Delivered** - Implemented and released
|
|
153
|
+
- **Deprecated** - No longer supported
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Feature Definition
|
|
158
|
+
|
|
159
|
+
A Feature is a **user-visible unit of functionality** that delivers one or more capabilities and is the primary unit of product planning.
|
|
160
|
+
|
|
161
|
+
**Distinction from Requirement (Motivation layer):**
|
|
162
|
+
|
|
163
|
+
- **Requirement** - What system _must_ do (functional/non-functional/regulatory)
|
|
164
|
+
- **Feature** - Planned unit of value with prioritization, sizing, and lifecycle
|
|
165
|
+
|
|
166
|
+
**Priority Levels:**
|
|
167
|
+
|
|
168
|
+
- **Critical** - Product cannot function without it
|
|
169
|
+
- **High** - Core functionality users expect
|
|
170
|
+
- **Medium** - Valuable enhancement
|
|
171
|
+
- **Low** - Nice-to-have optimization
|
|
172
|
+
- **Informational** - Documentation or informational
|
|
173
|
+
|
|
174
|
+
**Sizing Estimates:**
|
|
175
|
+
|
|
176
|
+
- **XS** - < 1 day of effort
|
|
177
|
+
- **S** - 1–3 days
|
|
178
|
+
- **M** - 1–2 weeks
|
|
179
|
+
- **L** - 2–4 weeks
|
|
180
|
+
- **XL** - > 4 weeks
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## User Workflow Definition
|
|
185
|
+
|
|
186
|
+
A UserWorkflow is a **sequence of user-facing steps** through the product to accomplish a goal.
|
|
187
|
+
|
|
188
|
+
**Complexity Assessment:**
|
|
189
|
+
|
|
190
|
+
- **Simple** - Linear flow, 2–3 steps, minimal decision points
|
|
191
|
+
- **Moderate** - Multiple branches, 5–10 steps, some conditional logic
|
|
192
|
+
- **Complex** - Many decision points, 10+ steps, cross-system integration
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Milestone Definition
|
|
197
|
+
|
|
198
|
+
A Milestone is a **time-bound delivery target** grouping features or capabilities.
|
|
199
|
+
|
|
200
|
+
**Lifecycle Statuses:**
|
|
201
|
+
|
|
202
|
+
- **Proposed** - Candidate milestone under evaluation
|
|
203
|
+
- **Planned** - Scheduled for planning and estimation
|
|
204
|
+
- **Active** - Development underway
|
|
205
|
+
- **Completed** - Released to users
|
|
206
|
+
- **Cancelled** - Postponed or deprioritized
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Best Practices
|
|
211
|
+
|
|
212
|
+
1. **Start with Personas, End with Workflows** - Understand users first, model journeys last
|
|
213
|
+
2. **Features Deliver Capabilities** - Every feature should map to at least one capability
|
|
214
|
+
3. **Capabilities Support Goals** - Link capabilities to motivation layer goals for justification
|
|
215
|
+
4. **Milestones Sequence Logically** - Plan dependencies and prerequisites
|
|
216
|
+
5. **Workflows are User-Centric** - Name them from the user's perspective
|
|
217
|
+
6. **Prioritization Reflects Business Value** - Higher priority features deliver more strategic value
|
|
218
|
+
7. **Link to Business Layer** - Map features to business services to show value realization
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Quick Reference
|
|
223
|
+
|
|
224
|
+
**Add Commands:**
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
dr add product persona <name>
|
|
228
|
+
dr add product capability <name>
|
|
229
|
+
dr add product feature <name>
|
|
230
|
+
dr add product user-workflow <name>
|
|
231
|
+
dr add product milestone <name>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Relationship Commands:**
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
dr relationship add <source> <destination> --predicate <predicate>
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
**Available Predicates:**
|
|
241
|
+
|
|
242
|
+
- `aggregates` - Capability decomposes into sub-capability
|
|
243
|
+
- `realizes` - Feature/Capability realizes capability/service/function
|
|
244
|
+
- `serves` - Feature/Workflow/Persona serves persona/role
|
|
245
|
+
- `scheduled-for` - Feature/Capability scheduled for milestone
|
|
246
|
+
- `composes` - Workflow composed of features
|
|
247
|
+
- `depends-on` - Feature depends on feature
|
|
248
|
+
- `precedes` - Milestone precedes milestone
|
|
249
|
+
- `satisfies` - Feature satisfies requirement
|
|
250
|
+
- `supports` - Capability supports goal
|
|
251
|
+
- `delivers` - Workflow delivers outcome
|
|
252
|
+
- `delivers-value` - Feature delivers value
|
|
253
|
+
- `fulfills` - Capability fulfills requirement
|
|
@@ -16,7 +16,7 @@ class ModelReportOrchestrator {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Regenerate reports for a specific set of affected layers.
|
|
19
|
-
* On first invocation or when reports don't exist, regenerates all
|
|
19
|
+
* On first invocation or when reports don't exist, regenerates all 13 reports.
|
|
20
20
|
* Invalid layer names in the affected set are skipped with a warning.
|
|
21
21
|
*/
|
|
22
22
|
async regenerate(affectedLayers) {
|
|
@@ -31,7 +31,7 @@ class ModelReportOrchestrator {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Regenerate all
|
|
34
|
+
* Regenerate all 13 layer reports.
|
|
35
35
|
* Lets mkdir errors propagate so callers can handle them with proper telemetry.
|
|
36
36
|
*/
|
|
37
37
|
async regenerateAll() {
|
|
@@ -54,7 +54,7 @@ class ModelReportOrchestrator {
|
|
|
54
54
|
return affected;
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
|
-
* Check if all
|
|
57
|
+
* Check if all 13 report files exist and are initialized.
|
|
58
58
|
* Returns false only if files don't exist (ENOENT); propagates other errors like EACCES, EMFILE, EIO.
|
|
59
59
|
*/
|
|
60
60
|
async isInitialized() {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/reports/model-report-orchestrator.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Model Report Orchestrator\n *\n * Coordinates report generation across all
|
|
4
|
+
"sourcesContent": ["/**\n * Model Report Orchestrator\n *\n * Coordinates report generation across all 13 architecture layers.\n * Determines which reports need regeneration and manages the report directory.\n */\n\nimport type { Model } from '../core/model.js';\nimport { ModelReportDataCollector } from './model-report-data.js';\nimport { ModelLayerReportGenerator } from './model-layer-report-generator.js';\nimport { CANONICAL_LAYER_NAMES, type CanonicalLayerName, getLayerOrder, isValidLayerName } from '../core/layers.js';\nimport { getErrorMessage } from '../utils/errors.js';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\nexport class ModelReportOrchestrator {\n private collector: ModelReportDataCollector;\n private generator: ModelLayerReportGenerator;\n\n constructor(private model: Model, private rootPath: string) {\n this.collector = new ModelReportDataCollector();\n const modelVersion = model.manifest.version || 'unknown';\n const generatedAt = new Date().toISOString();\n this.generator = new ModelLayerReportGenerator(modelVersion, generatedAt);\n }\n\n /**\n * Regenerate reports for a specific set of affected layers.\n * On first invocation or when reports don't exist, regenerates all 13 reports.\n * Invalid layer names in the affected set are skipped with a warning.\n */\n async regenerate(affectedLayers: Set<string>): Promise<void> {\n if (!(await this.isInitialized())) {\n return this.regenerateAll();\n }\n\n for (const layerName of affectedLayers) {\n // Type predicate narrows layerName to CanonicalLayerName automatically\n if (!isValidLayerName(layerName)) {\n console.warn(`Skipping invalid layer name: ${layerName}`);\n continue;\n }\n await this.generateLayerReport(layerName);\n }\n }\n\n /**\n * Regenerate all 13 layer reports.\n * Lets mkdir errors propagate so callers can handle them with proper telemetry.\n */\n async regenerateAll(): Promise<void> {\n // Ensure report directory exists\n const reportDir = this.getReportDir();\n await fs.mkdir(reportDir, { recursive: true });\n\n // Generate all 13 layer reports\n for (const layerName of CANONICAL_LAYER_NAMES) {\n await this.generateLayerReport(layerName);\n }\n }\n\n /**\n * Compute the set of layers affected by a change to a primary layer.\n * Returns the primary layer plus any layers that have cross-layer relationships with it.\n * Throws if the primary layer is not a recognized canonical layer name.\n */\n computeAffectedLayers(primaryLayer: CanonicalLayerName): Set<CanonicalLayerName> {\n // Defense-in-depth: validate despite type signature (guards against as casts from callers)\n if (!isValidLayerName(primaryLayer)) {\n throw new Error(\n `Invalid primary layer name: '${primaryLayer}' is not a recognized canonical layer. ` +\n `Valid layers are: ${CANONICAL_LAYER_NAMES.join(', ')}`\n );\n }\n\n const affected = new Set<CanonicalLayerName>([primaryLayer]);\n\n for (const rel of this.model.relationships.getAll()) {\n // Outbound: this layer references another layer\n if (rel.layer === primaryLayer && rel.targetLayer) {\n // Validate layer name before casting (defensive: guards against user-editable YAML with invalid layer names)\n if (isValidLayerName(rel.targetLayer)) {\n affected.add(rel.targetLayer);\n }\n }\n // Inbound: another layer references this layer\n if (rel.targetLayer === primaryLayer) {\n // Validate layer name before casting (defensive: guards against user-editable YAML with invalid layer names)\n if (isValidLayerName(rel.layer)) {\n affected.add(rel.layer);\n }\n }\n }\n\n return affected;\n }\n\n /**\n * Check if all 13 report files exist and are initialized.\n * Returns false only if files don't exist (ENOENT); propagates other errors like EACCES, EMFILE, EIO.\n */\n private async isInitialized(): Promise<boolean> {\n for (const layerName of CANONICAL_LAYER_NAMES) {\n try {\n await fs.access(this.getReportFilePath(layerName));\n } catch (error: unknown) {\n const err = error as NodeJS.ErrnoException;\n // Only ENOENT (file not found) should return false; other errors propagate\n if (err.code === 'ENOENT') {\n return false;\n }\n // Re-throw permission errors, I/O errors, etc.\n throw error;\n }\n }\n return true;\n }\n\n /**\n * Get the reports directory path.\n */\n private getReportDir(): string {\n return path.join(this.rootPath, 'documentation-robotics', 'reports');\n }\n\n /**\n * Get the full file path for a layer report.\n */\n private getReportFilePath(layerName: CanonicalLayerName): string {\n const layerNumber = getLayerOrder(layerName);\n const paddedNumber = String(layerNumber).padStart(2, '0');\n const filename = `${paddedNumber}-${layerName}-layer-report.md`;\n return path.join(this.getReportDir(), filename);\n }\n\n /**\n * Generate and write a single layer report.\n * Separates concerns to distinguish programming bugs from I/O errors.\n * Lets generation and write errors propagate so callers can handle them with proper telemetry.\n */\n private async generateLayerReport(layerName: CanonicalLayerName): Promise<void> {\n let data;\n let markdown;\n\n try {\n // Collect layer data (may throw if programming bug or model is corrupted)\n data = this.collector.collectLayerData(this.model, layerName);\n\n // Generate markdown report (may throw if programming bug)\n markdown = this.generator.generate(data);\n } catch (error) {\n throw new Error(\n `Failed to generate report content for layer: ${layerName} (programming error or corrupted model) - ${getErrorMessage(error)}`\n );\n }\n\n // Write to file (may throw for I/O errors like ENOSPC, EACCES, EIO)\n // Let write errors propagate so callers can handle them with proper telemetry\n const filePath = this.getReportFilePath(layerName);\n await fs.writeFile(filePath, markdown, 'utf-8');\n }\n}\n"],
|
|
5
5
|
"mappings": "AAQA,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,uBAAgD,eAAe,wBAAwB;AAChG,SAAS,uBAAuB;AAChC,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEhB,MAAO,wBAAuB;EAId;EAAsB;EAHlC;EACA;EAER,YAAoB,OAAsB,UAAgB;AAAtC,SAAA,QAAA,OAAsB,KAAA,WAAA,UACxC,KAAK,YAAY,IAAI,yBAAwB;AAC7C,UAAM,eAAe,MAAM,SAAS,WAAW,WACzC,eAAc,oBAAI,KAAI,GAAG,YAAW;AAC1C,SAAK,YAAY,IAAI,0BAA0B,cAAc,WAAW;EAC1E;;;;;;EAOA,MAAM,WAAW,gBAA2B;AAC1C,QAAI,CAAE,MAAM,KAAK,cAAa;AAC5B,aAAO,KAAK,cAAa;AAG3B,eAAW,aAAa,gBAAgB;AAEtC,UAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,gBAAQ,KAAK,gCAAgC,SAAS,EAAE;AACxD;MACF;AACA,YAAM,KAAK,oBAAoB,SAAS;IAC1C;EACF;;;;;EAMA,MAAM,gBAAa;AAEjB,UAAM,YAAY,KAAK,aAAY;AACnC,UAAM,GAAG,MAAM,WAAW,EAAE,WAAW,GAAI,CAAE;AAG7C,eAAW,aAAa;AACtB,YAAM,KAAK,oBAAoB,SAAS;EAE5C;;;;;;EAOA,sBAAsB,cAAgC;AAEpD,QAAI,CAAC,iBAAiB,YAAY;AAChC,YAAM,IAAI,MACR,gCAAgC,YAAY,4DACvB,sBAAsB,KAAK,IAAI,CAAC,EAAE;AAI3D,UAAM,WAAW,oBAAI,IAAwB,CAAC,YAAY,CAAC;AAE3D,eAAW,OAAO,KAAK,MAAM,cAAc,OAAM;AAE/C,MAAI,IAAI,UAAU,gBAAgB,IAAI,eAEhC,iBAAiB,IAAI,WAAW,KAClC,SAAS,IAAI,IAAI,WAAW,GAI5B,IAAI,gBAAgB,gBAElB,iBAAiB,IAAI,KAAK,KAC5B,SAAS,IAAI,IAAI,KAAK;AAK5B,WAAO;EACT;;;;;EAMQ,MAAM,gBAAa;AACzB,eAAW,aAAa;AACtB,UAAI;AACF,cAAM,GAAG,OAAO,KAAK,kBAAkB,SAAS,CAAC;MACnD,SAAS,OAAgB;AAGvB,YAFY,MAEJ,SAAS;AACf,iBAAO;AAGT,cAAM;MACR;AAEF,WAAO;EACT;;;;EAKQ,eAAY;AAClB,WAAO,KAAK,KAAK,KAAK,UAAU,0BAA0B,SAAS;EACrE;;;;EAKQ,kBAAkB,WAA6B;AACrD,UAAM,cAAc,cAAc,SAAS,GAErC,WAAW,GADI,OAAO,WAAW,EAAE,SAAS,GAAG,GAAG,CACxB,IAAI,SAAS;AAC7C,WAAO,KAAK,KAAK,KAAK,aAAY,GAAI,QAAQ;EAChD;;;;;;EAOQ,MAAM,oBAAoB,WAA6B;AAC7D,QAAI,MACA;AAEJ,QAAI;AAEF,aAAO,KAAK,UAAU,iBAAiB,KAAK,OAAO,SAAS,GAG5D,WAAW,KAAK,UAAU,SAAS,IAAI;IACzC,SAAS,OAAO;AACd,YAAM,IAAI,MACR,gDAAgD,SAAS,6CAA6C,gBAAgB,KAAK,CAAC,EAAE;IAElI;AAIA,UAAM,WAAW,KAAK,kBAAkB,SAAS;AACjD,UAAM,GAAG,UAAU,UAAU,UAAU,OAAO;EAChD;;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "api",
|
|
5
|
-
"number":
|
|
5
|
+
"number": 7,
|
|
6
6
|
"name": "API Layer",
|
|
7
|
-
"description": "Layer
|
|
7
|
+
"description": "Layer 7: API Layer",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "OpenAPI 3.0",
|
|
10
10
|
"version": "3.0",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "apm",
|
|
5
|
-
"number":
|
|
5
|
+
"number": 12,
|
|
6
6
|
"name": "APM Observability Layer",
|
|
7
|
-
"description": "Layer
|
|
7
|
+
"description": "Layer 12: APM Observability Layer",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "OpenTelemetry",
|
|
10
10
|
"version": "1.0",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "application",
|
|
5
|
-
"number":
|
|
5
|
+
"number": 5,
|
|
6
6
|
"name": "Application Layer",
|
|
7
|
-
"description": "Layer
|
|
7
|
+
"description": "Layer 5: Application Layer",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "ArchiMate 3.2",
|
|
10
10
|
"version": "3.2",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"schemas": {
|
|
4
4
|
"spec-node": {
|
|
5
5
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
@@ -596,6 +596,7 @@
|
|
|
596
596
|
"optimizes",
|
|
597
597
|
"owns",
|
|
598
598
|
"performs",
|
|
599
|
+
"precedes",
|
|
599
600
|
"protects",
|
|
600
601
|
"provides",
|
|
601
602
|
"realizes",
|
|
@@ -606,6 +607,7 @@
|
|
|
606
607
|
"requires",
|
|
607
608
|
"resolves-with",
|
|
608
609
|
"satisfies",
|
|
610
|
+
"scheduled-for",
|
|
609
611
|
"serves",
|
|
610
612
|
"specializes",
|
|
611
613
|
"supports",
|
|
@@ -1617,6 +1619,32 @@
|
|
|
1617
1619
|
"symmetry": false,
|
|
1618
1620
|
"reflexivity": false
|
|
1619
1621
|
}
|
|
1622
|
+
},
|
|
1623
|
+
"scheduled-for": {
|
|
1624
|
+
"predicate": "scheduled-for",
|
|
1625
|
+
"inverse": "schedules",
|
|
1626
|
+
"category": "structural",
|
|
1627
|
+
"description": "Element is assigned to a time-bound delivery target",
|
|
1628
|
+
"archimate_alignment": null,
|
|
1629
|
+
"semantics": {
|
|
1630
|
+
"directionality": "bidirectional",
|
|
1631
|
+
"transitivity": false,
|
|
1632
|
+
"symmetry": false,
|
|
1633
|
+
"reflexivity": false
|
|
1634
|
+
}
|
|
1635
|
+
},
|
|
1636
|
+
"precedes": {
|
|
1637
|
+
"predicate": "precedes",
|
|
1638
|
+
"inverse": "follows",
|
|
1639
|
+
"category": "behavioral",
|
|
1640
|
+
"description": "Element comes before another in a temporal sequence",
|
|
1641
|
+
"archimate_alignment": null,
|
|
1642
|
+
"semantics": {
|
|
1643
|
+
"directionality": "bidirectional",
|
|
1644
|
+
"transitivity": true,
|
|
1645
|
+
"symmetry": false,
|
|
1646
|
+
"reflexivity": false
|
|
1647
|
+
}
|
|
1620
1648
|
}
|
|
1621
1649
|
}
|
|
1622
1650
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "data-model",
|
|
5
|
-
"number":
|
|
5
|
+
"number": 8,
|
|
6
6
|
"name": "Data Model Layer",
|
|
7
|
-
"description": "Layer
|
|
7
|
+
"description": "Layer 8: Data Model Layer",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "JSON Schema Draft 7",
|
|
10
10
|
"version": "Draft 7",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"specVersion": "0.
|
|
2
|
+
"specVersion": "0.9.0",
|
|
3
3
|
"layer": {
|
|
4
4
|
"id": "data-store",
|
|
5
|
-
"number":
|
|
5
|
+
"number": 9,
|
|
6
6
|
"name": "Data Store Layer",
|
|
7
|
-
"description": "Layer
|
|
7
|
+
"description": "Layer 9: Data Store Layer",
|
|
8
8
|
"inspired_by": {
|
|
9
9
|
"standard": "ISO/IEC 9075 (SQL) + Paradigm Extensions",
|
|
10
10
|
"version": "2024",
|