@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 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
- Consumed by AI coding tools (Claude, Cursor, Copilot) and human contributors alike.
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 | 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 |
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 | Adapter |
70
- | --- | --- |
71
- | Claude Code | [adapters/claude/CLAUDE.md](adapters/claude/CLAUDE.md) |
72
- | Cursor | [adapters/cursor/](adapters/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 | Decision |
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) | Code coverage baseline stored in repository |
85
- | [0003](docs/adr/0003-architecture-governance-process.md) | Architecture governance via DACI, RFC, and ARB |
86
- | [0004](docs/adr/0004-workload-identity-spiffe-spire.md) | SPIFFE/SPIRE for workload identity |
87
- | [0005](docs/adr/0005-observability-opentelemetry.md) | OpenTelemetry as the unified observability framework |
88
- | [0006](docs/adr/0006-opa-centralized-policy-engine.md) | OPA as the centralized authorization policy engine |
89
- | [0007](docs/adr/0007-zero-downtime-deployment.md) | Zero-downtime deployment via blue/green and canary |
90
- | [0008](docs/adr/0008-rapid-key-rotation.md) | Rapid key rotation with a 5-minute platform SLA |
91
- | [0009](docs/adr/0009-gitops-change-management.md) | GitOps as the declarative change management mechanism |
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
 
@@ -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
- when working in projects under this governance. They are non-negotiable and take precedence over
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
- make it pass.
22
- - Exceptions (adding a new test, fixing a test bug, tracking an intentional contract change)
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
- developer consent in the current conversation.
36
- - Entry points are considered high-blast-radius: a silent change to `main` can alter startup
37
- behavior, flag defaults, or initialization order in ways that are hard to review.
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
- prior training behavior.
49
- - When a governance rule conflicts with a model default (e.g., adding attribution, adding
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
- developer experience. They are non-negotiable unless explicitly superseded by a signed ADR.
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
- gRPC services use Protocol Buffers with buf schema registry publication. GraphQL schemas
16
- are registered in the central schema registry.
17
- 2. Interface definitions are version-controlled in the owning service's repository and published
18
- to the central API catalog on every release.
19
- 3. APIs follow a consistent resource-oriented design: nouns for resources, standard HTTP verbs
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
- 4. All APIs are versioned. The version is embedded in the URL path for REST (`/v1/`, `/v2/`).
25
- gRPC APIs encode the version in the package name (`keelcore.auth.v1`).
26
- 5. A version is considered stable once it is deployed to production. Stable versions must not
27
- receive breaking changes. Add a new version instead.
28
- 6. Breaking changes are defined as: removing or renaming a field, changing a field's type,
29
- removing an endpoint, changing required/optional status of a field, or changing error semantics.
30
- 7. Non-breaking additions (new optional fields, new endpoints, new enum values that do not affect
31
- existing behavior) may be made to a stable version.
32
- 8. Deprecated versions remain available for a minimum of 6 months after the successor version
33
- is available. Deprecation is communicated via the `Deprecation` and `Sunset` response headers
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
- 9. All error responses use a consistent envelope:
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
- 10. `code` is a machine-readable uppercase string constant. `message` is human-readable.
52
- HTTP status codes and `code` values are documented in the API catalog.
53
- 11. Error messages must not include internal implementation details (stack traces, SQL queries,
54
- internal service names) in production responses.
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
- 12. All list endpoints that may return more than 100 items support cursor-based pagination.
59
- Offset pagination is acceptable only for internal tooling APIs.
60
- 13. Page size has a maximum (default 100, configurable per endpoint, maximum 1000). Requests
61
- for unlimited results are rejected.
62
- 14. Pagination response includes: `next_cursor`, `prev_cursor` (where supported), `total_count`
63
- (where computationally feasible), and `has_more`.
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
- 15. All API traffic passes through the centralized rate limiting layer before reaching service pods.
70
- 16. Global rate limits protect the platform from aggregate overload. These are set by the platform
71
- team and documented in the API catalog.
72
- 17. Rate limit enforcement uses a token bucket algorithm. Burst capacity may be up to 2× the
73
- sustained rate for a window of up to 5 seconds.
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
- 18. Every API defines explicit rate limits per endpoint. Rate limits are documented in the API
78
- catalog alongside the endpoint specification.
79
- 19. Rate limits are enforced per API key, per client identity (OAuth client ID), or per
80
- authenticated user, in that priority order. Unauthenticated traffic shares a shared
81
- anonymous pool with a lower limit.
82
- 20. Services configure rate limits independently of the global limit; the effective limit is
83
- the minimum of the global and per-service limits.
84
- 21. Rate limit state is stored in a shared, distributed backend (e.g., Redis). Per-replica
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
- 22. Rate-limited requests receive HTTP 429 with:
90
- - `Retry-After` header (seconds until the client may retry)
91
- - `X-RateLimit-Limit` (requests allowed per window)
92
- - `X-RateLimit-Remaining` (requests remaining in the current window)
93
- - `X-RateLimit-Reset` (Unix timestamp of window reset)
94
- - A JSON body following the standard error envelope (rule 9 above)
95
- 23. Rate limit headers (`X-RateLimit-*`) are included on every API response, not only on 429s.
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
- 24. Usage quotas (distinct from rate limits) enforce longer-window consumption caps (daily,
100
- monthly) per API key or tenant. Quotas are configured in the API management platform.
101
- 25. Quota exhaustion returns HTTP 429 with `code: QUOTA_EXCEEDED` and a `Retry-After` pointing
102
- to the quota reset time.
103
- 26. Quota alerts fire at 80% and 95% consumption to allow clients and operators to take action
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
- 27. API keys are issued by the central API management platform. Hand-crafted keys are prohibited.
111
- 28. API keys are associated with: an owner (human or service), a set of allowed scopes, an
112
- expiry date, and an environment (keys do not cross environment boundaries).
113
- 29. API keys are rotated on a maximum 12-month cycle. Keys that have not been rotated are
114
- automatically expired and flagged for the owner.
115
- 30. API key usage is logged per request with: key ID (never the key value), endpoint, response
116
- code, and latency.
117
- 31. Compromised API keys are revoked within 5 minutes of detection. The platform supports
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
- 32. API scopes are defined at the resource level and follow the pattern `{resource}:{action}`
123
- (e.g., `orders:read`, `orders:write`). Wildcard scopes are prohibited for non-admin APIs.
124
- 33. Clients are issued only the scopes they need. Over-provisioned scopes are flagged in the
125
- quarterly access review.
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
- 35. The API gateway handles: routing, authentication verification, rate limiting, WAF enforcement,
133
- request/response logging, and protocol translation (where needed).
134
- 36. Business logic must not reside in gateway configuration. Transformation rules that implement
135
- business semantics belong in the upstream service.
136
- 37. Gateway configuration is version-controlled and deployed via the same GitOps pipeline as
137
- application code. Manual console edits are prohibited in staging and production.
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
- 38. The gateway enforces circuit breakers for each upstream service. A service that exceeds the
142
- error threshold (5xx rate > 50% for 10 seconds) is circuit-broken; traffic is rejected at
143
- the gateway with HTTP 503 until the upstream recovers.
144
- 39. Upstream health checks are configured per route. The gateway does not route to unhealthy
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
- 40. The gateway emits per-endpoint metrics: request rate, error rate, latency (p50/p95/p99),
150
- and upstream latency. These are automatically included in each API's RED dashboard.
151
- 41. Every request is tagged with a `request_id` injected or verified by the gateway. The
152
- `request_id` matches the `trace_id` in distributed traces.
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
- 42. Every API is registered in the central API catalog before its first production deployment.
159
- Unregistered APIs are blocked by admission control.
160
- 43. The catalog entry includes: service owner, SLO, rate limits, authentication requirements,
161
- versioning status, deprecation dates (if applicable), and a link to the OpenAPI/Protobuf spec.
162
- 44. The catalog is queryable by all engineers and is the single source of truth for API
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
- 45. API retirement follows a defined process: announce deprecation (Sunset header + catalog
168
- update), monitor usage, notify active consumers, enforce sunset date.
169
- 46. An API version with active traffic cannot be retired without consumer migration or an
170
- explicitly accepted exception.
171
- 47. The `Sunset` date is set in UTC and announced at least 6 months in advance for externally
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
- for all architecture ADRs and the final escalation point for cross-domain technical disputes.
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
- member except to break ties (see Tie-Breaking below).
19
- 5. Membership is documented in the internal people directory and in this file's companion
20
- `docs/arb-members.md` (maintained separately from this governance doc to avoid churn).
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
- 6. Members must be active engineers or engineering managers with direct responsibility in their
25
- domain. Advisory or external members are not permitted.
26
- 7. A member who misses three consecutive meetings without proxy is automatically suspended
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
- 8. The ARB meets on a defined monthly cadence. The meeting schedule is published at the start
32
- of each quarter.
33
- 9. Emergency sessions may be called by the Chair or by any two members with a minimum 24-hour
34
- notice. Emergency sessions are limited to the agenda item that triggered them.
35
- 10. Meeting notes and decisions are published to the engineering wiki within five business days.
36
- 11. Decisions made asynchronously (via PR approval or written vote) are recorded with the same
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
- 12. Quorum is a simple majority of seated, non-suspended members (excluding the Chair):
44
- - 5 members: quorum = 3
45
- - 7 members: quorum = 4
46
- - 9 members: quorum = 5
47
- 13. Decisions made without quorum are provisional. They must be ratified at the next session
48
- where quorum is present, or they are void.
49
- 14. A member who has a conflict of interest in a decision must declare it and recuse. Recused
50
- members do not count toward quorum for that item.
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
- 15. Decisions are made by simple majority of present, non-recused members.
55
- 16. Votes are recorded (member, vote, rationale for dissent) in the meeting notes.
56
- 17. Abstentions are permitted but discourage without stated reason.
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
- 18. When a vote is tied, the Chair casts the deciding vote.
61
- 19. The Chair must state their rationale when casting a tie-breaking vote.
62
- 20. Tie-breaking decisions are flagged in meeting notes for CTO awareness.
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
- 21. The ARB has authority over: platform architecture standards, vendor selection for
67
- platform-level tooling, cross-domain API contracts, security architecture, and
68
- data architecture patterns.
69
- 22. The ARB does not have authority over: team-internal implementation choices, product
70
- roadmap prioritization, staffing decisions, or budget approval.
71
- 23. Any team may bring a decision to the ARB for guidance even if ARB approval is not strictly
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
- 24. The ARB is the default Approver for all ADRs tagged as architecture decisions.
77
- 25. The ARB reviews RFCs at the Under Discussion stage. Approval converts an RFC to Accepted
78
- and triggers ADR creation.
79
- 26. The ARB may delegate Approver authority for a specific decision to a named individual or
80
- sub-committee. Delegation is recorded in the relevant ADR/RFC.
81
- 27. The ARB chair may approve urgent security-related ADRs unilaterally with 24-hour notice
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
- 28. Escalation path: Team → Domain Lead → ARB → CTO.
87
- 29. Any engineer may escalate a decision to the ARB by opening a GitHub issue in the
88
- `keelcore/standards` repository labeled `arb-escalation`.
89
- 30. The ARB must acknowledge escalations within three business days and schedule review
90
- within ten business days.
91
- 31. ARB decisions may be escalated to the CTO only on the grounds of: process violation,
92
- conflict of interest, or organizational policy conflict. The CTO's decision is final.
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
- 33. The ARB publishes a versioned Architecture Standards snapshot at least once per quarter.
98
- The snapshot is tagged in this repository as `arb-standards-YYYY-QN`.
99
- 34. Each quarterly snapshot includes: new ADRs accepted since the last snapshot, standards
100
- that changed maturity level, deprecated standards, and open RFCs in progress.
101
- 35. The ARB reviews all standards marked `Deprecated` at least once per year to confirm
102
- retirement or rescind deprecation.
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