@a-company/paradigm 3.0.3 → 3.1.2

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 (32) hide show
  1. package/dist/{triage-RM5KNG5V.js → chunk-4LGLU2LO.js} +1035 -663
  2. package/dist/{chunk-4WR7X3FE.js → chunk-AQZSUGL3.js} +42 -6
  3. package/dist/{chunk-27OSFWHG.js → chunk-MVXJVRFI.js} +98 -1
  4. package/dist/{chunk-S65LENNL.js → chunk-VZ7CXFRZ.js} +248 -3
  5. package/dist/delete-W67IVTLJ.js +45 -0
  6. package/dist/dist-GPQ4LAY3.js +42 -0
  7. package/dist/edit-Y7XPYSMK.js +63 -0
  8. package/dist/habits-FA65W77Y.js +1153 -0
  9. package/dist/{hooks-7TQIRXXS.js → hooks-YXPQV4SP.js} +1 -1
  10. package/dist/index.js +84 -31
  11. package/dist/{list-QMUE7DPK.js → list-R3QWW4SC.js} +3 -1
  12. package/dist/{lore-server-3TAIUZ3Y.js → lore-server-RQH5REZV.js} +166 -41
  13. package/dist/mcp.js +1608 -117
  14. package/dist/{record-5CTCDFUO.js → record-OHQNWOUP.js} +7 -2
  15. package/dist/{review-QEDNQAIO.js → review-RUHX25A5.js} +1 -1
  16. package/dist/{sentinel-RSEXIRXM.js → sentinel-WB7GIK4V.js} +1 -1
  17. package/dist/{serve-WCIRW244.js → serve-H7ZBMODT.js} +1 -1
  18. package/dist/{server-NXG5N7JE.js → server-MV4HNFVF.js} +1 -1
  19. package/dist/{shift-NABNKPGL.js → shift-JDBRTHWO.js} +1 -1
  20. package/dist/{show-S653P3TO.js → show-WTOJXUTN.js} +1 -1
  21. package/dist/timeline-P7BARFLI.js +110 -0
  22. package/dist/triage-TBIWJA6R.js +671 -0
  23. package/dist/university-content/courses/para-401.json +1 -1
  24. package/dist/university-content/courses/para-501.json +486 -0
  25. package/dist/university-content/plsat/v3.0.json +233 -0
  26. package/dist/university-content/reference.json +61 -0
  27. package/lore-ui/dist/assets/index-BB3P4Cok.js +56 -0
  28. package/lore-ui/dist/assets/index-DI0Q6NmX.css +1 -0
  29. package/lore-ui/dist/index.html +2 -2
  30. package/package.json +1 -1
  31. package/lore-ui/dist/assets/index-DcT8TINz.js +0 -56
  32. package/lore-ui/dist/assets/index-DyJhpQ5w.css +0 -1
@@ -1157,6 +1157,239 @@
1157
1157
  "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."
1158
1158
  }
1159
1159
  ]
1160
+ },
1161
+ {
1162
+ "type": "standalone",
1163
+ "slot": "slot-051",
1164
+ "course": "para-501",
1165
+ "variants": [
1166
+ {
1167
+ "id": "plsat-051",
1168
+ "scenario": "Your team just held a meeting where the lead architect decided to switch from PostgreSQL to CockroachDB for the user service. No code was written yet — this is purely a strategic decision with rationale documented in meeting notes.",
1169
+ "question": "Which lore entry type should be used to record this?",
1170
+ "choices": {
1171
+ "A": "`agent-session` — because the meeting was a work session",
1172
+ "B": "`milestone` — because switching databases is a major event",
1173
+ "C": "`decision` — because this is an architectural decision with rationale and no implementation",
1174
+ "D": "`human-note` — because a human made the decision",
1175
+ "E": "`review` — because the team reviewed database options"
1176
+ },
1177
+ "correct": "C",
1178
+ "explanation": "The `decision` entry type is specifically for architectural or design decisions with rationale. No code was written (ruling out `agent-session`), it is not yet a completed achievement (ruling out `milestone`), and while a human made the decision, the entry type describes the *content* not the *author* — the author field separately tracks who recorded it. A standalone decision with rationale is exactly what the `decision` type exists for."
1179
+ }
1180
+ ]
1181
+ },
1182
+ {
1183
+ "type": "standalone",
1184
+ "slot": "slot-052",
1185
+ "course": "para-501",
1186
+ "variants": [
1187
+ {
1188
+ "id": "plsat-052",
1189
+ "scenario": "An agent just finished a quick session where it fixed a typo in a README and updated one comment in a source file. Total files modified: 2 (README.md and src/utils/format.ts).",
1190
+ "question": "Should the agent record a lore entry before ending the session?",
1191
+ "choices": {
1192
+ "A": "Yes — every session should be recorded regardless of scope",
1193
+ "B": "No — 2 files is below the 3-file significance threshold, and the stop hook will not require it",
1194
+ "C": "Yes — the source file modification triggers the recording requirement",
1195
+ "D": "No — but only because README.md is not a source file",
1196
+ "E": "It depends on whether the typo fix was in a critical component"
1197
+ },
1198
+ "correct": "B",
1199
+ "explanation": "The lore recording trigger is 3+ modified source files. With only 2 files modified (and one being a README which is typically excluded from the source file count), this session is below the threshold. The stop hook will not block for a missing lore entry. Agents can still choose to record, but it is not enforced."
1200
+ }
1201
+ ]
1202
+ },
1203
+ {
1204
+ "type": "standalone",
1205
+ "slot": "slot-053",
1206
+ "course": "para-501",
1207
+ "variants": [
1208
+ {
1209
+ "id": "plsat-053",
1210
+ "scenario": "Sentinel has recorded 5 incidents over the past week. Three involve `#payment-processor` with TypeError, one involves `#payment-processor` with NetworkError, and one involves `#auth-service` with TypeError. Sentinel groups incidents using a 0.6 similarity threshold.",
1211
+ "question": "How many incident groups will Sentinel likely create?",
1212
+ "choices": {
1213
+ "A": "1 group — all 5 incidents involve errors in the same general area",
1214
+ "B": "2 groups — one for the 3 TypeError incidents in #payment-processor, and the auth TypeError stays separate because different component",
1215
+ "C": "3 groups — one per unique (component, error type) combination",
1216
+ "D": "5 groups — each incident is unique",
1217
+ "E": "2 groups — one for all #payment-processor incidents (4), one for #auth-service (1)"
1218
+ },
1219
+ "correct": "C",
1220
+ "explanation": "Sentinel groups by symbolic similarity with a 0.6 threshold. The three `#payment-processor` + TypeError incidents share both component and error type — high similarity, one group. The `#payment-processor` + NetworkError shares the component but differs in error type — enough divergence for a separate group. The `#auth-service` + TypeError shares error type with group 1 but differs in component — separate group. Three distinct (component, error type) clusters yield 3 groups."
1221
+ }
1222
+ ]
1223
+ },
1224
+ {
1225
+ "type": "standalone",
1226
+ "slot": "slot-054",
1227
+ "course": "para-501",
1228
+ "variants": [
1229
+ {
1230
+ "id": "plsat-054",
1231
+ "scenario": "A production error just occurred. You want to record it, check for known fixes, resolve it, and then create a new pattern so future occurrences are handled faster.",
1232
+ "question": "What is the correct Sentinel tool sequence?",
1233
+ "choices": {
1234
+ "A": "`sentinel_add_pattern` → `sentinel_record` → `sentinel_resolve`",
1235
+ "B": "`sentinel_triage` → `sentinel_record` → `sentinel_resolve` → `sentinel_add_pattern`",
1236
+ "C": "`sentinel_record` → `sentinel_triage` → fix → `sentinel_resolve` → `sentinel_add_pattern`",
1237
+ "D": "`sentinel_record` → `sentinel_add_pattern` → `sentinel_resolve`",
1238
+ "E": "`sentinel_patterns` → `sentinel_record` → `sentinel_add_pattern` → `sentinel_resolve`"
1239
+ },
1240
+ "correct": "C",
1241
+ "explanation": "The correct lifecycle is: (1) `sentinel_record` — create the incident with error details and symbolic context. (2) `sentinel_triage` — view the incident with matched patterns and suggested resolutions. (3) Fix the issue using the context from triage. (4) `sentinel_resolve` — close the incident with the fix commit. (5) `sentinel_add_pattern` — capture the fix as a reusable pattern. You must record before you can triage, fix before you can resolve, and resolve before creating a pattern from the resolution."
1242
+ }
1243
+ ]
1244
+ },
1245
+ {
1246
+ "type": "standalone",
1247
+ "slot": "slot-055",
1248
+ "course": "para-501",
1249
+ "variants": [
1250
+ {
1251
+ "id": "plsat-055",
1252
+ "scenario": "You are configuring habits for your project. You want to ensure that agents always call `paradigm_ripple` before modifying symbols, and you want this enforced at the start of every task. The seed habit `ripple-before-modify` exists with `trigger: preflight` and `severity: advisory`.",
1253
+ "question": "Which trigger ensures the habit is evaluated before implementation begins?",
1254
+ "choices": {
1255
+ "A": "`on-stop` — checks compliance at the end of the session",
1256
+ "B": "`on-commit` — checks before changes are committed",
1257
+ "C": "`preflight` — evaluated before starting implementation",
1258
+ "D": "`postflight` — evaluated after completing implementation",
1259
+ "E": "`pre-write` — evaluated before each file edit"
1260
+ },
1261
+ "correct": "C",
1262
+ "explanation": "The `preflight` trigger evaluates habits before implementation begins — this is when discovery checks like `paradigm_ripple` should run. `postflight` is too late (implementation already happened), `on-stop` is the end of the session, and `on-commit` is at commit time. There is no `pre-write` trigger — the four triggers are preflight, postflight, on-commit, and on-stop."
1263
+ }
1264
+ ]
1265
+ },
1266
+ {
1267
+ "type": "standalone",
1268
+ "slot": "slot-056",
1269
+ "course": "para-501",
1270
+ "variants": [
1271
+ {
1272
+ "id": "plsat-056",
1273
+ "scenario": "A project overrides the seed habit `verify-before-done` (originally `severity: warn`) to `severity: block` in `.paradigm/habits.yaml`. An agent finishes implementing a feature but does not call `paradigm_pm_postflight`. The stop hook runs.",
1274
+ "question": "What happens?",
1275
+ "choices": {
1276
+ "A": "A warning is logged but the session completes — `warn` is the seed severity",
1277
+ "B": "The session is blocked — the project override to `block` means the stop hook treats this as a blocking violation",
1278
+ "C": "Nothing — habit severity only affects habit check output, not the stop hook",
1279
+ "D": "The override is ignored because seed habits cannot be overridden",
1280
+ "E": "The session completes but the next session receives a mandatory reminder"
1281
+ },
1282
+ "correct": "B",
1283
+ "explanation": "Project overrides in `.paradigm/habits.yaml` take precedence over seed defaults. The three-layer merge (seed → global → project) means the project's `severity: block` override replaces the seed's `severity: warn`. When the stop hook evaluates on-stop habits, it finds a blocking violation because `verify-before-done` was not followed and its severity is now `block`. The session cannot complete until the agent runs `paradigm_pm_postflight`."
1284
+ }
1285
+ ]
1286
+ },
1287
+ {
1288
+ "type": "standalone",
1289
+ "slot": "slot-057",
1290
+ "course": "para-501",
1291
+ "variants": [
1292
+ {
1293
+ "id": "plsat-057",
1294
+ "scenario": "An agent has finished reading requirements and has a clear plan for implementing a new feature. It has not written any code yet. It wants to save a checkpoint in case the session crashes.",
1295
+ "question": "Which checkpoint phase should it use?",
1296
+ "choices": {
1297
+ "A": "`implementing` — the agent is about to start implementing",
1298
+ "B": "`planning` — the agent has a plan but has not started coding",
1299
+ "C": "`validating` — the agent needs to validate its plan first",
1300
+ "D": "`complete` — the planning phase is complete",
1301
+ "E": "`ready` — the agent is ready to implement"
1302
+ },
1303
+ "correct": "B",
1304
+ "explanation": "The `planning` phase captures the state after requirements are understood and a plan exists but before any code is written. If the session crashes, recovery knows: the plan is set, coding has not started, here are the key decisions. `implementing` should only be used after code changes begin. `complete` is for when the entire task is finished. There is no `ready` phase — the four phases are planning, implementing, validating, and complete."
1305
+ }
1306
+ ]
1307
+ },
1308
+ {
1309
+ "type": "standalone",
1310
+ "slot": "slot-058",
1311
+ "course": "para-501",
1312
+ "variants": [
1313
+ {
1314
+ "id": "plsat-058",
1315
+ "scenario": "The stop hook has blocked your session with two violations:\n1. \"Modified source directories missing .purpose coverage: src/services/refund/\"\n2. \"Lore entry expected: 4 source files modified, no lore recorded\"\n\nYou need to unblock and complete your session.",
1316
+ "question": "What is the correct remediation sequence?",
1317
+ "choices": {
1318
+ "A": "Run `paradigm_reindex` to fix both violations automatically",
1319
+ "B": "Create a .purpose file in `src/services/refund/`, record a lore entry with `paradigm_lore_record`, then run `paradigm_reindex`",
1320
+ "C": "Delete the `.paradigm/.pending-review` file to clear the tracking",
1321
+ "D": "Add `src/services/refund/` to the `.paradigm/config.yaml` skip list",
1322
+ "E": "Call `paradigm_pm_postflight` which handles all violations"
1323
+ },
1324
+ "correct": "B",
1325
+ "explanation": "Each violation requires a specific fix: (1) Create or update a .purpose file in or above `src/services/refund/` to provide coverage for the new directory. (2) Call `paradigm_lore_record` with a summary of the session since 4 files exceeds the 3-file threshold. (3) Run `paradigm_reindex` to rebuild the index with the new .purpose file. Deleting `.pending-review` (C) just hides the tracking — the stop hook would still detect uncovered directories. `paradigm_pm_postflight` (E) reports violations but doesn't fix them."
1326
+ }
1327
+ ]
1328
+ },
1329
+ {
1330
+ "type": "passage",
1331
+ "slot": "passage-habits-review",
1332
+ "course": "para-501",
1333
+ "passage": "Your team's `.paradigm/habits.yaml` for an e-commerce project:\n\n```yaml\noverrides:\n ripple-before-modify:\n severity: block\n explore-before-implement:\n severity: warn\n test-new-components:\n enabled: false\n record-lore-for-significant:\n severity: block\n\ncustom:\n - id: check-price-validation\n name: Validate Price Calculations\n description: Ensure price calculation tests exist for any payment-related changes\n category: testing\n trigger: postflight\n severity: warn\n check:\n type: tests-exist\n params:\n patterns: [\"**/price*.test.*\", \"**/payment*.test.*\"]\n enabled: true\n```\n\nThe seed habits that are NOT shown in overrides retain their default values. The project has 10 seed habits plus 1 custom habit.",
1334
+ "questions": [
1335
+ {
1336
+ "slot": "pg-habits-q1",
1337
+ "variants": [
1338
+ {
1339
+ "id": "plsat-pg3-q1a",
1340
+ "scenario": "",
1341
+ "question": "An agent skips calling `paradigm_ripple` before modifying `#checkout-service` and then tries to end the session. What happens?",
1342
+ "choices": {
1343
+ "A": "Advisory note is logged — ripple-before-modify defaults to advisory severity",
1344
+ "B": "Warning is shown — the override upgrades it to warn",
1345
+ "C": "Session is blocked — the override sets ripple-before-modify to severity: block",
1346
+ "D": "Nothing — ripple-before-modify only checks during preflight, not on-stop",
1347
+ "E": "The habit is disabled because test-new-components is disabled"
1348
+ },
1349
+ "correct": "C",
1350
+ "explanation": "The overrides section sets `ripple-before-modify` to `severity: block`. The seed habit's trigger is `preflight`, but when severity is `block`, violations detected during preflight evaluation carry through to the stop hook as blocking violations. The agent cannot complete the session until it calls `paradigm_ripple` for the modified symbols."
1351
+ }
1352
+ ]
1353
+ },
1354
+ {
1355
+ "slot": "pg-habits-q2",
1356
+ "variants": [
1357
+ {
1358
+ "id": "plsat-pg3-q2a",
1359
+ "scenario": "",
1360
+ "question": "The team disabled `test-new-components` but added a custom `check-price-validation` habit. What testing discipline does this configuration express?",
1361
+ "choices": {
1362
+ "A": "No testing discipline — disabling the seed habit removes all test requirements",
1363
+ "B": "Targeted testing — the team doesn't require tests for ALL components, but does require them for price/payment code specifically",
1364
+ "C": "The custom habit replaces the seed habit entirely",
1365
+ "D": "This is a configuration error — you cannot disable a seed habit and add a custom one in the same category",
1366
+ "E": "Full testing — the custom habit covers everything the seed habit did"
1367
+ },
1368
+ "correct": "B",
1369
+ "explanation": "Disabling `test-new-components` (which checks for test files globally with `**/*.test.*`) removes the blanket test requirement. The custom `check-price-validation` habit adds a targeted requirement: test files must exist specifically for price and payment code (`**/price*.test.*`, `**/payment*.test.*`). This is a deliberate choice: the team decided that testing everything is too strict, but payment/price logic is critical enough to enforce test coverage."
1370
+ }
1371
+ ]
1372
+ },
1373
+ {
1374
+ "slot": "pg-habits-q3",
1375
+ "variants": [
1376
+ {
1377
+ "id": "plsat-pg3-q3a",
1378
+ "scenario": "",
1379
+ "question": "An agent modifies 5 source files including payment logic but does not record a lore entry. What combination of violations will the stop hook report?",
1380
+ "choices": {
1381
+ "A": "One violation: missing lore entry (block severity)",
1382
+ "B": "Two violations: missing lore entry (block) and missing price validation tests (warn)",
1383
+ "C": "One violation: missing price validation tests only — lore is advisory by default",
1384
+ "D": "Three violations: missing lore, missing tests, and .purpose coverage",
1385
+ "E": "The lore violation alone blocks the session — other checks are not evaluated after a block"
1386
+ },
1387
+ "correct": "B",
1388
+ "explanation": "The stop hook evaluates ALL checks independently. `record-lore-for-significant` is overridden to `severity: block` and 5 files exceeds the 3-file threshold — this blocks. `check-price-validation` has `trigger: postflight` and `severity: warn`, and if payment files were modified without matching test files, it warns. Both violations are reported. The stop hook blocks because at least one violation has `severity: block`, but it reports all violations so the agent can fix everything in one pass."
1389
+ }
1390
+ ]
1391
+ }
1392
+ ]
1160
1393
  }
1161
1394
  ]
1162
1395
  }
@@ -147,6 +147,55 @@
147
147
  "description": "Validate .purpose files and portal.yaml structural integrity. Checks for missing fields, invalid references, and formatting issues.",
148
148
  "when": "Before committing changes to .purpose files or portal.yaml. Also useful as a CI check.",
149
149
  "example": "paradigm_purpose_validate({ includePortal: true })"
150
+ },
151
+ {
152
+ "id": "paradigm-lore-record",
153
+ "name": "paradigm_lore_record",
154
+ "description": "Record a lore entry — a session, decision, milestone, incident, or review. Creates a date-partitioned YAML file in .paradigm/lore/entries/ with an auto-incremented ID.",
155
+ "when": "After significant sessions (3+ files modified), architectural decisions, milestones, or incidents. The stop hook enforces this for 3+ file sessions.",
156
+ "example": "paradigm_lore_record({ type: 'agent-session', title: 'Add JWT auth', summary: 'Implemented RS256 JWT middleware...', symbols_touched: ['#auth-middleware', '^authenticated'] })"
157
+ },
158
+ {
159
+ "id": "paradigm-lore-search",
160
+ "name": "paradigm_lore_search",
161
+ "description": "Search lore entries with filters — by symbol, author, type, date range, tags, review status, and minimum completeness score.",
162
+ "when": "When investigating a symbol's history, looking for past decisions, or reviewing recent project activity.",
163
+ "example": "paradigm_lore_search({ symbol: '#payment-service', dateFrom: '2026-01-01', type: 'decision' })"
164
+ },
165
+ {
166
+ "id": "paradigm-lore-timeline",
167
+ "name": "paradigm_lore_timeline",
168
+ "description": "Get a high-level project timeline — recent entries, active authors, hot symbols (most-referenced), and timeline metadata.",
169
+ "when": "At session start for orientation, or when you need a quick overview of recent project activity.",
170
+ "example": "paradigm_lore_timeline({ limit: 10 })"
171
+ },
172
+ {
173
+ "id": "paradigm-habits-check",
174
+ "name": "paradigm_habits_check",
175
+ "description": "Evaluate habits for a trigger point (preflight, postflight, on-stop). Returns per-habit evaluations with follow/skip/partial results and whether any blocking violations exist.",
176
+ "when": "At preflight (before coding), postflight (after implementing), or on-stop (before session end) to verify behavioral compliance.",
177
+ "example": "paradigm_habits_check({ trigger: 'preflight', symbolsTouched: ['#payment-service'], filesModified: ['src/services/payment.ts'] })"
178
+ },
179
+ {
180
+ "id": "paradigm-habits-status",
181
+ "name": "paradigm_habits_status",
182
+ "description": "Get the practice profile for an engineer — overall compliance rate, per-category breakdowns, trend direction, and incident correlations.",
183
+ "when": "To review behavioral patterns, identify weak areas, or find evidence for adjusting habit severity levels.",
184
+ "example": "paradigm_habits_status({ period: '30d' })"
185
+ },
186
+ {
187
+ "id": "paradigm-practice-context",
188
+ "name": "paradigm_practice_context",
189
+ "description": "Get habit-aware warnings before modifying symbols. Returns relevant habits, recent compliance rates, and suggestions based on weak areas.",
190
+ "when": "Before modifying symbols to get behavioral context — which habits apply and what your compliance history looks like for them.",
191
+ "example": "paradigm_practice_context({ symbols: ['#payment-service', '^authenticated'], task: 'Add refund endpoint' })"
192
+ },
193
+ {
194
+ "id": "paradigm-session-checkpoint",
195
+ "name": "paradigm_session_checkpoint",
196
+ "description": "Save a session checkpoint for crash recovery. Captures phase, context, modified files, symbols, and decisions. Stored in .paradigm/session-checkpoint.json with 7-day expiry.",
197
+ "when": "At every phase transition — after planning, during implementation, before validation, and on completion.",
198
+ "example": "paradigm_session_checkpoint({ phase: 'implementing', context: 'Adding JWT auth middleware', modifiedFiles: ['src/middleware/auth.ts'], symbolsTouched: ['#auth-middleware'] })"
150
199
  }
151
200
  ]
152
201
  },
@@ -207,6 +256,18 @@
207
256
  "command": "paradigm promote <tag>",
208
257
  "description": "Promote a suggested tag to the project section of tags.yaml. Part of the governance workflow where humans approve AI-suggested tags.",
209
258
  "flags": ["--to core: Promote to core section instead of project", "--reject: Reject and remove the suggested tag"]
259
+ },
260
+ {
261
+ "id": "habits",
262
+ "command": "paradigm habits <subcommand>",
263
+ "description": "Manage behavioral habits. Subcommands: list (show all habits with source and severity), status (show practice profile and compliance rates), init (create .paradigm/habits.yaml with overrides template), add (add a custom habit definition).",
264
+ "flags": ["list: Show all active habits with source (seed/global/project)", "status [--period 30d]: Show practice profile and compliance rates", "init: Create habits.yaml template", "add <id>: Add a custom habit interactively"]
265
+ },
266
+ {
267
+ "id": "lore",
268
+ "command": "paradigm lore <subcommand>",
269
+ "description": "Manage project lore — the timeline of sessions, decisions, milestones, and incidents. Subcommands: list (show recent entries), show (display a specific entry), record (create a new entry interactively), review (add review scores to an entry).",
270
+ "flags": ["list [--limit 10] [--type agent-session]: List recent entries", "show <id>: Display a specific lore entry", "record [--type agent-session]: Record a new entry", "review <id>: Add completeness and quality scores to an entry"]
210
271
  }
211
272
  ]
212
273
  },