@ghostbyte/agent-docs-kit 0.0.0-stage → 4.0.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 +21 -0
- package/README.md +82 -2
- package/bin/agent-docs.mjs +8 -0
- package/content/catalog.json +196 -0
- package/content/engineering/01-query-performance.md +48 -0
- package/content/engineering/02-networking-fundamentals.md +48 -0
- package/content/engineering/03-rate-limiting-algorithms.md +48 -0
- package/content/engineering/04-production-debugging.md +48 -0
- package/content/engineering/05-code-review-practices.md +48 -0
- package/content/engineering/06-data-modeling.md +48 -0
- package/content/engineering/07-cloud-cost-saving.md +48 -0
- package/content/engineering/08-testing-types.md +48 -0
- package/content/engineering/09-message-queues.md +48 -0
- package/content/engineering/full-reference.md +144 -0
- package/content/security/01-design-architecture.md +39 -0
- package/content/security/02-local-development.md +41 -0
- package/content/security/03-database-backend.md +46 -0
- package/content/security/04-api-layer.md +51 -0
- package/content/security/05-frontend-ui.md +44 -0
- package/content/security/06-application-security-testing.md +48 -0
- package/content/security/07-cicd-release-engineering.md +41 -0
- package/content/security/08-cloud-infrastructure.md +45 -0
- package/content/security/09-edge-cdn-dns.md +44 -0
- package/content/security/10-release-rollout.md +41 -0
- package/content/security/11-post-release-monitoring-ir.md +43 -0
- package/content/security/12-ongoing-operations.md +52 -0
- package/content/security/full-reference.md +3173 -0
- package/docs/ARCHITECTURE.md +107 -0
- package/docs/CONTENT_MAINTENANCE.md +9 -0
- package/docs/GITHUB_AND_NPM_SETUP.md +104 -0
- package/docs/PURPOSE.md +23 -0
- package/docs/RELEASE_PROCESS.md +11 -0
- package/docs/SECURITY_MODEL.md +9 -0
- package/docs/archive/AGENT_DOCS_KIT_v3.2.md +1025 -0
- package/package.json +57 -4
- package/skills/manage-project-quality/SKILL.md +78 -0
- package/skills/manage-project-quality/agents/openai.yaml +4 -0
- package/skills/manage-project-quality/assets/documentation-report.md +12 -0
- package/skills/manage-project-quality/assets/engineering-report.md +13 -0
- package/skills/manage-project-quality/assets/security-report.md +18 -0
- package/skills/manage-project-quality/references/documentation-governance.md +39 -0
- package/skills/manage-project-quality/references/engineering-01-query-performance.md +48 -0
- package/skills/manage-project-quality/references/engineering-02-networking-fundamentals.md +48 -0
- package/skills/manage-project-quality/references/engineering-03-rate-limiting-algorithms.md +48 -0
- package/skills/manage-project-quality/references/engineering-04-production-debugging.md +48 -0
- package/skills/manage-project-quality/references/engineering-05-code-review-practices.md +48 -0
- package/skills/manage-project-quality/references/engineering-06-data-modeling.md +48 -0
- package/skills/manage-project-quality/references/engineering-07-cloud-cost-saving.md +48 -0
- package/skills/manage-project-quality/references/engineering-08-testing-types.md +48 -0
- package/skills/manage-project-quality/references/engineering-09-message-queues.md +48 -0
- package/skills/manage-project-quality/references/engineering-full-reference.md +144 -0
- package/skills/manage-project-quality/references/engineering-protocol.md +23 -0
- package/skills/manage-project-quality/references/evidence-and-reporting.md +19 -0
- package/skills/manage-project-quality/references/security-01-design-architecture.md +39 -0
- package/skills/manage-project-quality/references/security-02-local-development.md +41 -0
- package/skills/manage-project-quality/references/security-03-database-backend.md +46 -0
- package/skills/manage-project-quality/references/security-04-api-layer.md +51 -0
- package/skills/manage-project-quality/references/security-05-frontend-ui.md +44 -0
- package/skills/manage-project-quality/references/security-06-application-security-testing.md +48 -0
- package/skills/manage-project-quality/references/security-07-cicd-release-engineering.md +41 -0
- package/skills/manage-project-quality/references/security-08-cloud-infrastructure.md +45 -0
- package/skills/manage-project-quality/references/security-09-edge-cdn-dns.md +44 -0
- package/skills/manage-project-quality/references/security-10-release-rollout.md +41 -0
- package/skills/manage-project-quality/references/security-11-post-release-monitoring-ir.md +43 -0
- package/skills/manage-project-quality/references/security-12-ongoing-operations.md +52 -0
- package/skills/manage-project-quality/references/security-full-reference.md +3173 -0
- package/skills/manage-project-quality/references/security-protocol.md +22 -0
- package/skills/manage-project-quality/scripts/check-report.mjs +23 -0
- package/src/api/index.mjs +4 -0
- package/src/cli/arguments.mjs +30 -0
- package/src/cli/help.mjs +24 -0
- package/src/cli/main.mjs +65 -0
- package/src/commands/audit.mjs +49 -0
- package/src/commands/doctor.mjs +12 -0
- package/src/commands/list.mjs +11 -0
- package/src/commands/setup.mjs +42 -0
- package/src/commands/skill.mjs +14 -0
- package/src/commands/validate.mjs +20 -0
- package/src/core/catalog.mjs +19 -0
- package/src/core/files.mjs +42 -0
- package/src/core/paths.mjs +5 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ghostbyte1014
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,83 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent Docs & Quality Kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Documentation governance, evidence-based security audits, and engineering-quality reviews in one installable CLI and one progressive Codex skill.
|
|
4
|
+
|
|
5
|
+
[](https://github.com/ghostbyte1014/Agent_Docs_Kit/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/@ghostbyte/agent-docs-kit)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
## What each part is for
|
|
10
|
+
|
|
11
|
+
| Workflow | Purpose | Result model |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Documentation | Keep scope, architecture, decisions, operations, and change history navigable and current. | Current / Needs update / Reference / Archived |
|
|
14
|
+
| Security | Test security controls with evidence and expose release risk. | Pass / Fail / Unverified / N/A |
|
|
15
|
+
| Engineering | Review maintainability, reliability, performance, testing, operability, and cost tradeoffs. | Applied / Partial / Recommended / Unverified / N/A |
|
|
16
|
+
|
|
17
|
+
Security can block a release. Engineering advice is normally non-blocking. Documentation policy improves governance but becomes technically enforceable only when backed by hooks or CI.
|
|
18
|
+
|
|
19
|
+
## Try it without installing
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx @ghostbyte/agent-docs-kit@latest
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The no-argument command opens a guided menu in an interactive terminal. Direct commands work well in scripts:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx @ghostbyte/agent-docs-kit@latest setup --dry-run
|
|
29
|
+
npx @ghostbyte/agent-docs-kit@latest setup
|
|
30
|
+
npx @ghostbyte/agent-docs-kit@latest audit documentation
|
|
31
|
+
npx @ghostbyte/agent-docs-kit@latest list security
|
|
32
|
+
npx @ghostbyte/agent-docs-kit@latest audit security api-layer --style learning
|
|
33
|
+
npx @ghostbyte/agent-docs-kit@latest review engineering testing-types
|
|
34
|
+
npx @ghostbyte/agent-docs-kit@latest skill install --target project
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Installing the package performs no setup and changes no project files. Mutation happens only after an explicit command:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install --save-dev @ghostbyte/agent-docs-kit
|
|
41
|
+
npx agent-docs setup
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Existing files are skipped unless `--force` is supplied. Use `--dry-run` to preview owned writes.
|
|
45
|
+
|
|
46
|
+
## Codex skill
|
|
47
|
+
|
|
48
|
+
The package contains `manage-project-quality`, a single router skill whose references are loaded by selected workflow and phase. Install it into the current project with:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npx agent-docs skill install --target project
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This creates `.agents/skills/manage-project-quality`. For a user-level Codex installation, explicitly run `npx agent-docs skill install --target codex`.
|
|
55
|
+
|
|
56
|
+
## Maintainer setup
|
|
57
|
+
|
|
58
|
+
See [GitHub and npm setup](docs/GITHUB_AND_NPM_SETUP.md) for the commands to create/push the repository, enable GitHub Pages, verify the npm package name, publish the first version, and configure trusted publishing. The package name and repository URL are configured for `ghostbyte1014`; change them before release if the actual owner or repository differs.
|
|
59
|
+
|
|
60
|
+
Further documentation:
|
|
61
|
+
|
|
62
|
+
- [Purpose and boundaries](docs/PURPOSE.md)
|
|
63
|
+
- [Architecture and complete file structure](docs/ARCHITECTURE.md)
|
|
64
|
+
- [Security model](docs/SECURITY_MODEL.md)
|
|
65
|
+
- [Release process](docs/RELEASE_PROCESS.md)
|
|
66
|
+
- [Legacy v3.2 compiled kit](docs/archive/AGENT_DOCS_KIT_v3.2.md)
|
|
67
|
+
|
|
68
|
+
## Development
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm install
|
|
72
|
+
npm test
|
|
73
|
+
npm run validate
|
|
74
|
+
npm run build
|
|
75
|
+
npm run site:preview
|
|
76
|
+
npm pack --dry-run
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
There are no runtime dependencies and no lifecycle install script.
|
|
80
|
+
|
|
81
|
+
## License
|
|
82
|
+
|
|
83
|
+
[MIT](LICENSE) © ghostbyte1014.
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"security": [
|
|
4
|
+
{
|
|
5
|
+
"id": "01",
|
|
6
|
+
"slug": "design-architecture",
|
|
7
|
+
"title": "Design & Architecture",
|
|
8
|
+
"aliases": [
|
|
9
|
+
"1"
|
|
10
|
+
],
|
|
11
|
+
"source": "content/security/01-design-architecture.md"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"id": "02",
|
|
15
|
+
"slug": "local-development",
|
|
16
|
+
"title": "Local Development",
|
|
17
|
+
"aliases": [
|
|
18
|
+
"2"
|
|
19
|
+
],
|
|
20
|
+
"source": "content/security/02-local-development.md"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "03",
|
|
24
|
+
"slug": "database-backend",
|
|
25
|
+
"title": "Database & Backend",
|
|
26
|
+
"aliases": [
|
|
27
|
+
"3"
|
|
28
|
+
],
|
|
29
|
+
"source": "content/security/03-database-backend.md"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "04",
|
|
33
|
+
"slug": "api-layer",
|
|
34
|
+
"title": "API Layer",
|
|
35
|
+
"aliases": [
|
|
36
|
+
"4"
|
|
37
|
+
],
|
|
38
|
+
"source": "content/security/04-api-layer.md"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "05",
|
|
42
|
+
"slug": "frontend-ui",
|
|
43
|
+
"title": "Frontend & UI",
|
|
44
|
+
"aliases": [
|
|
45
|
+
"5"
|
|
46
|
+
],
|
|
47
|
+
"source": "content/security/05-frontend-ui.md"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "06",
|
|
51
|
+
"slug": "application-security-testing",
|
|
52
|
+
"title": "Application Security Testing",
|
|
53
|
+
"aliases": [
|
|
54
|
+
"6"
|
|
55
|
+
],
|
|
56
|
+
"source": "content/security/06-application-security-testing.md"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "07",
|
|
60
|
+
"slug": "cicd-release-engineering",
|
|
61
|
+
"title": "CI/CD & Release Engineering",
|
|
62
|
+
"aliases": [
|
|
63
|
+
"7"
|
|
64
|
+
],
|
|
65
|
+
"source": "content/security/07-cicd-release-engineering.md"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": "08",
|
|
69
|
+
"slug": "cloud-infrastructure",
|
|
70
|
+
"title": "Cloud Infrastructure",
|
|
71
|
+
"aliases": [
|
|
72
|
+
"8"
|
|
73
|
+
],
|
|
74
|
+
"source": "content/security/08-cloud-infrastructure.md"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "09",
|
|
78
|
+
"slug": "edge-cdn-dns",
|
|
79
|
+
"title": "Edge, CDN & DNS",
|
|
80
|
+
"aliases": [
|
|
81
|
+
"9"
|
|
82
|
+
],
|
|
83
|
+
"source": "content/security/09-edge-cdn-dns.md"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "10",
|
|
87
|
+
"slug": "release-rollout",
|
|
88
|
+
"title": "Release & Rollout",
|
|
89
|
+
"aliases": [
|
|
90
|
+
"10"
|
|
91
|
+
],
|
|
92
|
+
"source": "content/security/10-release-rollout.md"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "11",
|
|
96
|
+
"slug": "post-release-monitoring-ir",
|
|
97
|
+
"title": "Post-release Monitoring & Incident Response",
|
|
98
|
+
"aliases": [
|
|
99
|
+
"11"
|
|
100
|
+
],
|
|
101
|
+
"source": "content/security/11-post-release-monitoring-ir.md"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "12",
|
|
105
|
+
"slug": "ongoing-operations",
|
|
106
|
+
"title": "Ongoing Operations",
|
|
107
|
+
"aliases": [
|
|
108
|
+
"12"
|
|
109
|
+
],
|
|
110
|
+
"source": "content/security/12-ongoing-operations.md"
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"engineering": [
|
|
114
|
+
{
|
|
115
|
+
"id": "01",
|
|
116
|
+
"slug": "query-performance",
|
|
117
|
+
"title": "Query Performance & Slow Query Diagnosis",
|
|
118
|
+
"aliases": [
|
|
119
|
+
"1"
|
|
120
|
+
],
|
|
121
|
+
"source": "content/engineering/01-query-performance.md"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"id": "02",
|
|
125
|
+
"slug": "networking-fundamentals",
|
|
126
|
+
"title": "Networking Fundamentals",
|
|
127
|
+
"aliases": [
|
|
128
|
+
"2"
|
|
129
|
+
],
|
|
130
|
+
"source": "content/engineering/02-networking-fundamentals.md"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "03",
|
|
134
|
+
"slug": "rate-limiting-algorithms",
|
|
135
|
+
"title": "Rate Limiting Algorithm Choices",
|
|
136
|
+
"aliases": [
|
|
137
|
+
"3"
|
|
138
|
+
],
|
|
139
|
+
"source": "content/engineering/03-rate-limiting-algorithms.md"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "04",
|
|
143
|
+
"slug": "production-debugging",
|
|
144
|
+
"title": "Production Debugging",
|
|
145
|
+
"aliases": [
|
|
146
|
+
"4"
|
|
147
|
+
],
|
|
148
|
+
"source": "content/engineering/04-production-debugging.md"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": "05",
|
|
152
|
+
"slug": "code-review-practices",
|
|
153
|
+
"title": "Code Review Practices",
|
|
154
|
+
"aliases": [
|
|
155
|
+
"5"
|
|
156
|
+
],
|
|
157
|
+
"source": "content/engineering/05-code-review-practices.md"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "06",
|
|
161
|
+
"slug": "data-modeling",
|
|
162
|
+
"title": "Data Modeling",
|
|
163
|
+
"aliases": [
|
|
164
|
+
"6"
|
|
165
|
+
],
|
|
166
|
+
"source": "content/engineering/06-data-modeling.md"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "07",
|
|
170
|
+
"slug": "cloud-cost-saving",
|
|
171
|
+
"title": "Cloud Cost Saving",
|
|
172
|
+
"aliases": [
|
|
173
|
+
"7"
|
|
174
|
+
],
|
|
175
|
+
"source": "content/engineering/07-cloud-cost-saving.md"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "08",
|
|
179
|
+
"slug": "testing-types",
|
|
180
|
+
"title": "Testing Types",
|
|
181
|
+
"aliases": [
|
|
182
|
+
"8"
|
|
183
|
+
],
|
|
184
|
+
"source": "content/engineering/08-testing-types.md"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "09",
|
|
188
|
+
"slug": "message-queues",
|
|
189
|
+
"title": "Message Queues",
|
|
190
|
+
"aliases": [
|
|
191
|
+
"9"
|
|
192
|
+
],
|
|
193
|
+
"source": "content/engineering/09-message-queues.md"
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Query Performance & Slow Query Diagnosis
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 1: Query Performance & Slow Query Diagnosis
|
|
4
|
+
|
|
5
|
+
**When to run this:** When a query, endpoint, or report is running slower than expected, or before shipping a new query against a table that will grow.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Work through the standard diagnostic order for a slow query instead of guessing at fixes — read the plan first, fix the cheapest thing, and don't reach for denormalization until indexing is exhausted.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 1: Query Performance & Slow Query Diagnosis
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | Start with the explain plan | Reveals whether the DB is scanning, sorting, or joining in a way that doesn't match intent — guessing at fixes without this wastes time. | Have you run EXPLAIN (or EXPLAIN ANALYZE) on the slow query and read where the time actually goes? |
|
|
40
|
+
| 2 | Add the missing index | Full table scans get linearly worse as data grows; the right index turns O(n) into O(log n). | Does the WHERE/JOIN/ORDER BY column set have a supporting index? |
|
|
41
|
+
| 3 | Stop selecting * | Pulling unused columns wastes I/O and network, and can defeat a covering index. | Does the query request only the columns actually used downstream? |
|
|
42
|
+
| 4 | Fix N+1 queries | One query per row in a loop turns a single request into hundreds; batching/joining collapses it back to one or few. | Does any code path issue a query inside a loop over another query's results? |
|
|
43
|
+
| 5 | Use a covering index | An index that includes all selected columns lets the DB answer from the index alone, skipping the table lookup. | For hot read queries, does the index include every column the query selects? |
|
|
44
|
+
| 6 | Cache repeated queries | Identical, expensive, low-volatility queries don't need to hit the DB every time. | Are the same expensive read queries re-run frequently with unchanged results, and if so, are they cached? |
|
|
45
|
+
| 7 | Prune partitions | Partition pruning lets the DB skip irrelevant partitions entirely instead of scanning the whole table. | For large time-series/partitioned tables, does the query filter on the partition key so pruning can kick in? |
|
|
46
|
+
| 8 | Denormalize for reads | Trading write complexity/redundancy for fewer joins can be the right call once indexing alone isn't enough. | Has indexing been exhausted before reaching for denormalization, and is the redundancy kept in sync deliberately? |
|
|
47
|
+
| 9 | Batch your writes | Many small write round-trips cost more in overhead than one larger batched write. | Are writes that happen together (e.g. in a loop or transaction) batched instead of issued one at a time? |
|
|
48
|
+
| 10 | Update table statistics | A stale planner (out-of-date row-count/distribution stats) can pick a bad plan even with the right indexes present. | Are table statistics refreshed on a schedule (ANALYZE / equivalent), especially after large data changes? |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Networking Fundamentals
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 2: Networking Fundamentals
|
|
4
|
+
|
|
5
|
+
**When to run this:** When debugging connectivity, latency, or TLS issues, or before making infra decisions (load balancer, CDN, multi-region) that depend on understanding the network path.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Confirm the team can reason about what happens between a client request and a server response — not memorize trivia, but recognize which layer a given production issue actually lives in.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 2: Networking Fundamentals
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | DNS resolution | Wrong TTLs or stale records cause outages/slow failover that look like application bugs. | Do you know your DNS TTLs and what happens on a DNS provider outage or a failed cutover? |
|
|
40
|
+
| 2 | TCP handshake | SYN/SYN-ACK/ACK latency adds to every new connection; connection reuse avoids paying it repeatedly. | Are connections being reused (keep-alive/pooling) where the handshake cost matters? |
|
|
41
|
+
| 3 | TLS handshake | Adds round trips and CPU cost on top of TCP; session resumption and TLS version choice affect both. | Is TLS session resumption enabled, and is the minimum TLS version intentionally set? |
|
|
42
|
+
| 4 | NAT | Explains why a server sees one client IP for many real users, and why some P2P/inbound-connection patterns don't work as expected. | Does any rate-limiting or per-client logic depend on client IP, and does it account for NAT'd clients sharing an IP? |
|
|
43
|
+
| 5 | Load balancer types | L4 vs L7 balancers differ in what they can inspect and route on (raw TCP vs HTTP headers/paths). | Does the current load balancer type actually support the routing/health-check behavior the app needs? |
|
|
44
|
+
| 6 | CDN edge caching | Wrong cache-control headers cause either stale content served for too long or origin overload from no caching at all. | Are cache-control/CDN cache-key rules deliberately set per route, not left at CDN defaults? |
|
|
45
|
+
| 7 | Packet loss & retransmit | Retransmits show up as latency and timeouts that look application-side but are actually network-layer. | When debugging intermittent slowness, has packet loss been ruled out before blaming application code? |
|
|
46
|
+
| 8 | MTU / fragmentation | Oversized packets get fragmented or dropped, which shows up as weird partial-failure behavior, especially over VPNs/tunnels. | Has MTU mismatch been considered for any VPN, tunnel, or container network path in play? |
|
|
47
|
+
| 9 | Keep-alive | Persistent connections avoid the handshake cost per request but tie up server resources if left open too long. | Are keep-alive timeouts tuned deliberately on both client and server, not left at framework defaults? |
|
|
48
|
+
| 10 | BGP routing | Explains internet-scale outages and route leaks — usually outside your control, but recognizable when it's the actual cause. | When a broad, upstream-looking outage occurs, is BGP/routing considered as a possible cause rather than assumed to be your infra? |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Rate Limiting Algorithm Choices
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 3: Rate Limiting Algorithm Choices
|
|
4
|
+
|
|
5
|
+
**When to run this:** When designing or reviewing a rate limiter — this is a companion to the security check in security-gate/SECURITY_CHECKLIST.md → 01_API_Security/01_rate_limiting.md, focused on picking the right algorithm rather than confirming a limiter exists.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Make sure the chosen algorithm actually matches the traffic pattern being protected against, instead of defaulting to whatever's easiest to implement.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 3: Rate Limiting Algorithm Choices
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | Fixed window | Simple to implement but allows a burst of 2x the limit right at the window boundary. | If fixed window is used, is the boundary-burst behavior acceptable for this endpoint? |
|
|
40
|
+
| 2 | Sliding window log | Precise (tracks every request timestamp) but memory-heavy at scale. | If precision matters and volume is low/medium, is sliding window log a better fit than fixed window? |
|
|
41
|
+
| 3 | Sliding window counter | Approximates the sliding log with much less memory by weighting two adjacent fixed windows. | For high-volume endpoints needing better accuracy than fixed window, is sliding window counter being used instead of the log variant? |
|
|
42
|
+
| 4 | Token bucket | Allows controlled bursts up to the bucket size while enforcing a steady refill rate — good for bursty-but-bounded traffic. | Does the traffic pattern need to allow short bursts, and if so, is token bucket the chosen algorithm? |
|
|
43
|
+
| 5 | Leaky bucket | Smooths bursty input into a constant output rate — good for protecting a downstream system that can't handle spikes at all. | Is there a downstream system that needs a strictly constant request rate, and if so, is leaky bucket used to enforce it? |
|
|
44
|
+
| 6 | Distributed rate limiting | A per-instance limiter is meaningless behind a load balancer with multiple app servers — limits get multiplied by instance count. | If the app runs on more than one instance, is the rate limit state shared (e.g. via Redis) rather than per-instance? |
|
|
45
|
+
| 7 | Client-side throttling | Reduces wasted requests and improves UX, but is never sufficient alone since a client can be bypassed or malicious. | Does the client throttle its own request rate, and is server-side enforcement still present as the actual control? |
|
|
46
|
+
| 8 | Adaptive rate limiting | Static limits can be too strict in quiet periods or too loose under load; adaptive limits adjust to current system health. | Does the limiter adjust based on current load/error rate, or is it a single static number regardless of system state? |
|
|
47
|
+
| 9 | Concurrency limiting | Limits in-flight requests, not just requests-per-second — protects against slow requests piling up and exhausting resources. | Is there a cap on concurrent in-flight requests per client, separate from the requests-per-second limit? |
|
|
48
|
+
| 10 | Back pressure | Signals upstream to slow down instead of silently dropping or queuing indefinitely when a system is overloaded. | When downstream capacity is exceeded, does the system push back (429/503, queue limits) rather than accepting unbounded work? |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Production Debugging
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 4: Debugging Production Issues
|
|
4
|
+
|
|
5
|
+
**When to run this:** Before an incident happens — this is about having the right tooling and habits in place, not what to do during a live fire.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Confirm the team has the observability primitives needed to actually diagnose a production issue quickly, not just react to alerts.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 4: Debugging Production Issues
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | Correlation IDs | Without a shared ID, tracing one user's request across multiple services means grepping logs by timestamp and guessing. | Does every request get a correlation/request ID that's propagated across all services it touches and included in every log line? |
|
|
40
|
+
| 2 | Distributed tracing | Shows exactly where time is spent across a multi-service call chain — impossible to reconstruct from logs alone at scale. | Is distributed tracing (e.g. OpenTelemetry) instrumented across service boundaries? |
|
|
41
|
+
| 3 | Feature flag rollback | Turning off a bad feature via flag is faster and safer than a code rollback/redeploy under incident pressure. | Can the riskiest recent features be disabled via flag without a deploy? |
|
|
42
|
+
| 4 | Canary analysis | Rolling out to a small subset first catches regressions before they hit 100% of traffic. | Are risky changes rolled out to a canary/subset with automated comparison against the baseline before full rollout? |
|
|
43
|
+
| 5 | Replay traffic | Re-running real production requests against a fix confirms it actually resolves the issue, not just a synthetic test case. | Is there a way to replay real production traffic (or a sample) against a candidate fix before it ships? |
|
|
44
|
+
| 6 | Heap dumps | A heap dump is often the only way to root-cause a memory leak instead of guessing from symptoms. | Is heap-dump capture available (manually or via crash trigger) for services with memory-related symptoms? |
|
|
45
|
+
| 7 | Chaos testing | Deliberately injecting failure in a controlled way surfaces weaknesses before real, uncontrolled failure does. | Has chaos testing (killing instances, injecting latency/errors) been run against critical paths? |
|
|
46
|
+
| 8 | Synthetic monitoring | Catches outages and regressions from the outside, the way a real user would experience them, independent of internal metrics. | Are synthetic checks running against critical user journeys from outside the infrastructure? |
|
|
47
|
+
| 9 | Error budgets | Gives a quantified, agreed-upon threshold for how much unreliability is acceptable, so incident response isn't a judgment call every time. | Is there an agreed error budget per service, and does exceeding it trigger a defined response (e.g. freeze on new features)? |
|
|
48
|
+
| 10 | Postmortems | Without a blameless, written record, the same class of incident tends to recur because the lesson isn't institutionalized. | Does every significant incident get a blameless postmortem with concrete follow-up actions that are actually tracked to completion? |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Code Review Practices
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 5: Code Review Practices
|
|
4
|
+
|
|
5
|
+
**When to run this:** Ongoing — use this to periodically check whether the team's actual review habits match its stated process, not just once.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Keep review effective and fast rather than either a rubber stamp or a bottleneck.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 5: Code Review Practices
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | Small PRs | Large PRs get worse review (reviewers skim or rubber-stamp) and take longer to land. | Is there a rough size norm for PRs, and are oversized PRs flagged for splitting? |
|
|
40
|
+
| 2 | Clear description | A reviewer without context re-derives the 'why' from the diff alone, which is slower and more error-prone than being told. | Does every PR description explain what changed and why, not just restate the diff? |
|
|
41
|
+
| 3 | Constructive feedback | Feedback that reads as personal or vague either gets ignored or damages the reviewer/author relationship over time. | Is feedback phrased around the code/tradeoff rather than the author, with a suggested direction, not just a criticism? |
|
|
42
|
+
| 4 | Nitpick vs blocker | Without this distinction, minor style opinions can block a merge as if they were correctness issues. | Are non-blocking comments explicitly labeled (e.g. 'nit:') so the author knows what's optional vs required? |
|
|
43
|
+
| 5 | Fast turnaround | A PR that sits for days loses context for both author and reviewer and blocks downstream work. | Is there a target turnaround time for first review, and is it generally being met? |
|
|
44
|
+
| 6 | Automated checks first | Humans shouldn't spend review time on things a linter/CI can catch automatically. | Do lint, format, and test checks run and pass before a human reviews the PR? |
|
|
45
|
+
| 7 | Context before code | Reviewing code without understanding the surrounding system leads to reviews that miss integration-level problems. | Does the reviewer understand the relevant part of the system before diving into line-by-line comments? |
|
|
46
|
+
| 8 | Approve vs request changes | Conflating 'I have a question' with 'this is blocked' slows things down or sends mixed signals. | Is the approve/comment/request-changes distinction used deliberately, not defaulted to whichever is habit? |
|
|
47
|
+
| 9 | Self-review first | Authors catch a meaningful fraction of their own issues by re-reading the diff before asking someone else to. | Does the author review their own diff (and leave self-notes where useful) before requesting review? |
|
|
48
|
+
| 10 | Learning from reviews | Review comments that aren't retained just repeat themselves across future PRs instead of becoming shared knowledge. | Do recurring review comments get turned into a lint rule, style-guide entry, or documented convention? |
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Data Modeling
|
|
2
|
+
|
|
3
|
+
# Engineering Topic 6: Data Modeling Concepts
|
|
4
|
+
|
|
5
|
+
**When to run this:** When designing a new schema, adding a table/relationship to an existing one, or reviewing a migration before it ships.
|
|
6
|
+
|
|
7
|
+
**Goal of this pass:** Confirm the schema decisions are deliberate — the right relationship type, the right key strategy, the right precision — rather than whatever the ORM defaulted to.
|
|
8
|
+
|
|
9
|
+
## Files in this folder
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `CHECKLIST.md` | The reference list of concepts for this topic — what each one is, why it matters, and the self-check question to ask. Doesn't get filled in; copy `RESULTS_TEMPLATE.md` to record a real pass. |
|
|
14
|
+
| `RESULTS_TEMPLATE.md` | Fillable version of the same list, with a Status column and notes. Copy this file per pass (e.g. `RESULTS_2026-08-29.md`) so history isn't overwritten. |
|
|
15
|
+
|
|
16
|
+
Full source list lives in `../ENGINEERING_REFERENCE.md`. Unlike
|
|
17
|
+
`../../security-gate/phases/`, this is knowledge/practice review, not pass/fail security
|
|
18
|
+
testing — there's no severity rating, and "Fail" isn't the right framing.
|
|
19
|
+
Use the Status options in `RESULTS_TEMPLATE.md` instead: Applied, Partial,
|
|
20
|
+
Should adopt, or Not applicable.
|
|
21
|
+
|
|
22
|
+
## Wrap-up
|
|
23
|
+
|
|
24
|
+
- This isn't a gate — nothing here blocks a release the way
|
|
25
|
+
Critical/High security items in `../../security-gate/phases/` do.
|
|
26
|
+
- Total concepts in this topic: 10
|
|
27
|
+
- Useful as an onboarding read-through, a periodic self-audit, or context
|
|
28
|
+
to hand an agent before it reviews related code.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# Concepts — Topic 6: Data Modeling Concepts
|
|
33
|
+
|
|
34
|
+
Reference list only — no status column. Use `RESULTS_TEMPLATE.md` in
|
|
35
|
+
this same folder to actually record a pass.
|
|
36
|
+
|
|
37
|
+
| # | Concept | Why it matters | Self-check |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 1 | Primary vs foreign keys | Gets the basic referential integrity of the schema right; missing FK constraints let orphaned/inconsistent data accumulate silently. | Does every relationship that should be enforced have an actual FK constraint, not just an implied convention? |
|
|
40
|
+
| 2 | One-to-many | The most common relationship shape; modeling it as many-to-many or vice versa causes either data duplication or missing constraints. | For each relationship, has one-to-many vs many-to-many actually been verified against real-world cardinality, not assumed? |
|
|
41
|
+
| 3 | Many-to-many | Requires a join table; skipping it (e.g. storing a comma-separated list) breaks referential integrity and queryability. | Are many-to-many relationships modeled with a proper join table rather than a denormalized list column? |
|
|
42
|
+
| 4 | Composite keys | Sometimes the natural key is a combination of columns, not a synthetic ID — forcing a synthetic key can hide a real uniqueness constraint. | Where a natural composite key exists (e.g. user_id + role_id), is it enforced as a unique constraint even if a synthetic PK is also used? |
|
|
43
|
+
| 5 | Soft deletes | A `deleted_at` column preserves history/auditability but means every query must remember to filter it, or leaked 'deleted' data appears. | If soft deletes are used, do all reads consistently filter them out (e.g. via a default scope), and is that not forgotten in raw queries? |
|
|
44
|
+
| 6 | Polymorphic associations | Lets one table reference multiple other table types, but sacrifices FK constraint enforcement at the DB level — a known tradeoff, not a free pattern. | Where a polymorphic association is used, was that tradeoff (no DB-level FK) made deliberately, with integrity checks handled elsewhere? |
|
|
45
|
+
| 7 | Enum vs lookup table | A hardcoded enum is faster to query but requires a migration/deploy to add a value; a lookup table is more flexible but adds a join. | Was the enum-vs-lookup-table choice made based on how often the value set changes, not just habit? |
|
|
46
|
+
| 8 | Audit columns | Without created_at/updated_at/created_by-style columns, debugging 'when did this change and who did it' becomes guesswork. | Do tables that matter for debugging/compliance have consistent audit columns? |
|
|
47
|
+
| 9 | Schema migrations | Migrations that aren't reversible or aren't tested against production-scale data can cause downtime or data loss when they run for real. | Are migrations reviewed for reversibility and tested against realistic data volume before running on production? |
|
|
48
|
+
| 10 | Precision & data types | Using float for money, or too-small an int type for a growing counter, causes rounding errors or overflow that surface much later. | Are numeric types chosen deliberately (e.g. decimal for currency, right-sized int for counters expected to grow)? |
|