@a-company/paradigm 2.0.13 → 3.0.1

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.
Files changed (49) hide show
  1. package/dist/{auto-IU7VN55K.js → auto-6MOGYQ4G.js} +34 -0
  2. package/dist/chunk-27OSFWHG.js +199 -0
  3. package/dist/{chunk-2M6OSOIG.js → chunk-4WR7X3FE.js} +46 -0
  4. package/dist/{chunk-5GOA7WYD.js → chunk-GWM2WRXL.js} +1 -1
  5. package/dist/{chunk-THFVK5AE.js → chunk-QS36NGWV.js} +1 -1
  6. package/dist/{chunk-ELLR7WP6.js → chunk-S65LENNL.js} +4 -4
  7. package/dist/{chunk-YDNKXH4Z.js → chunk-YCLN7WXV.js} +37 -0
  8. package/dist/{chunk-753RICFF.js → chunk-ZPN7MXRA.js} +1 -1
  9. package/dist/{dist-7MPIRMTZ-IOQOREMZ.js → dist-2F7NO4H4-KSL6SJIO.js} +156 -4182
  10. package/dist/{doctor-6Y6L6HEB.js → doctor-JBIV5PMN.js} +2 -2
  11. package/dist/{hooks-MBWE4ILT.js → hooks-7TQIRXXS.js} +1 -1
  12. package/dist/index.js +56 -35
  13. package/dist/list-QMUE7DPK.js +53 -0
  14. package/dist/lore-server-3TAIUZ3Y.js +292 -0
  15. package/dist/mcp.js +856 -114
  16. package/dist/{promote-Z52ZJTJU.js → promote-E6NBZ3BK.js} +1 -0
  17. package/dist/record-5CTCDFUO.js +32 -0
  18. package/dist/review-QEDNQAIO.js +33 -0
  19. package/dist/{sentinel-LCFD56OJ.js → sentinel-RSEXIRXM.js} +1 -1
  20. package/dist/serve-WCIRW244.js +36 -0
  21. package/dist/server-E2CNZC4K.js +288 -0
  22. package/dist/server-NXG5N7JE.js +6135 -0
  23. package/dist/{shift-HKIAP4ZN.js → shift-NABNKPGL.js} +11 -5
  24. package/dist/show-S653P3TO.js +127 -0
  25. package/dist/{summary-H6J6N6PJ.js → summary-5SBFO7QK.js} +1 -1
  26. package/dist/{sync-BEOCW7TZ.js → sync-5KSTPJ4B.js} +2 -2
  27. package/dist/{triage-ETVXXFMV.js → triage-RM5KNG5V.js} +30 -31
  28. package/dist/{university-R2WDQLSI.js → university-65YJZ2LW.js} +10 -2
  29. package/dist/university-content/courses/para-101.json +561 -0
  30. package/dist/university-content/courses/para-201.json +707 -0
  31. package/dist/university-content/courses/para-301.json +654 -0
  32. package/dist/university-content/courses/para-401.json +640 -0
  33. package/dist/university-content/plsat/v2.0.json +760 -0
  34. package/dist/university-content/plsat/v3.0.json +1162 -0
  35. package/dist/university-content/reference.json +336 -0
  36. package/dist/university-ui/assets/index-CoBFthx2.js +87 -0
  37. package/dist/university-ui/assets/index-CoBFthx2.js.map +1 -0
  38. package/dist/university-ui/assets/index-DW2N5NTk.css +1 -0
  39. package/dist/university-ui/index.html +17 -0
  40. package/dist/{upgrade-5B3YGGC6.js → upgrade-TIYFQYPO.js} +1 -1
  41. package/dist/{watch-6IIWPWDN.js → watch-2XEYUH43.js} +1 -1
  42. package/lore-ui/dist/assets/index-DcT8TINz.js +56 -0
  43. package/lore-ui/dist/assets/index-DyJhpQ5w.css +1 -0
  44. package/lore-ui/dist/index.html +13 -0
  45. package/package.json +7 -3
  46. package/dist/chunk-ILOWBJRC.js +0 -12
  47. package/dist/chunk-MQWH7PFI.js +0 -13366
  48. package/dist/server-F5ITNK6T.js +0 -9846
  49. package/dist/server-T6WIFYRQ.js +0 -16076
@@ -0,0 +1,760 @@
1
+ {
2
+ "version": "2.0",
3
+ "frameworkVersion": "2.0",
4
+ "timeLimit": 2700,
5
+ "passThreshold": 0.8,
6
+ "title": "The PLSAT \u2014 Paradigm Licensure Standardized Assessment Test",
7
+ "description": "50 questions. 45 minutes. 80% to pass. Good luck, scholar.",
8
+ "questions": [
9
+ {
10
+ "id": "plsat-001",
11
+ "course": "para-101",
12
+ "scenario": "You've just joined a team that uses Paradigm. You open the project and see directories like `.paradigm/`, several `.purpose` files, and a `portal.yaml` at the root. A colleague asks you to document a new utility function they wrote in `src/lib/format-currency.ts`.",
13
+ "question": "Which symbol prefix should you use to document this utility?",
14
+ "choices": {
15
+ "A": "`$format-currency` \u2014 because it describes a process (formatting)",
16
+ "B": "`!format-currency` \u2014 because it signals a transformation event",
17
+ "C": "`#format-currency` \u2014 because it is a documented code unit",
18
+ "D": "`~format-currency` \u2014 because it applies a rule (formatting rules)",
19
+ "E": "`^format-currency` \u2014 because it gates what format is allowed"
20
+ },
21
+ "correct": "C",
22
+ "explanation": "In Paradigm, every documented code unit uses the `#` (Component) symbol. There are only 5 operational symbols, and `#` is the universal prefix for any code unit \u2014 utilities, services, handlers, components, hooks, you name it. `$` is for multi-step flows, `!` for signals/events, `~` for aspects with code anchors, and `^` for condition gates. A simple utility function is a component."
23
+ },
24
+ {
25
+ "id": "plsat-002",
26
+ "course": "para-101",
27
+ "scenario": "A component manages user authentication state \u2014 tracking the current user, login status, and session tokens. You need to document it in a `.purpose` file.",
28
+ "question": "How should this component be documented in Paradigm?",
29
+ "choices": {
30
+ "A": "`#auth-state` with no tags \u2014 the component name is descriptive enough",
31
+ "B": "`#auth-state` with `tags: [state]` \u2014 the `[state]` tag classifies its role",
32
+ "C": "`!auth-state` \u2014 authentication state changes should be modeled as signals",
33
+ "D": "`$auth-state` \u2014 state management is a multi-step flow",
34
+ "E": "`~auth-state` \u2014 authentication state is a cross-cutting concern requiring an aspect"
35
+ },
36
+ "correct": "B",
37
+ "explanation": "State management components use the `#` (Component) symbol with a `[state]` tag from the tag bank. Paradigm uses only 5 operational symbols for structure, and a tag bank for classification. The `[state]` tag tells humans and AI agents that this component's primary role is managing state, while `#` identifies it as a documented code unit. Signals (`!`) are for events, flows (`$`) are for multi-step processes, and aspects (`~`) are for enforced rules with code anchors."
38
+ },
39
+ {
40
+ "id": "plsat-003",
41
+ "course": "para-101",
42
+ "scenario": "Your team is debating logging practices. One developer argues that using `console.log` everywhere is fine because logs are just for debugging. Another insists on using structured, symbol-aware logging with Paradigm's logger (e.g., `log.component('#checkout-service').info('Processing payment', { amount })`).",
43
+ "question": "What is the STRONGEST argument for using Paradigm's structured logger over raw `console.log`?",
44
+ "choices": {
45
+ "A": "Structured logging is faster at runtime than `console.log`",
46
+ "B": "Paradigm's logger automatically fixes bugs when it detects errors in the logs",
47
+ "C": "Symbol-aware logging connects runtime behavior to the documented architecture, making it possible to trace issues back to specific components, flows, and gates",
48
+ "D": "Using `console.log` will cause Paradigm's CI checks to fail",
49
+ "E": "Structured logging is required by law for production applications"
50
+ },
51
+ "correct": "C",
52
+ "explanation": "The core value of Paradigm's structured logger is traceability: every log line is tagged with a symbol (`#component`, `^gate`, `!signal`, etc.), which means you can correlate runtime behavior with the architectural documentation. When something goes wrong, you can trace from the log back to the component in the `.purpose` file, understand its flows, check its gates, and review its history. Raw `console.log` loses this connection. Performance (A) is not the primary benefit. Paradigm doesn't auto-fix bugs (B) or enforce logging by law (E). CI checks (D) depend on team configuration, not a universal rule."
53
+ },
54
+ {
55
+ "id": "plsat-004",
56
+ "course": "para-101",
57
+ "scenario": "You're setting up a brand new project with Paradigm. You run `paradigm shift` and it creates the `.paradigm/` directory structure. Your project will have a REST API with several endpoints that require condition checks \u2014 such as authentication, feature flags, and rate limiting.",
58
+ "question": "Which file MUST you create at the project root?",
59
+ "choices": {
60
+ "A": "`auth.yaml` \u2014 Paradigm's dedicated authentication config",
61
+ "B": "`gates.yaml` \u2014 where all `^gate` definitions live",
62
+ "C": "`portal.yaml` \u2014 where gates and protected routes are defined",
63
+ "D": "`.paradigm/security.yaml` \u2014 security config goes in the paradigm directory",
64
+ "E": "No file needed \u2014 gates are defined inline in `.purpose` files only"
65
+ },
66
+ "correct": "C",
67
+ "explanation": "`portal.yaml` is REQUIRED at the project root whenever your project has protected routes. It defines gates (`^` symbols) with their check expressions, and maps routes to the gates that protect them. Gates can represent any condition checkpoint \u2014 authentication, authorization, feature flags, rate limits, or custom business rules. Gates can also appear in `.purpose` files for documentation, but `portal.yaml` is the authoritative source for route protection."
68
+ },
69
+ {
70
+ "id": "plsat-005",
71
+ "course": "para-101",
72
+ "scenario": "You find the following `.purpose` file in `src/payments/`:\n\n```yaml\nname: Payments Module\ndescription: Handles all payment processing\ncomponents:\n #stripe-service:\n description: Stripe API integration\n file: stripe.ts\n tags: [integration, stripe]\n #payment-processor:\n description: Core payment logic\n file: processor.ts\n signals: [\"!payment-completed\", \"!payment-failed\"]\n```",
73
+ "question": "What is the correct way to reference `#stripe-service` from another `.purpose` file in a different directory?",
74
+ "choices": {
75
+ "A": "`payments/#stripe-service` \u2014 use the directory path as a namespace",
76
+ "B": "`#stripe-service` \u2014 symbol IDs are globally unique across the project",
77
+ "C": "`&stripe-service` \u2014 integrations use the `&` prefix when cross-referenced",
78
+ "D": "`#payments.stripe-service` \u2014 use dot notation for cross-module references",
79
+ "E": "`import: #stripe-service from payments` \u2014 use import syntax"
80
+ },
81
+ "correct": "B",
82
+ "explanation": "Symbol IDs are globally unique across the entire Paradigm project. You reference `#stripe-service` the same way everywhere \u2014 no namespacing, no path prefixes, no import syntax. Paradigm's index (built by `paradigm scan`) tracks where each symbol is defined. If you have naming conflicts, use more specific names (e.g., `#payments-stripe-service`). The convention is kebab-case for all symbol IDs."
83
+ },
84
+ {
85
+ "id": "plsat-006",
86
+ "course": "para-101",
87
+ "scenario": "Your team uses the following directory structure:\n\n```\nsrc/\n middleware/auth.ts\n events/payment-events.ts\n services/billing.ts\n flows/onboarding.ts\n aspects/rate-limiter.ts\n```\n\nA new developer asks which Paradigm logger method to use in each file. Your team follows the conventional directory-to-symbol mapping as a guideline.",
88
+ "question": "Which file-to-logger mapping is INCORRECT?",
89
+ "choices": {
90
+ "A": "`middleware/auth.ts` \u2192 `log.gate('^auth-check')`",
91
+ "B": "`events/payment-events.ts` \u2192 `log.signal('!payment-received')`",
92
+ "C": "`services/billing.ts` \u2192 `log.component('#billing-service')`",
93
+ "D": "`flows/onboarding.ts` \u2192 `log.signal('!onboarding-started')`",
94
+ "E": "`aspects/rate-limiter.ts` \u2192 `log.aspect('~rate-limited')`"
95
+ },
96
+ "correct": "D",
97
+ "explanation": "Files in the `flows/` directory conventionally correspond to `$` (Flow) symbols and should use `log.flow()`, not `log.signal()`. The correct call would be `log.flow('$onboarding').info(...)`. The conventional directory-to-symbol mapping is: middleware/auth/guards \u2192 `^` (gate), events/handlers/listeners \u2192 `!` (signal), services/lib/components \u2192 `#` (component), flows/sagas/workflows \u2192 `$` (flow), aspects/rules \u2192 `~` (aspect). While teams may adapt these conventions to their needs, this mapping provides a consistent default that helps developers and AI agents reason about the codebase."
98
+ },
99
+ {
100
+ "id": "plsat-007",
101
+ "course": "para-101",
102
+ "scenario": "Your team is prototyping a new feature \u2014 an experimental search widget that may or may not ship. You've built the component and want to document it in a `.purpose` file. You also want to make it clear to other developers and AI agents that this is an idea in progress, not a committed part of the product.",
103
+ "question": "How should you classify this component to indicate it is experimental?",
104
+ "choices": {
105
+ "A": "Use a special `?experimental-widget` symbol prefix reserved for ideas",
106
+ "B": "Add `status: experimental` to the component definition",
107
+ "C": "Add the `[idea]` tag to the component: `tags: [idea]`",
108
+ "D": "Create an aspect `~experimental` and apply it to the component",
109
+ "E": "Comment it out in the `.purpose` file with `# EXPERIMENTAL`"
110
+ },
111
+ "correct": "C",
112
+ "explanation": "Paradigm's tag bank includes the `[idea]` tag for exactly this purpose. You'd define the component as `#experimental-widget` with `tags: [idea]`. Tags are the classification layer in Paradigm: the 5 operational symbols (`#`, `$`, `^`, `!`, `~`) provide structure, while tags from the tag bank provide classification metadata like `[idea]`, `[feature]`, `[state]`, `[integration]`, `[critical]`, etc. Choice B (status field) is plausible but `status` is typically for lifecycle states like `active` or `deprecated`, not for ideation. There is no `?` symbol prefix in Paradigm (A). Commenting it out (E) removes it from the symbol graph entirely."
113
+ },
114
+ {
115
+ "id": "plsat-008",
116
+ "course": "para-101",
117
+ "scenario": "A `.paradigm/tags.yaml` file has three sections: `core`, `project`, and `suggested`. The `core` section contains tags like `[feature]`, `[integration]`, `[state]`, `[critical]`, and `[security]`.",
118
+ "question": "What is the `suggested` section for?",
119
+ "choices": {
120
+ "A": "Tags that Paradigm automatically generates based on code analysis",
121
+ "B": "Tags proposed by AI agents awaiting human approval before use",
122
+ "C": "Tags from the Paradigm community marketplace that can be installed",
123
+ "D": "Tags that are deprecated and will be removed in the next version",
124
+ "E": "Tags that the framework suggests but are optional to implement"
125
+ },
126
+ "correct": "B",
127
+ "explanation": "The `suggested` section in `tags.yaml` holds tags proposed by AI agents (via `paradigm_tags_suggest`) that haven't been approved by a human yet. This is part of Paradigm's governance model: AI can propose new classifications, but a human must promote them to `project` or `core` before they become official. This prevents tag sprawl and keeps the taxonomy intentional. The `core` tags ship with Paradigm, `project` tags are team-defined, and `suggested` are AI proposals awaiting review."
128
+ },
129
+ {
130
+ "id": "plsat-009",
131
+ "course": "para-101",
132
+ "scenario": "You're reading a project's `.paradigm/config.yaml` and see:\n\n```yaml\ndiscipline: fullstack\nconventions:\n naming: kebab-case\n components: PascalCase\n```",
133
+ "question": "Based on these conventions, which symbol ID is correctly formatted?",
134
+ "choices": {
135
+ "A": "`#paymentService` \u2014 camelCase for services",
136
+ "B": "`#payment-service` \u2014 kebab-case for IDs, PascalCase for class-like references",
137
+ "C": "`#Payment_Service` \u2014 PascalCase with underscores",
138
+ "D": "`#PAYMENT_SERVICE` \u2014 SCREAMING_SNAKE for services",
139
+ "E": "`#payment.service` \u2014 dot notation for namespaced components"
140
+ },
141
+ "correct": "B",
142
+ "explanation": "Paradigm conventions specify kebab-case for all symbol IDs. The `components: PascalCase` convention means that when referring to class-like components in prose or code, you use PascalCase (e.g., `#PaymentService`), but the canonical ID in `.purpose` files is kebab-case (`#payment-service`). This dual convention is documented in the CLAUDE.md: 'Use kebab-case for all symbol IDs' and 'Use PascalCase for class-like components'."
143
+ },
144
+ {
145
+ "id": "plsat-010",
146
+ "course": "para-101",
147
+ "scenario": "A team member creates a new `.purpose` file for their notification system:\n\n```yaml\nname: Notifications\ncomponents:\n #email-sender:\n description: Sends transactional emails\n file: email.ts\n #push-notifier:\n description: Sends push notifications\n file: push.ts\nsignals:\n !notification-sent:\n description: Fires after any notification is delivered\n emitters: [\"#email-sender\", \"#push-notifier\"]\n```",
148
+ "question": "This `.purpose` file is missing a critical top-level field. What is it?",
149
+ "choices": {
150
+ "A": "`version` \u2014 every purpose file must specify a schema version",
151
+ "B": "`description` \u2014 every purpose file should describe what the module does",
152
+ "C": "`tags` \u2014 top-level tags are required for indexing",
153
+ "D": "`gates` \u2014 every module must define its authorization requirements",
154
+ "E": "`flows` \u2014 signals require at least one flow to be meaningful"
155
+ },
156
+ "correct": "B",
157
+ "explanation": "Every `.purpose` file should have a `description` field explaining what the module/directory does. While `name` identifies it, `description` provides the context that AI agents and developers need to understand the module's role. The `paradigm_purpose_init` tool requires both `name` and `description` conceptually, and `paradigm doctor` will flag purpose files missing descriptions. Tags, gates, and flows are optional depending on the module's nature. Version is handled at the framework level, not per-file."
158
+ },
159
+ {
160
+ "id": "plsat-011",
161
+ "course": "para-201",
162
+ "scenario": "You're designing an e-commerce checkout process that involves: (1) validating the cart, (2) checking inventory, (3) processing payment via Stripe, (4) creating the order record, and (5) sending a confirmation email. This spans 5 different components across 3 directories.",
163
+ "question": "How should this be documented in Paradigm?",
164
+ "choices": {
165
+ "A": "As a single `#checkout` component with sub-steps in its description",
166
+ "B": "As a `$checkout-flow` with ordered steps referencing each component",
167
+ "C": "As five separate `!` signals chained together",
168
+ "D": "As a `~checkout-required` aspect applied to all five components",
169
+ "E": "As five `^` gates that must be passed sequentially"
170
+ },
171
+ "correct": "B",
172
+ "explanation": "A multi-step process spanning 3+ components is the textbook definition of a Flow (`$`). You'd define `$checkout-flow` with ordered steps, each referencing the responsible component and action: `#cart-validator` validates, `#inventory-checker` checks stock, `#stripe-service` processes payment, `#order-service` creates the record, `#email-sender` confirms. Flows document the sequence and make it visible to `paradigm_flows_affected` for impact analysis. Signals (`!`) may be emitted during the flow, but they don't define the sequence."
173
+ },
174
+ {
175
+ "id": "plsat-012",
176
+ "course": "para-201",
177
+ "scenario": "Your `portal.yaml` defines these gates:\n\n```yaml\ngates:\n ^authenticated:\n description: User must be logged in\n check: req.user != null\n ^project-admin:\n description: User must be admin of the project\n check: project.admins.includes(req.user.id)\n requires: [\"^authenticated\"]\n```\n\nA new endpoint `DELETE /api/projects/:id` needs to be added. Only project admins should be able to delete projects.",
178
+ "question": "What is the correct route entry in `portal.yaml`?",
179
+ "choices": {
180
+ "A": "`\"DELETE /api/projects/:id\": [^authenticated, ^project-admin]`",
181
+ "B": "`\"DELETE /api/projects/:id\": [^project-admin]`",
182
+ "C": "`\"DELETE /api/projects/:id\": [^authenticated]`",
183
+ "D": "`\"DELETE /api/projects/:id\": [^project-admin, ^authenticated]`",
184
+ "E": "`\"DELETE /api/projects/:id\": [^admin]`"
185
+ },
186
+ "correct": "B",
187
+ "explanation": "Since `^project-admin` already has `requires: [\"^authenticated\"]`, listing `^authenticated` in the route is redundant. The gate dependency chain means `^project-admin` will automatically enforce `^authenticated` first. The route only needs to specify `[^project-admin]`. Choice A technically works (it's not wrong per se), but it's redundant and violates the DRY principle. Choice D reverses the order, which could cause confusion about evaluation sequence. Choice E references a gate that doesn't exist in the portal."
188
+ },
189
+ {
190
+ "id": "plsat-013",
191
+ "course": "para-201",
192
+ "scenario": "A developer defines the following aspect:\n\n```yaml\naspects:\n ~audit-required:\n description: All financial operations must be logged\n tags: [compliance, security]\n applies-to: [\"#*Service\"]\n```\n\nThey run `paradigm doctor` and get a validation error.",
193
+ "question": "What is missing from this aspect definition?",
194
+ "choices": {
195
+ "A": "The `enforcement` field specifying how the aspect is enforced",
196
+ "B": "The `anchors` field pointing to the actual enforcement code",
197
+ "C": "The `severity` field indicating how critical the aspect is",
198
+ "D": "The `gates` field linking the aspect to authorization checks",
199
+ "E": "The `signals` field for emitting audit events"
200
+ },
201
+ "correct": "B",
202
+ "explanation": "Aspects (`~`) MUST have code anchors. This is a hard rule in Paradigm: no unanchored aspects allowed. Anchors point to the actual lines of code where the aspect is enforced (e.g., `src/middleware/audit.ts:15-35`). Without anchors, the aspect is just documentation with no verifiable link to implementation. `paradigm doctor` and `paradigm_aspect_check` will both flag unanchored aspects. The anchor format supports single lines (`file.ts:15`), ranges (`file.ts:15-20`), and multiple lines (`file.ts:15,25,30`)."
203
+ },
204
+ {
205
+ "id": "plsat-014",
206
+ "course": "para-201",
207
+ "scenario": "You're implementing a webhook handler that receives events from a third-party payment provider. When a payment succeeds, your system needs to: update the order status, send a receipt email, and notify the analytics service. These are independent side effects that don't need to happen in order.",
208
+ "question": "What is the MOST appropriate Paradigm modeling for these independent side effects?",
209
+ "choices": {
210
+ "A": "A `$payment-webhook-flow` with three sequential steps",
211
+ "B": "A `!payment-succeeded` signal with three subscriber components",
212
+ "C": "Three separate `^` gates that the webhook must pass",
213
+ "D": "A `~payment-side-effects` aspect applied to the webhook handler",
214
+ "E": "Three `#` components with no formal connection between them"
215
+ },
216
+ "correct": "B",
217
+ "explanation": "When side effects are independent and don't require ordering, a Signal (`!`) is the right model. You define `!payment-succeeded` and document three subscriber components (`#order-service`, `#email-sender`, `#analytics-tracker`) that react to it. Signals are for events that trigger side effects. A Flow (`$`) would be appropriate if the steps needed to happen in a specific order or if one step depended on the output of another. Gates (`^`) are for condition checks, not business logic."
218
+ },
219
+ {
220
+ "id": "plsat-015",
221
+ "course": "para-201",
222
+ "scenario": "Your project's discipline is `fullstack`. You're adding a new feature: team invitations. The feature involves a UI component for the invite form, an API endpoint, a service for generating invite tokens, and an email sender. You create a new directory `src/features/team-invites/`.",
223
+ "question": "What should the `.purpose` file in this directory contain at minimum?",
224
+ "choices": {
225
+ "A": "Just a `name` field \u2014 Paradigm will auto-discover the rest",
226
+ "B": "A `name`, `description`, and at least one `#component` entry",
227
+ "C": "A full `$flow` definition with all steps documented",
228
+ "D": "Gate definitions (`^`) for all protected endpoints in this feature",
229
+ "E": "Signal definitions (`!`) for all events this feature emits"
230
+ },
231
+ "correct": "B",
232
+ "explanation": "At minimum, a `.purpose` file needs a `name` and `description` (to orient agents and developers) and at least one `#component` documenting a code unit. Gates go in `portal.yaml` (the authoritative source for route protection), not in purpose files. Flows and signals are important but not required for every feature \u2014 they should be added when the feature has multi-step processes or emits events. Paradigm does not auto-discover components; they must be explicitly documented."
233
+ },
234
+ {
235
+ "id": "plsat-016",
236
+ "course": "para-201",
237
+ "scenario": "You're looking at a `portal.yaml` with this route mapping:\n\n```yaml\nroutes:\n \"GET /api/projects\": [^authenticated]\n \"POST /api/projects\": [^authenticated]\n \"GET /api/projects/:id\": [^authenticated, ^project-member]\n \"PUT /api/projects/:id\": [^authenticated, ^project-admin]\n \"DELETE /api/projects/:id\": [^authenticated, ^project-admin]\n \"POST /api/projects/:id/comments\": [^authenticated, ^project-member]\n```\n\nA colleague adds a new endpoint: `DELETE /api/projects/:id/comments/:commentId`. Only the comment author should be able to delete their own comment.",
238
+ "question": "Which gate configuration follows Paradigm best practices?",
239
+ "choices": {
240
+ "A": "Add `[^authenticated, ^project-admin]` \u2014 admins can delete anything",
241
+ "B": "Add `[^authenticated, ^project-member, ^comment-author]` \u2014 must be a member AND the author",
242
+ "C": "Add `[^comment-author]` \u2014 authorship implies authentication and membership",
243
+ "D": "Add `[^authenticated, ^comment-author]` \u2014 logged in and owns the comment",
244
+ "E": "Don't add it to portal.yaml \u2014 handle it in the route handler code only"
245
+ },
246
+ "correct": "B",
247
+ "explanation": "The correct approach is `[^authenticated, ^project-member, ^comment-author]`. Being the comment author doesn't automatically mean you're authenticated or a project member (the comment could be from before you were removed). Each gate has one responsibility: `^authenticated` checks login, `^project-member` checks project access, `^comment-author` checks ownership. If `^comment-author` had `requires: [^authenticated, ^project-member]`, then just `[^comment-author]` would suffice. But without explicit requires, list all gates. Choice E violates the cardinal rule: all protected routes MUST be in portal.yaml."
248
+ },
249
+ {
250
+ "id": "plsat-017",
251
+ "course": "para-201",
252
+ "scenario": "Your team defines the following flow:\n\n```yaml\nflows:\n $user-onboarding:\n description: New user setup after registration\n steps:\n - component: \"#email-verifier\"\n action: send-verification-email\n - component: \"#profile-wizard\"\n action: collect-profile-data\n - component: \"#team-assigner\"\n action: assign-default-team\n - component: \"#welcome-emailer\"\n action: send-welcome-email\n signals: [\"!user-onboarded\"]\n```\n\nYou need to modify `#email-verifier` to use a new email provider.",
253
+ "question": "Before making the code change, what should you do FIRST?",
254
+ "choices": {
255
+ "A": "Run `paradigm_search` to find all references to `#email-verifier`",
256
+ "B": "Read the `#email-verifier` source file to understand the current implementation",
257
+ "C": "Call `paradigm_ripple` on `#email-verifier` to understand the impact",
258
+ "D": "Call `paradigm_orchestrate_inline` to plan the migration",
259
+ "E": "Update the `.purpose` file first to reflect the new provider"
260
+ },
261
+ "correct": "C",
262
+ "explanation": "Before modifying ANY symbol, the first step is always `paradigm_ripple`. This shows you what depends on `#email-verifier` directly and indirectly \u2014 in this case, you'd discover it's part of `$user-onboarding` and any other flows or components that reference it. This prevents you from making changes that break downstream dependencies. After ripple analysis, you'd read the source (B), check wisdom/history, and then implement. Orchestration (D) is for complex multi-file tasks, not single-component changes."
263
+ },
264
+ {
265
+ "id": "plsat-018",
266
+ "course": "para-201",
267
+ "scenario": "You're defining a gate for a multi-tenant SaaS application. Users can belong to multiple organizations, and each organization has its own resources. You need a gate that checks whether the requesting user is a member of the organization that owns the requested resource.",
268
+ "question": "Which gate definition follows the Paradigm portal pattern?",
269
+ "choices": {
270
+ "A": "```yaml\n^org-member:\n description: User is a member of the organization AND has read permission\n check: org.members.includes(req.user.id) && req.user.permissions.read\n```",
271
+ "B": "```yaml\n^org-member:\n description: User is a member of the resource's organization\n check: org.members.includes(req.user.id)\n```",
272
+ "C": "```yaml\n^org-access:\n description: User can access organization resources with full CRUD\n check: org.members.includes(req.user.id) && req.user.role !== 'viewer'\n```",
273
+ "D": "```yaml\n^resource-check:\n description: Validates resource exists and user has access\n check: resource != null && org.members.includes(req.user.id)\n```",
274
+ "E": "```yaml\n^member-or-admin:\n description: User is either a member or an admin of the organization\n check: org.members.includes(req.user.id) || org.admins.includes(req.user.id)\n```"
275
+ },
276
+ "correct": "B",
277
+ "explanation": "Paradigm's gate philosophy is 'one responsibility per gate.' Choice B does exactly one thing: checks organization membership. Choice A bundles membership with permissions (two responsibilities). Choice C adds a role check. Choice D validates resource existence (that's a different concern). Choice E conflates membership and admin roles. If you need permission checks, create `^org-reader`, `^org-writer` as separate gates with `requires: [\"^org-member\"]`. Keep gates minimal and composable."
278
+ },
279
+ {
280
+ "id": "plsat-019",
281
+ "course": "para-201",
282
+ "scenario": "A developer has documented the following in `aspects/`:\n\n```yaml\naspects:\n ~rate-limited:\n description: API endpoints are rate-limited per user\n tags: [security, performance]\n anchors:\n - src/middleware/rate-limiter.ts:12-45\n applies-to: [\"#*-handler\"]\n enforcement: middleware\n```\n\nThe `applies-to` pattern `#*-handler` uses a glob. The developer asks if the aspect will automatically apply rate limiting to all matching components.",
283
+ "question": "What is the correct understanding of `applies-to` in an aspect?",
284
+ "choices": {
285
+ "A": "It automatically applies the middleware to all matching components at runtime",
286
+ "B": "It generates rate-limiting code for each matching component during build",
287
+ "C": "It is a documentation hint \u2014 tells humans/AI which components SHOULD have this aspect, but doesn't enforce it",
288
+ "D": "It creates a compile-time check that all matching components import the rate limiter",
289
+ "E": "It registers the components with the rate-limiter middleware automatically on server startup"
290
+ },
291
+ "correct": "C",
292
+ "explanation": "Paradigm is a documentation and intelligence framework, not a runtime. `applies-to` is a declarative hint that tells humans and AI agents which components should have the `~rate-limited` aspect applied. It doesn't auto-generate code, inject middleware, or create compile-time checks. The anchors point to WHERE the rate limiting is implemented, and `applies-to` says WHERE it SHOULD be applied. `paradigm doctor` and `paradigm_aspect_check` can validate that the anchors exist, but enforcement in the actual code is the developer's responsibility."
293
+ },
294
+ {
295
+ "id": "plsat-020",
296
+ "course": "para-201",
297
+ "scenario": "You open `.paradigm/config.yaml` and see `discipline: fullstack`. You're curious what this means and whether it affects how symbols are mapped.",
298
+ "question": "What does the `discipline` field control in Paradigm?",
299
+ "choices": {
300
+ "A": "It determines which programming language the project uses",
301
+ "B": "It configures the symbol-to-directory mapping and recommended patterns for the project type",
302
+ "C": "It restricts which symbols are allowed \u2014 e.g., some disciplines don't use flows",
303
+ "D": "It's purely cosmetic \u2014 shown in the dashboard but has no functional effect",
304
+ "E": "It determines the deployment pipeline configuration"
305
+ },
306
+ "correct": "B",
307
+ "explanation": "The `discipline` field tells Paradigm what kind of project this is, which influences symbol mappings (e.g., where components vs. gates typically live), suggested patterns, and how AI agents reason about the codebase. A `fullstack` discipline suggests `middleware/` maps to gates, `services/` to components, etc. Different disciplines (e.g., `cli`, `library`, `embedded`) would have different default mappings. Since v2, Paradigm auto-detects the discipline from project structure at init time. It doesn't restrict symbols \u2014 all 5 are always available."
308
+ },
309
+ {
310
+ "id": "plsat-021",
311
+ "course": "para-201",
312
+ "scenario": "While reviewing a PR, you notice a developer added a new webhook endpoint:\n\n```typescript\n// src/api/webhooks/stripe.ts\napp.post('/api/webhooks/stripe', async (req, res) => {\n const event = verifyStripeSignature(req);\n if (event.type === 'payment_intent.succeeded') {\n await updateOrderStatus(event.data);\n await sendReceipt(event.data);\n }\n res.json({ received: true });\n});\n```\n\nThe developer did not update any Paradigm files.",
313
+ "question": "Which Paradigm files should be updated? Select the MOST complete answer.",
314
+ "choices": {
315
+ "A": "Only `portal.yaml` \u2014 add the webhook route with appropriate gates",
316
+ "B": "Only the nearest `.purpose` file \u2014 add `#stripe-webhook-handler` as a component",
317
+ "C": "Both `portal.yaml` and the nearest `.purpose` file",
318
+ "D": "The `.purpose` file, `portal.yaml`, and add a `!payment-succeeded` signal definition",
319
+ "E": "No updates needed \u2014 webhooks are external and don't need Paradigm documentation"
320
+ },
321
+ "correct": "D",
322
+ "explanation": "The most complete answer includes: (1) The `.purpose` file needs a `#stripe-webhook-handler` component with `tags: [integration, stripe]`. (2) `portal.yaml` needs the route \u2014 even webhook endpoints may need gates (e.g., signature verification as `^stripe-signature-valid`). (3) The payment success event should be documented as `!payment-succeeded` since it triggers side effects (order update, receipt). This is the Paradigm principle: if it exists in code, it should exist in the symbol graph."
323
+ },
324
+ {
325
+ "id": "plsat-022",
326
+ "course": "para-201",
327
+ "scenario": "A developer writes this commit message:\n\n```\nadded apple pay button and updated checkout\n```",
328
+ "question": "What is wrong with this commit message according to Paradigm conventions?",
329
+ "choices": {
330
+ "A": "It should use past tense ('added' is correct, actually)",
331
+ "B": "It's missing the conventional commit type, primary symbol in parentheses, and the `Symbols:` trailer",
332
+ "C": "It should be in ALL CAPS for visibility",
333
+ "D": "It should reference the Jira ticket number instead of symbols",
334
+ "E": "Nothing is wrong \u2014 commit messages are personal preference"
335
+ },
336
+ "correct": "B",
337
+ "explanation": "Paradigm commit messages follow a strict format: `type(#primary-symbol): description` in the subject, symbol references in the body, and a `Symbols:` trailer for machine parsing. The correct message would be:\n\n```\nfeat(#payment-form): add Apple Pay support\n\n- Add #apple-pay-button component\n- Update $checkout-flow with new payment step\n\nSymbols: #payment-form, #apple-pay-button, $checkout-flow\n```\n\nThe `Symbols:` trailer is parsed by the post-commit hook for automatic history capture."
338
+ },
339
+ {
340
+ "id": "plsat-023",
341
+ "course": "para-201",
342
+ "scenario": "You're building a real-time notification system. Notifications can arrive via WebSocket, and the user can mark them as read, archive them, or delete them. The system also needs to handle notification preferences (email, push, in-app) and batching for high-volume scenarios.",
343
+ "question": "A team member suggests modeling each notification action (read, archive, delete) as a separate `$` flow. What is the BEST response?",
344
+ "choices": {
345
+ "A": "Agree \u2014 each action is a distinct process that should have its own flow",
346
+ "B": "Disagree \u2014 single actions are not flows; use `#` components for each action and a `$notification-lifecycle` flow for the overall process",
347
+ "C": "Disagree \u2014 these should all be `!` signals since they're user-triggered events",
348
+ "D": "Agree, but only if each action involves 3+ components",
349
+ "E": "Disagree \u2014 model them as `^` gates since they require condition checks"
350
+ },
351
+ "correct": "B",
352
+ "explanation": "Flows (`$`) are for multi-step processes spanning 3+ components. A single action like 'mark as read' is just a component method, not a flow. The correct modeling is: `#notification-reader`, `#notification-archiver`, etc. as components, with `!notification-read`, `!notification-archived` as signals for side effects. If the OVERALL lifecycle (receive \u2192 display \u2192 interact \u2192 archive/delete) is worth documenting, THAT is the flow: `$notification-lifecycle`. Choice D gets close but misses the key insight about modeling the lifecycle."
353
+ },
354
+ {
355
+ "id": "plsat-024",
356
+ "course": "para-201",
357
+ "scenario": "Your project has the following aspect definition:\n\n```yaml\n~audit-required:\n description: Financial operations must produce audit logs\n anchors:\n - src/middleware/audit.ts:15-35\n - src/decorators/auditable.ts:1-20\n applies-to: [\"#*Service\"]\n enforcement: middleware\n```\n\nA colleague refactors `audit.ts` and moves the audit logic from lines 15-35 to lines 50-70.",
358
+ "question": "What happens if the anchors are not updated?",
359
+ "choices": {
360
+ "A": "Nothing \u2014 anchors are just documentation hints and aren't validated",
361
+ "B": "`paradigm doctor` will report stale anchors, and `paradigm_aspect_check` will flag the mismatch",
362
+ "C": "The application will crash because the aspect can't find its enforcement code",
363
+ "D": "The audit middleware will stop working because Paradigm controls execution",
364
+ "E": "The CI pipeline will block the merge due to anchor validation"
365
+ },
366
+ "correct": "B",
367
+ "explanation": "Paradigm is a documentation/intelligence layer, not a runtime. Stale anchors won't crash your app or stop middleware from working. However, `paradigm doctor` (the validation command) and `paradigm_aspect_check` (the MCP tool) will detect that the anchored lines no longer match the expected code. This is important because anchors are the mechanism that keeps aspects grounded in real code rather than becoming aspirational documentation. The developer should update anchors to `src/middleware/audit.ts:50-70` as part of the refactor."
368
+ },
369
+ {
370
+ "id": "plsat-025",
371
+ "course": "para-201",
372
+ "scenario": "You're adding a new API endpoint `POST /api/billing/invoices` to your project. Before writing any code, you want to follow Paradigm best practices.",
373
+ "question": "What is the recommended sequence of steps?",
374
+ "choices": {
375
+ "A": "Write the code \u2192 Update `.purpose` file \u2192 Update `portal.yaml` \u2192 Commit",
376
+ "B": "Call `paradigm_gates_for_route` \u2192 Update `portal.yaml` \u2192 Write the code \u2192 Update `.purpose` file \u2192 Commit",
377
+ "C": "Update `portal.yaml` \u2192 Write the code \u2192 Run `paradigm doctor` \u2192 Commit",
378
+ "D": "Write the code \u2192 Run `paradigm scan` \u2192 Let it auto-generate the purpose file \u2192 Commit",
379
+ "E": "Call `paradigm_orchestrate_inline` \u2192 Spawn agents \u2192 Let agents handle everything"
380
+ },
381
+ "correct": "B",
382
+ "explanation": "The recommended flow for adding endpoints is: (1) Call `paradigm_gates_for_route` to get gate suggestions for `POST /api/billing/invoices`, (2) Update `portal.yaml` with the route and its gates, (3) Implement the endpoint with proper gate enforcement, (4) Update the nearest `.purpose` file with the new `#` component, signals, etc. (5) Commit with proper Paradigm commit format. This 'portal first' approach ensures security is designed before implementation. Choice D is wrong because `paradigm scan` discovers existing symbols but doesn't auto-generate purpose files from code."
383
+ },
384
+ {
385
+ "id": "plsat-026",
386
+ "course": "para-301",
387
+ "scenario": "You're in the middle of a long Claude Code session. You've made 47 tool calls, modified 12 files, and you're about to start a complex refactor of the payment system. You vaguely recall something about context management but can't remember the details.",
388
+ "question": "What should you do before starting the refactor?",
389
+ "choices": {
390
+ "A": "Just continue \u2014 context management is handled automatically",
391
+ "B": "Call `paradigm_context_check` to see if a handoff is recommended",
392
+ "C": "Start a new Claude session immediately to get fresh context",
393
+ "D": "Save all files and run `paradigm scan` to rebuild the index",
394
+ "E": "Call `paradigm_session_stats` and if over 100 tool calls, panic"
395
+ },
396
+ "correct": "B",
397
+ "explanation": "The protocol says to call `paradigm_context_check` periodically (every 10-15 tool calls) during long sessions. At 47 tool calls, you're well overdue for a check. This tool analyzes your context window usage and recommends whether to continue, prepare a handoff, or urgently wrap up. If usage is over 85%, you should prioritize completing your current task and prepare a handoff with `paradigm_handoff_prepare`. Don't just start a new session (C) without preparing a handoff \u2014 you'd lose all context about what was done."
398
+ },
399
+ {
400
+ "id": "plsat-027",
401
+ "course": "para-301",
402
+ "scenario": "You run `paradigm doctor` and get the following output:\n\n```\nWARNING: #payment-processor has been modified 7 times in 14 days\nWARNING: #payment-processor has 3 rollbacks in history\nFRAGILITY SCORE: 0.85 (HIGH)\n```",
403
+ "question": "What does a fragility score of 0.85 indicate, and what should you do?",
404
+ "choices": {
405
+ "A": "The component has a bug 85% of the time \u2014 rewrite it from scratch",
406
+ "B": "85% of the codebase depends on it \u2014 extract it into a separate service",
407
+ "C": "The component is highly unstable due to frequent changes and rollbacks \u2014 proceed with extra caution, review wisdom, and consider refactoring",
408
+ "D": "The component needs 85% more test coverage \u2014 write tests first",
409
+ "E": "The score is informational only \u2014 ignore it and proceed normally"
410
+ },
411
+ "correct": "C",
412
+ "explanation": "A fragility score of 0.85 (out of 1.0) means the component is highly unstable. It's been changed 7 times in 2 weeks with 3 rollbacks \u2014 a clear pattern of churn. Before modifying it: (1) Call `paradigm_wisdom_context` to check if there are antipatterns or decisions recorded about it, (2) Call `paradigm_history_context` to understand the recent changes, (3) Consider whether a refactor is needed before adding more changes. The score doesn't mean 'has bugs 85%' or 'needs 85% coverage' \u2014 it's a stability metric based on change frequency and rollback rate."
413
+ },
414
+ {
415
+ "id": "plsat-028",
416
+ "course": "para-301",
417
+ "scenario": "After a production incident where the payment system double-charged a customer, the team discovers the root cause: a developer removed a deduplication check while refactoring `#payment-processor`. The team wants to prevent this from happening again.",
418
+ "question": "What is the MOST appropriate Paradigm response to this incident?",
419
+ "choices": {
420
+ "A": "Add a comment in the code: `// DO NOT REMOVE THIS CHECK`",
421
+ "B": "Record an antipattern in wisdom: 'Never remove deduplication from #payment-processor' with the alternative approach",
422
+ "C": "Create a `^deduplication-enforced` gate in portal.yaml",
423
+ "D": "Add `#payment-processor` to a 'do not touch' list in `.paradigm/config.yaml`",
424
+ "E": "Record the incident in Sentinel AND record an antipattern in wisdom"
425
+ },
426
+ "correct": "E",
427
+ "explanation": "The most complete response uses both Sentinel and Wisdom. (1) Record the incident with `paradigm_sentinel_record` so it appears in incident tracking with symbolic context (the `#payment-processor` symbol, error details, timeline). (2) Record an antipattern with `paradigm_wisdom_record` so future AI agents and developers are warned before modifying `#payment-processor`. The antipattern would say: 'Never remove deduplication logic' with alternative: 'If refactoring payment processing, always preserve the deduplication middleware and add tests for it.' A code comment (A) is easily missed. A gate (C) is for condition checks on routes, not business logic."
428
+ },
429
+ {
430
+ "id": "plsat-029",
431
+ "course": "para-301",
432
+ "scenario": "You need to understand the impact of changing `^authenticated` \u2014 the main authentication gate used across your entire application. You want to know what depends on it.",
433
+ "question": "Which MCP tool call gives you the MOST useful dependency information?",
434
+ "choices": {
435
+ "A": "`paradigm_search({ query: '^authenticated' })` \u2014 find all references",
436
+ "B": "`paradigm_related({ symbol: '^authenticated' })` \u2014 show direct relations",
437
+ "C": "`paradigm_ripple({ symbol: '^authenticated', depth: 3 })` \u2014 show direct AND indirect dependencies up to 3 levels",
438
+ "D": "`paradigm_navigate({ intent: 'find', target: '^authenticated' })` \u2014 locate the gate",
439
+ "E": "`paradigm_flows_affected({ symbol: '^authenticated' })` \u2014 show affected flows"
440
+ },
441
+ "correct": "C",
442
+ "explanation": "`paradigm_ripple` with a depth parameter gives you the cascading dependency analysis. For a widely-used gate like `^authenticated`, you need to see not just what directly references it, but what depends on things that depend on it (transitive dependencies). At depth 3, you'd see: Level 1 \u2014 all gates with `requires: [^authenticated]`, all routes using it. Level 2 \u2014 all components behind those routes. Level 3 \u2014 flows involving those components. `paradigm_related` (B) only shows direct connections. `paradigm_search` (A) finds textual references but doesn't analyze the dependency graph."
443
+ },
444
+ {
445
+ "id": "plsat-030",
446
+ "course": "para-301",
447
+ "scenario": "It's Monday morning. You open Claude Code to continue work on a project. Last Friday, a different Claude session was making changes to the user management module. You have no idea what state things are in.",
448
+ "question": "What is the FIRST thing you should do?",
449
+ "choices": {
450
+ "A": "Run `git log` to see recent commits",
451
+ "B": "Call `paradigm_session_recover` to load breadcrumbs from the previous session",
452
+ "C": "Call `paradigm_status` for a general project overview",
453
+ "D": "Read the `.paradigm/config.yaml` to understand the project",
454
+ "E": "Start fresh \u2014 don't worry about what the previous session did"
455
+ },
456
+ "correct": "B",
457
+ "explanation": "`paradigm_session_recover` is designed exactly for this scenario. It loads breadcrumbs from previous sessions, showing you what was done, what files were modified, what symbols were touched, and what the next steps were. This is more useful than `paradigm_status` (C) because status gives you general project info, not session-specific context. After recovering the session, THEN you'd call `paradigm_status` and check the relevant files. Starting fresh (E) risks duplicating work or missing important context."
458
+ },
459
+ {
460
+ "id": "plsat-031",
461
+ "course": "para-301",
462
+ "scenario": "Your application is experiencing intermittent 500 errors on the checkout flow. You suspect it's related to the Stripe integration. You want to check if there's a known pattern for this type of failure.",
463
+ "question": "Which sequence of Sentinel tools should you use?",
464
+ "choices": {
465
+ "A": "`paradigm_sentinel_triage` to see open incidents, then `paradigm_sentinel_patterns` to find matching failure patterns",
466
+ "B": "`paradigm_sentinel_stats` to see overall health, then guess at the root cause",
467
+ "C": "`paradigm_sentinel_record` to create a new incident immediately",
468
+ "D": "`paradigm_sentinel_suggest_pattern` without any incident context",
469
+ "E": "`paradigm_sentinel_resolve` to close any open incidents and hope it goes away"
470
+ },
471
+ "correct": "A",
472
+ "explanation": "The diagnostic workflow is: (1) `paradigm_sentinel_triage` with a filter like `search: '500'` or `symbol: '#stripe-service'` to see if there are existing open incidents matching your symptoms. (2) `paradigm_sentinel_patterns` to find known failure patterns (with confidence scores) that match the error. If a pattern matches, it includes resolution steps and code hints. You'd only record a NEW incident (C) if triage shows this is a novel failure. Resolving without investigating (E) is never the right answer. Stats (B) give you health metrics but not diagnostic details."
473
+ },
474
+ {
475
+ "id": "plsat-032",
476
+ "course": "para-301",
477
+ "scenario": "You want to find who on your team has the most expertise with the payment system before making a significant architectural change.",
478
+ "question": "Which Paradigm tool helps you find the right person?",
479
+ "choices": {
480
+ "A": "`paradigm_search({ query: 'payments' })` and look at file authors in git blame",
481
+ "B": "`paradigm_wisdom_expert({ area: 'payments' })` to find recognized experts",
482
+ "C": "`paradigm_history_context({ symbols: ['#payment-service'] })` and infer from commit history",
483
+ "D": "`paradigm_navigate({ intent: 'explore', target: 'payments' })` and read the code to figure out who wrote it",
484
+ "E": "Ask in Deus / Slack / Teams"
485
+ },
486
+ "correct": "B",
487
+ "explanation": "`paradigm_wisdom_expert` is purpose-built for finding human experts by area or symbol. It returns people who are recognized as knowledgeable about the payment system, based on recorded wisdom and history. While `paradigm_history_context` (C) can show who recently worked on the code, that doesn't mean they're the expert \u2014 they might have just fixed a typo. `paradigm_wisdom_expert` tracks deliberate expertise attribution, not just commit frequency."
488
+ },
489
+ {
490
+ "id": "plsat-033",
491
+ "course": "para-301",
492
+ "scenario": "After completing a significant refactor of the authentication module, you want to record what you did for future sessions and team members.",
493
+ "question": "What is the correct way to record this in Paradigm's history system?",
494
+ "choices": {
495
+ "A": "Write a detailed comment in the `.purpose` file",
496
+ "B": "Call `paradigm_history_record` with type 'refactor', affected symbols, and description",
497
+ "C": "Update `.paradigm/docs/changelog.md` with the changes",
498
+ "D": "Just commit with a good message \u2014 git history is sufficient",
499
+ "E": "Call `paradigm_wisdom_record` with type 'decision' explaining the refactor rationale"
500
+ },
501
+ "correct": "B",
502
+ "explanation": "`paradigm_history_record` is the right tool for recording implementation events. You'd call it with `type: 'refactor'`, `symbols: ['^authenticated', '#auth-middleware', ...]`, and a description of what was changed. This feeds into the history system that powers `paradigm_history_context` and `paradigm_history_fragility`. A good commit message (D) is important but separate \u2014 Paradigm's history provides symbolic context that git alone doesn't. If the refactor involved an architectural DECISION, you'd ALSO record wisdom (E), but that's supplementary, not a replacement."
503
+ },
504
+ {
505
+ "id": "plsat-034",
506
+ "course": "para-301",
507
+ "scenario": "You've run tests after implementing a new feature. 15 tests passed, 2 failed, and 1 was skipped. You previously recorded the implementation with `paradigm_history_record` and got back an implementation ID.",
508
+ "question": "How should you record the test results?",
509
+ "choices": {
510
+ "A": "Update the implementation record by calling `paradigm_history_record` again",
511
+ "B": "Call `paradigm_history_validate` with result 'partial' and the test counts",
512
+ "C": "Call `paradigm_history_validate` with result 'fail' because not all tests passed",
513
+ "D": "Don't record it \u2014 fix the failing tests first, then record a 'pass'",
514
+ "E": "Call `paradigm_sentinel_record` to log the test failures as incidents"
515
+ },
516
+ "correct": "B",
517
+ "explanation": "`paradigm_history_validate` is the validation companion to `paradigm_history_record`. With 15 passed, 2 failed, and 1 skipped, the result is 'partial' (not full pass, not complete failure). You'd call it with `result: 'partial'` and `tests: { passed: 15, failed: 2, skipped: 1 }`. This creates a validation record linked to the implementation. Recording it as 'fail' (C) is too harsh \u2014 partial acknowledges progress. Waiting to record (D) loses valuable history about the initial state. Test failures aren't production incidents (E) unless they indicate a production problem."
518
+ },
519
+ {
520
+ "id": "plsat-035",
521
+ "course": "para-301",
522
+ "scenario": "A context check returns the following:\n\n```\nContext usage: ~82%\nRecommendation: prepare-handoff\nMessage: Context getting full. Complete current task and prepare handoff.\n```\n\nYou're in the middle of implementing a feature that's about 70% done.",
523
+ "question": "What is the correct course of action?",
524
+ "choices": {
525
+ "A": "Ignore the warning and finish the feature \u2014 82% means you still have 18% left",
526
+ "B": "Stop immediately and call `paradigm_handoff_prepare` with what you've done so far",
527
+ "C": "Finish the current task as quickly as possible, then call `paradigm_handoff_prepare` with a summary, modified files, and next steps",
528
+ "D": "Delete some earlier context by running `paradigm_session_recover` to free up space",
529
+ "E": "Switch to a different, smaller task that can be completed in the remaining context"
530
+ },
531
+ "correct": "C",
532
+ "explanation": "At 82% with a 'prepare-handoff' recommendation, you should complete your current task (not start new ones) and then hand off. The protocol says: when context usage is high but not critical (>85%), prioritize completing the current task, then prepare a handoff. `paradigm_handoff_prepare` takes your summary, modified files, symbols touched, and next steps \u2014 giving the next session everything it needs to pick up where you left off. Ignoring it (A) risks running out of context mid-task. Stopping immediately (B) wastes the 70% progress. You can't delete context (D)."
533
+ },
534
+ {
535
+ "id": "plsat-036",
536
+ "course": "para-301",
537
+ "scenario": "You want to understand the complete structure of the authentication module without reading every file. The project has 200+ files across nested directories.",
538
+ "question": "What is the MOST token-efficient way to explore this?",
539
+ "choices": {
540
+ "A": "Read every file in `src/auth/` one by one",
541
+ "B": "Call `paradigm_navigate({ intent: 'explore', target: 'auth' })` to browse the area",
542
+ "C": "Run `paradigm_search({ query: 'auth' })` and read every matching file",
543
+ "D": "Read `.paradigm/navigator.yaml` and then every file it references",
544
+ "E": "Call `paradigm_status` and hope it includes auth module details"
545
+ },
546
+ "correct": "B",
547
+ "explanation": "`paradigm_navigate` with intent 'explore' is designed for exactly this: browsing an area of the codebase without reading individual files. At ~200 tokens per call, it's vastly more efficient than reading files (~500-2000 tokens each). It returns the structural overview of the auth area \u2014 components, gates, flows, signals \u2014 from the indexed symbols. If you need specific implementation details AFTER exploring, then you read individual files. The rule is: MCP for discovery, files for implementation."
548
+ },
549
+ {
550
+ "id": "plsat-037",
551
+ "course": "para-301",
552
+ "scenario": "You're debugging an issue where the `$order-fulfillment` flow is failing at the 'ship order' step. The flow has 6 steps spanning 4 components. You suspect the gate `^warehouse-authorized` is rejecting valid requests.",
553
+ "question": "Which combination of tools gives you the MOST diagnostic information?",
554
+ "choices": {
555
+ "A": "`paradigm_flow_validate({ flowId: '$order-fulfillment' })` + `paradigm_sentinel_triage({ symbol: '^warehouse-authorized' })`",
556
+ "B": "`paradigm_search({ query: 'warehouse' })` + read all matching files",
557
+ "C": "`paradigm_ripple({ symbol: '$order-fulfillment' })` only",
558
+ "D": "`paradigm_history_context({ symbols: ['$order-fulfillment'] })` only",
559
+ "E": "`paradigm_navigate({ intent: 'find', target: '^warehouse-authorized' })` + read the gate code"
560
+ },
561
+ "correct": "A",
562
+ "explanation": "The best combination is: (1) `paradigm_flow_validate` checks the flow definition against the codebase \u2014 are all steps implemented, do the gates exist, are signals emitted? This could reveal if the flow definition is out of sync with the code. (2) `paradigm_sentinel_triage` filtered by `^warehouse-authorized` shows if there are incidents or known patterns for this gate failing. Together, these give you structural validation AND operational history. Ripple (C) shows dependencies but not failures. History (D) shows changes but not current errors."
563
+ },
564
+ {
565
+ "id": "plsat-038",
566
+ "course": "para-301",
567
+ "scenario": "Your team has been using Paradigm for 6 months. A new developer joins and asks: 'How do I know if the Paradigm files are actually accurate? What if the code has drifted from the documentation?'",
568
+ "question": "What is the correct answer?",
569
+ "choices": {
570
+ "A": "Trust the Paradigm files \u2014 they're always accurate because they're machine-generated",
571
+ "B": "Run `paradigm doctor` to validate consistency between Paradigm files and the codebase, and check `paradigm_aspect_check` for aspect anchor drift",
572
+ "C": "Paradigm files are aspirational \u2014 they describe what the code SHOULD be, not what it IS",
573
+ "D": "Run `paradigm scan` to regenerate all Paradigm files from scratch",
574
+ "E": "Check the git blame on `.purpose` files to see when they were last updated"
575
+ },
576
+ "correct": "B",
577
+ "explanation": "`paradigm doctor` is the validation tool that checks for inconsistencies between Paradigm files and the codebase. It flags missing anchors, undefined symbols referenced in flows, gates referenced in portal.yaml that don't have implementations, and more. `paradigm_aspect_check` specifically validates that aspect anchors still point to valid code. `paradigm_purpose_validate` checks `.purpose` file structural validity. These tools are how you verify accuracy. Paradigm files are NOT auto-generated (A) or aspirational (C) \u2014 they're maintained documentation that has validation tools."
578
+ },
579
+ {
580
+ "id": "plsat-039",
581
+ "course": "para-401",
582
+ "scenario": "You need to build a complete user profile feature: a UI component, API endpoint, database service, validation logic, and tests. This will touch at least 6 files across 3 directories.",
583
+ "question": "Before writing ANY code, what should you do FIRST?",
584
+ "choices": {
585
+ "A": "Start coding the UI component \u2014 start with the frontend and work backwards",
586
+ "B": "Call `paradigm_orchestrate_inline({ task: 'Build user profile feature', mode: 'plan' })` to get the right agents and plan",
587
+ "C": "Call `paradigm_search` for existing profile-related symbols",
588
+ "D": "Create the `.purpose` file first to define all the symbols",
589
+ "E": "Call `paradigm_ripple` on every component you plan to create"
590
+ },
591
+ "correct": "B",
592
+ "explanation": "When a task affects 3+ files, involves multiple features, or spans security and implementation, the FIRST step is calling `paradigm_orchestrate_inline` with mode='plan'. This returns: the right agent team (e.g., architect + security + builder + tester), estimated token cost, and an execution plan with stages. This prevents you from wasting tokens on ad-hoc implementation when a structured approach would be more efficient. After the plan, you'd call with mode='execute' to get full agent prompts. You can't ripple (E) symbols that don't exist yet."
593
+ },
594
+ {
595
+ "id": "plsat-040",
596
+ "course": "para-401",
597
+ "scenario": "You call `paradigm_orchestrate_inline` with mode='plan' for a task involving JWT authentication. The plan returns four agents: architect, security, builder, tester. The plan shows two stages:\n\n```\nStage 1: [architect, security] (canRunParallel: true)\nStage 2: [builder, tester] (canRunParallel: false)\n```",
598
+ "question": "How should you execute this plan?",
599
+ "choices": {
600
+ "A": "Run all four agents simultaneously for maximum speed",
601
+ "B": "Run architect and security in parallel, wait for both to complete, then run builder, then tester sequentially",
602
+ "C": "Run architect first, then security, then builder, then tester \u2014 always sequential",
603
+ "D": "Skip the architect and security agents \u2014 just run builder and tester",
604
+ "E": "Run builder first to get code written, then architect and security for review"
605
+ },
606
+ "correct": "B",
607
+ "explanation": "The orchestration plan explicitly marks `canRunParallel: true` for Stage 1 (architect + security), meaning they can run simultaneously. Stage 2 has `canRunParallel: false`, meaning builder must complete before tester starts. The correct execution is: launch architect and security in parallel (Stage 1), wait for both to finish, run builder with handoff context from Stage 1, then run tester after builder completes. Skipping agents (D) defeats the purpose of orchestration. Running builder first (E) ignores architecture and security design."
608
+ },
609
+ {
610
+ "id": "plsat-041",
611
+ "course": "para-401",
612
+ "scenario": "Your team is evaluating which agent provider to use for orchestration. The environment has:\n- `ANTHROPIC_API_KEY` set\n- Claude Code installed (Max subscription)\n- Cursor IDE open\n- No `.paradigm/config.yaml` provider override\n\nThe team runs `paradigm team providers`.",
613
+ "question": "Which provider will be used by default based on the cascade?",
614
+ "choices": {
615
+ "A": "Cursor agent CLI \u2014 because Cursor IDE is detected",
616
+ "B": "Claude Code Task tool \u2014 because Max subscription is available",
617
+ "C": "Anthropic API (claude) \u2014 because it's first in the cascade and the API key is set",
618
+ "D": "Manual file-based handoffs \u2014 because no provider is explicitly configured",
619
+ "E": "Claude Code Agent Teams \u2014 because it supports parallel execution"
620
+ },
621
+ "correct": "C",
622
+ "explanation": "The provider cascade tries providers in order: (1) claude (Anthropic API), (2) claude-code-teams, (3) claude-code, (4) cursor-cli, (5) claude-cli, (6) manual. Since `ANTHROPIC_API_KEY` is set, the first provider (`claude` \u2014 Anthropic API) is available and will be used. The cascade stops at the first available provider unless overridden. Even though Cursor and Claude Code are available, they're lower priority. To override, use `paradigm team providers --set cursor-cli` or set `agent-provider` in config."
623
+ },
624
+ {
625
+ "id": "plsat-042",
626
+ "course": "para-401",
627
+ "scenario": "You're configuring agent models for your team. The task involves:\n- An architectural review (complex reasoning needed)\n- A security audit (critical, needs thoroughness)\n- Building 3 UI components (straightforward implementation)\n- Writing unit tests (repetitive, pattern-based)\n\nYour budget is limited.",
628
+ "question": "Which model assignment follows Paradigm's recommended configuration?",
629
+ "choices": {
630
+ "A": "All agents use opus for maximum quality",
631
+ "B": "Architect: opus, Security: opus, Builder: haiku, Tester: haiku",
632
+ "C": "All agents use haiku for cost efficiency",
633
+ "D": "Architect: sonnet, Security: sonnet, Builder: sonnet, Tester: sonnet",
634
+ "E": "Architect: opus, Security: sonnet, Builder: opus, Tester: haiku"
635
+ },
636
+ "correct": "B",
637
+ "explanation": "Paradigm's recommended model configuration is: architect and security agents use opus (complex reasoning, critical decisions), builder uses haiku (fast, cost-effective for straightforward implementation), and tester uses haiku (pattern-based, repetitive work). The reviewer role (not in this scenario) uses sonnet (balanced critique). This balances quality where it matters most (architecture, security) with cost efficiency where tasks are more mechanical (building, testing). All-opus (A) blows the budget. All-haiku (C) risks poor architectural decisions."
638
+ },
639
+ {
640
+ "id": "plsat-043",
641
+ "course": "para-401",
642
+ "scenario": "You're about to call an MCP tool. Your choices are:\n1. `paradigm_status` (~100 tokens)\n2. `paradigm_navigate` (~200 tokens)\n3. Reading a 400-line TypeScript file (~2000 tokens)\n4. `paradigm_ripple` (~300 tokens)\n\nYou need to understand what components exist in the payments area before modifying `#payment-service`.",
643
+ "question": "What is the MOST token-efficient approach?",
644
+ "choices": {
645
+ "A": "Read the TypeScript file directly \u2014 you need to see the actual code",
646
+ "B": "Call `paradigm_navigate` to explore the payments area, then `paradigm_ripple` on `#payment-service`, then read only the specific file you need to change",
647
+ "C": "Call `paradigm_status` first, then read all payment-related files",
648
+ "D": "Call all four tools to be thorough",
649
+ "E": "Skip all tools and just start coding \u2014 you'll figure it out"
650
+ },
651
+ "correct": "B",
652
+ "explanation": "The optimal approach is: (1) `paradigm_navigate` (~200 tokens) to discover what exists in the payments area without reading files. (2) `paradigm_ripple` (~300 tokens) on `#payment-service` to understand impact before modifying. (3) THEN read the specific file you need to change. Total: ~500 tokens + one targeted file read. This follows the rule: 'MCP for discovery, files for implementation.' Reading files first (A) costs ~2000 tokens before you even know what you're looking at. Calling everything (D) wastes `paradigm_status` tokens on info you don't need for this task."
653
+ },
654
+ {
655
+ "id": "plsat-044",
656
+ "course": "para-401",
657
+ "scenario": "Your team decides that all API responses should include a `requestId` header for tracing. This is an architectural decision that affects every API endpoint in the project.",
658
+ "question": "How should this decision be recorded in Paradigm?",
659
+ "choices": {
660
+ "A": "Add a comment in every API route file",
661
+ "B": "Call `paradigm_wisdom_record` with type 'decision', a descriptive title, rationale with factors and conclusion, and consequences",
662
+ "C": "Create a `~request-id-required` aspect and add it to every component",
663
+ "D": "Update `.paradigm/config.yaml` with a new convention",
664
+ "E": "Both B and C \u2014 record the decision AND create an aspect with code anchors"
665
+ },
666
+ "correct": "E",
667
+ "explanation": "The most complete answer is both. (1) Record the architectural decision with `paradigm_wisdom_record` (type: 'decision') including title, rationale (factors: tracing, debugging, support; conclusion: all API responses must include requestId), and consequences (positive: better debugging; negative: slight overhead; mitigations: use middleware). (2) Create `~request-id-required` aspect with anchors pointing to the middleware that adds the header. The decision documents the WHY, the aspect enforces the WHAT with verifiable code anchors. Just the decision (B) lacks enforcement. Just the aspect (C) lacks rationale."
668
+ },
669
+ {
670
+ "id": "plsat-045",
671
+ "course": "para-401",
672
+ "scenario": "You're writing a commit message for a change that added rate limiting to the payment API, modified the Stripe webhook handler, and added a new `!rate-limit-exceeded` signal.\n\nThe affected symbols are: `#payment-api`, `#stripe-webhook-handler`, `~rate-limited`, `!rate-limit-exceeded`.",
673
+ "question": "Which commit message follows Paradigm conventions?",
674
+ "choices": {
675
+ "A": "```\nfeat: add rate limiting to payments\n```",
676
+ "B": "```\nfeat(#payment-api): add rate limiting to payment endpoints\n\n- Apply ~rate-limited aspect to #payment-api\n- Update #stripe-webhook-handler with rate limit checks\n- Add !rate-limit-exceeded signal for monitoring\n\nSymbols: #payment-api, #stripe-webhook-handler, ~rate-limited, !rate-limit-exceeded\n```",
677
+ "C": "```\nfeat(payments): add rate limiting\n\nAdded rate limiting to payment API and webhook handler.\n```",
678
+ "D": "```\nFEAT(#payment-api): ADD RATE LIMITING\n\nSymbols: ALL PAYMENT SYMBOLS\n```",
679
+ "E": "```\nfeat(~rate-limited): apply rate limiting aspect\n\n- Updated payment-api\n- Updated stripe-webhook-handler\n\nSymbols: ~rate-limited\n```"
680
+ },
681
+ "correct": "B",
682
+ "explanation": "Choice B follows all Paradigm commit conventions: (1) Subject line: `type(#primary-symbol): description` with the primary affected component. (2) Body: references all affected symbols with their prefixes (#, ~, !). (3) `Symbols:` trailer: machine-readable list of ALL affected symbols for the post-commit hook to parse. Choice A lacks symbols entirely. Choice C uses a generic scope instead of a symbol. Choice D is SCREAMING_CASE (no). Choice E uses the aspect as the primary symbol, but the primary change is to `#payment-api`, and the Symbols trailer is incomplete."
683
+ },
684
+ {
685
+ "id": "plsat-046",
686
+ "course": "para-401",
687
+ "scenario": "A developer on your team proposes a new tag: `[webhook-handler]`. They've noticed 5 components across the project that handle incoming webhooks and think a dedicated tag would be useful for classification.",
688
+ "question": "What is the correct process for adding this tag?",
689
+ "choices": {
690
+ "A": "Add it directly to the `core` section of `tags.yaml`",
691
+ "B": "Add it directly to the `project` section of `tags.yaml`",
692
+ "C": "Call `paradigm_tags_suggest` with the tag name, description, reason, and example symbols \u2014 it goes to `suggested` for human approval",
693
+ "D": "Just start using `tags: [webhook-handler]` on components \u2014 tags are freeform",
694
+ "E": "Create a new aspect `~webhook-handler` instead \u2014 tags aren't for this"
695
+ },
696
+ "correct": "C",
697
+ "explanation": "The proper process is `paradigm_tags_suggest`, which adds the tag to the `suggested` section of `tags.yaml` for human review. This is Paradigm's governance model: AI can propose tags, but humans must approve them before they become official. Once approved, a human promotes it to `project` (team-specific) or `core` (if it should ship with Paradigm). Adding directly to `core` (A) is only for Paradigm framework maintainers. Freeform usage (D) leads to tag sprawl. An aspect (E) is wrong because webhook handling isn't a cross-cutting rule requiring code anchors."
698
+ },
699
+ {
700
+ "id": "plsat-047",
701
+ "course": "para-401",
702
+ "scenario": "Your CI/CD pipeline runs `paradigm doctor` as a check. The latest run shows:\n\n```\nERROR: Gate ^project-owner referenced in portal.yaml but not defined\nWARNING: Aspect ~cache-invalidation has stale anchors (file moved)\nERROR: Flow $signup-flow references undefined component #sms-verifier\nINFO: 3 suggested tags awaiting human review\n```",
703
+ "question": "Which issues MUST be fixed before merging, and which can wait?",
704
+ "choices": {
705
+ "A": "All four must be fixed \u2014 `paradigm doctor` errors should block the merge",
706
+ "B": "The two ERRORs must be fixed (undefined gate and undefined component). The WARNING and INFO can wait.",
707
+ "C": "Only the gate error must be fixed (security). Everything else is documentation.",
708
+ "D": "None need to block the merge \u2014 `paradigm doctor` is advisory only",
709
+ "E": "The errors and warning must be fixed. Only the INFO about suggested tags can wait."
710
+ },
711
+ "correct": "B",
712
+ "explanation": "ERRORs indicate broken references that will cause real problems: a gate referenced in `portal.yaml` that doesn't exist means route protection is undefined, and a flow referencing an undefined component means the flow documentation is actively misleading. These MUST be fixed. The WARNING about stale anchors is important but not merge-blocking \u2014 the aspect still works, the documentation just needs updating. The INFO about suggested tags is purely administrative. In practice, many teams also fix WARNINGs before merge, but the ERRORs are the must-fix items."
713
+ },
714
+ {
715
+ "id": "plsat-048",
716
+ "course": "para-401",
717
+ "scenario": "You're preparing a handoff because your context window is at 87%. You've been working on a migration from REST to GraphQL for the user module. You've completed the schema and resolvers but haven't written tests yet.",
718
+ "question": "What information should you include in `paradigm_handoff_prepare`?",
719
+ "choices": {
720
+ "A": "Just the summary \u2014 the next session can figure out the rest",
721
+ "B": "Summary, list of modified files, symbols touched, next steps (write tests), and the open question about whether to keep the REST endpoints during migration",
722
+ "C": "A complete transcript of everything you did in this session",
723
+ "D": "Only the list of modified files \u2014 the next session can read them",
724
+ "E": "Summary and next steps only \u2014 modified files are in git"
725
+ },
726
+ "correct": "B",
727
+ "explanation": "`paradigm_handoff_prepare` accepts: summary (what was done), modifiedFiles (what changed), symbolsTouched (which symbols were affected), nextSteps (what to do next), and openQuestions (unresolved decisions). The MOST useful handoff includes ALL of these. The next session needs to know: (1) what was accomplished (summary), (2) which files to look at (modifiedFiles), (3) which symbols are in play (symbolsTouched), (4) exactly what to do next (write tests), and (5) any decisions that still need to be made (keep REST endpoints?). A transcript (C) is too much. Just files (D) lacks context."
728
+ },
729
+ {
730
+ "id": "plsat-049",
731
+ "course": "para-401",
732
+ "scenario": "You want to validate that a specific flow `$checkout-flow` is correctly implemented. The flow has 5 steps, involves 3 gates, and emits 2 signals. You want to verify that all steps have implementations, gates exist in portal.yaml, and signals are actually emitted in the code.",
733
+ "question": "Which MCP tool call gives you this deep implementation check?",
734
+ "choices": {
735
+ "A": "`paradigm_flow_validate({ flowId: '$checkout-flow' })` \u2014 validates flow definition only",
736
+ "B": "`paradigm_flow_validate({ flowId: '$checkout-flow', checkImplementation: true })` \u2014 deep check against codebase",
737
+ "C": "`paradigm_purpose_validate()` \u2014 validates all purpose files including flows",
738
+ "D": "`paradigm_ripple({ symbol: '$checkout-flow' })` \u2014 shows flow dependencies",
739
+ "E": "`paradigm_related({ symbol: '$checkout-flow' })` \u2014 shows what's connected to the flow"
740
+ },
741
+ "correct": "B",
742
+ "explanation": "`paradigm_flow_validate` with `checkImplementation: true` performs a deep validation: it checks that gates exist in portal.yaml, actions are implemented in the codebase, and signals are emitted. Without `checkImplementation`, it only validates the YAML structure (A). `paradigm_purpose_validate` (C) checks structural validity of purpose files but doesn't do the deep codebase cross-reference. `paradigm_ripple` (D) shows what depends on the flow, not whether it's correctly implemented. The `checkImplementation` flag is the key to going from structural validation to implementation verification."
743
+ },
744
+ {
745
+ "id": "plsat-050",
746
+ "course": "para-401",
747
+ "scenario": "It's 2 AM. Your production system is down. The error logs show:\n\n```\nERROR: Cannot read property 'id' of null\n at PaymentProcessor.processRefund (payment-processor.ts:142)\n at RefundHandler.handle (refund-handler.ts:67)\n```\n\nYou need to investigate and fix this as fast as possible using Paradigm tools. The on-call engineer has no context about the payment system.",
748
+ "question": "What is the optimal 2 AM sequence of actions using Paradigm?",
749
+ "choices": {
750
+ "A": "Read the source files, find the bug, fix it, deploy",
751
+ "B": "`paradigm_sentinel_record` the incident \u2192 `paradigm_sentinel_patterns` for known fixes \u2192 `paradigm_wisdom_context` for `#payment-processor` antipatterns \u2192 Fix \u2192 `paradigm_sentinel_resolve`",
752
+ "C": "`paradigm_orchestrate_inline` to spin up an architect and security agent",
753
+ "D": "`paradigm_status` \u2192 `paradigm_navigate` \u2192 Read every file in payments/ \u2192 Eventually find the bug",
754
+ "E": "`paradigm_ripple` on `#payment-processor` \u2192 Fix everything that depends on it"
755
+ },
756
+ "correct": "B",
757
+ "explanation": "At 2 AM with production down, you want the fastest path to resolution with full traceability: (1) `paradigm_sentinel_record` the incident with the error and stack trace \u2014 this starts the clock and provides symbolic context. (2) `paradigm_sentinel_patterns` to check if this is a KNOWN failure pattern with an existing resolution \u2014 this could save you hours. (3) `paradigm_wisdom_context` for `#payment-processor` to check if there are recorded antipatterns (e.g., 'null check required before accessing refund.id'). (4) Fix the issue with full context. (5) `paradigm_sentinel_resolve` to close the incident with the fix commit. Orchestration (C) is overkill for an emergency fix. Reading everything (D) burns time you don't have."
758
+ }
759
+ ]
760
+ }