@keelcore/standards 0.9.7 → 0.10.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/README.md +37 -26
- package/governance/ai/conduct.md +17 -26
- package/governance/api-management.md +91 -102
- package/governance/arb.md +55 -62
- package/governance/bash.md +117 -46
- package/governance/ci.md +165 -144
- package/governance/coding.md +89 -78
- package/governance/observability.md +77 -86
- package/governance/platform.md +81 -87
- package/governance/release-policy.md +126 -96
- package/governance/runtime.md +87 -95
- package/governance/security.md +77 -85
- package/governance/testing.md +66 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
# keelcore/standards
|
|
2
2
|
|
|
3
|
-
Engineering standards for keelcore projects. Single source of truth for coding, CI, and bash.
|
|
4
|
-
|
|
3
|
+
Engineering standards for keelcore projects. Single source of truth for coding, CI, and bash. Consumed by AI coding
|
|
4
|
+
tools (Claude, Cursor, Copilot) and human contributors alike.
|
|
5
5
|
|
|
6
6
|
## Governance
|
|
7
7
|
|
|
8
|
-
| File
|
|
9
|
-
|
|
|
10
|
-
| [governance/coding.md](governance/coding.md)
|
|
11
|
-
| [governance/ci.md](governance/ci.md)
|
|
12
|
-
| [governance/bash.md](governance/bash.md)
|
|
13
|
-
| [governance/platform.md](governance/platform.md)
|
|
14
|
-
| [governance/observability.md](governance/observability.md)
|
|
15
|
-
| [governance/security.md](governance/security.md)
|
|
16
|
-
| [governance/runtime.md](governance/runtime.md)
|
|
17
|
-
| [governance/api-management.md](governance/api-management.md) | API design, versioning, rate limiting, quotas, gateway
|
|
8
|
+
| File | Scope |
|
|
9
|
+
| ------------------------------------------------------------ | --------------------------------------------------------------------- |
|
|
10
|
+
| [governance/coding.md](governance/coding.md) | All code edits — scope control, reviewability, safety |
|
|
11
|
+
| [governance/ci.md](governance/ci.md) | CI workflows and scripts — supply chain, coverage, permissions |
|
|
12
|
+
| [governance/bash.md](governance/bash.md) | Bash scripts — portability, structure, logging |
|
|
13
|
+
| [governance/platform.md](governance/platform.md) | Platform architecture — governance process, DNS, TLS, WAF, networking |
|
|
14
|
+
| [governance/observability.md](governance/observability.md) | Metrics, logging, tracing, alerting |
|
|
15
|
+
| [governance/security.md](governance/security.md) | IAM, encryption, key management, data classification |
|
|
16
|
+
| [governance/runtime.md](governance/runtime.md) | Containers, orchestration, deployment, compliance |
|
|
17
|
+
| [governance/api-management.md](governance/api-management.md) | API design, versioning, rate limiting, quotas, gateway |
|
|
18
18
|
|
|
19
19
|
## Consumption
|
|
20
20
|
|
|
@@ -66,29 +66,40 @@ pip install keelcore-standards
|
|
|
66
66
|
|
|
67
67
|
Copy the relevant adapter to your repo and adjust paths if needed.
|
|
68
68
|
|
|
69
|
-
| Tool
|
|
70
|
-
|
|
|
71
|
-
| Claude Code
|
|
72
|
-
| Cursor
|
|
69
|
+
| Tool | Adapter |
|
|
70
|
+
| -------------- | ------------------------------------------------------------------------------------ |
|
|
71
|
+
| Claude Code | [adapters/claude/CLAUDE.md](adapters/claude/CLAUDE.md) |
|
|
72
|
+
| Cursor | [adapters/cursor/](adapters/cursor/) |
|
|
73
73
|
| GitHub Copilot | [adapters/copilot/copilot-instructions.md](adapters/copilot/copilot-instructions.md) |
|
|
74
74
|
|
|
75
|
+
## Bootstrapping a New Repository
|
|
76
|
+
|
|
77
|
+
Paste-ready prompts that drive an AI coding agent through the full standards bootstrap: submodule + governance-mandated
|
|
78
|
+
`scripts/` + canonical `Makefile` + BATS
|
|
79
|
+
|
|
80
|
+
- pre-commit. Each prompt encodes the human-in-the-loop contract (stage, do not commit).
|
|
81
|
+
|
|
82
|
+
| Agent | Prompt |
|
|
83
|
+
| ----------- | -------------------------------------------------------------------------- |
|
|
84
|
+
| Claude Code | [adapters/claude/bootstrap_prompt.md](adapters/claude/bootstrap_prompt.md) |
|
|
85
|
+
|
|
75
86
|
## Architecture Decision Records
|
|
76
87
|
|
|
77
88
|
ADRs documenting standards design decisions live in [docs/adr/](docs/adr/).
|
|
78
89
|
|
|
79
90
|
New ADRs use the template at [docs/adr/0000-template.md](docs/adr/0000-template.md).
|
|
80
91
|
|
|
81
|
-
| ADR
|
|
82
|
-
|
|
|
92
|
+
| ADR | Decision |
|
|
93
|
+
| ----------------------------------------------------------- | ------------------------------------------------------------ |
|
|
83
94
|
| [0001](docs/adr/0001-standards-as-submodule-and-package.md) | Standards distributed as both submodule and language package |
|
|
84
|
-
| [0002](docs/adr/0002-coverage-baseline-in-repo.md)
|
|
85
|
-
| [0003](docs/adr/0003-architecture-governance-process.md)
|
|
86
|
-
| [0004](docs/adr/0004-workload-identity-spiffe-spire.md)
|
|
87
|
-
| [0005](docs/adr/0005-observability-opentelemetry.md)
|
|
88
|
-
| [0006](docs/adr/0006-opa-centralized-policy-engine.md)
|
|
89
|
-
| [0007](docs/adr/0007-zero-downtime-deployment.md)
|
|
90
|
-
| [0008](docs/adr/0008-rapid-key-rotation.md)
|
|
91
|
-
| [0009](docs/adr/0009-gitops-change-management.md)
|
|
95
|
+
| [0002](docs/adr/0002-coverage-baseline-in-repo.md) | Code coverage baseline stored in repository |
|
|
96
|
+
| [0003](docs/adr/0003-architecture-governance-process.md) | Architecture governance via DACI, RFC, and ARB |
|
|
97
|
+
| [0004](docs/adr/0004-workload-identity-spiffe-spire.md) | SPIFFE/SPIRE for workload identity |
|
|
98
|
+
| [0005](docs/adr/0005-observability-opentelemetry.md) | OpenTelemetry as the unified observability framework |
|
|
99
|
+
| [0006](docs/adr/0006-opa-centralized-policy-engine.md) | OPA as the centralized authorization policy engine |
|
|
100
|
+
| [0007](docs/adr/0007-zero-downtime-deployment.md) | Zero-downtime deployment via blue/green and canary |
|
|
101
|
+
| [0008](docs/adr/0008-rapid-key-rotation.md) | Rapid key rotation with a 5-minute platform SLA |
|
|
102
|
+
| [0009](docs/adr/0009-gitops-change-management.md) | GitOps as the declarative change management mechanism |
|
|
92
103
|
|
|
93
104
|
## Versioning
|
|
94
105
|
|
package/governance/ai/conduct.md
CHANGED
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
# AI Model Conduct Standards
|
|
2
2
|
|
|
3
|
-
These rules govern the behavior of AI coding assistants (Claude, Copilot, Cursor, or equivalent)
|
|
4
|
-
|
|
5
|
-
any model-default behavior.
|
|
3
|
+
These rules govern the behavior of AI coding assistants (Claude, Copilot, Cursor, or equivalent) when working in
|
|
4
|
+
projects under this governance. They are non-negotiable and take precedence over any model-default behavior.
|
|
6
5
|
|
|
7
|
-
**Maturity:** Required
|
|
8
|
-
**Version:** 1.0.0
|
|
9
|
-
**Last Reviewed:** 2026-03-14
|
|
6
|
+
**Maturity:** Required **Version:** 1.0.0 **Last Reviewed:** 2026-03-14
|
|
10
7
|
|
|
11
8
|
## Commit Attribution
|
|
12
9
|
|
|
13
10
|
- Do NOT add `Co-Authored-By`, `Generated-by`, or any AI attribution trailer to commit messages.
|
|
14
|
-
- Commit messages contain only the subject, optional body, and the required DCO `Signed-off-by`
|
|
15
|
-
trailer. No AI branding.
|
|
11
|
+
- Commit messages contain only the subject, optional body, and the required DCO `Signed-off-by` trailer. No AI branding.
|
|
16
12
|
|
|
17
13
|
## Test File Protection
|
|
18
14
|
|
|
19
15
|
- Do NOT modify test files without explicit prior authorization from the developer.
|
|
20
|
-
- When a test fails, find and fix the root cause in production code. Do not adjust the test to
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
require explicit approval in the conversation before any edit is made.
|
|
16
|
+
- When a test fails, find and fix the root cause in production code. Do not adjust the test to make it pass.
|
|
17
|
+
- Exceptions (adding a new test, fixing a test bug, tracking an intentional contract change) require explicit approval
|
|
18
|
+
in the conversation before any edit is made.
|
|
24
19
|
|
|
25
20
|
## Test Suite Execution
|
|
26
21
|
|
|
27
22
|
- Run `make test` (or `make unit-test` at minimum) before declaring any code change complete.
|
|
28
23
|
- Do not hand off code without verifying the test suite passes.
|
|
29
|
-
- If tests cannot be run (environment constraint), state this explicitly and enumerate what was
|
|
30
|
-
not validated.
|
|
24
|
+
- If tests cannot be run (environment constraint), state this explicitly and enumerate what was not validated.
|
|
31
25
|
|
|
32
26
|
## Entry Point Files Are Pinned
|
|
33
27
|
|
|
34
|
-
- `main.go` (and any program entry point file) is pinned — do not edit it without explicit
|
|
35
|
-
|
|
36
|
-
- Entry points are considered high-blast-radius: a silent change to `main` can alter startup
|
|
37
|
-
|
|
28
|
+
- `main.go` (and any program entry point file) is pinned — do not edit it without explicit developer consent in the
|
|
29
|
+
current conversation.
|
|
30
|
+
- Entry points are considered high-blast-radius: a silent change to `main` can alter startup behavior, flag defaults, or
|
|
31
|
+
initialization order in ways that are hard to review.
|
|
38
32
|
|
|
39
33
|
## Bash Script Delivery
|
|
40
34
|
|
|
@@ -44,16 +38,14 @@ any model-default behavior.
|
|
|
44
38
|
|
|
45
39
|
## Governance Supremacy
|
|
46
40
|
|
|
47
|
-
- Project governance documents (this repo's `governance/` tree) override any model default or
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
speculative features, cleaning up untouched code), governance wins without exception.
|
|
41
|
+
- Project governance documents (this repo's `governance/` tree) override any model default or prior training behavior.
|
|
42
|
+
- When a governance rule conflicts with a model default (e.g., adding attribution, adding speculative features, cleaning
|
|
43
|
+
up untouched code), governance wins without exception.
|
|
51
44
|
- If a governance rule is ambiguous, ask for clarification rather than applying a default.
|
|
52
45
|
|
|
53
46
|
## Scope Discipline
|
|
54
47
|
|
|
55
|
-
- Do not perform unrequested cleanup, refactoring, or improvements in files adjacent to the
|
|
56
|
-
current change.
|
|
48
|
+
- Do not perform unrequested cleanup, refactoring, or improvements in files adjacent to the current change.
|
|
57
49
|
- Do not add docstrings, comments, or type annotations to code not directly modified.
|
|
58
50
|
- Do not add error handling, fallbacks, or validation for scenarios that cannot occur.
|
|
59
51
|
- Surgical edits only: the smallest correct change that satisfies the request.
|
|
@@ -61,6 +53,5 @@ any model-default behavior.
|
|
|
61
53
|
## Memory and Governance Relationship
|
|
62
54
|
|
|
63
55
|
- Model memory (session-local or persisted) is subordinate to governance.
|
|
64
|
-
- If a memory contradicts governance, flag the conflict to the developer; do not silently pick
|
|
65
|
-
one over the other.
|
|
56
|
+
- If a memory contradicts governance, flag the conflict to the developer; do not silently pick one over the other.
|
|
66
57
|
- Governance is the source of truth; memory captures working context and in-flight decisions.
|
|
@@ -1,41 +1,37 @@
|
|
|
1
1
|
# API Management Standards
|
|
2
2
|
|
|
3
|
-
These rules govern API design, versioning, rate limiting, quotas, lifecycle management, and
|
|
4
|
-
|
|
3
|
+
These rules govern API design, versioning, rate limiting, quotas, lifecycle management, and developer experience. They
|
|
4
|
+
are non-negotiable unless explicitly superseded by a signed ADR.
|
|
5
5
|
|
|
6
|
-
**Maturity:** Required
|
|
7
|
-
**Version:** 1.0.0
|
|
8
|
-
**Last Reviewed:** 2026-03-09
|
|
6
|
+
**Maturity:** Required **Version:** 1.0.0 **Last Reviewed:** 2026-03-09
|
|
9
7
|
|
|
10
8
|
## API Design
|
|
11
9
|
|
|
12
10
|
### Interface Contracts
|
|
13
11
|
|
|
14
|
-
1. Every API exposes a machine-readable interface definition. REST APIs use OpenAPI 3.1+.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
(GET, POST, PUT, PATCH, DELETE) for operations, and standard status codes.
|
|
12
|
+
1. Every API exposes a machine-readable interface definition. REST APIs use OpenAPI 3.1+. gRPC services use Protocol
|
|
13
|
+
Buffers with buf schema registry publication. GraphQL schemas are registered in the central schema registry.
|
|
14
|
+
2. Interface definitions are version-controlled in the owning service's repository and published to the central API
|
|
15
|
+
catalog on every release.
|
|
16
|
+
3. APIs follow a consistent resource-oriented design: nouns for resources, standard HTTP verbs (GET, POST, PUT, PATCH,
|
|
17
|
+
DELETE) for operations, and standard status codes.
|
|
21
18
|
|
|
22
19
|
### Versioning
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
is
|
|
34
|
-
and in the API catalog.
|
|
21
|
+
1. All APIs are versioned. The version is embedded in the URL path for REST (`/v1/`, `/v2/`). gRPC APIs encode the
|
|
22
|
+
version in the package name (`keelcore.auth.v1`).
|
|
23
|
+
2. A version is considered stable once it is deployed to production. Stable versions must not receive breaking changes.
|
|
24
|
+
Add a new version instead.
|
|
25
|
+
3. Breaking changes are defined as: removing or renaming a field, changing a field's type, removing an endpoint,
|
|
26
|
+
changing required/optional status of a field, or changing error semantics.
|
|
27
|
+
4. Non-breaking additions (new optional fields, new endpoints, new enum values that do not affect existing behavior) may
|
|
28
|
+
be made to a stable version.
|
|
29
|
+
5. Deprecated versions remain available for a minimum of 6 months after the successor version is available. Deprecation
|
|
30
|
+
is communicated via the `Deprecation` and `Sunset` response headers and in the API catalog.
|
|
35
31
|
|
|
36
32
|
### Error Responses
|
|
37
33
|
|
|
38
|
-
|
|
34
|
+
1. All error responses use a consistent envelope:
|
|
39
35
|
|
|
40
36
|
```json
|
|
41
37
|
{
|
|
@@ -48,128 +44,121 @@ developer experience. They are non-negotiable unless explicitly superseded by a
|
|
|
48
44
|
}
|
|
49
45
|
```
|
|
50
46
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
2. `code` is a machine-readable uppercase string constant. `message` is human-readable. HTTP status codes and `code`
|
|
48
|
+
values are documented in the API catalog.
|
|
49
|
+
3. Error messages must not include internal implementation details (stack traces, SQL queries, internal service names)
|
|
50
|
+
in production responses.
|
|
55
51
|
|
|
56
52
|
### Pagination
|
|
57
53
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
1. All list endpoints that may return more than 100 items support cursor-based pagination. Offset pagination is
|
|
55
|
+
acceptable only for internal tooling APIs.
|
|
56
|
+
2. Page size has a maximum (default 100, configurable per endpoint, maximum 1000). Requests for unlimited results are
|
|
57
|
+
rejected.
|
|
58
|
+
3. Pagination response includes: `next_cursor`, `prev_cursor` (where supported), `total_count` (where computationally
|
|
59
|
+
feasible), and `has_more`.
|
|
64
60
|
|
|
65
61
|
## Rate Limiting
|
|
66
62
|
|
|
67
63
|
### Global Limits
|
|
68
64
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
1. All API traffic passes through the centralized rate limiting layer before reaching service pods.
|
|
66
|
+
2. Global rate limits protect the platform from aggregate overload. These are set by the platform team and documented in
|
|
67
|
+
the API catalog.
|
|
68
|
+
3. Rate limit enforcement uses a token bucket algorithm. Burst capacity may be up to 2× the sustained rate for a window
|
|
69
|
+
of up to 5 seconds.
|
|
74
70
|
|
|
75
71
|
### Per-Service and Per-Client Limits
|
|
76
72
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
in-memory rate limiting that can be bypassed by round-robin routing is prohibited.
|
|
73
|
+
1. Every API defines explicit rate limits per endpoint. Rate limits are documented in the API catalog alongside the
|
|
74
|
+
endpoint specification.
|
|
75
|
+
2. Rate limits are enforced per API key, per client identity (OAuth client ID), or per authenticated user, in that
|
|
76
|
+
priority order. Unauthenticated traffic shares a shared anonymous pool with a lower limit.
|
|
77
|
+
3. Services configure rate limits independently of the global limit; the effective limit is the minimum of the global
|
|
78
|
+
and per-service limits.
|
|
79
|
+
4. Rate limit state is stored in a shared, distributed backend (e.g., Redis). Per-replica in-memory rate limiting that
|
|
80
|
+
can be bypassed by round-robin routing is prohibited.
|
|
86
81
|
|
|
87
82
|
### Rate Limit Responses
|
|
88
83
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
1. Rate-limited requests receive HTTP 429 with:
|
|
85
|
+
- `Retry-After` header (seconds until the client may retry)
|
|
86
|
+
- `X-RateLimit-Limit` (requests allowed per window)
|
|
87
|
+
- `X-RateLimit-Remaining` (requests remaining in the current window)
|
|
88
|
+
- `X-RateLimit-Reset` (Unix timestamp of window reset)
|
|
89
|
+
- A JSON body following the standard error envelope (rule 9 above)
|
|
90
|
+
2. Rate limit headers (`X-RateLimit-*`) are included on every API response, not only on 429s.
|
|
96
91
|
|
|
97
92
|
### Quotas
|
|
98
93
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
before hard limits are hit.
|
|
94
|
+
1. Usage quotas (distinct from rate limits) enforce longer-window consumption caps (daily, monthly) per API key or
|
|
95
|
+
tenant. Quotas are configured in the API management platform.
|
|
96
|
+
2. Quota exhaustion returns HTTP 429 with `code: QUOTA_EXCEEDED` and a `Retry-After` pointing to the quota reset time.
|
|
97
|
+
3. Quota alerts fire at 80% and 95% consumption to allow clients and operators to take action before hard limits are
|
|
98
|
+
hit.
|
|
105
99
|
|
|
106
100
|
## Authentication and Authorization
|
|
107
101
|
|
|
108
102
|
### API Key Management
|
|
109
103
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
emergency bulk revocation for a compromised credential class.
|
|
104
|
+
1. API keys are issued by the central API management platform. Hand-crafted keys are prohibited.
|
|
105
|
+
2. API keys are associated with: an owner (human or service), a set of allowed scopes, an expiry date, and an
|
|
106
|
+
environment (keys do not cross environment boundaries).
|
|
107
|
+
3. API keys are rotated on a maximum 12-month cycle. Keys that have not been rotated are automatically expired and
|
|
108
|
+
flagged for the owner.
|
|
109
|
+
4. API key usage is logged per request with: key ID (never the key value), endpoint, response code, and latency.
|
|
110
|
+
5. Compromised API keys are revoked within 5 minutes of detection. The platform supports emergency bulk revocation for a
|
|
111
|
+
compromised credential class.
|
|
119
112
|
|
|
120
113
|
### Scopes and Permissions
|
|
121
114
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
34. Admin scopes require MFA-protected issuance and a shorter expiry (maximum 8 hours).
|
|
115
|
+
1. API scopes are defined at the resource level and follow the pattern `{resource}:{action}` (e.g., `orders:read`,
|
|
116
|
+
`orders:write`). Wildcard scopes are prohibited for non-admin APIs.
|
|
117
|
+
2. Clients are issued only the scopes they need. Over-provisioned scopes are flagged in the quarterly access review.
|
|
118
|
+
3. Admin scopes require MFA-protected issuance and a shorter expiry (maximum 8 hours).
|
|
127
119
|
|
|
128
120
|
## API Gateway
|
|
129
121
|
|
|
130
122
|
### Gateway Responsibilities
|
|
131
123
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
124
|
+
1. The API gateway handles: routing, authentication verification, rate limiting, WAF enforcement, request/response
|
|
125
|
+
logging, and protocol translation (where needed).
|
|
126
|
+
2. Business logic must not reside in gateway configuration. Transformation rules that implement business semantics
|
|
127
|
+
belong in the upstream service.
|
|
128
|
+
3. Gateway configuration is version-controlled and deployed via the same GitOps pipeline as application code. Manual
|
|
129
|
+
console edits are prohibited in staging and production.
|
|
138
130
|
|
|
139
131
|
### Backend Health and Circuit Breaking
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
upstreams.
|
|
133
|
+
1. The gateway enforces circuit breakers for each upstream service. A service that exceeds the error threshold (5xx
|
|
134
|
+
rate > 50% for 10 seconds) is circuit-broken; traffic is rejected at the gateway with HTTP 503 until the upstream
|
|
135
|
+
recovers.
|
|
136
|
+
2. Upstream health checks are configured per route. The gateway does not route to unhealthy upstreams.
|
|
146
137
|
|
|
147
138
|
### Observability at the Gateway
|
|
148
139
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
1. The gateway emits per-endpoint metrics: request rate, error rate, latency (p50/p95/p99), and upstream latency. These
|
|
141
|
+
are automatically included in each API's RED dashboard.
|
|
142
|
+
2. Every request is tagged with a `request_id` injected or verified by the gateway. The `request_id` matches the
|
|
143
|
+
`trace_id` in distributed traces.
|
|
153
144
|
|
|
154
145
|
## API Lifecycle
|
|
155
146
|
|
|
156
147
|
### Catalog and Discovery
|
|
157
148
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
discoverability.
|
|
149
|
+
1. Every API is registered in the central API catalog before its first production deployment. Unregistered APIs are
|
|
150
|
+
blocked by admission control.
|
|
151
|
+
2. The catalog entry includes: service owner, SLO, rate limits, authentication requirements, versioning status,
|
|
152
|
+
deprecation dates (if applicable), and a link to the OpenAPI/Protobuf spec.
|
|
153
|
+
3. The catalog is queryable by all engineers and is the single source of truth for API discoverability.
|
|
164
154
|
|
|
165
155
|
### Deprecation and Retirement
|
|
166
156
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
consumed APIs, 30 days for internal-only APIs.
|
|
157
|
+
1. API retirement follows a defined process: announce deprecation (Sunset header + catalog update), monitor usage,
|
|
158
|
+
notify active consumers, enforce sunset date.
|
|
159
|
+
2. An API version with active traffic cannot be retired without consumer migration or an explicitly accepted exception.
|
|
160
|
+
3. The `Sunset` date is set in UTC and announced at least 6 months in advance for externally consumed APIs, 30 days for
|
|
161
|
+
internal-only APIs.
|
|
173
162
|
|
|
174
163
|
## Do Not
|
|
175
164
|
|
package/governance/arb.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# Architecture Review Board (ARB)
|
|
2
2
|
|
|
3
|
-
**Maturity:** Required
|
|
4
|
-
**Version:** 1.0.0
|
|
5
|
-
**Last Reviewed:** 2026-03-09
|
|
3
|
+
**Maturity:** Required **Version:** 1.0.0 **Last Reviewed:** 2026-03-09
|
|
6
4
|
|
|
7
|
-
The ARB is the governing body for platform architecture decisions. It is the default Approver
|
|
8
|
-
|
|
5
|
+
The ARB is the governing body for platform architecture decisions. It is the default Approver for all architecture ADRs
|
|
6
|
+
and the final escalation point for cross-domain technical disputes.
|
|
9
7
|
|
|
10
8
|
## Membership
|
|
11
9
|
|
|
@@ -14,92 +12,87 @@ for all architecture ADRs and the final escalation point for cross-domain techni
|
|
|
14
12
|
1. The ARB has a minimum of 5 members and a maximum of 9 members.
|
|
15
13
|
2. Members are nominated by the CTO and serve a minimum term of 12 months.
|
|
16
14
|
3. Required seats (one each): Infrastructure, Security, Observability, Data, Application Platform.
|
|
17
|
-
4. The CTO or a designated VP of Engineering holds the Chair seat. The Chair is a non-voting
|
|
18
|
-
|
|
19
|
-
5. Membership is documented in the internal people directory and in this file's companion
|
|
20
|
-
|
|
15
|
+
4. The CTO or a designated VP of Engineering holds the Chair seat. The Chair is a non-voting member except to break ties
|
|
16
|
+
(see Tie-Breaking below).
|
|
17
|
+
5. Membership is documented in the internal people directory and in this file's companion `docs/arb-members.md`
|
|
18
|
+
(maintained separately from this governance doc to avoid churn).
|
|
21
19
|
|
|
22
20
|
### Eligibility
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
pending review by the Chair.
|
|
22
|
+
1. Members must be active engineers or engineering managers with direct responsibility in their domain. Advisory or
|
|
23
|
+
external members are not permitted.
|
|
24
|
+
2. A member who misses three consecutive meetings without proxy is automatically suspended pending review by the Chair.
|
|
28
25
|
|
|
29
26
|
## Meeting Cadence
|
|
30
27
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
formality as decisions made in session.
|
|
28
|
+
1. The ARB meets on a defined monthly cadence. The meeting schedule is published at the start of each quarter.
|
|
29
|
+
2. Emergency sessions may be called by the Chair or by any two members with a minimum 24-hour notice. Emergency sessions
|
|
30
|
+
are limited to the agenda item that triggered them.
|
|
31
|
+
3. Meeting notes and decisions are published to the engineering wiki within five business days.
|
|
32
|
+
4. Decisions made asynchronously (via PR approval or written vote) are recorded with the same formality as decisions
|
|
33
|
+
made in session.
|
|
38
34
|
|
|
39
35
|
## Decision-Making
|
|
40
36
|
|
|
41
37
|
### Quorum
|
|
42
38
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
1. Quorum is a simple majority of seated, non-suspended members (excluding the Chair):
|
|
40
|
+
- 5 members: quorum = 3
|
|
41
|
+
- 7 members: quorum = 4
|
|
42
|
+
- 9 members: quorum = 5
|
|
43
|
+
2. Decisions made without quorum are provisional. They must be ratified at the next session where quorum is present, or
|
|
44
|
+
they are void.
|
|
45
|
+
3. A member who has a conflict of interest in a decision must declare it and recuse. Recused members do not count toward
|
|
46
|
+
quorum for that item.
|
|
51
47
|
|
|
52
48
|
### Voting
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
1. Decisions are made by simple majority of present, non-recused members.
|
|
51
|
+
2. Votes are recorded (member, vote, rationale for dissent) in the meeting notes.
|
|
52
|
+
3. Abstentions are permitted but discourage without stated reason.
|
|
57
53
|
|
|
58
54
|
### Tie-Breaking
|
|
59
55
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
1. When a vote is tied, the Chair casts the deciding vote.
|
|
57
|
+
2. The Chair must state their rationale when casting a tie-breaking vote.
|
|
58
|
+
3. Tie-breaking decisions are flagged in meeting notes for CTO awareness.
|
|
63
59
|
|
|
64
60
|
## Scope of Authority
|
|
65
61
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
required. The ARB may accept or decline to review.
|
|
62
|
+
1. The ARB has authority over: platform architecture standards, vendor selection for platform-level tooling,
|
|
63
|
+
cross-domain API contracts, security architecture, and data architecture patterns.
|
|
64
|
+
2. The ARB does not have authority over: team-internal implementation choices, product roadmap prioritization, staffing
|
|
65
|
+
decisions, or budget approval.
|
|
66
|
+
3. Any team may bring a decision to the ARB for guidance even if ARB approval is not strictly required. The ARB may
|
|
67
|
+
accept or decline to review.
|
|
73
68
|
|
|
74
69
|
## ADR and RFC Approval
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
to the full board, subject to ratification at the next session.
|
|
71
|
+
1. The ARB is the default Approver for all ADRs tagged as architecture decisions.
|
|
72
|
+
2. The ARB reviews RFCs at the Under Discussion stage. Approval converts an RFC to Accepted and triggers ADR creation.
|
|
73
|
+
3. The ARB may delegate Approver authority for a specific decision to a named individual or sub-committee. Delegation is
|
|
74
|
+
recorded in the relevant ADR/RFC.
|
|
75
|
+
4. The ARB chair may approve urgent security-related ADRs unilaterally with 24-hour notice to the full board, subject to
|
|
76
|
+
ratification at the next session.
|
|
83
77
|
|
|
84
78
|
## Escalation
|
|
85
79
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
32. Escalation outcomes are published (with appropriate confidentiality) in the engineering wiki.
|
|
80
|
+
1. Escalation path: Team → Domain Lead → ARB → CTO.
|
|
81
|
+
2. Any engineer may escalate a decision to the ARB by opening a GitHub issue in the `keelcore/standards` repository
|
|
82
|
+
labeled `arb-escalation`.
|
|
83
|
+
3. The ARB must acknowledge escalations within three business days and schedule review within ten business days.
|
|
84
|
+
4. ARB decisions may be escalated to the CTO only on the grounds of: process violation, conflict of interest, or
|
|
85
|
+
organizational policy conflict. The CTO's decision is final.
|
|
86
|
+
5. Escalation outcomes are published (with appropriate confidentiality) in the engineering wiki.
|
|
94
87
|
|
|
95
88
|
## Standards Cadence
|
|
96
89
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
90
|
+
1. The ARB publishes a versioned Architecture Standards snapshot at least once per quarter. The snapshot is tagged in
|
|
91
|
+
this repository as `arb-standards-YYYY-QN`.
|
|
92
|
+
2. Each quarterly snapshot includes: new ADRs accepted since the last snapshot, standards that changed maturity level,
|
|
93
|
+
deprecated standards, and open RFCs in progress.
|
|
94
|
+
3. The ARB reviews all standards marked `Deprecated` at least once per year to confirm retirement or rescind
|
|
95
|
+
deprecation.
|
|
103
96
|
|
|
104
97
|
## Do Not
|
|
105
98
|
|