@grainulation/silo 1.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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +111 -0
- package/bin/silo.js +327 -0
- package/lib/analytics.js +76 -0
- package/lib/import-export.js +174 -0
- package/lib/index.js +28 -0
- package/lib/packs.js +184 -0
- package/lib/search.js +128 -0
- package/lib/serve-mcp.js +337 -0
- package/lib/server.js +425 -0
- package/lib/store.js +145 -0
- package/lib/templates.js +139 -0
- package/package.json +48 -0
- package/packs/api-design.json +189 -0
- package/packs/architecture.json +175 -0
- package/packs/ci-cd.json +175 -0
- package/packs/compliance.json +203 -0
- package/packs/data-engineering.json +175 -0
- package/packs/frontend.json +175 -0
- package/packs/migration.json +147 -0
- package/packs/observability.json +175 -0
- package/packs/security.json +175 -0
- package/packs/team-process.json +175 -0
- package/packs/testing.json +147 -0
- package/public/grainulation-tokens.css +321 -0
- package/public/index.html +803 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Application Security",
|
|
3
|
+
"description": "OWASP top 10 mitigations, auth patterns, secrets management, supply chain security, and hardening guidance for web applications.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"claims": [
|
|
6
|
+
{
|
|
7
|
+
"id": "sec-001",
|
|
8
|
+
"type": "constraint",
|
|
9
|
+
"topic": "SQL injection prevention",
|
|
10
|
+
"content": "All database queries must use parameterized statements or prepared queries. String concatenation for SQL is never acceptable, even for internal tools. ORMs provide this by default but raw queries must be audited. OWASP ranks injection as A03:2021.",
|
|
11
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
12
|
+
"evidence": "documented",
|
|
13
|
+
"status": "active",
|
|
14
|
+
"phase_added": "define",
|
|
15
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
16
|
+
"conflicts_with": [],
|
|
17
|
+
"resolved_by": null,
|
|
18
|
+
"tags": ["security", "owasp", "injection", "sql"]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "sec-002",
|
|
22
|
+
"type": "constraint",
|
|
23
|
+
"topic": "secrets never in source control",
|
|
24
|
+
"content": "Secrets (API keys, database credentials, signing keys) must never appear in source control, including in commit history. Use environment variables, secret managers (Vault, AWS Secrets Manager, 1Password CLI), or encrypted .env files with .gitignore. Rotate any secret that has ever been committed.",
|
|
25
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
26
|
+
"evidence": "documented",
|
|
27
|
+
"status": "active",
|
|
28
|
+
"phase_added": "define",
|
|
29
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
30
|
+
"conflicts_with": [],
|
|
31
|
+
"resolved_by": null,
|
|
32
|
+
"tags": ["security", "secrets", "source-control"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "sec-003",
|
|
36
|
+
"type": "recommendation",
|
|
37
|
+
"topic": "JWT access token lifetime",
|
|
38
|
+
"content": "JWT access tokens should have a lifetime of 5-15 minutes. Refresh tokens should be opaque (not JWT), stored server-side, rotated on each use, and have a maximum lifetime of 7-30 days. Never store JWTs in localStorage; use httpOnly secure cookies or in-memory storage.",
|
|
39
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
40
|
+
"evidence": "documented",
|
|
41
|
+
"status": "active",
|
|
42
|
+
"phase_added": "define",
|
|
43
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
44
|
+
"conflicts_with": [],
|
|
45
|
+
"resolved_by": null,
|
|
46
|
+
"tags": ["security", "auth", "jwt", "tokens"]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "sec-004",
|
|
50
|
+
"type": "risk",
|
|
51
|
+
"topic": "dependency supply chain attacks",
|
|
52
|
+
"content": "npm, PyPI, and other registries are vectors for supply chain attacks (typosquatting, maintainer account takeover, malicious postinstall scripts). Pin exact dependency versions, use lockfiles, audit with npm audit / pip-audit, and consider running install with --ignore-scripts in CI.",
|
|
53
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
54
|
+
"evidence": "production",
|
|
55
|
+
"status": "active",
|
|
56
|
+
"phase_added": "define",
|
|
57
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
58
|
+
"conflicts_with": [],
|
|
59
|
+
"resolved_by": null,
|
|
60
|
+
"tags": ["security", "supply-chain", "dependencies", "npm"]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "sec-005",
|
|
64
|
+
"type": "factual",
|
|
65
|
+
"topic": "bcrypt cost factor",
|
|
66
|
+
"content": "bcrypt with a cost factor of 10 takes approximately 100ms to hash on modern hardware. Increase to 12 (roughly 400ms) for high-security contexts. Argon2id is the current OWASP recommendation for new projects, with minimum parameters: 19 MiB memory, 2 iterations, 1 parallelism.",
|
|
67
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
68
|
+
"evidence": "documented",
|
|
69
|
+
"status": "active",
|
|
70
|
+
"phase_added": "define",
|
|
71
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
72
|
+
"conflicts_with": [],
|
|
73
|
+
"resolved_by": null,
|
|
74
|
+
"tags": ["security", "auth", "hashing", "passwords"]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "sec-006",
|
|
78
|
+
"type": "constraint",
|
|
79
|
+
"topic": "CORS allowlist",
|
|
80
|
+
"content": "CORS Access-Control-Allow-Origin must never be set to * for authenticated endpoints. Maintain an explicit allowlist of permitted origins. Reflect the Origin header only if it matches the allowlist. Misconfigured CORS is OWASP A01:2021 (Broken Access Control).",
|
|
81
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
82
|
+
"evidence": "documented",
|
|
83
|
+
"status": "active",
|
|
84
|
+
"phase_added": "define",
|
|
85
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
86
|
+
"conflicts_with": [],
|
|
87
|
+
"resolved_by": null,
|
|
88
|
+
"tags": ["security", "cors", "owasp", "access-control"]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "sec-007",
|
|
92
|
+
"type": "recommendation",
|
|
93
|
+
"topic": "CSP header configuration",
|
|
94
|
+
"content": "Content-Security-Policy should start strict and loosen as needed: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'. Avoid 'unsafe-inline' and 'unsafe-eval'. Use nonces for inline scripts if unavoidable. Report violations with report-uri or report-to.",
|
|
95
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
96
|
+
"evidence": "documented",
|
|
97
|
+
"status": "active",
|
|
98
|
+
"phase_added": "define",
|
|
99
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
100
|
+
"conflicts_with": [],
|
|
101
|
+
"resolved_by": null,
|
|
102
|
+
"tags": ["security", "csp", "headers", "xss"]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "sec-008",
|
|
106
|
+
"type": "risk",
|
|
107
|
+
"topic": "SSRF in internal services",
|
|
108
|
+
"content": "Server-Side Request Forgery (SSRF) allows attackers to make requests from your server to internal networks, cloud metadata endpoints (169.254.169.254), or localhost services. Validate and allowlist all URLs that originate from user input. Block requests to private IP ranges and link-local addresses.",
|
|
109
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
110
|
+
"evidence": "production",
|
|
111
|
+
"status": "active",
|
|
112
|
+
"phase_added": "define",
|
|
113
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
114
|
+
"conflicts_with": [],
|
|
115
|
+
"resolved_by": null,
|
|
116
|
+
"tags": ["security", "ssrf", "owasp", "cloud"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "sec-009",
|
|
120
|
+
"type": "recommendation",
|
|
121
|
+
"topic": "rate limiting auth endpoints",
|
|
122
|
+
"content": "Login endpoints must be rate-limited to no more than 10 attempts per IP per minute and 5 attempts per account per minute. After 5 consecutive failures for an account, enforce exponential backoff or temporary lockout (15-30 minutes). Log all failed attempts with IP and timestamp for anomaly detection.",
|
|
123
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
124
|
+
"evidence": "documented",
|
|
125
|
+
"status": "active",
|
|
126
|
+
"phase_added": "define",
|
|
127
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
128
|
+
"conflicts_with": [],
|
|
129
|
+
"resolved_by": null,
|
|
130
|
+
"tags": ["security", "auth", "rate-limiting", "brute-force"]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "sec-010",
|
|
134
|
+
"type": "factual",
|
|
135
|
+
"topic": "HTTPS and HSTS requirements",
|
|
136
|
+
"content": "All production traffic must use TLS 1.2 or higher. TLS 1.0 and 1.1 are deprecated (RFC 8996). Set Strict-Transport-Security header with max-age of at least 31536000 (1 year) and includeSubDomains. Submit to the HSTS preload list for public-facing domains.",
|
|
137
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
138
|
+
"evidence": "documented",
|
|
139
|
+
"status": "active",
|
|
140
|
+
"phase_added": "define",
|
|
141
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
142
|
+
"conflicts_with": [],
|
|
143
|
+
"resolved_by": null,
|
|
144
|
+
"tags": ["security", "tls", "https", "hsts"]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "sec-011",
|
|
148
|
+
"type": "risk",
|
|
149
|
+
"topic": "insecure deserialization",
|
|
150
|
+
"content": "Never deserialize untrusted data with language-native serialization (Java ObjectInputStream, Python pickle, PHP unserialize). These allow arbitrary code execution. Use JSON or Protocol Buffers with schema validation instead. OWASP A08:2021 (Software and Data Integrity Failures).",
|
|
151
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
152
|
+
"evidence": "documented",
|
|
153
|
+
"status": "active",
|
|
154
|
+
"phase_added": "define",
|
|
155
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
156
|
+
"conflicts_with": [],
|
|
157
|
+
"resolved_by": null,
|
|
158
|
+
"tags": ["security", "deserialization", "owasp", "rce"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"id": "sec-012",
|
|
162
|
+
"type": "recommendation",
|
|
163
|
+
"topic": "least privilege for service accounts",
|
|
164
|
+
"content": "Service accounts and IAM roles must follow least privilege: grant only the specific actions on the specific resources needed. Audit permissions quarterly. AWS policies should never use Resource: * with Action: *. Use IAM Access Analyzer to identify unused permissions.",
|
|
165
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
166
|
+
"evidence": "documented",
|
|
167
|
+
"status": "active",
|
|
168
|
+
"phase_added": "define",
|
|
169
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
170
|
+
"conflicts_with": [],
|
|
171
|
+
"resolved_by": null,
|
|
172
|
+
"tags": ["security", "iam", "least-privilege", "cloud"]
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Team Process and Engineering Culture",
|
|
3
|
+
"description": "Code review practices, on-call rotation design, postmortem processes, RFC workflows, tech debt management, and estimation techniques for engineering teams.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"claims": [
|
|
6
|
+
{
|
|
7
|
+
"id": "team-001",
|
|
8
|
+
"type": "constraint",
|
|
9
|
+
"topic": "code review turnaround time",
|
|
10
|
+
"content": "Code reviews should receive first-pass feedback within 4 business hours. Reviews taking longer than 24 hours are the top-cited blocker for developer productivity (Google Developer Survey 2023). Set team norms: reviews under 400 lines get same-day response, larger PRs should be split or paired on.",
|
|
11
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
12
|
+
"evidence": "documented",
|
|
13
|
+
"status": "active",
|
|
14
|
+
"phase_added": "define",
|
|
15
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
16
|
+
"conflicts_with": [],
|
|
17
|
+
"resolved_by": null,
|
|
18
|
+
"tags": ["team-process", "code-review", "developer-experience", "productivity"]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "team-002",
|
|
22
|
+
"type": "factual",
|
|
23
|
+
"topic": "PR size and defect correlation",
|
|
24
|
+
"content": "Code review effectiveness drops sharply after 400 lines of change. Google research shows defect detection rate falls from 70% for small PRs (<200 lines) to under 30% for large PRs (>1000 lines). Reviewers spend an average of 20 minutes regardless of PR size. Break large changes into stacked PRs of 200-400 lines each.",
|
|
25
|
+
"source": { "origin": "industry", "artifact": null, "connector": null },
|
|
26
|
+
"evidence": "documented",
|
|
27
|
+
"status": "active",
|
|
28
|
+
"phase_added": "define",
|
|
29
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
30
|
+
"conflicts_with": [],
|
|
31
|
+
"resolved_by": null,
|
|
32
|
+
"tags": ["team-process", "code-review", "pr-size", "quality"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "team-003",
|
|
36
|
+
"type": "recommendation",
|
|
37
|
+
"topic": "on-call rotation design",
|
|
38
|
+
"content": "On-call rotations should be 1 week per engineer, with a minimum of 6 people in the rotation (no more than 1 week in 6 on primary). Provide a secondary on-call who shadows. Compensate on-call with either extra pay (10-15% of base for the week) or time off (1 day per week on-call). On-call without compensation breeds resentment and attrition.",
|
|
39
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
40
|
+
"evidence": "production",
|
|
41
|
+
"status": "active",
|
|
42
|
+
"phase_added": "define",
|
|
43
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
44
|
+
"conflicts_with": [],
|
|
45
|
+
"resolved_by": null,
|
|
46
|
+
"tags": ["team-process", "on-call", "rotation", "compensation"]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "team-004",
|
|
50
|
+
"type": "recommendation",
|
|
51
|
+
"topic": "RFC process for decisions",
|
|
52
|
+
"content": "Use RFCs (Request for Comments) for decisions that are: cross-team, hard to reverse, or affect more than 3 people. RFC template: Context (why now), Proposal (what), Alternatives considered (at least 2), Tradeoffs, Migration plan. Set a review period of 5 business days. Silence is not consent; require explicit approvals from stakeholders. Archive accepted RFCs as ADRs.",
|
|
53
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
54
|
+
"evidence": "documented",
|
|
55
|
+
"status": "active",
|
|
56
|
+
"phase_added": "define",
|
|
57
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
58
|
+
"conflicts_with": [],
|
|
59
|
+
"resolved_by": null,
|
|
60
|
+
"tags": ["team-process", "rfc", "decision-making", "adr"]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "team-005",
|
|
64
|
+
"type": "risk",
|
|
65
|
+
"topic": "tech debt compounding",
|
|
66
|
+
"content": "Tech debt compounds: workarounds on top of workarounds increase the cost of every future change. Without explicit allocation, tech debt grows 25-40% per year in velocity cost (Stripe Developer Survey 2018: developers spend 42% of time on tech debt). Allocate 15-20% of sprint capacity to tech debt reduction, tracked with a dedicated backlog and quarterly review.",
|
|
67
|
+
"source": { "origin": "industry", "artifact": null, "connector": null },
|
|
68
|
+
"evidence": "web",
|
|
69
|
+
"status": "active",
|
|
70
|
+
"phase_added": "define",
|
|
71
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
72
|
+
"conflicts_with": [],
|
|
73
|
+
"resolved_by": null,
|
|
74
|
+
"tags": ["team-process", "tech-debt", "velocity", "planning"]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "team-006",
|
|
78
|
+
"type": "factual",
|
|
79
|
+
"topic": "estimation accuracy ranges",
|
|
80
|
+
"content": "Software estimation accuracy follows the Cone of Uncertainty: at project inception, estimates are 0.25x-4x actual. After requirements, 0.5x-2x. After detailed design, 0.67x-1.5x. After code complete, 0.9x-1.1x. Communicate estimates as ranges, never single points. Use relative sizing (story points) for prioritization and historical velocity for date forecasting.",
|
|
81
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
82
|
+
"evidence": "documented",
|
|
83
|
+
"status": "active",
|
|
84
|
+
"phase_added": "define",
|
|
85
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
86
|
+
"conflicts_with": [],
|
|
87
|
+
"resolved_by": null,
|
|
88
|
+
"tags": ["team-process", "estimation", "planning", "uncertainty"]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "team-007",
|
|
92
|
+
"type": "recommendation",
|
|
93
|
+
"topic": "postmortem action item tracking",
|
|
94
|
+
"content": "Postmortem action items must have: a single owner (not a team), a due date within 30 days, and a tracking ticket. Review incomplete action items at the start of every postmortem meeting. Teams that do not track action items to completion repeat the same incidents. 60% of incidents are caused by previously identified but unresolved issues.",
|
|
95
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
96
|
+
"evidence": "production",
|
|
97
|
+
"status": "active",
|
|
98
|
+
"phase_added": "define",
|
|
99
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
100
|
+
"conflicts_with": [],
|
|
101
|
+
"resolved_by": null,
|
|
102
|
+
"tags": ["team-process", "postmortem", "incident-response", "accountability"]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "team-008",
|
|
106
|
+
"type": "constraint",
|
|
107
|
+
"topic": "meeting hygiene for engineers",
|
|
108
|
+
"content": "Protect maker time: engineers need 4-hour uninterrupted blocks for complex work. Meeting-free mornings or meeting-free days (e.g., no meetings on Tuesday/Thursday) measurably increase output. Context-switching between meetings costs 15-25 minutes of recovery time per switch. Batch meetings into afternoon blocks.",
|
|
109
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
110
|
+
"evidence": "web",
|
|
111
|
+
"status": "active",
|
|
112
|
+
"phase_added": "define",
|
|
113
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
114
|
+
"conflicts_with": [],
|
|
115
|
+
"resolved_by": null,
|
|
116
|
+
"tags": ["team-process", "meetings", "focus-time", "productivity"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "team-009",
|
|
120
|
+
"type": "recommendation",
|
|
121
|
+
"topic": "runbook-driven operations",
|
|
122
|
+
"content": "Every alert and recurring operational task should have a runbook: what the alert means, how to diagnose, step-by-step remediation, escalation criteria, and who to contact. Runbooks reduce MTTR by 40-60% for on-call engineers encountering unfamiliar alerts. Store runbooks alongside alert definitions, linked by alert name. Review and update runbooks after every incident.",
|
|
123
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
124
|
+
"evidence": "production",
|
|
125
|
+
"status": "active",
|
|
126
|
+
"phase_added": "define",
|
|
127
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
128
|
+
"conflicts_with": [],
|
|
129
|
+
"resolved_by": null,
|
|
130
|
+
"tags": ["team-process", "runbooks", "on-call", "operations"]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "team-010",
|
|
134
|
+
"type": "risk",
|
|
135
|
+
"topic": "bus factor for critical systems",
|
|
136
|
+
"content": "Bus factor (number of people who could be hit by a bus before the project stalls) of 1 is a critical risk. Mitigate with: pair programming or rotation on critical systems, mandatory documentation for system architecture and runbooks, cross-training sessions quarterly, and code review requirements that expose at least 2 people to every area of the codebase.",
|
|
137
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
138
|
+
"evidence": "documented",
|
|
139
|
+
"status": "active",
|
|
140
|
+
"phase_added": "define",
|
|
141
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
142
|
+
"conflicts_with": [],
|
|
143
|
+
"resolved_by": null,
|
|
144
|
+
"tags": ["team-process", "bus-factor", "knowledge-sharing", "risk"]
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"id": "team-011",
|
|
148
|
+
"type": "estimate",
|
|
149
|
+
"topic": "onboarding ramp-up time",
|
|
150
|
+
"content": "New engineer onboarding to full productivity takes: 1-2 weeks for development environment setup and first PR, 1-3 months for independent feature delivery, 3-6 months for system-level understanding and architecture contributions. Structured onboarding programs (buddy system, 30/60/90-day goals, curated codebase walkthroughs) reduce ramp-up by 30-40% compared to ad-hoc onboarding.",
|
|
151
|
+
"source": { "origin": "industry", "artifact": null, "connector": null },
|
|
152
|
+
"evidence": "web",
|
|
153
|
+
"status": "active",
|
|
154
|
+
"phase_added": "define",
|
|
155
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
156
|
+
"conflicts_with": [],
|
|
157
|
+
"resolved_by": null,
|
|
158
|
+
"tags": ["team-process", "onboarding", "hiring", "ramp-up"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"id": "team-012",
|
|
162
|
+
"type": "recommendation",
|
|
163
|
+
"topic": "retrospective action limits",
|
|
164
|
+
"content": "Limit retrospective action items to 2-3 per sprint. Teams that generate 8-10 action items per retro complete fewer than 20% of them, creating learned helplessness. Pick the highest-impact items, assign owners, and carry forward only incomplete items from the previous retro. If the same item appears 3 retros in a row, escalate it.",
|
|
165
|
+
"source": { "origin": "best-practice", "artifact": null, "connector": null },
|
|
166
|
+
"evidence": "documented",
|
|
167
|
+
"status": "active",
|
|
168
|
+
"phase_added": "define",
|
|
169
|
+
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
170
|
+
"conflicts_with": [],
|
|
171
|
+
"resolved_by": null,
|
|
172
|
+
"tags": ["team-process", "retrospective", "agile", "continuous-improvement"]
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Testing Strategy",
|
|
3
|
+
"description": "Integration and smoke testing patterns for multi-tool ecosystems. Covers server endpoint testing, UI consistency validation, cross-tool integration, and CI pipeline alignment with zero external test dependencies.",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"claims": [
|
|
6
|
+
{
|
|
7
|
+
"id": "test-001",
|
|
8
|
+
"type": "constraint",
|
|
9
|
+
"topic": "test framework",
|
|
10
|
+
"content": "All tests must use node:test and node:assert/strict with zero external dependencies. No Jest, Mocha, Vitest, or other frameworks.",
|
|
11
|
+
"source": { "origin": "architecture", "artifact": null, "connector": null },
|
|
12
|
+
"evidence": "documented",
|
|
13
|
+
"status": "active",
|
|
14
|
+
"phase_added": "define",
|
|
15
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
16
|
+
"conflicts_with": [],
|
|
17
|
+
"resolved_by": null,
|
|
18
|
+
"tags": ["testing", "node-test", "zero-dep"]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "test-002",
|
|
22
|
+
"type": "constraint",
|
|
23
|
+
"topic": "test isolation",
|
|
24
|
+
"content": "Tests must use real filesystem (mkdtempSync), real processes (child_process.spawn), and real HTTP. No mocks, no spies, no test doubles.",
|
|
25
|
+
"source": { "origin": "architecture", "artifact": null, "connector": null },
|
|
26
|
+
"evidence": "documented",
|
|
27
|
+
"status": "active",
|
|
28
|
+
"phase_added": "define",
|
|
29
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
30
|
+
"conflicts_with": [],
|
|
31
|
+
"resolved_by": null,
|
|
32
|
+
"tags": ["testing", "integration", "no-mocks"]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "test-003",
|
|
36
|
+
"type": "recommendation",
|
|
37
|
+
"topic": "server endpoint tests",
|
|
38
|
+
"content": "Every tool server needs endpoint tests: spawn server on random port, hit each route with node:http, assert status codes and response shapes, teardown. Covers /health, /api/state, SSE /events, and tool-specific CRUD endpoints.",
|
|
39
|
+
"source": { "origin": "research", "artifact": null, "connector": null },
|
|
40
|
+
"evidence": "tested",
|
|
41
|
+
"status": "active",
|
|
42
|
+
"phase_added": "research",
|
|
43
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
44
|
+
"conflicts_with": [],
|
|
45
|
+
"resolved_by": null,
|
|
46
|
+
"tags": ["testing", "server", "http", "endpoints"]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "test-004",
|
|
50
|
+
"type": "recommendation",
|
|
51
|
+
"topic": "UI smoke tests",
|
|
52
|
+
"content": "Validate HTML consistency by parsing index.html as a string: check required DOM IDs (searchInput, grainLogo, main-content, sse-dot), CSS tokens (--bg, --accent), TOOL config object, self-contained rule (no external scripts/styles), and keyboard shortcut handlers.",
|
|
53
|
+
"source": { "origin": "research", "artifact": null, "connector": null },
|
|
54
|
+
"evidence": "tested",
|
|
55
|
+
"status": "active",
|
|
56
|
+
"phase_added": "research",
|
|
57
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
58
|
+
"conflicts_with": [],
|
|
59
|
+
"resolved_by": null,
|
|
60
|
+
"tags": ["testing", "ui", "smoke-test", "consistency"]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "test-005",
|
|
64
|
+
"type": "recommendation",
|
|
65
|
+
"topic": "cross-tool integration",
|
|
66
|
+
"content": "Integration tests must validate the full pipeline: wheat init -> compile -> mill reads compilation, silo imports claims, barn detects sprints, wheat connect farmer registers hooks. Each test creates a temp sprint and cleans up.",
|
|
67
|
+
"source": { "origin": "research", "artifact": null, "connector": null },
|
|
68
|
+
"evidence": "tested",
|
|
69
|
+
"status": "active",
|
|
70
|
+
"phase_added": "research",
|
|
71
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
72
|
+
"conflicts_with": [],
|
|
73
|
+
"resolved_by": null,
|
|
74
|
+
"tags": ["testing", "integration", "cross-tool", "pipeline"]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "test-006",
|
|
78
|
+
"type": "constraint",
|
|
79
|
+
"topic": "CI matrix",
|
|
80
|
+
"content": "CI must test on Node 18, 20, and 22. Every CI run verifies zero runtime dependencies, runs all tests, checks CLI --help, and performs a dry-run npm publish.",
|
|
81
|
+
"source": { "origin": "architecture", "artifact": ".github/workflows/ci.yml", "connector": null },
|
|
82
|
+
"evidence": "documented",
|
|
83
|
+
"status": "active",
|
|
84
|
+
"phase_added": "define",
|
|
85
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
86
|
+
"conflicts_with": [],
|
|
87
|
+
"resolved_by": null,
|
|
88
|
+
"tags": ["testing", "ci", "node-matrix", "github-actions"]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "test-007",
|
|
92
|
+
"type": "factual",
|
|
93
|
+
"topic": "test coverage baseline",
|
|
94
|
+
"content": "Baseline: 191 tests across 5 repos (wheat 25, barn 58, mill 30, silo 21, ranch 44). After adding server, UI smoke, and cross-tool tests: ~260 tests total.",
|
|
95
|
+
"source": { "origin": "measurement", "artifact": null, "connector": null },
|
|
96
|
+
"evidence": "tested",
|
|
97
|
+
"status": "active",
|
|
98
|
+
"phase_added": "research",
|
|
99
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
100
|
+
"conflicts_with": [],
|
|
101
|
+
"resolved_by": null,
|
|
102
|
+
"tags": ["testing", "coverage", "baseline"]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "test-008",
|
|
106
|
+
"type": "risk",
|
|
107
|
+
"topic": "server test port conflicts",
|
|
108
|
+
"content": "Server tests must use random ports (bind to port 0, read assigned port) to avoid conflicts with running dev servers or parallel CI jobs.",
|
|
109
|
+
"source": { "origin": "experience", "artifact": null, "connector": null },
|
|
110
|
+
"evidence": "tested",
|
|
111
|
+
"status": "active",
|
|
112
|
+
"phase_added": "research",
|
|
113
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
114
|
+
"conflicts_with": [],
|
|
115
|
+
"resolved_by": null,
|
|
116
|
+
"tags": ["testing", "server", "ports", "ci"]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "test-009",
|
|
120
|
+
"type": "recommendation",
|
|
121
|
+
"topic": "SSE testing pattern",
|
|
122
|
+
"content": "Test SSE endpoints by connecting with http.get, reading the first data frame, parsing it as JSON, and asserting the state shape. Destroy the connection after assertion to avoid hanging tests.",
|
|
123
|
+
"source": { "origin": "research", "artifact": null, "connector": null },
|
|
124
|
+
"evidence": "tested",
|
|
125
|
+
"status": "active",
|
|
126
|
+
"phase_added": "research",
|
|
127
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
128
|
+
"conflicts_with": [],
|
|
129
|
+
"resolved_by": null,
|
|
130
|
+
"tags": ["testing", "sse", "server-sent-events", "pattern"]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "test-010",
|
|
134
|
+
"type": "recommendation",
|
|
135
|
+
"topic": "test execution order",
|
|
136
|
+
"content": "Execute in layers: (1) fix broken tests, (2) server endpoint tests, (3) UI smoke tests, (4) cross-tool integration, (5) CI wiring. Each layer is independently valuable and ships as its own commit.",
|
|
137
|
+
"source": { "origin": "research", "artifact": null, "connector": null },
|
|
138
|
+
"evidence": "stated",
|
|
139
|
+
"status": "active",
|
|
140
|
+
"phase_added": "research",
|
|
141
|
+
"timestamp": "2026-03-16T00:00:00.000Z",
|
|
142
|
+
"conflicts_with": [],
|
|
143
|
+
"resolved_by": null,
|
|
144
|
+
"tags": ["testing", "strategy", "execution-order"]
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
}
|