@cat-factory/sandbox-fixtures 0.7.360 → 0.8.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/dist/fixtures/answer-recommendation.d.ts +3 -0
- package/dist/fixtures/answer-recommendation.d.ts.map +1 -0
- package/dist/fixtures/answer-recommendation.js +336 -0
- package/dist/fixtures/answer-recommendation.js.map +1 -0
- package/dist/fixtures/architecture.d.ts.map +1 -1
- package/dist/fixtures/architecture.js +94 -4
- package/dist/fixtures/architecture.js.map +1 -1
- package/dist/fixtures/clarity.d.ts.map +1 -1
- package/dist/fixtures/clarity.js +120 -8
- package/dist/fixtures/clarity.js.map +1 -1
- package/dist/fixtures/code-review-repo.d.ts +3 -0
- package/dist/fixtures/code-review-repo.d.ts.map +1 -0
- package/dist/fixtures/code-review-repo.js +307 -0
- package/dist/fixtures/code-review-repo.js.map +1 -0
- package/dist/fixtures/code-review.d.ts.map +1 -1
- package/dist/fixtures/code-review.js +8 -2
- package/dist/fixtures/code-review.js.map +1 -1
- package/dist/fixtures/estimation.d.ts +3 -0
- package/dist/fixtures/estimation.d.ts.map +1 -0
- package/dist/fixtures/estimation.js +277 -0
- package/dist/fixtures/estimation.js.map +1 -0
- package/dist/fixtures/requirements.d.ts.map +1 -1
- package/dist/fixtures/requirements.js +91 -2
- package/dist/fixtures/requirements.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +6 -0
- package/dist/registry.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-recommendation.d.ts","sourceRoot":"","sources":["../../src/fixtures/answer-recommendation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAyC3D,eAAO,MAAM,8BAA8B,EAAE,wBAAwB,EAoapE,CAAA"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { exp } from '../expectation.js';
|
|
2
|
+
// requirements-writer fixtures. The payload carries the three things
|
|
3
|
+
// `buildRecommendationPrompt` needs: the `RequirementsContext` under review, the `findings` to
|
|
4
|
+
// answer (one recommendation per id), and the `grounding` material in the Writer's own precedence
|
|
5
|
+
// order (team standards → in-repo spec excerpts → web results).
|
|
6
|
+
//
|
|
7
|
+
// What makes these fixtures different from the reviewer ones is that the Writer's output is judged
|
|
8
|
+
// as much on its SELF-REPORTS as on its answers. `groundedIn` is the provenance a human checks
|
|
9
|
+
// before trusting a suggestion, and `confidence` is what an unattended run compares against its
|
|
10
|
+
// auto-answer floor (ADR 0053) before adopting an answer with nobody reading it. So the grounding is
|
|
11
|
+
// varied deliberately across the three: one finding a standard settles outright, one the project's
|
|
12
|
+
// own spec settles, and several that rest on nothing but general practice. A Writer that cites a
|
|
13
|
+
// standard it was not given, or reports high confidence on a question about this business it was
|
|
14
|
+
// never told about, is the failure these fixtures exist to expose.
|
|
15
|
+
/** One finding for the Writer to answer, in the stored review-item shape. */
|
|
16
|
+
function finding(id, title, detail, over = {}) {
|
|
17
|
+
return {
|
|
18
|
+
id,
|
|
19
|
+
category: over.category ?? 'gap',
|
|
20
|
+
severity: over.severity ?? 'medium',
|
|
21
|
+
title,
|
|
22
|
+
detail,
|
|
23
|
+
status: 'recommend_requested',
|
|
24
|
+
reply: null,
|
|
25
|
+
autoAnswerable: over.autoAnswerable ?? true,
|
|
26
|
+
createdAt: 0,
|
|
27
|
+
updatedAt: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export const ANSWER_RECOMMENDATION_FIXTURES = [
|
|
31
|
+
{
|
|
32
|
+
id: 'writer-session-timeout-simple',
|
|
33
|
+
agentKind: 'requirements-writer',
|
|
34
|
+
kind: 'answer-recommendation',
|
|
35
|
+
name: 'Session timeout defaults (simple)',
|
|
36
|
+
difficulty: 'simple',
|
|
37
|
+
summary: 'Two findings a team standard settles outright, plus one it does not.',
|
|
38
|
+
payload: {
|
|
39
|
+
block: {
|
|
40
|
+
title: 'Sign users out after a period of inactivity',
|
|
41
|
+
type: 'service',
|
|
42
|
+
description: 'Sign a user out when they have been inactive for a while, so an unattended browser does ' +
|
|
43
|
+
'not stay signed in. Warn them shortly before it happens.',
|
|
44
|
+
},
|
|
45
|
+
docs: [],
|
|
46
|
+
tasks: [],
|
|
47
|
+
service: {
|
|
48
|
+
stated: true,
|
|
49
|
+
frameId: 'frame-console',
|
|
50
|
+
title: 'Customer console',
|
|
51
|
+
description: 'The signed-in web console customers manage their account from.',
|
|
52
|
+
},
|
|
53
|
+
findings: [
|
|
54
|
+
finding('timeout-length', 'How long is "a while"?', 'The spec asks for an inactivity sign-out but names no duration.', { severity: 'high' }),
|
|
55
|
+
finding('warning-lead', 'How long before the sign-out is the warning shown?', '"Shortly before" is not a duration a build can implement.'),
|
|
56
|
+
finding('billing-exception', 'Should a user mid-way through a checkout flow be signed out?', 'Signing someone out during payment loses the transaction; keeping them in weakens the ' +
|
|
57
|
+
'protection. This is a business trade-off.', { category: 'question', severity: 'high', autoAnswerable: false }),
|
|
58
|
+
],
|
|
59
|
+
grounding: {
|
|
60
|
+
fragments: [
|
|
61
|
+
{
|
|
62
|
+
id: 'std-session-policy',
|
|
63
|
+
title: 'Session and inactivity policy',
|
|
64
|
+
body: 'Signed-in sessions in customer-facing products expire after 30 minutes of ' +
|
|
65
|
+
'inactivity. A warning dialog is shown 2 minutes before expiry and offers to extend ' +
|
|
66
|
+
'the session. Sessions never expire while a request is in flight.',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
specExcerpts: [],
|
|
70
|
+
webResults: [],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
expectations: [
|
|
74
|
+
exp('cites-standard', 'Answers the timeout from the standard and names it as the source.', {
|
|
75
|
+
impact: 5,
|
|
76
|
+
trickiness: 1,
|
|
77
|
+
detail: 'The standard states 30 minutes outright. Answering with a different number, or with the ' +
|
|
78
|
+
'right number but `groundedIn: general-practice`, both fail: the first ignores the ' +
|
|
79
|
+
'precedence rule, the second under-reports provenance a human would have trusted.',
|
|
80
|
+
matchHints: ['30 minutes', 'thirty minutes', 'std-session-policy', 'standard'],
|
|
81
|
+
}),
|
|
82
|
+
exp('warning-lead-from-standard', 'Takes the 2-minute warning lead from the same standard.', {
|
|
83
|
+
impact: 4,
|
|
84
|
+
trickiness: 2,
|
|
85
|
+
matchHints: ['2 minutes', 'two minutes', 'warning', 'before expiry'],
|
|
86
|
+
}),
|
|
87
|
+
exp('checkout-needs-owner', 'Flags the checkout exception as a business decision and rates its confidence low.', {
|
|
88
|
+
impact: 5,
|
|
89
|
+
trickiness: 4,
|
|
90
|
+
detail: 'The calibration test. Nothing the Writer was given settles whether payment beats ' +
|
|
91
|
+
'security here, so a high-confidence answer invites an unattended run to adopt it with ' +
|
|
92
|
+
'nobody reading it. The honest move is a concrete default at LOW confidence.',
|
|
93
|
+
matchHints: [
|
|
94
|
+
'business decision',
|
|
95
|
+
'product owner',
|
|
96
|
+
'low confidence',
|
|
97
|
+
'not confident',
|
|
98
|
+
'cannot be sure',
|
|
99
|
+
'depends on',
|
|
100
|
+
'needs a decision',
|
|
101
|
+
],
|
|
102
|
+
}),
|
|
103
|
+
exp('in-flight-rule', 'Notices the standard already answers part of the checkout case: a session never expires while a request is in flight.', {
|
|
104
|
+
impact: 3,
|
|
105
|
+
trickiness: 5,
|
|
106
|
+
detail: 'The standout catch: the standard is not silent on the trade-off, it partly settles it. ' +
|
|
107
|
+
'Reading a constraint out of the grounding rather than only matching a number is the ' +
|
|
108
|
+
'skill.',
|
|
109
|
+
matchHints: [
|
|
110
|
+
'in flight',
|
|
111
|
+
'in-flight',
|
|
112
|
+
'request is in flight',
|
|
113
|
+
'active request',
|
|
114
|
+
'while a request',
|
|
115
|
+
],
|
|
116
|
+
}),
|
|
117
|
+
],
|
|
118
|
+
notes: 'The standard-settles-it case. The trap is the third finding: it looks answerable and is not, ' +
|
|
119
|
+
'and the standard supplies a partial constraint that a careless read misses entirely.',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'writer-retention-moderate',
|
|
123
|
+
agentKind: 'requirements-writer',
|
|
124
|
+
kind: 'answer-recommendation',
|
|
125
|
+
name: 'Data retention window (moderate)',
|
|
126
|
+
difficulty: 'moderate',
|
|
127
|
+
summary: 'The project spec settles one finding; the rest rest on general practice and must say so.',
|
|
128
|
+
payload: {
|
|
129
|
+
block: {
|
|
130
|
+
title: 'Let a customer delete their account and data',
|
|
131
|
+
type: 'service',
|
|
132
|
+
description: 'A customer should be able to delete their account from the settings page and have their ' +
|
|
133
|
+
'data removed. We need to honour deletion requests.',
|
|
134
|
+
},
|
|
135
|
+
docs: [],
|
|
136
|
+
tasks: [],
|
|
137
|
+
service: {
|
|
138
|
+
stated: true,
|
|
139
|
+
frameId: 'frame-accounts',
|
|
140
|
+
title: 'Accounts',
|
|
141
|
+
description: 'Account lifecycle, authentication and profile data.',
|
|
142
|
+
},
|
|
143
|
+
findings: [
|
|
144
|
+
finding('grace-period', 'Is deletion immediate, or is there a window to change their mind?', 'The spec says "removed" without saying when, and an accidental deletion is unrecoverable ' +
|
|
145
|
+
'if it is immediate.', { severity: 'high' }),
|
|
146
|
+
finding('audit-conflict', 'What happens to records we are required to keep, such as invoices and audit entries?', 'Deleting everything conflicts with keeping financial records; keeping everything is not ' +
|
|
147
|
+
'deletion. The boundary needs stating.', { category: 'risk', severity: 'high' }),
|
|
148
|
+
finding('shared-content', 'What happens to content the deleted user shared with colleagues?', 'Removing it breaks their teammates’ work; leaving it means the user’s content ' +
|
|
149
|
+
'outlives their account.', { category: 'clarification', autoAnswerable: false }),
|
|
150
|
+
],
|
|
151
|
+
grounding: {
|
|
152
|
+
fragments: [],
|
|
153
|
+
specExcerpts: [
|
|
154
|
+
'# spec/accounts.md\n\nThe system SHALL retain issued invoices and their line items for ' +
|
|
155
|
+
'seven years from the date of issue, independently of the account they belong to. An ' +
|
|
156
|
+
'invoice SHALL remain retrievable after the account is closed.',
|
|
157
|
+
],
|
|
158
|
+
webResults: [],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
expectations: [
|
|
162
|
+
exp('invoices-from-spec', 'Answers the audit conflict from the project spec: invoices are retained seven years, independently of the account.', {
|
|
163
|
+
impact: 5,
|
|
164
|
+
trickiness: 2,
|
|
165
|
+
detail: 'The spec settles it outright, so the answer must come from there and report ' +
|
|
166
|
+
'`project-spec`, not `general-practice`.',
|
|
167
|
+
matchHints: ['seven years', '7 years', 'invoice', 'retain', 'project-spec', 'spec/'],
|
|
168
|
+
}),
|
|
169
|
+
exp('grace-period-default', 'Gives a concrete grace-period default rather than "it depends", and labels it general practice.', {
|
|
170
|
+
impact: 4,
|
|
171
|
+
trickiness: 3,
|
|
172
|
+
detail: 'Nothing in the grounding names a window, so the honest report is `general-practice`. ' +
|
|
173
|
+
'A concrete number (commonly 30 days) is still required: hedging is the failure the ' +
|
|
174
|
+
'`answer_concreteness` dimension scores.',
|
|
175
|
+
matchHints: [
|
|
176
|
+
'grace period',
|
|
177
|
+
'30 days',
|
|
178
|
+
'thirty days',
|
|
179
|
+
'general practice',
|
|
180
|
+
'general-practice',
|
|
181
|
+
'reversible',
|
|
182
|
+
'soft delete',
|
|
183
|
+
],
|
|
184
|
+
}),
|
|
185
|
+
exp('grounded-in-general-practice', 'Reports the un-grounded answers as `general-practice`, the level they actually came from.', {
|
|
186
|
+
impact: 5,
|
|
187
|
+
trickiness: 4,
|
|
188
|
+
detail: 'The provenance test, and the one that matters most: a suggestion that cites a named ' +
|
|
189
|
+
'regulation looks far more authoritative in the answer box than the guess it actually ' +
|
|
190
|
+
'is. There are no standards in this fixture’s grounding at all, so anything but ' +
|
|
191
|
+
'`general-practice` on the grace-period and shared-content answers is invented.',
|
|
192
|
+
// Phrased as what a correct answer CONTAINS, not as the absence of an invented citation.
|
|
193
|
+
// The scorer can only detect presence, so a negatively-phrased expectation would score
|
|
194
|
+
// "missed" against a model that behaved correctly and said nothing about it. The absence
|
|
195
|
+
// half is the judge's `grounding_honesty` dimension, which can see it.
|
|
196
|
+
matchHints: [
|
|
197
|
+
'general practice',
|
|
198
|
+
'general-practice',
|
|
199
|
+
'not from a standard',
|
|
200
|
+
'no standard',
|
|
201
|
+
'own knowledge',
|
|
202
|
+
'no specific standard',
|
|
203
|
+
],
|
|
204
|
+
}),
|
|
205
|
+
exp('shared-content-owner', 'Treats the shared-content question as one the business must own, at low confidence.', {
|
|
206
|
+
impact: 4,
|
|
207
|
+
trickiness: 3,
|
|
208
|
+
matchHints: [
|
|
209
|
+
'low confidence',
|
|
210
|
+
'business decision',
|
|
211
|
+
'product owner',
|
|
212
|
+
'depends on',
|
|
213
|
+
'needs a decision',
|
|
214
|
+
'cannot decide',
|
|
215
|
+
],
|
|
216
|
+
}),
|
|
217
|
+
],
|
|
218
|
+
// Deletion invites a design answer (a soft-delete column, a purge job), and the Writer is told
|
|
219
|
+
// the Architect owns that, so specifying HOW is a scope violation here even when the design is
|
|
220
|
+
// sensible. That is deliberately NOT an expectation: it is an ABSENCE, and the objective scorer
|
|
221
|
+
// can only detect presence, so it would score "missed" against exactly the answers that got it
|
|
222
|
+
// right. The `product_scope` rubric dimension already states it to the judge, which can see an
|
|
223
|
+
// absence; adding a token-matched proxy beside it would only make the grid disagree with itself.
|
|
224
|
+
notes: 'The provenance fixture. One finding the spec settles, one that needs a concrete default from ' +
|
|
225
|
+
'general knowledge honestly labelled, and one that belongs to a person.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: 'writer-sla-credits-complex',
|
|
229
|
+
agentKind: 'requirements-writer',
|
|
230
|
+
kind: 'answer-recommendation',
|
|
231
|
+
name: 'Uptime credits policy (complex)',
|
|
232
|
+
difficulty: 'complex',
|
|
233
|
+
summary: 'A standard and the project spec DISAGREE, and most findings turn on unstated commercials.',
|
|
234
|
+
payload: {
|
|
235
|
+
block: {
|
|
236
|
+
title: 'Service-credit scheme for missed uptime commitments',
|
|
237
|
+
type: 'service',
|
|
238
|
+
description: 'When we miss our uptime commitment in a month, affected customers should get service ' +
|
|
239
|
+
'credits automatically instead of having to ask. Sales wants this in the next contract ' +
|
|
240
|
+
'cycle.',
|
|
241
|
+
},
|
|
242
|
+
docs: [],
|
|
243
|
+
tasks: [],
|
|
244
|
+
service: {
|
|
245
|
+
stated: true,
|
|
246
|
+
frameId: 'frame-billing',
|
|
247
|
+
title: 'Billing',
|
|
248
|
+
description: 'Subscriptions, invoicing and credits.',
|
|
249
|
+
},
|
|
250
|
+
findings: [
|
|
251
|
+
finding('credit-scale', 'What credit does each level of downtime earn?', 'The spec says "credits" with no schedule tying downtime to a credit amount.', { severity: 'high' }),
|
|
252
|
+
finding('measurement-window', 'Over what window is uptime measured, and does planned maintenance count against it?', 'A monthly figure and a rolling figure produce different results, and excluded ' +
|
|
253
|
+
'maintenance changes the answer again.', { category: 'clarification', severity: 'high' }),
|
|
254
|
+
finding('credit-cap', 'Is there an upper bound on credits in a single month?', 'An uncapped scheme can exceed the customer’s own monthly fee during a long outage.', { category: 'risk', severity: 'high' }),
|
|
255
|
+
finding('eligibility', 'Which customers are eligible: everyone, or only those on a contract with an uptime commitment?', 'Applying it to self-serve customers who were never promised an SLA is a commercial ' +
|
|
256
|
+
'decision.', { category: 'question', autoAnswerable: false }),
|
|
257
|
+
],
|
|
258
|
+
grounding: {
|
|
259
|
+
fragments: [
|
|
260
|
+
{
|
|
261
|
+
id: 'std-sla-credits',
|
|
262
|
+
title: 'Service-level commitments and credits',
|
|
263
|
+
body: 'Uptime is measured per calendar month. Below 99.9% earns a 10% credit; below 99.0% ' +
|
|
264
|
+
'earns 25%; below 95.0% earns 50%. Credits are capped at 50% of the monthly fee for ' +
|
|
265
|
+
'the affected service. Scheduled maintenance announced at least 5 days in advance is ' +
|
|
266
|
+
'excluded from the calculation.',
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
specExcerpts: [
|
|
270
|
+
'# spec/billing.md\n\nA credit SHALL be applied to the next invoice and SHALL NOT exceed ' +
|
|
271
|
+
'the invoice total. Credits SHALL NOT be paid out in cash and SHALL expire 12 months ' +
|
|
272
|
+
'after issue.',
|
|
273
|
+
'# tech-spec/uptime.md\n\nAvailability is computed from the external probe results ' +
|
|
274
|
+
'aggregated over a rolling 30-day window.',
|
|
275
|
+
],
|
|
276
|
+
webResults: [],
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
expectations: [
|
|
280
|
+
exp('credit-scale-from-standard', 'Takes the credit schedule from the standard (10% / 25% / 50%) and names it as the source.', {
|
|
281
|
+
impact: 5,
|
|
282
|
+
trickiness: 1,
|
|
283
|
+
matchHints: ['10%', '25%', '50%', 'std-sla-credits', 'standard', 'credit schedule'],
|
|
284
|
+
}),
|
|
285
|
+
exp('window-conflict', 'Notices the standard says calendar month while the tech-spec computes a rolling 30-day window, and does not silently pick one.', {
|
|
286
|
+
impact: 5,
|
|
287
|
+
trickiness: 5,
|
|
288
|
+
detail: 'The standout catch. Both grounding sources are authoritative and they disagree, so ' +
|
|
289
|
+
'answering confidently from either one hides a contradiction that would surface as a ' +
|
|
290
|
+
'billing dispute. The honest answer names the conflict and asks which governs.',
|
|
291
|
+
matchHints: [
|
|
292
|
+
'conflict',
|
|
293
|
+
'disagree',
|
|
294
|
+
'inconsistent',
|
|
295
|
+
'calendar month',
|
|
296
|
+
'rolling',
|
|
297
|
+
'contradict',
|
|
298
|
+
'differ',
|
|
299
|
+
],
|
|
300
|
+
}),
|
|
301
|
+
exp('cap-interaction', 'Reconciles the two caps: the standard caps at 50% of the fee, the spec caps at the invoice total.', {
|
|
302
|
+
impact: 4,
|
|
303
|
+
trickiness: 4,
|
|
304
|
+
detail: 'Both apply, and the binding one is whichever is lower. Quoting only the standard’s ' +
|
|
305
|
+
'cap drops a constraint the project already committed to.',
|
|
306
|
+
matchHints: ['50%', 'invoice total', 'whichever is lower', 'both', 'cap', 'exceed'],
|
|
307
|
+
}),
|
|
308
|
+
exp('maintenance-exclusion', 'Carries over the 5-day maintenance-notice exclusion rather than leaving maintenance undefined.', {
|
|
309
|
+
impact: 3,
|
|
310
|
+
trickiness: 3,
|
|
311
|
+
matchHints: ['maintenance', '5 days', 'five days', 'announced', 'excluded'],
|
|
312
|
+
}),
|
|
313
|
+
exp('eligibility-is-commercial', 'Refuses to settle eligibility itself: it is a commercial decision, rated low confidence.', {
|
|
314
|
+
impact: 4,
|
|
315
|
+
trickiness: 2,
|
|
316
|
+
matchHints: [
|
|
317
|
+
'commercial',
|
|
318
|
+
'sales',
|
|
319
|
+
'low confidence',
|
|
320
|
+
'business decision',
|
|
321
|
+
'contract',
|
|
322
|
+
'needs a decision',
|
|
323
|
+
],
|
|
324
|
+
}),
|
|
325
|
+
exp('no-cash-payout', 'Honours the spec rule that credits are never paid in cash and expire after 12 months.', {
|
|
326
|
+
impact: 3,
|
|
327
|
+
trickiness: 3,
|
|
328
|
+
matchHints: ['cash', 'not paid out', 'next invoice', '12 months', 'expir*'],
|
|
329
|
+
}),
|
|
330
|
+
],
|
|
331
|
+
notes: 'The hardest of the three: the grounding is rich AND self-contradictory, so a Writer that ' +
|
|
332
|
+
'simply pattern-matches the standard produces a confident answer that is wrong on the one ' +
|
|
333
|
+
'question a billing dispute would turn on.',
|
|
334
|
+
},
|
|
335
|
+
];
|
|
336
|
+
//# sourceMappingURL=answer-recommendation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-recommendation.js","sourceRoot":"","sources":["../../src/fixtures/answer-recommendation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/fixtures/architecture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAwB3D,eAAO,MAAM,qBAAqB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/fixtures/architecture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAwB3D,eAAO,MAAM,qBAAqB,EAAE,wBAAwB,EAkT3D,CAAA"}
|
|
@@ -17,6 +17,96 @@ function proposalContext(block, proposal) {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
export const ARCHITECTURE_FIXTURES = [
|
|
20
|
+
{
|
|
21
|
+
// The simple anchor of the range. Its flaw is not subtle, which is the point: a reviewer that
|
|
22
|
+
// cannot name "local disk is not durable on a fleet" has nothing useful to say about the
|
|
23
|
+
// outbox fixture either, and a rubric needs a floor as much as a ceiling.
|
|
24
|
+
id: 'arch-avatar-storage-simple',
|
|
25
|
+
agentKind: 'architect-companion',
|
|
26
|
+
kind: 'architecture',
|
|
27
|
+
name: 'Avatar storage design (simple)',
|
|
28
|
+
difficulty: 'simple',
|
|
29
|
+
summary: 'An "upload a profile picture" design that stores files on the app server’s own disk.',
|
|
30
|
+
payload: proposalContext({
|
|
31
|
+
title: 'Profile pictures',
|
|
32
|
+
type: 'service',
|
|
33
|
+
description: 'Let a user upload a profile picture and show it beside their name.',
|
|
34
|
+
}, [
|
|
35
|
+
'# Design: profile pictures',
|
|
36
|
+
'',
|
|
37
|
+
'The upload endpoint writes the file to `/var/app/uploads/<userId>.png` on the API server and',
|
|
38
|
+
'stores the path in `users.avatar_path`. A GET endpoint reads the file off disk and streams it',
|
|
39
|
+
'back. We run three API instances behind the load balancer. Simple and no new dependencies.',
|
|
40
|
+
].join('\n')),
|
|
41
|
+
expectations: [
|
|
42
|
+
exp('not-shared-or-durable', 'Local disk is neither shared across the three instances nor durable across a deploy: an upload lands on one box and 404s from the other two.', {
|
|
43
|
+
impact: 5,
|
|
44
|
+
trickiness: 2,
|
|
45
|
+
detail: 'The central flaw. The design even states the instance count, so the contradiction is on ' +
|
|
46
|
+
'the page; object storage or a shared volume is the fix.',
|
|
47
|
+
matchHints: [
|
|
48
|
+
'three instances',
|
|
49
|
+
'other instance',
|
|
50
|
+
'not shared',
|
|
51
|
+
'local disk',
|
|
52
|
+
'ephemeral',
|
|
53
|
+
'object storage',
|
|
54
|
+
's3',
|
|
55
|
+
'lost on deploy',
|
|
56
|
+
'durab*',
|
|
57
|
+
],
|
|
58
|
+
}),
|
|
59
|
+
exp('no-upload-validation', 'No size limit, content-type check or re-encode: the endpoint accepts any file of any size under a `.png` name.', {
|
|
60
|
+
impact: 4,
|
|
61
|
+
trickiness: 2,
|
|
62
|
+
matchHints: [
|
|
63
|
+
'size limit',
|
|
64
|
+
'max size',
|
|
65
|
+
'content type',
|
|
66
|
+
'content-type',
|
|
67
|
+
'validate',
|
|
68
|
+
're-encode',
|
|
69
|
+
'image type',
|
|
70
|
+
'arbitrary file',
|
|
71
|
+
],
|
|
72
|
+
}),
|
|
73
|
+
exp('path-from-user-id', 'The filename is derived from a request-supplied id, so path traversal and overwriting another user’s avatar both need checking.', {
|
|
74
|
+
impact: 4,
|
|
75
|
+
trickiness: 4,
|
|
76
|
+
detail: 'Whether `userId` is the authenticated user or a parameter decides whether this is a ' +
|
|
77
|
+
'file-overwrite primitive; the design does not say, and a strong review asks.',
|
|
78
|
+
matchHints: [
|
|
79
|
+
'path traversal',
|
|
80
|
+
'travers*',
|
|
81
|
+
'overwrite',
|
|
82
|
+
'authenticated user',
|
|
83
|
+
'sanitis*',
|
|
84
|
+
'sanitiz*',
|
|
85
|
+
'another user',
|
|
86
|
+
],
|
|
87
|
+
}),
|
|
88
|
+
exp('serving-through-the-app', 'Streaming every avatar through the API ties image traffic to application capacity; a CDN or signed URL decouples them.', {
|
|
89
|
+
impact: 2,
|
|
90
|
+
trickiness: 3,
|
|
91
|
+
matchHints: ['cdn', 'signed url', 'presigned', 'cache', 'static', 'through the app'],
|
|
92
|
+
}),
|
|
93
|
+
exp('no-lifecycle', 'Nothing removes the file when the user changes or deletes their avatar, or when the account is deleted.', {
|
|
94
|
+
impact: 3,
|
|
95
|
+
trickiness: 4,
|
|
96
|
+
matchHints: [
|
|
97
|
+
'delete',
|
|
98
|
+
'cleanup',
|
|
99
|
+
'clean up',
|
|
100
|
+
'orphan',
|
|
101
|
+
'replace',
|
|
102
|
+
'lifecycle',
|
|
103
|
+
'retention',
|
|
104
|
+
],
|
|
105
|
+
}),
|
|
106
|
+
],
|
|
107
|
+
notes: 'The floor of the range. The must-find is the fleet/durability contradiction; the traversal ' +
|
|
108
|
+
'and lifecycle questions separate a competent review from a checklist.',
|
|
109
|
+
},
|
|
20
110
|
{
|
|
21
111
|
id: 'arch-counter-redis-moderate',
|
|
22
112
|
agentKind: 'architect-companion',
|
|
@@ -54,7 +144,7 @@ export const ARCHITECTURE_FIXTURES = [
|
|
|
54
144
|
exp('hot-key', 'A viral article is a single hot Redis key — a write/throughput hotspot with no sharding plan.', {
|
|
55
145
|
impact: 3,
|
|
56
146
|
trickiness: 4,
|
|
57
|
-
matchHints: ['hot key', 'hotspot', 'hot spot', 'contention', 'shard'],
|
|
147
|
+
matchHints: ['hot key', 'hotspot', 'hot spot', 'contention', 'shard*'],
|
|
58
148
|
}),
|
|
59
149
|
exp('read-cost', 'Reading the count back from Redis on every render is unnecessary; the count can be returned from the INCR or cached.', {
|
|
60
150
|
impact: 2,
|
|
@@ -65,7 +155,7 @@ export const ARCHITECTURE_FIXTURES = [
|
|
|
65
155
|
impact: 3,
|
|
66
156
|
trickiness: 4,
|
|
67
157
|
detail: 'Whether a view is deduped is a real product/correctness question the design skips.',
|
|
68
|
-
matchHints: ['dedupe', 'deduplicat', 'unique', 'bot', 'refresh', 'idempoten'],
|
|
158
|
+
matchHints: ['dedupe', 'deduplicat*', 'unique', 'bot', 'refresh', 'idempoten*'],
|
|
69
159
|
}),
|
|
70
160
|
],
|
|
71
161
|
notes: 'The cache-as-durable-store flaw is the must-find; hot-key and dedupe are the higher-skill catches.',
|
|
@@ -121,7 +211,7 @@ export const ARCHITECTURE_FIXTURES = [
|
|
|
121
211
|
impact: 4,
|
|
122
212
|
trickiness: 3,
|
|
123
213
|
matchHints: [
|
|
124
|
-
'idempoten',
|
|
214
|
+
'idempoten*',
|
|
125
215
|
'at least once',
|
|
126
216
|
'at-least-once',
|
|
127
217
|
'duplicate',
|
|
@@ -138,7 +228,7 @@ export const ARCHITECTURE_FIXTURES = [
|
|
|
138
228
|
'schema coupling',
|
|
139
229
|
'schema version',
|
|
140
230
|
'thin event',
|
|
141
|
-
'bloat',
|
|
231
|
+
'bloat*',
|
|
142
232
|
],
|
|
143
233
|
}),
|
|
144
234
|
exp('retry-sweep', 'The "log and retry in a background sweep" path has no durable record of the failed publish to retry from — what does the sweep read?', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/fixtures/architecture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAGvC,uFAAuF;AACvF,4FAA4F;AAC5F,uFAAuF;AACvF,4EAA4E;AAE5E,gGAAgG;AAChG,SAAS,eAAe,CACtB,KAA2D,EAC3D,QAAgB;IAEhB,OAAO;QACL,SAAS,EAAE,qBAAqB;QAChC,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,IAAI;QACjB,KAAK;QACL,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5D,SAAS,EAAE,EAAE;QACb,gBAAgB,EAAE,IAAI;KACvB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAA+B;IAC/D;QACE,EAAE,EAAE,6BAA6B;QACjC,SAAS,EAAE,qBAAqB;QAChC,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,gCAAgC;QACtC,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE,iFAAiF;QAC1F,OAAO,EAAE,eAAe,CACtB;YACE,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,mDAAmD;SACjE,EACD;YACE,6BAA6B;YAC7B,EAAE;YACF,+FAA+F;YAC/F,kGAAkG;YAClG,4EAA4E;SAC7E,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;QACD,YAAY,EAAE;YACZ,GAAG,CACD,kBAAkB,EAClB,8GAA8G,EAC9G;gBACE,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;gBACb,MAAM,EACJ,6FAA6F;gBAC/F,UAAU,EAAE;oBACV,aAAa;oBACb,YAAY;oBACZ,WAAW;oBACX,YAAY;oBACZ,aAAa;oBACb,iBAAiB;oBACjB,yBAAyB;oBACzB,aAAa;iBACd;aACF,CACF;YACD,GAAG,CACD,SAAS,EACT,+FAA+F,EAC/F;gBACE,MAAM,EAAE,CAAC;gBACT,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/fixtures/architecture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clarity.d.ts","sourceRoot":"","sources":["../../src/fixtures/clarity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAO3D,eAAO,MAAM,gBAAgB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"clarity.d.ts","sourceRoot":"","sources":["../../src/fixtures/clarity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAO3D,eAAO,MAAM,gBAAgB,EAAE,wBAAwB,EAkWtD,CAAA"}
|