@precepts/standards 0.1.0
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/LICENSE +30 -0
- package/README.md +115 -0
- package/package.json +40 -0
- package/schema/document-standard-template.md +139 -0
- package/schema/standards.schema.json +154 -0
- package/standards/integration/governance/_category_.json +1 -0
- package/standards/integration/governance/integration-styles.md +56 -0
- package/standards/integration/index.md +9 -0
- package/standards/integration/standards/_category_.json +1 -0
- package/standards/integration/standards/api/_category_.json +1 -0
- package/standards/integration/standards/api/error-handling.md +250 -0
- package/standards/integration/standards/api/resource-design.md +286 -0
- package/standards/integration/standards/data-formats/_category_.json +1 -0
- package/standards/integration/standards/data-formats/character-encoding.md +206 -0
- package/standards/integration/standards/data-formats/date-format.md +102 -0
- package/standards/integration/standards/data-formats/datetime-formats.md +265 -0
- package/standards/integration/standards/data-formats/monetary-format.md +61 -0
- package/standards/integration/standards/events/_category_.json +1 -0
- package/standards/integration/standards/events/event-envelope.md +270 -0
- package/standards/integration/standards/foundational/_category_.json +1 -0
- package/standards/integration/standards/foundational/naming-conventions.md +334 -0
- package/standards/integration/standards/observability/_category_.json +1 -0
- package/standards/integration/standards/observability/integration-observability.md +226 -0
- package/standards/integration/standards/resilience/_category_.json +1 -0
- package/standards/integration/standards/resilience/integration-resilience-patterns.md +291 -0
- package/standards/integration/standards/resilience/retry-policy.md +268 -0
- package/standards/integration/standards/resilience/timeout.md +269 -0
- package/standards/integration/standards/versioning/_category_.json +1 -0
- package/standards/integration/standards/versioning/backward-forward-compatibility.md +230 -0
- package/standards/product/Guidelines/_category_.json +1 -0
- package/standards/product/Guidelines/requirement-document.md +54 -0
- package/standards/product/index.md +9 -0
- package/standards/project-management/index.md +9 -0
- package/standards/ux/index.md +9 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
identifier: "INTG-STD-005"
|
|
3
|
+
name: "Character Encoding"
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
status: "MANDATORY"
|
|
6
|
+
|
|
7
|
+
domain: "INTEGRATION"
|
|
8
|
+
documentType: "standard"
|
|
9
|
+
category: "format"
|
|
10
|
+
appliesTo: ["api", "events", "a2a", "files", "mcp", "webhooks", "grpc", "graphql", "batch", "streaming"]
|
|
11
|
+
|
|
12
|
+
lastUpdated: "2026-03-28"
|
|
13
|
+
owner: "Integration Architecture Board"
|
|
14
|
+
|
|
15
|
+
standardsCompliance:
|
|
16
|
+
iso: ["ISO-10646"]
|
|
17
|
+
rfc: ["RFC-3629", "RFC-8259", "RFC-5198", "RFC-2277"]
|
|
18
|
+
w3c: ["Character-Model-for-the-World-Wide-Web"]
|
|
19
|
+
other: []
|
|
20
|
+
|
|
21
|
+
taxonomy:
|
|
22
|
+
capability: "data-format"
|
|
23
|
+
subCapability: "character-encoding"
|
|
24
|
+
layer: "contract"
|
|
25
|
+
|
|
26
|
+
enforcement:
|
|
27
|
+
method: "automated"
|
|
28
|
+
validationRules:
|
|
29
|
+
encoding: "UTF-8"
|
|
30
|
+
normalization: "NFC"
|
|
31
|
+
bom: "forbidden-in-json"
|
|
32
|
+
rejectionCriteria:
|
|
33
|
+
- "Non-UTF-8 encoded payloads"
|
|
34
|
+
- "BOM in JSON payloads"
|
|
35
|
+
- "Unassigned or surrogate code points"
|
|
36
|
+
|
|
37
|
+
dependsOn: []
|
|
38
|
+
supersedes: ""
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# Character Encoding
|
|
42
|
+
|
|
43
|
+
## Purpose
|
|
44
|
+
|
|
45
|
+
This standard defines the **REQUIRED** character encoding for all text data exchanged across integration boundaries. Inconsistent encoding causes data corruption, security vulnerabilities, and integration failures. All integration surfaces **MUST** use UTF-8 with NFC normalization to guarantee round-trip fidelity and deterministic string comparison.
|
|
46
|
+
|
|
47
|
+
> *Normative language (**MUST**, **MUST NOT**, **SHOULD**, **SHOULD NOT**, **MAY**) follows RFC 2119 semantics.*
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Rules
|
|
52
|
+
|
|
53
|
+
### R-1: UTF-8 as Sole Encoding
|
|
54
|
+
|
|
55
|
+
All text data crossing integration boundaries **MUST** be encoded in UTF-8 (RFC 3629).
|
|
56
|
+
|
|
57
|
+
- UTF-16, UTF-32, ISO-8859-x, Windows-125x, Shift_JIS, and all other encodings **MUST NOT** be used at integration boundaries.
|
|
58
|
+
- Internal representations **MAY** use other encodings, but **MUST** convert to UTF-8 before crossing any boundary.
|
|
59
|
+
|
|
60
|
+
### R-2: Valid UTF-8 Sequences Only
|
|
61
|
+
|
|
62
|
+
All byte sequences **MUST** be well-formed per RFC 3629. The following **MUST** be rejected:
|
|
63
|
+
|
|
64
|
+
- Overlong encodings (e.g., `C0 80` for U+0000)
|
|
65
|
+
- Surrogate halves (U+D800 through U+DFFF)
|
|
66
|
+
- Code points beyond U+10FFFF
|
|
67
|
+
- Truncated multi-byte sequences
|
|
68
|
+
- Unexpected continuation bytes without a valid leading byte
|
|
69
|
+
|
|
70
|
+
### R-3: NFC Normalization
|
|
71
|
+
|
|
72
|
+
All text **MUST** be normalized to NFC (RFC 5198) before transmission.
|
|
73
|
+
|
|
74
|
+
- Producers **MUST** emit NFC-normalized text.
|
|
75
|
+
- Consumers **SHOULD** verify NFC normalization on input.
|
|
76
|
+
- String comparison at integration boundaries **MUST** compare NFC-normalized forms.
|
|
77
|
+
- NFKC or NFKD **MUST NOT** be applied at integration boundaries - compatibility decomposition is lossy.
|
|
78
|
+
|
|
79
|
+
### R-4: BOM (Byte Order Mark) Handling
|
|
80
|
+
|
|
81
|
+
The UTF-8 BOM (`EF BB BF`) **MUST** be handled per format:
|
|
82
|
+
|
|
83
|
+
| Format | BOM Rule | Rationale |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| JSON | **MUST NOT** be present | RFC 8259 forbids it |
|
|
86
|
+
| XML | **MAY** be present; parsers **MUST** tolerate | XML spec permits BOM |
|
|
87
|
+
| CSV | **SHOULD** be present for spreadsheet interop | Required for UTF-8 detection in common tools |
|
|
88
|
+
| Protocol Buffers / gRPC | **MUST NOT** be present | Binary framing; BOM is meaningless |
|
|
89
|
+
| GraphQL | **MUST NOT** be present | Spec treats BOM as insignificant |
|
|
90
|
+
| Plain text (logs, config) | **SHOULD NOT** be present | Breaks concatenation and Unix tools |
|
|
91
|
+
| HTTP bodies | **MUST NOT** be present in JSON/API responses | Redundant with Content-Type header |
|
|
92
|
+
|
|
93
|
+
If a BOM is encountered where forbidden, the system **MUST** strip it before processing and **MAY** log a warning.
|
|
94
|
+
|
|
95
|
+
### R-5: Encoding Declaration
|
|
96
|
+
|
|
97
|
+
The encoding **MUST** be declared through the appropriate mechanism:
|
|
98
|
+
|
|
99
|
+
| Surface | Declaration Mechanism |
|
|
100
|
+
|---|---|
|
|
101
|
+
| HTTP responses | `Content-Type` header with `charset=utf-8` |
|
|
102
|
+
| HTTP requests | `Content-Type` header **MUST** include `charset=utf-8` for text payloads |
|
|
103
|
+
| XML documents | `<?xml version="1.0" encoding="UTF-8"?>` **MUST** be present |
|
|
104
|
+
| HTML documents | `<meta charset="UTF-8">` **MUST** appear within first 1024 bytes |
|
|
105
|
+
| CSV files | UTF-8 BOM as first bytes; `text/csv; charset=utf-8` in HTTP |
|
|
106
|
+
| Event payloads | Schema registry or envelope **MUST** declare encoding |
|
|
107
|
+
| Message queues | Message metadata **MUST** declare `charset=utf-8` |
|
|
108
|
+
| gRPC / Protobuf | Implicit - `string` type is defined as UTF-8 |
|
|
109
|
+
| File transfers | Filename convention or manifest **MUST** declare encoding |
|
|
110
|
+
|
|
111
|
+
### R-6: Rejection Policy
|
|
112
|
+
|
|
113
|
+
Systems receiving data at integration boundaries **MUST** validate encoding:
|
|
114
|
+
|
|
115
|
+
- **API gateways** **MUST** reject non-UTF-8 payloads with HTTP 400 and a descriptive error.
|
|
116
|
+
- **Event consumers** **MUST** route non-UTF-8 messages to a dead-letter queue and emit an alert.
|
|
117
|
+
- **File processors** **MUST** reject non-UTF-8 files and log the detected encoding.
|
|
118
|
+
- **Batch jobs** **MUST** fail the individual record (not the entire batch) and report violations in the summary.
|
|
119
|
+
|
|
120
|
+
Systems **MUST NOT** silently replace invalid bytes with U+FFFD at integration boundaries. Replacement characters are acceptable only for internal display or logging.
|
|
121
|
+
|
|
122
|
+
### R-7: Database Storage
|
|
123
|
+
|
|
124
|
+
Integration-facing tables **MUST** use UTF-8-compatible character sets and collation. Notably, 3-byte "utf8" in MySQL **MUST NOT** be used - it cannot represent characters outside the Basic Multilingual Plane. Use the full 4-byte UTF-8 character set instead.
|
|
125
|
+
|
|
126
|
+
### R-8: Special Character Handling
|
|
127
|
+
|
|
128
|
+
| Context | Rule |
|
|
129
|
+
|---|---|
|
|
130
|
+
| JSON strings | Control characters (U+0000 - U+001F) **MUST** be escaped per RFC 8259 |
|
|
131
|
+
| XML content | Syntax-conflicting characters **MUST** use entities or CDATA; control chars other than TAB, LF, CR **MUST NOT** appear |
|
|
132
|
+
| URL parameters | Non-ASCII characters **MUST** be percent-encoded after UTF-8 encoding (RFC 3986) |
|
|
133
|
+
| SQL | Parameterized queries **MUST** be used; string concatenation with user Unicode input **MUST NOT** be used |
|
|
134
|
+
| Log output | Non-printable characters **SHOULD** be escaped using `\uXXXX` notation |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Examples
|
|
139
|
+
|
|
140
|
+
### Valid: UTF-8 JSON with Encoding Declaration
|
|
141
|
+
|
|
142
|
+
A JSON payload containing multilingual text, served with the correct Content-Type header (`application/json; charset=utf-8`). All characters are valid UTF-8, NFC-normalized, and no BOM is present.
|
|
143
|
+
|
|
144
|
+
### Invalid: Non-UTF-8 Payload
|
|
145
|
+
|
|
146
|
+
A payload containing bare `0xE9` (Latin-1 "e-acute") without valid UTF-8 continuation bytes. Rejected at the gateway with error code `INVALID_ENCODING` and the byte offset of the invalid sequence.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Enforcement Rules
|
|
151
|
+
|
|
152
|
+
| Violation | Action | Error Code |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| Non-UTF-8 encoding detected | Reject (HTTP 400 or equivalent) | `INVALID_ENCODING` |
|
|
155
|
+
| Invalid UTF-8 byte sequence | Reject (HTTP 400 or equivalent) | `INVALID_UTF8` |
|
|
156
|
+
| BOM present in JSON payload | Strip, process, and log warning | `UNEXPECTED_BOM` |
|
|
157
|
+
| Surrogate code point | Reject (HTTP 400 or equivalent) | `SURROGATE_CODEPOINT` |
|
|
158
|
+
| Non-character code point | Reject (HTTP 400 or equivalent) | `NONCHARACTER` |
|
|
159
|
+
| Forbidden control character (C0 other than TAB/LF/CR, or C1) | Reject (HTTP 400 or equivalent) | `FORBIDDEN_CONTROL` |
|
|
160
|
+
| NULL (U+0000) in JSON or XML | Reject (HTTP 400 or equivalent) | `FORBIDDEN_CONTROL` |
|
|
161
|
+
| Private-use code points without bilateral agreement | Reject or log warning | `PRIVATE_USE` |
|
|
162
|
+
| Missing encoding declaration | Log warning; assume UTF-8 | `MISSING_CHARSET` |
|
|
163
|
+
|
|
164
|
+
Enforcement **MUST** occur at the outermost integration boundary (API gateway, message broker ingress, file intake). Interior services **MAY** rely on gateway validation.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Security Considerations
|
|
169
|
+
|
|
170
|
+
| Threat | Attack Vector | Mitigation |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| Encoding injection | Overlong UTF-8 sequences bypass path/input filters (e.g., `C0 AF` encodes `/`) | R-2 eliminates overlong sequences; R-6 rejects non-UTF-8 before application logic |
|
|
173
|
+
| Normalization bypass | Visually identical strings with different byte representations bypass auth checks | R-3 mandates NFC; comparison **MUST** use normalized forms |
|
|
174
|
+
| Homoglyph spoofing | Characters from different scripts appear identical (Latin "a" vs Cyrillic "a") | Systems processing user-visible identifiers **SHOULD** apply confusable detection (UTS #39) |
|
|
175
|
+
| Null byte injection | Embedded U+0000 truncates strings in C-based systems, enabling filter bypass | Enforcement rules forbid NULL in text payloads |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## References
|
|
180
|
+
|
|
181
|
+
- [**RFC 3629**](https://www.rfc-editor.org/rfc/rfc3629) - UTF-8 (STD 63)
|
|
182
|
+
- [**RFC 8259**](https://datatracker.ietf.org/doc/html/rfc8259) - JSON Data Interchange Format
|
|
183
|
+
- [**RFC 5198**](https://www.rfc-editor.org/rfc/rfc5198) - Unicode Format for Network Interchange
|
|
184
|
+
- [**RFC 2277 / BCP 18**](https://www.rfc-editor.org/rfc/rfc2277.html) - IETF Policy on Character Sets and Languages
|
|
185
|
+
- [**RFC 3986**](https://www.rfc-editor.org/rfc/rfc3986) - URI Generic Syntax
|
|
186
|
+
- [**W3C Character Model**](https://www.w3.org/TR/charmod/) - Fundamentals
|
|
187
|
+
- [**Unicode Standard Annex #15**](https://unicode.org/reports/tr15/) - Normalization Forms
|
|
188
|
+
- [**Unicode Technical Standard #39**](https://unicode.org/reports/tr39/) - Security Mechanisms
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Rationale
|
|
193
|
+
|
|
194
|
+
**UTF-8 exclusively:** UTF-8 encodes every Unicode code point, is mandated by RFC 8259 (JSON) and BCP 18 (IETF protocols), is ASCII-compatible, self-synchronizing, and used by over 98% of web pages.
|
|
195
|
+
|
|
196
|
+
**NFC over other forms:** NFC is the most compact canonical form, preserves compatibility characters (unlike lossy NFKC/NFKD), and is recommended by both W3C and RFC 5198.
|
|
197
|
+
|
|
198
|
+
**Per-format BOM rules:** No single BOM policy fits all consumers - JSON forbids it (RFC 8259), while spreadsheet tools require it for reliable UTF-8 detection.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Version History
|
|
203
|
+
|
|
204
|
+
| Version | Date | Change |
|
|
205
|
+
| ------- | ---------- | ------------------ |
|
|
206
|
+
| 1.0.0 | 2026-03-28 | Initial definition |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
identifier: "INTG-STD-001"
|
|
3
|
+
name: "Date Format"
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
status: "MANDATORY"
|
|
6
|
+
|
|
7
|
+
domain: "INTEGRATION"
|
|
8
|
+
documentType: "standard"
|
|
9
|
+
category: "format"
|
|
10
|
+
appliesTo: ["api", "events", "a2a", "mcp"]
|
|
11
|
+
|
|
12
|
+
lastUpdated: "2026-02-16"
|
|
13
|
+
owner: "Integration Architecture Board"
|
|
14
|
+
|
|
15
|
+
standardsCompliance:
|
|
16
|
+
iso: ["ISO-8601"]
|
|
17
|
+
rfc: []
|
|
18
|
+
w3c: []
|
|
19
|
+
other: []
|
|
20
|
+
|
|
21
|
+
taxonomy:
|
|
22
|
+
capability: "data-format"
|
|
23
|
+
subCapability: "date"
|
|
24
|
+
layer: "contract"
|
|
25
|
+
|
|
26
|
+
enforcement:
|
|
27
|
+
method: "automated"
|
|
28
|
+
validationRules:
|
|
29
|
+
dateFormat: "YYYY-MM-DD"
|
|
30
|
+
regex: "^\\d{4}-\\d{2}-\\d{2}$"
|
|
31
|
+
rejectionCriteria:
|
|
32
|
+
- "Unix Epoch format"
|
|
33
|
+
- "Local timezone offsets"
|
|
34
|
+
- "Non-ISO date separators (slash, space)"
|
|
35
|
+
supportedFormats: ["ISO-8601"]
|
|
36
|
+
authoritativeModel: "ISO-8601"
|
|
37
|
+
|
|
38
|
+
dependsOn: []
|
|
39
|
+
supersedes: ""
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
# Date
|
|
43
|
+
|
|
44
|
+
## Purpose
|
|
45
|
+
|
|
46
|
+
All date values transmitted across any interface **MUST** follow the ISO-8601 format. This ensures deterministic interpretation across all systems, languages, and timezones.
|
|
47
|
+
|
|
48
|
+
## Conceptual Model
|
|
49
|
+
|
|
50
|
+
A date represents a calendar day without time-of-day or timezone information. The canonical representation is the ISO-8601 extended format: `YYYY-MM-DD`.
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
- All date fields **MUST** use the `YYYY-MM-DD` format
|
|
55
|
+
- Unix Epoch representations **MUST** be rejected
|
|
56
|
+
- Local timezone offsets **MUST NOT** be included in date-only fields
|
|
57
|
+
- Non-ISO separators (slash, space) **MUST** be rejected
|
|
58
|
+
|
|
59
|
+
## Examples
|
|
60
|
+
|
|
61
|
+
### Valid
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{ "created_at": "2026-02-16" }
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Invalid
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{ "created_at": "16-02-2026" }
|
|
71
|
+
```
|
|
72
|
+
```json
|
|
73
|
+
{ "created_at": "16/02/2026" }
|
|
74
|
+
```
|
|
75
|
+
```json
|
|
76
|
+
{ "created_at": "02-16-2026" }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Validation Rules
|
|
80
|
+
|
|
81
|
+
**Regex:** `^\d{4}-\d{2}-\d{2}$`
|
|
82
|
+
|
|
83
|
+
Validation **MUST** occur at contract boundary (API gateway, event schema registry, message broker).
|
|
84
|
+
|
|
85
|
+
## Enforcement Rules
|
|
86
|
+
|
|
87
|
+
- **Constraint:** Reject any payload using Unix Epoch or local timezone offsets.
|
|
88
|
+
- **Reference:** [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)
|
|
89
|
+
|
|
90
|
+
## References
|
|
91
|
+
|
|
92
|
+
- [**ISO-8601**](https://en.wikipedia.org/wiki/ISO_8601) - Date and time format standard
|
|
93
|
+
|
|
94
|
+
## Rationale
|
|
95
|
+
|
|
96
|
+
ISO-8601 `YYYY-MM-DD` is unambiguous across locales (unlike `DD/MM/YYYY` vs `MM/DD/YYYY`), sorts lexicographically, and is natively supported by all major programming languages and databases.
|
|
97
|
+
|
|
98
|
+
## Version History
|
|
99
|
+
|
|
100
|
+
| Version | Date | Change |
|
|
101
|
+
| ------- | ---------- | ------------------ |
|
|
102
|
+
| 1.0.0 | 2026-02-16 | Initial definition |
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
identifier: "INTG-STD-002"
|
|
3
|
+
name: "Date and Time"
|
|
4
|
+
version: "2.0.0"
|
|
5
|
+
status: "MANDATORY"
|
|
6
|
+
|
|
7
|
+
domain: "INTEGRATION"
|
|
8
|
+
documentType: "standard"
|
|
9
|
+
category: "format"
|
|
10
|
+
appliesTo: ["api", "events", "a2a", "mcp"]
|
|
11
|
+
|
|
12
|
+
lastUpdated: "2026-01-29"
|
|
13
|
+
owner: "Integration Architecture Board"
|
|
14
|
+
|
|
15
|
+
standardsCompliance:
|
|
16
|
+
iso: ["ISO-8601"]
|
|
17
|
+
rfc: ["RFC-3339", "RFC-9557"]
|
|
18
|
+
w3c: []
|
|
19
|
+
other: []
|
|
20
|
+
|
|
21
|
+
taxonomy:
|
|
22
|
+
capability: "data-format"
|
|
23
|
+
subCapability: "date-time"
|
|
24
|
+
layer: "contract"
|
|
25
|
+
|
|
26
|
+
enforcement:
|
|
27
|
+
method: "automated"
|
|
28
|
+
absolute:
|
|
29
|
+
format: "RFC3339_UTC"
|
|
30
|
+
allowOffset: false
|
|
31
|
+
allowUnixEpoch: false
|
|
32
|
+
timezoneRequired: true
|
|
33
|
+
regex: "^d{4}-d{2}-d{2}Td{2}:d{2}:d{2}(.d{1,9})?Z$"
|
|
34
|
+
scheduled:
|
|
35
|
+
zoneRequired: true
|
|
36
|
+
allowOffsetOnly: false
|
|
37
|
+
authoritativeTuple: ["local_timestamp", "zone"]
|
|
38
|
+
supportedFormats:
|
|
39
|
+
- "RFC9557"
|
|
40
|
+
- "TRIPLE_FIELD_MODEL"
|
|
41
|
+
|
|
42
|
+
classifications: ["ABSOLUTE", "SCHEDULED"]
|
|
43
|
+
dependsOn: ["INTG-STD-001"]
|
|
44
|
+
supersedes: ""
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
# Date and Time
|
|
48
|
+
|
|
49
|
+
## Purpose
|
|
50
|
+
|
|
51
|
+
This standard defines the **REQUIRED** representation of date and time values exchanged across all integration boundaries.
|
|
52
|
+
|
|
53
|
+
The objective is to,
|
|
54
|
+
|
|
55
|
+
- Deterministic interpretation
|
|
56
|
+
- Cross-platform interoperability
|
|
57
|
+
- DST and timezone resilience
|
|
58
|
+
- Machine-governable validation
|
|
59
|
+
- Long-term scheduling correctness
|
|
60
|
+
|
|
61
|
+
> *Normative language (MUST, MUST NOT, SHOULD) follows RFC 2119 semantics.*
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Classifications
|
|
66
|
+
|
|
67
|
+
There are two distinct semantic classifications of date-time representations.
|
|
68
|
+
|
|
69
|
+
| Classification| Description | Deterministic at creation time |
|
|
70
|
+
|---------------|----------------------------------------------|--------------------------------|
|
|
71
|
+
| **ABSOLUTE** | Represents a past or present instant in time | Yes |
|
|
72
|
+
| **SCHEDULED** | Represents a future planned occurrence | No (offset subject to change) |
|
|
73
|
+
|
|
74
|
+
Representation strategy depends on the applicable classification.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Rules
|
|
79
|
+
|
|
80
|
+
### ABSOLUTE Timestamp Standard
|
|
81
|
+
|
|
82
|
+
### Rules
|
|
83
|
+
|
|
84
|
+
All **ABSOLUTE** timestamps **MUST**,
|
|
85
|
+
1. Conform to RFC 3339
|
|
86
|
+
2. Be expressed in UTC
|
|
87
|
+
3. Use the literal `Z` suffix
|
|
88
|
+
4. NOT use Unix Epoch format
|
|
89
|
+
5. NOT use timezone offsets (`+01:00`)
|
|
90
|
+
6. Represent a single unambiguous instant
|
|
91
|
+
|
|
92
|
+
### Canonical Format
|
|
93
|
+
|
|
94
|
+
`YYYY-MM-DDTHH:mm:ssZ`
|
|
95
|
+
|
|
96
|
+
Optionally, fractional seconds **MAY** be allowed, with a maximum of 9 fractional digits.
|
|
97
|
+
|
|
98
|
+
`YYYY-MM-DDTHH:mm:ss.SSSZ`
|
|
99
|
+
|
|
100
|
+
### Validation Regex
|
|
101
|
+
|
|
102
|
+
`^d{4}-d{2}-d{2}Td{2}:d{2}:d{2}(.d{1,9})?Z$`
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### SCHEDULED (Future) Timestamp Standard
|
|
107
|
+
|
|
108
|
+
### Distinction
|
|
109
|
+
|
|
110
|
+
Future timestamps are not deterministic because,
|
|
111
|
+
- DST (*Daylight Saving Time*) rules may change
|
|
112
|
+
- Jurisdictions may modify timezone legislation
|
|
113
|
+
- Offsets are derived values
|
|
114
|
+
- Offset alone does not uniquely identify a timezone
|
|
115
|
+
|
|
116
|
+
→ Offsets **MUST NOT** be authoritative for future scheduled timestamps.
|
|
117
|
+
|
|
118
|
+
### Rules
|
|
119
|
+
|
|
120
|
+
If a date-time represents a **SCHEDULED** future event,
|
|
121
|
+
- An IANA (*Internet Assigned Numbers Authority*) timezone identifier (ZoneId) is **MANDATORY**
|
|
122
|
+
- Zone **MUST** take precedence over offset
|
|
123
|
+
- Offset-only representations **MUST** be rejected
|
|
124
|
+
|
|
125
|
+
### Canonical Formats
|
|
126
|
+
|
|
127
|
+
#### Timezone-Aware Systems (Preferred)
|
|
128
|
+
|
|
129
|
+
Use **RFC-9557** format
|
|
130
|
+
|
|
131
|
+
`YYYY-MM-DDTHH:mm:ss[Area/Location]`
|
|
132
|
+
|
|
133
|
+
This preserves timezone identity independent of offset.
|
|
134
|
+
|
|
135
|
+
#### Timezone-Unaware Systems (Fallback)
|
|
136
|
+
|
|
137
|
+
Use the *Triple-Field Model*
|
|
138
|
+
- `local_timestamp`: LocalDateTime without offset
|
|
139
|
+
- `zone`: Valid IANA ZoneId
|
|
140
|
+
- `utc_timestamp`: RFC-3339 canonical UTC
|
|
141
|
+
|
|
142
|
+
Here, the authoritative representation is `(local_timestamp, zone)`, while `utc_timestamp` is a derived projection.
|
|
143
|
+
|
|
144
|
+
### Interpretation Algorithm
|
|
145
|
+
|
|
146
|
+
To compute execution instant,
|
|
147
|
+
- Read `zone`
|
|
148
|
+
- Apply current **tzdb** (*Timezone DB*) rules
|
|
149
|
+
- Derive offset
|
|
150
|
+
- Compute `utc_timestamp`
|
|
151
|
+
- Execute at derived instant
|
|
152
|
+
|
|
153
|
+
**NEVER** reverse this order.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Examples
|
|
158
|
+
|
|
159
|
+
### ABSOLUTE Timestamps
|
|
160
|
+
|
|
161
|
+
#### Valid
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{ "created_at": "2026-02-16T09:30:45Z" }
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{ "created_at": "2026-02-16T09:30:45.123Z" }
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### Invalid
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{ "created_at": "1698393600" }
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```json
|
|
178
|
+
{ "created_at": "2026-02-16T10:30:45+01:00" }
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### SCHEDULED Timestamps
|
|
182
|
+
|
|
183
|
+
#### Valid
|
|
184
|
+
|
|
185
|
+
```json
|
|
186
|
+
{ "scheduled_at": "2027-12-01T11:00:00[America/New_York]" }
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"local_timestamp": "2027-12-01T11:00:00",
|
|
192
|
+
"zone": "America/New_York",
|
|
193
|
+
"utc_timestamp": "2027-12-01T16:00:00Z"
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Invalid
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{ "scheduled_at": "2027-12-01T11:00:00Z" }
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
```json
|
|
204
|
+
{ "scheduled_at": "2026-02-16T10:30:45+01:00" }
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{ "scheduled_at": "1698393600" }
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Enforcement Rules
|
|
214
|
+
|
|
215
|
+
The following payloads **MUST** be *rejected*,
|
|
216
|
+
|
|
217
|
+
For **ABSOLUTE** timestamps:
|
|
218
|
+
- Unix Epoch format
|
|
219
|
+
- Offset-based timestamps
|
|
220
|
+
- Missing timezone indicator
|
|
221
|
+
- Local timestamps without Z
|
|
222
|
+
|
|
223
|
+
For **SCHEDULED** timestamps:
|
|
224
|
+
- Missing zone
|
|
225
|
+
- Invalid IANA (*Internet Assigned Numbers Authority*) ZoneId
|
|
226
|
+
- Offset-only representation
|
|
227
|
+
- UTC timestamp inconsistent with tzdb projection
|
|
228
|
+
|
|
229
|
+
Validation **MUST** occur at contract boundary.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Rationale
|
|
234
|
+
|
|
235
|
+
This standard ensures,
|
|
236
|
+
- Deterministic event replay (event-driven systems)
|
|
237
|
+
- Cross-language interoperability
|
|
238
|
+
- Protection against DST drift
|
|
239
|
+
- Regulatory resilience
|
|
240
|
+
- AI-governable timestamp validation
|
|
241
|
+
- Future-proof scheduling semantics
|
|
242
|
+
|
|
243
|
+
UTC guarantees stability for **ABSOLUTE** time.
|
|
244
|
+
|
|
245
|
+
Zone-based representation guarantees correctness for **SCHEDULED** time.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## References
|
|
250
|
+
|
|
251
|
+
- [**ISO-8601**](https://en.wikipedia.org/wiki/ISO_8601) (Date)
|
|
252
|
+
- [**RFC-3339**](https://www.rfc-editor.org/rfc/rfc3339.html#page-4) ((Z Form))
|
|
253
|
+
- [**RFC-9557**](https://www.rfc-editor.org/rfc/rfc9557#name-internet-extended-date-time)
|
|
254
|
+
- [**TZDB**](https://www.iana.org/time-zones)
|
|
255
|
+
- Current [**TZDB Explorer**](https://nodatime.org/TimeZones), with historic versions
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Version History
|
|
260
|
+
|
|
261
|
+
| Version | Date | Change |
|
|
262
|
+
| ------- | ---------- | ------------------------------------ |
|
|
263
|
+
| 2.0.0 | 2026-02-16 | Introduced scheduled timestamp model |
|
|
264
|
+
| 1.1.0 | 2026-02-16 | Added fractional seconds |
|
|
265
|
+
| 1.0.0 | 2023-10-27 | Initial definition |
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
identifier: "INTG-STD-003"
|
|
3
|
+
name: "Money and Currency"
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
status: "DRAFT"
|
|
6
|
+
|
|
7
|
+
domain: "INTEGRATION"
|
|
8
|
+
documentType: "standard"
|
|
9
|
+
category: "format"
|
|
10
|
+
appliesTo: ["api", "events", "a2a", "files", "mcp"]
|
|
11
|
+
|
|
12
|
+
lastUpdated: "2026-02-17"
|
|
13
|
+
owner: "Integration Architecture Board"
|
|
14
|
+
|
|
15
|
+
standardsCompliance:
|
|
16
|
+
iso: ["ISO-4217"]
|
|
17
|
+
rfc: []
|
|
18
|
+
w3c: []
|
|
19
|
+
other: []
|
|
20
|
+
|
|
21
|
+
taxonomy:
|
|
22
|
+
capability: "data-format"
|
|
23
|
+
subCapability: "monetary"
|
|
24
|
+
layer: "contract"
|
|
25
|
+
|
|
26
|
+
enforcement:
|
|
27
|
+
method: "automated"
|
|
28
|
+
validationRules: {}
|
|
29
|
+
rejectionCriteria: []
|
|
30
|
+
supportedFormats: []
|
|
31
|
+
authoritativeModel: ""
|
|
32
|
+
|
|
33
|
+
dependsOn: []
|
|
34
|
+
supersedes: ""
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Money and Currency
|
|
38
|
+
|
|
39
|
+
## Purpose
|
|
40
|
+
|
|
41
|
+
## Conceptual Model
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
|
|
45
|
+
## Examples
|
|
46
|
+
|
|
47
|
+
## Allowed Representations
|
|
48
|
+
|
|
49
|
+
## Validation Rules
|
|
50
|
+
|
|
51
|
+
## Enforcement Rules
|
|
52
|
+
|
|
53
|
+
## References
|
|
54
|
+
|
|
55
|
+
## Rationale
|
|
56
|
+
|
|
57
|
+
## Version History
|
|
58
|
+
|
|
59
|
+
| Version | Date | Change |
|
|
60
|
+
| ------- | ---------- | ------------------ |
|
|
61
|
+
| 1.0.0 | 2026-02-17 | Initial definition |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"label": "Events", "position": 4}
|