@a-company/paradigm 3.46.0 → 5.3.3

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 (166) hide show
  1. package/dist/{accept-orchestration-ZUWQUHSK.js → accept-orchestration-GX2YRWM4.js} +5 -5
  2. package/dist/{add-VSPZ6FM4.js → add-FZRKEGH4.js} +1 -1
  3. package/dist/agent-HYKC2LAK.js +387 -0
  4. package/dist/agent-loader-SJPJJS33.js +36 -0
  5. package/dist/{agents-suggest-65SER5IS.js → agents-suggest-DNSYJ6IA.js} +1 -1
  6. package/dist/{aggregate-SV3VGEIL.js → aggregate-H57K7PNV.js} +1 -1
  7. package/dist/{assess-UHBDYIK7.js → assess-4WVXZLZQ.js} +2 -2
  8. package/dist/{auto-24ICVUH4.js → auto-QFS5NHQU.js} +1 -1
  9. package/dist/{beacon-3SJV4DAP.js → beacon-KXZXYQHX.js} +1 -1
  10. package/dist/{calibration-WWHK73WU.js → calibration-V46G7JTY.js} +2 -2
  11. package/dist/{check-OLI6AUS6.js → check-OWAIWV23.js} +1 -1
  12. package/dist/{chunk-RP6TZYGE.js → chunk-2IO7JAG2.js} +1 -1
  13. package/dist/chunk-2T6BTYBN.js +712 -0
  14. package/dist/{chunk-CDMAMDSG.js → chunk-5VKJBNJL.js} +13 -5
  15. package/dist/{chunk-KB4XJWE3.js → chunk-6N3JTACN.js} +98 -437
  16. package/dist/chunk-7N7GSU6K.js +34 -0
  17. package/dist/chunk-A2L4TSLZ.js +526 -0
  18. package/dist/{chunk-P7XSBJE3.js → chunk-ABVQGRF7.js} +1 -1
  19. package/dist/{chunk-HIKKOCXY.js → chunk-EI32ZBE6.js} +1 -1
  20. package/dist/{chunk-QIOCFXDQ.js → chunk-EKGMAM62.js} +1 -1
  21. package/dist/chunk-EZ3GOCYC.js +132 -0
  22. package/dist/chunk-GGMI6C2L.js +1075 -0
  23. package/dist/{chunk-DS5QY37M.js → chunk-GTR2TBIJ.js} +247 -15
  24. package/dist/{chunk-QDXI2DHR.js → chunk-J2JEQRT3.js} +1 -1
  25. package/dist/{chunk-AKIMFN6I.js → chunk-JASGXLK3.js} +2 -2
  26. package/dist/{chunk-J4E6K5MG.js → chunk-LSRABQIY.js} +25 -1
  27. package/dist/chunk-MCMOGQMU.js +145 -0
  28. package/dist/{chunk-ZXMDA7VB.js → chunk-PDX44BCA.js} +1 -6
  29. package/dist/{chunk-2SKXFXIT.js → chunk-S3ORKP3V.js} +10 -15
  30. package/dist/{chunk-ZMQA6SCO.js → chunk-S6MZ2IEX.js} +628 -228
  31. package/dist/chunk-TAIJOFOE.js +124 -0
  32. package/dist/{chunk-FS3WTUHY.js → chunk-TXESEO7Y.js} +6 -6
  33. package/dist/{chunk-7COU5S2Z.js → chunk-VL67H5IC.js} +1 -1
  34. package/dist/{chunk-QWA26UNO.js → chunk-WQITYKHM.js} +7 -7
  35. package/dist/{chunk-MW5DMGBB.js → chunk-YMDLDELF.js} +114 -55
  36. package/dist/{claude-63ISJAZK.js → claude-FRRWJSTJ.js} +1 -1
  37. package/dist/{claude-cli-ABML5RHX.js → claude-cli-XJLK2X4L.js} +1 -1
  38. package/dist/{claude-code-JRLMRPTO.js → claude-code-HTBA4XRB.js} +1 -1
  39. package/dist/{claude-code-teams-CAJBEFIZ.js → claude-code-teams-T4SP24MD.js} +1 -1
  40. package/dist/{conductor-HLWYWUVH.js → conductor-PGPDVIVE.js} +1 -1
  41. package/dist/{config-schema-3YNIFJCJ.js → config-schema-EA4XALGG.js} +4 -2
  42. package/dist/{constellation-FAGT45TU.js → constellation-A26CCGQS.js} +1 -1
  43. package/dist/{context-audit-557EO6PK.js → context-audit-RLO3ETRP.js} +8 -5
  44. package/dist/{cost-XEBADYFT.js → cost-BGM32XJU.js} +1 -1
  45. package/dist/{cost-UD3WPEKZ.js → cost-VI46A4XL.js} +1 -1
  46. package/dist/{cursor-cli-QUOOF2N4.js → cursor-cli-JVEZGHWQ.js} +1 -1
  47. package/dist/{cursorrules-3TKZ4E4R.js → cursorrules-HLIKJJZT.js} +1 -1
  48. package/dist/decision-loader-WWCLIQPJ.js +20 -0
  49. package/dist/{delete-RRK4RL6Y.js → delete-KBRPQLPC.js} +2 -2
  50. package/dist/{diff-IP5CIARP.js → diff-RQLLNAFI.js} +5 -5
  51. package/dist/{discipline-5F5OVTXB.js → discipline-FA4OZXIS.js} +1 -1
  52. package/dist/{dist-UXWV4OKX.js → dist-34NA5RS5.js} +1 -1
  53. package/dist/{dist-5QE2BB2B-X6DYVSUL.js → dist-5QE2BB2B-5S3T6Y3T.js} +1 -1
  54. package/dist/{dist-CM3MVWWW.js → dist-77JDTVAY.js} +1 -0
  55. package/dist/{dist-POMVY6WP.js → dist-QK4SQAK7.js} +1 -1
  56. package/dist/{dist-3RVKEJRT.js → dist-TA6LSC2Q.js} +1 -1
  57. package/dist/docs-LVLRPBAW.js +155 -0
  58. package/dist/docs-PBZB7LYP.js +89 -0
  59. package/dist/{doctor-GKZJU7QG.js → doctor-ULBOHEIC.js} +3 -3
  60. package/dist/{drift-YGT4LJ7Q.js → drift-R5NRKFHI.js} +1 -1
  61. package/dist/{echo-A6HD5UP7.js → echo-O2LY7CC2.js} +1 -1
  62. package/dist/{edit-4CLNN5JG.js → edit-R2HNLMOG.js} +2 -2
  63. package/dist/event-25OJKDCE.js +31 -0
  64. package/dist/{export-T7CMMJIB.js → export-IWVL7XLF.js} +1 -1
  65. package/dist/{flow-UFMPVOEM.js → flow-CRRVV3O3.js} +2 -2
  66. package/dist/{global-HHUJSBG5.js → global-3NG5JXUB.js} +1 -1
  67. package/dist/graduate-USAWGBJM.js +160 -0
  68. package/dist/{graph-YYUXI3F7.js → graph-VHUMAAS6.js} +2 -2
  69. package/dist/{graph-server-ZPXRSGCW.js → graph-server-YL22VBBN.js} +1 -1
  70. package/dist/{habits-RG5SVKXP.js → habits-OL5NGPXO.js} +3 -3
  71. package/dist/{history-CETCSUCP.js → history-WOWC573W.js} +1 -1
  72. package/dist/{hooks-TCUHQMPF.js → hooks-HFWSCGPV.js} +2 -2
  73. package/dist/index.js +290 -188
  74. package/dist/{integrity-MK2OP5TA.js → integrity-IHO4FZTS.js} +1 -1
  75. package/dist/{integrity-checker-J7YXRTBT.js → integrity-checker-PSKJA5SB.js} +1 -0
  76. package/dist/journal-loader-5EYSBFFY.js +18 -0
  77. package/dist/{lint-HYWGS3JJ.js → lint-K6CJGGPH.js} +1 -1
  78. package/dist/{list-IUCYPGMK.js → list-4YK7QKFF.js} +1 -1
  79. package/dist/{list-BTLFHSRC.js → list-ENR7Q4CR.js} +2 -2
  80. package/dist/{lore-loader-VTEEZDX3.js → lore-loader-7NO6N6FT.js} +4 -1
  81. package/dist/{lore-server-NOOAHKJX.js → lore-server-UNJY5KC3.js} +1 -1
  82. package/dist/{manual-AFJ2J2V3.js → manual-G6FISID5.js} +1 -1
  83. package/dist/mcp.js +3764 -359
  84. package/dist/{migrate-FQVGQNXZ.js → migrate-LS45DNEV.js} +2 -2
  85. package/dist/{migrate-assessments-JP6Q5KME.js → migrate-assessments-RGH4O6IX.js} +2 -2
  86. package/dist/nomination-engine-Q4XSXFKT.js +40 -0
  87. package/dist/notebook-YWIYGEHV.js +155 -0
  88. package/dist/{orchestrate-A226N6FC.js → orchestrate-XZA33TJC.js} +5 -5
  89. package/dist/{peers-RFQCWVLV.js → peers-DEOUIZM6.js} +1 -1
  90. package/dist/persona-UHAHIVST.js +390 -0
  91. package/dist/{pipeline-3G2FRAKM.js → pipeline-L4HCSBGN.js} +1 -1
  92. package/dist/{platform-server-H7Y6Q7O4.js → platform-server-PMD57BEG.js} +264 -18
  93. package/dist/{plugin-update-checker-HMRPGY5Z.js → plugin-update-checker-ELOEEQYS.js} +1 -0
  94. package/dist/{portal-check-FF5EKZE5.js → portal-check-NPYGII2D.js} +2 -2
  95. package/dist/{portal-compliance-VU4NIFEN.js → portal-compliance-J7DGAPFX.js} +2 -2
  96. package/dist/{probe-7JK7IDNI.js → probe-MHL5HQZ2.js} +3 -3
  97. package/dist/{promote-XO63XMAN.js → promote-F6ZYZZAL.js} +2 -2
  98. package/dist/{providers-YNFSL6HK.js → providers-GK7PB2OL.js} +2 -2
  99. package/dist/{quiz-I75NU2QQ.js → quiz-M66SC7F7.js} +1 -1
  100. package/dist/{record-46CLR4OG.js → record-RA4WR2BO.js} +2 -2
  101. package/dist/{reindex-WIJMCJ4A.js → reindex-HRA2AUS6.js} +3 -2
  102. package/dist/{remember-4EUZKIIB.js → remember-HBWJ655S.js} +1 -1
  103. package/dist/{retag-KC4JVRLE.js → retag-3OLCVDEQ.js} +2 -2
  104. package/dist/{review-Q7M4CRB5.js → review-27ATYTD2.js} +2 -2
  105. package/dist/review-57QMURZV.js +334 -0
  106. package/dist/{ripple-RI3LOT6R.js → ripple-JPBXP5I3.js} +1 -1
  107. package/dist/{sentinel-UOIGJWHH.js → sentinel-4XIG4STA.js} +2 -2
  108. package/dist/{sentinel-bridge-APDXYAZS.js → sentinel-bridge-MDUXTQRL.js} +2 -2
  109. package/dist/{serve-KKEHE44G.js → serve-FLTFTM3P.js} +2 -2
  110. package/dist/{serve-22A4XOIG.js → serve-INL7SNBK.js} +2 -2
  111. package/dist/{serve-2YJ6D2Y6.js → serve-KBSE36PL.js} +4 -4
  112. package/dist/{server-JV6UFGWZ.js → server-54SKYFFY.js} +2 -2
  113. package/dist/{server-RDLQ3DK7.js → server-XUOIO7E6.js} +1 -1
  114. package/dist/{setup-YNZJQLW7.js → setup-EDS27WUR.js} +1 -1
  115. package/dist/{setup-M2ZKLKNN.js → setup-KO5AFC4K.js} +2 -2
  116. package/dist/{shift-LNMKFYLR.js → shift-VFG23DLA.js} +16 -16
  117. package/dist/{show-P7GYO43X.js → show-5PV5KFJE.js} +2 -2
  118. package/dist/{show-PKZMYKRN.js → show-NQKYX6WQ.js} +1 -1
  119. package/dist/{snapshot-Y3COXK4T.js → snapshot-BK4RBPCG.js} +1 -1
  120. package/dist/{spawn-SSXZX45U.js → spawn-AW6GDECS.js} +3 -3
  121. package/dist/{status-KLHALGW4.js → status-WGIAQODY.js} +1 -1
  122. package/dist/{summary-5NQNOD3F.js → summary-NIRABMF5.js} +2 -2
  123. package/dist/{sweep-EZU3GU6S.js → sweep-QMHNSIY5.js} +2 -2
  124. package/dist/{switch-WYUMVNA5.js → switch-6EJPZDIA.js} +1 -1
  125. package/dist/{symphony-6K3HD7AW.js → symphony-4OCY36AI.js} +5 -5
  126. package/dist/{symphony-YCHBYN3E.js → symphony-B75X2MME.js} +2 -2
  127. package/dist/{symphony-peers-HSY3RI3S.js → symphony-peers-2ZQYLRNI.js} +1 -1
  128. package/dist/{symphony-peers-APOGJPF4.js → symphony-peers-OL7F6M5S.js} +1 -0
  129. package/dist/{symphony-relay-GTAJRCVF.js → symphony-relay-UJYUXN65.js} +28 -1
  130. package/dist/{sync-ZM4Q3R4U.js → sync-VEHUH4OA.js} +3 -3
  131. package/dist/{sync-llms-JIPP3XX4.js → sync-llms-YHCFIE6X.js} +2 -2
  132. package/dist/{task-loader-7M2FCBX6.js → task-loader-LDYWQSLM.js} +1 -0
  133. package/dist/{team-HGLJXWQG.js → team-7HG7XK5C.js} +6 -6
  134. package/dist/{test-WTR5Q33E.js → test-566CP5KC.js} +1 -1
  135. package/dist/{thread-3WM7KKID.js → thread-N754I4D5.js} +1 -1
  136. package/dist/{timeline-ANC7LVDL.js → timeline-M3CICQFE.js} +2 -2
  137. package/dist/{triage-IZ4MDYNB.js → triage-HHYGT3HY.js} +1 -1
  138. package/dist/{tutorial-GC6QL4US.js → tutorial-KD22SUNO.js} +1 -1
  139. package/dist/university-content/courses/.purpose +66 -0
  140. package/dist/university-content/courses/para-401.json +146 -0
  141. package/dist/university-content/courses/para-501.json +67 -0
  142. package/dist/university-content/courses/para-601.json +608 -0
  143. package/dist/university-content/plsat/.purpose +6 -0
  144. package/dist/university-content/plsat/v2.0.json +2 -2
  145. package/dist/university-content/plsat/v3.0.json +563 -3
  146. package/dist/university-content/reference.json +91 -0
  147. package/dist/{upgrade-ANX3LVSA.js → upgrade-H5PF32BW.js} +2 -2
  148. package/dist/{validate-GD5XWILV.js → validate-CNKEKO6A.js} +1 -1
  149. package/dist/{validate-ITC5D6QG.js → validate-MB5ULIHS.js} +1 -1
  150. package/dist/{validate-ZVPNN4FL.js → validate-QH3LADM6.js} +1 -1
  151. package/dist/{watch-X64UK7K4.js → watch-2TKP5PVL.js} +3 -3
  152. package/dist/{watch-ERBEJUJW.js → watch-ZF4ML6CD.js} +2 -2
  153. package/dist/{wisdom-L2WC7J62.js → wisdom-AATMGNFA.js} +1 -1
  154. package/dist/work-log-loader-5L45XNYZ.js +14 -0
  155. package/dist/{workspace-UIUTHZTD.js → workspace-6E6OSRNU.js} +4 -4
  156. package/package.json +1 -1
  157. package/platform-ui/dist/assets/DocsSection-ByAgPzWV.js +1 -0
  158. package/platform-ui/dist/assets/DocsSection-CjdO6R-u.css +1 -0
  159. package/platform-ui/dist/assets/{GitSection-BD3Ze06e.js → GitSection-BLovj9yT.js} +1 -1
  160. package/platform-ui/dist/assets/{GraphSection-SglITfSs.js → GraphSection-C5PCPUFl.js} +1 -1
  161. package/platform-ui/dist/assets/{LoreSection-bR5Km4Fd.js → LoreSection-BftejTla.js} +1 -1
  162. package/platform-ui/dist/assets/{SentinelSection-QSpAZArG.js → SentinelSection-CnYcasN7.js} +1 -1
  163. package/platform-ui/dist/assets/{SymphonySection-CobYJgvg.js → SymphonySection-BpmqCHeK.js} +1 -1
  164. package/platform-ui/dist/assets/{index-DbxeSMkV.js → index-G9JnWEs_.js} +10 -10
  165. package/platform-ui/dist/index.html +1 -1
  166. package/dist/dist-PSF5CP4I.js +0 -7294
@@ -26,7 +26,7 @@ import {
26
26
  routeMessage,
27
27
  unregisterAgent
28
28
  } from "./chunk-S2HO5MLR.js";
29
- import "./chunk-ZXMDA7VB.js";
29
+ import "./chunk-PDX44BCA.js";
30
30
 
31
31
  // src/commands/symphony/index.ts
32
32
  import chalk from "chalk";
@@ -57,7 +57,7 @@ async function symphonyJoinCommand(options) {
57
57
  Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));
58
58
  }
59
59
  async function symphonyJoinRemote(rootDir, remote) {
60
- const { SymphonyRelay } = await import("./symphony-relay-GTAJRCVF.js");
60
+ const { SymphonyRelay } = await import("./symphony-relay-UJYUXN65.js");
61
61
  let address;
62
62
  let embeddedCode;
63
63
  if (remote.includes("#")) {
@@ -174,7 +174,7 @@ async function symphonyWhoamiCommand() {
174
174
  async function symphonyListCommand(options) {
175
175
  cleanStaleAgents();
176
176
  const agents = listAgents();
177
- const { loadPeers } = await import("./symphony-peers-HSY3RI3S.js");
177
+ const { loadPeers } = await import("./symphony-peers-2ZQYLRNI.js");
178
178
  const peers = loadPeers();
179
179
  const remoteAgents = [];
180
180
  for (const peer of peers) {
@@ -398,7 +398,7 @@ async function symphonyStatusCommand(options) {
398
398
  const threads = listThreads("active");
399
399
  const pendingRequests = listFileRequests("pending");
400
400
  const unread = identity ? readInbox(identity.id) : [];
401
- const { loadPeers } = await import("./symphony-peers-HSY3RI3S.js");
401
+ const { loadPeers } = await import("./symphony-peers-2ZQYLRNI.js");
402
402
  const peers = loadPeers();
403
403
  const activePeers = peers.filter((p) => !p.revoked);
404
404
  if (options.json) {
@@ -443,7 +443,7 @@ async function symphonyStatusCommand(options) {
443
443
  async function symphonyServeCommand(options) {
444
444
  const port = parseInt(options.port || "3939", 10);
445
445
  const rootDir = process.cwd();
446
- const { SymphonyRelay } = await import("./symphony-relay-GTAJRCVF.js");
446
+ const { SymphonyRelay } = await import("./symphony-relay-UJYUXN65.js");
447
447
  let identity = getMyIdentity(rootDir);
448
448
  if (!identity) {
449
449
  identity = registerAgent(rootDir);
@@ -19,7 +19,7 @@ import {
19
19
  resolveThread,
20
20
  routeMessage
21
21
  } from "./chunk-S2HO5MLR.js";
22
- import "./chunk-ZXMDA7VB.js";
22
+ import "./chunk-PDX44BCA.js";
23
23
 
24
24
  // src/platform-server/routes/symphony.ts
25
25
  import { Router } from "express";
@@ -59,7 +59,7 @@ function createSymphonyRouter(projectDir, broadcast) {
59
59
  });
60
60
  router.get("/peers", async (_req, res) => {
61
61
  try {
62
- const { loadPeers } = await import("./symphony-peers-HSY3RI3S.js");
62
+ const { loadPeers } = await import("./symphony-peers-2ZQYLRNI.js");
63
63
  const peers = loadPeers();
64
64
  const result = peers.map((p) => ({
65
65
  id: p.id,
@@ -15,7 +15,7 @@ import {
15
15
  verifyHmacProof,
16
16
  verifyPairingCode
17
17
  } from "./chunk-KVDYJLTC.js";
18
- import "./chunk-ZXMDA7VB.js";
18
+ import "./chunk-PDX44BCA.js";
19
19
  export {
20
20
  PAIRING_TTL_MS,
21
21
  PEERS_FILE,
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import "./chunk-7N7GSU6K.js";
2
3
 
3
4
  // ../paradigm-mcp/src/utils/symphony-peers.ts
4
5
  import * as fs from "fs";
@@ -15,9 +15,10 @@ import {
15
15
  listAgents,
16
16
  readOutbox
17
17
  } from "./chunk-S2HO5MLR.js";
18
- import "./chunk-ZXMDA7VB.js";
18
+ import "./chunk-PDX44BCA.js";
19
19
 
20
20
  // ../paradigm-mcp/src/utils/symphony-relay.ts
21
+ import * as fs from "fs";
21
22
  import * as path from "path";
22
23
  import * as os from "os";
23
24
  import * as crypto from "crypto";
@@ -309,6 +310,9 @@ var SymphonyRelay = class _SymphonyRelay {
309
310
  break;
310
311
  case "message_ack":
311
312
  break;
313
+ case "nomination_forward":
314
+ this.handleNominationForward(ws, frame.nomination, frame.origin);
315
+ break;
312
316
  case "agents_sync":
313
317
  this.handleAgentsSync(ws, frame.agents);
314
318
  break;
@@ -392,6 +396,29 @@ var SymphonyRelay = class _SymphonyRelay {
392
396
  }
393
397
  sendFrame(senderWs, { type: "message_ack", messageId: message.id });
394
398
  }
399
+ /**
400
+ * Forward a nomination from a remote agent to local nomination storage.
401
+ * Remote nominations are stored in the same nominations.jsonl but tagged with origin.
402
+ */
403
+ handleNominationForward(senderWs, nomination, origin) {
404
+ if (!nomination?.id) return;
405
+ const tagged = { ...nomination, remote_origin: origin, forwarded_at: (/* @__PURE__ */ new Date()).toISOString() };
406
+ try {
407
+ const eventsDir = path.join(os.homedir(), ".paradigm", "events");
408
+ fs.mkdirSync(eventsDir, { recursive: true });
409
+ const nomPath = path.join(eventsDir, "nominations.jsonl");
410
+ fs.appendFileSync(nomPath, JSON.stringify(tagged) + "\n", "utf8");
411
+ } catch {
412
+ }
413
+ if (this.mode === "server") {
414
+ for (const [peerId, peerWs] of this.connectedPeers) {
415
+ if (peerWs !== senderWs && peerWs.readyState === WebSocket.OPEN) {
416
+ sendFrame(peerWs, { type: "nomination_forward", nomination: tagged, origin });
417
+ }
418
+ }
419
+ }
420
+ sendFrame(senderWs, { type: "nomination_ack", nominationId: nomination.id });
421
+ }
395
422
  /**
396
423
  * Update stored agent list for a peer after receiving agents_sync.
397
424
  */
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  syncCommand
4
- } from "./chunk-RP6TZYGE.js";
5
- import "./chunk-KB4XJWE3.js";
4
+ } from "./chunk-2IO7JAG2.js";
5
+ import "./chunk-6N3JTACN.js";
6
6
  import "./chunk-YO6DVTL7.js";
7
7
  import "./chunk-4NCFWYGG.js";
8
- import "./chunk-ZXMDA7VB.js";
8
+ import "./chunk-PDX44BCA.js";
9
9
  export {
10
10
  syncCommand
11
11
  };
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadParadigmFiles
4
- } from "./chunk-KB4XJWE3.js";
4
+ } from "./chunk-6N3JTACN.js";
5
5
  import "./chunk-YO6DVTL7.js";
6
6
  import {
7
7
  log
8
8
  } from "./chunk-4NCFWYGG.js";
9
- import "./chunk-ZXMDA7VB.js";
9
+ import "./chunk-PDX44BCA.js";
10
10
 
11
11
  // src/commands/sync-llms.ts
12
12
  import * as fs from "fs";
@@ -8,6 +8,7 @@ import {
8
8
  shelveTask,
9
9
  updateTask
10
10
  } from "./chunk-CSD7IHSN.js";
11
+ import "./chunk-7N7GSU6K.js";
11
12
  export {
12
13
  completeTask,
13
14
  createTask,
@@ -8,19 +8,19 @@ import {
8
8
  teamModelsCommand,
9
9
  teamResetCommand,
10
10
  teamStatusCommand
11
- } from "./chunk-HIKKOCXY.js";
12
- import "./chunk-QWA26UNO.js";
13
- import "./chunk-J4E6K5MG.js";
11
+ } from "./chunk-EI32ZBE6.js";
12
+ import "./chunk-WQITYKHM.js";
13
+ import "./chunk-LSRABQIY.js";
14
14
  import "./chunk-PBHIFAL4.js";
15
- import "./chunk-FS3WTUHY.js";
15
+ import "./chunk-TXESEO7Y.js";
16
16
  import "./chunk-6QC3YGB6.js";
17
17
  import "./chunk-PMXRGPRQ.js";
18
- import "./chunk-MW5DMGBB.js";
19
18
  import "./chunk-5JGJACDU.js";
20
19
  import "./chunk-ZGUAAVMA.js";
21
20
  import "./chunk-EDOAWN7J.js";
22
21
  import "./chunk-IRKUEJVW.js";
23
- import "./chunk-ZXMDA7VB.js";
22
+ import "./chunk-YMDLDELF.js";
23
+ import "./chunk-PDX44BCA.js";
24
24
  export {
25
25
  teamAcceptCommand,
26
26
  teamCheckCommand,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  parseGateConfig
4
4
  } from "./chunk-IRKUEJVW.js";
5
- import "./chunk-ZXMDA7VB.js";
5
+ import "./chunk-PDX44BCA.js";
6
6
 
7
7
  // src/commands/portal/test.ts
8
8
  import * as path3 from "path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-ZXMDA7VB.js";
2
+ import "./chunk-PDX44BCA.js";
3
3
 
4
4
  // src/commands/thread.ts
5
5
  import * as fs from "fs";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadLoreEntries
4
- } from "./chunk-QIOCFXDQ.js";
5
- import "./chunk-ZXMDA7VB.js";
4
+ } from "./chunk-EKGMAM62.js";
5
+ import "./chunk-PDX44BCA.js";
6
6
 
7
7
  // src/commands/lore/timeline.ts
8
8
  import chalk from "chalk";
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  SentinelStorage
12
12
  } from "./chunk-FKJUBQU3.js";
13
- import "./chunk-ZXMDA7VB.js";
13
+ import "./chunk-PDX44BCA.js";
14
14
 
15
15
  // src/commands/triage/index.ts
16
16
  import chalk2 from "chalk";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-ZXMDA7VB.js";
2
+ import "./chunk-PDX44BCA.js";
3
3
 
4
4
  // src/commands/tutorial/index.ts
5
5
  import * as path from "path";
@@ -244,6 +244,17 @@ components:
244
244
  tags: [course-content, para-401]
245
245
  references: ["#orchestration", "#mcp-tools", "#paradigm-sync"]
246
246
 
247
+ para-401-agent-identity:
248
+ description: "Agent Identity & Expertise — .agent files, personality, expertise auto-population, symbol-to-agent routing, orchestration enrichment"
249
+ file: para-401.json
250
+ tags: [course-content, para-401]
251
+ references: ["#agent-loader", "#agent-tools", "#orchestration"]
252
+
253
+ para-401-notebooks-permissions:
254
+ description: "University lesson: Agent Notebooks & Permission Scoping — notebooks, permissions, integrity hashing"
255
+ type: lesson
256
+ tags: [university, notebooks, agent-identity, permissions]
257
+
247
258
  # PARA 501: Advanced Systems (10 lessons)
248
259
 
249
260
  para-501-lore-system:
@@ -311,3 +322,58 @@ components:
311
322
  file: para-501.json
312
323
  tags: [course-content, para-501]
313
324
  references: ["#PlatformServer", "#PlatformWebSocket", "#AgentPresenceManager", "#UserStateTracker", "#AgentCommandRoute", "#PlatformTools", "#AgentStore", "#AgentToast", "#AgentCallout"]
325
+
326
+ para-501-review-compliance:
327
+ description: "University lesson: Automated Review Pipeline — paradigm review, compliance-checker, dynamic tool loading, response format"
328
+ type: lesson
329
+ tags: [university, review, compliance, tool-loading]
330
+
331
+ # PARA 601: Ambient Coordination (8 lessons)
332
+
333
+ para-601-event-stream:
334
+ description: "Event Stream — append-only JSONL activity log, event types, automatic emission from MCP tools and hooks"
335
+ file: para-601.json
336
+ tags: [course-content, para-601]
337
+ references: ["#event-stream"]
338
+
339
+ para-601-attention-scoring:
340
+ description: "Attention Scoring — four-dimension relevance scoring (symbol, path, concept, signal), max-based scoring, configurable thresholds"
341
+ file: para-601.json
342
+ tags: [course-content, para-601]
343
+ references: ["#agent-loader", "#event-stream"]
344
+
345
+ para-601-nominations:
346
+ description: "Nominations — self-nominated agent contributions, brief/urgency/type/evidence, surfacing and engagement workflow"
347
+ file: para-601.json
348
+ tags: [course-content, para-601]
349
+ references: ["#nomination-engine", "#agent-loader"]
350
+
351
+ para-601-knowledge-streams:
352
+ description: "Knowledge Streams — Work Log, Learning Journal, Team Decisions; different audiences, lifecycles, and storage"
353
+ file: para-601.json
354
+ tags: [course-content, para-601]
355
+ references: ["#event-stream"]
356
+
357
+ para-601-trust-rings:
358
+ description: "Trust Rings — four concentric data sovereignty levels, project-locked default, enforcement boundaries"
359
+ file: para-601.json
360
+ tags: [course-content, para-601]
361
+ references: ["#data-policy"]
362
+
363
+ para-601-data-policy:
364
+ description: "Data Policy — YAML-configured rules, observation control, stream filtering, per-agent overrides, DEFAULT_DATA_POLICY"
365
+ file: para-601.json
366
+ tags: [course-content, para-601]
367
+ references: ["#data-policy"]
368
+
369
+ para-601-context-composition:
370
+ description: "Context Composition — paradigm_context_compose, profile enrichment, decisions, journal insights, nominations into session context"
371
+ file: para-601.json
372
+ tags: [course-content, para-601]
373
+ references: ["#agent-loader", "#nomination-engine"]
374
+
375
+ para-601-ambient-review:
376
+ description: "Ambient Review — comprehensive review of PARA 601 ambient coordination concepts"
377
+ file: para-601.json
378
+ tags: [course-content, para-601]
379
+ references: ["#event-stream", "#nomination-engine", "#data-policy", "#agent-loader"]
@@ -689,6 +689,152 @@
689
689
  "explanation": "Token cost estimates enable agents to evaluate tool selection before calling. An agent deciding between paradigm_search (~150 tokens) and reading 5 files (~2500 tokens) can make an informed cost/benefit decision. The goal is efficiency, not restriction."
690
690
  }
691
691
  ]
692
+ },
693
+ {
694
+ "id": "agent-identity",
695
+ "title": "Agent Identity & Expertise Profiles",
696
+ "content": "## Agent Identity & Expertise Profiles\n\nEvery Claude session starts blank. The project remembers — via lore, protocols, aspects — but the agent doesn't. An architect that has successfully designed auth systems 14 times has no memory of that expertise. The orchestrator cannot route tasks to the most qualified agent because qualification is not tracked.\n\nAgent identity files (`.agent`) solve this with persistent YAML profiles that track expertise, personality, and cross-project patterns. They **overlay** the existing `agents.yaml` system and are fully backward compatible — when no `.agent` files exist, everything works exactly as before.\n\n### Storage & Merge Priority\n\nProfiles live in two locations:\n\n- **Global** (`~/.paradigm/agents/architect.agent`) — travels across projects\n- **Project** (`.paradigm/agents/builder.agent`) — project-level overrides\n\nMerge priority: **project `.agent` > global `.agent` > `agents.yaml`**. This means a project can override a global agent's default model or focus areas without modifying the shared identity.\n\n### Profile Structure\n\nEach `.agent` file contains:\n\n- **`id`** — Agent identifier (e.g., \"architect\")\n- **`personality`** — Style (deliberate/rapid/exploratory/methodical), risk tolerance (conservative/balanced/aggressive), and verbosity (minimal/concise/detailed)\n- **`expertise`** — Per-symbol entries with confidence (0.0-1.0), session count, and last touch date\n- **`transferable`** — Cross-project patterns with success rates and linked protocols/lore\n- **`contexts`** — Per-project adaptations: focus areas, preferred model, session count\n\n### Expertise Auto-Population\n\nWhen lore is recorded with `paradigm_lore_record`, the relevant agent's expertise scores update automatically via exponential moving average:\n\n```\nFor each symbol in symbols_touched:\n if existing entry:\n sessions++\n confidence = 0.7 * old_confidence + 0.3 * lore_confidence\n else:\n create entry with confidence = lore_confidence (or 0.5 default)\n```\n\nAssessment verdicts from `paradigm_lore_assess` also feed into expertise. A verdict of `correct` nudges confidence up, `incorrect` nudges it down.\n\n### Querying Expertise\n\n`paradigm_agent_expertise` takes a symbol and returns agents ranked by confidence:\n\n```\nparadigm_agent_expertise({ symbol: \"#payment-service\" })\n// Returns: [{ agentId: \"architect\", confidence: 0.92, sessions: 14 }, ...]\n```\n\nThis enables **symbol-to-agent routing** — the orchestrator can prefer the agent most experienced with the symbols a task touches.\n\n### Orchestration Enrichment\n\nWhen `paradigm_orchestrate_inline` builds agent prompts, agents with `.agent` profiles receive a preamble:\n\n```markdown\n## Agent Identity: architect\n**Style:** deliberate | **Risk:** conservative | **Verbosity:** concise\n\n## Your Expertise on Relevant Symbols\n- #auth-middleware: confidence 0.92 (14 sessions)\n- $checkout-flow: confidence 0.88 (8 sessions)\n\n## Transferable Patterns\n- portal-gate-pattern: 95% success (learned in a-paradigm, applied in 2 projects)\n```\n\nThis goes BEFORE the role-specific prompt, giving the agent self-awareness about its strengths.\n\n### CLI Commands\n\n- `paradigm agent list` — Show all profiles with top expertise\n- `paradigm agent show <id>` — Full profile with expertise table\n- `paradigm agent create <id> --global` — Create new identity file\n- `paradigm agent sync <id>` — Bootstrap expertise from existing project lore\n\nAgent identities are a foundation for future capabilities: curated notebooks, model cascading, and knowledge graduation across projects.",
697
+ "keyConcepts": [
698
+ ".agent files are persistent YAML profiles that overlay agents.yaml — backward compatible",
699
+ "Two storage scopes: global (~/.paradigm/agents/) and project (.paradigm/agents/), project wins on merge",
700
+ "Expertise auto-updates via exponential moving average (70/30) from lore recording",
701
+ "paradigm_agent_expertise enables symbol-to-agent routing for orchestration",
702
+ "Orchestration enrichment prepends personality and expertise context to agent prompts"
703
+ ],
704
+ "quiz": [
705
+ {
706
+ "id": "q1",
707
+ "question": "You run `paradigm agent create architect --global`. Where is the file stored?",
708
+ "choices": {
709
+ "A": "In the project's .paradigm/agents/architect.agent",
710
+ "B": "In ~/.paradigm/agents/architect.agent",
711
+ "C": "In .paradigm/agents.yaml as a new entry",
712
+ "D": "In ~/.paradigm/score/agents/architect.agent",
713
+ "E": "In the project's .paradigm/config.yaml under agents section"
714
+ },
715
+ "correct": "B",
716
+ "explanation": "The --global flag stores the .agent file in ~/.paradigm/agents/, the global scope that travels across projects. Without --global, it would go in the project's .paradigm/agents/ directory."
717
+ },
718
+ {
719
+ "id": "q2",
720
+ "question": "Both ~/.paradigm/agents/builder.agent and .paradigm/agents/builder.agent exist with different defaultModel. Which one wins?",
721
+ "choices": {
722
+ "A": "The global one (~/.paradigm/agents/) always takes priority",
723
+ "B": "The one with the newer 'updated' timestamp wins",
724
+ "C": "Project-level .paradigm/agents/builder.agent takes priority",
725
+ "D": "agents.yaml overrides both .agent files",
726
+ "E": "An error is raised for the conflict"
727
+ },
728
+ "correct": "C",
729
+ "explanation": "Merge priority is: project .agent > global .agent > agents.yaml. Project-level overrides exist specifically so a project can customize model preferences or focus areas without changing the global identity."
730
+ },
731
+ {
732
+ "id": "q3",
733
+ "question": "An agent records lore with confidence: 0.8 touching #auth-middleware. The agent's existing expertise on that symbol is confidence: 0.9, sessions: 10. What's the new confidence?",
734
+ "choices": {
735
+ "A": "0.85 (simple average)",
736
+ "B": "0.87 (exponential moving average: 0.7 * 0.9 + 0.3 * 0.8)",
737
+ "C": "0.80 (new value replaces old)",
738
+ "D": "0.90 (existing value preserved)",
739
+ "E": "0.88 (weighted by session count)"
740
+ },
741
+ "correct": "B",
742
+ "explanation": "Expertise uses exponential moving average with alpha=0.3: new = 0.7 * old + 0.3 * new_observation. So 0.7 * 0.9 + 0.3 * 0.8 = 0.63 + 0.24 = 0.87. This balances stability (70% old) with responsiveness to new data (30% new)."
743
+ },
744
+ {
745
+ "id": "q4",
746
+ "question": "You want to find which agent is best qualified to modify #payment-service. Which MCP tool do you call?",
747
+ "choices": {
748
+ "A": "paradigm_agent_list and manually compare expertise arrays",
749
+ "B": "paradigm_agent_get with the symbol name",
750
+ "C": "paradigm_agent_expertise with symbol: \"#payment-service\"",
751
+ "D": "paradigm_search with query: \"payment-service agents\"",
752
+ "E": "paradigm_orchestrate_inline with the task description"
753
+ },
754
+ "correct": "C",
755
+ "explanation": "paradigm_agent_expertise takes a symbol and returns all agents with expertise on that symbol, ranked by confidence score. This is the purpose-built tool for symbol-to-agent routing, costing only ~100 tokens."
756
+ },
757
+ {
758
+ "id": "q5",
759
+ "question": "A project has agents.yaml with 5 agents but no .agent files. What happens during orchestration?",
760
+ "choices": {
761
+ "A": "An error: .agent files are required for orchestration",
762
+ "B": "agents.yaml is ignored and default agents are used",
763
+ "C": "Empty .agent files are auto-created for each agent",
764
+ "D": "Everything works exactly as before — .agent files are a pure overlay",
765
+ "E": "Orchestration runs but warns about missing profiles"
766
+ },
767
+ "correct": "D",
768
+ "explanation": ".agent files are a pure overlay. No files = no enrichment, same behavior as pre-3.47.0. The system is fully backward compatible — agents.yaml continues to work unchanged, and .agent profiles only add capabilities when present."
769
+ }
770
+ ]
771
+ },
772
+ {
773
+ "id": "notebooks-permissions",
774
+ "title": "Agent Notebooks & Permission Scoping",
775
+ "content": "## Agent Notebooks\n\nAgent notebooks are curated snippet libraries distilled from lore entries. They provide reusable knowledge that agents can apply across sessions and projects.\n\n### NotebookEntry Format\n\nEach entry contains:\n- **context**: When to apply this snippet (retrieval key)\n- **snippet**: The reusable code/knowledge\n- **provenance**: Where it came from (lore, manual, transfer)\n- **concepts[]**: Concept tags for retrieval (e.g., [\"auth\", \"middleware\"])\n- **appliedCount**: How many times used in orchestration\n- **confidence**: 0.0-1.0 reliability score\n\n### Storage\n\n- Global: `~/.paradigm/notebooks/{agent-id}/` — travels across projects\n- Project: `.paradigm/notebooks/{agent-id}/` — project-specific\n\n### MCP Tools\n\n- `paradigm_notebook_search` — find entries by concept, tag, or keyword\n- `paradigm_notebook_add` — create a new curated entry\n- `paradigm_notebook_promote` — extract from lore entry with provenance linking\n\n### Orchestration Integration\n\n`buildProfileEnrichment()` appends a \"Relevant Notebook Entries\" section with context + snippet for matching entries. This enriches the orchestration prompt with reusable patterns.\n\n## Agent Permissions\n\nPermission scoping controls what agents can access:\n\n### Permission Fields\n\n- **paths.read/write**: Glob patterns for file access\n- **paths.deny**: Always-deny patterns (overrides read/write)\n- **tools.allow/deny**: Tool name patterns\n- **dangerous_actions**: Actions requiring explicit approval\n\n### Integrity Hashing\n\nSHA-256 hash of `{id, role, permissions}` stored as `integrityHash`. `verifyIntegrity()` detects tampering — agents must never modify their own config.\n\n### In Orchestration\n\nPermissions appear as constraints in orchestration prompts, informing agents of their boundaries.",
776
+ "quiz": [
777
+ {
778
+ "id": "Q-401-NP-001",
779
+ "question": "Where are global notebook entries stored for the architect agent?",
780
+ "options": [
781
+ "~/.paradigm/notebooks/architect/",
782
+ ".paradigm/notebooks/architect/",
783
+ "~/.paradigm/agents/architect/notebooks/",
784
+ ".paradigm/agents/architect.notebooks"
785
+ ],
786
+ "correct": 0,
787
+ "explanation": "Global notebook entries are stored at ~/.paradigm/notebooks/{agent-id}/ and travel across projects."
788
+ },
789
+ {
790
+ "id": "Q-401-NP-002",
791
+ "question": "An agent has permissions.paths.deny: [\".paradigm/agents/*\"]. What happens if it tries to write to .paradigm/agents/builder.agent?",
792
+ "options": [
793
+ "The write succeeds if there's also a write pattern matching it",
794
+ "The write is flagged as denied — deny patterns always override allow patterns",
795
+ "The write succeeds but triggers an advisory",
796
+ "The agent profile is deleted"
797
+ ],
798
+ "correct": 1,
799
+ "explanation": "Deny patterns always override allow patterns. checkPathPermission() checks deny first."
800
+ },
801
+ {
802
+ "id": "Q-401-NP-003",
803
+ "question": "You want to extract a reusable pattern from lore entry L-2026-03-10-001 into the architect's notebook. Which MCP tool?",
804
+ "options": [
805
+ "paradigm_notebook_add with loreEntryId parameter",
806
+ "paradigm_lore_promote with agentId parameter",
807
+ "paradigm_notebook_promote with agentId + loreEntryId",
808
+ "paradigm_agent_notebook with action: 'promote'"
809
+ ],
810
+ "correct": 2,
811
+ "explanation": "paradigm_notebook_promote takes agentId + loreEntryId and creates a distilled notebook entry with provenance link."
812
+ },
813
+ {
814
+ "id": "Q-401-NP-004",
815
+ "question": "An architect agent has 3 notebook entries matching #auth-middleware. How does orchestration use them?",
816
+ "options": [
817
+ "They replace the agent's expertise section in the prompt",
818
+ "buildProfileEnrichment() appends a 'Relevant Notebook Entries' section with context + snippet",
819
+ "They are sent as separate tool calls before the main prompt",
820
+ "They override the agent's personality settings"
821
+ ],
822
+ "correct": 1,
823
+ "explanation": "buildProfileEnrichment() appends notebook entries (up to 5) with context + truncated snippet to the orchestration prompt."
824
+ },
825
+ {
826
+ "id": "Q-401-NP-005",
827
+ "question": "A .agent file's integrityHash doesn't match the computed hash. What does this indicate?",
828
+ "options": [
829
+ "The file was created before v4.0 and needs migration",
830
+ "The file was modified without going through saveAgentProfile() — possible tampering",
831
+ "The agent's expertise has been updated since the hash was computed",
832
+ "The hash algorithm has changed between versions"
833
+ ],
834
+ "correct": 1,
835
+ "explanation": "verifyIntegrity() returns false when the stored hash doesn't match. The hash covers id+role+permissions, so changes to those fields without saveAgentProfile() indicate tampering."
836
+ }
837
+ ]
692
838
  }
693
839
  ]
694
840
  }
@@ -1039,6 +1039,73 @@
1039
1039
  "explanation": "Internet direct connect uses the connection string format: address:port#code. The --public flag on the hub displays this connection string. The spoke parses the embedded code from after the # character and uses it automatically — no interactive prompt needed. Port 3939 must be reachable from the internet (port forward, VPN, or SSH tunnel)."
1040
1040
  }
1041
1041
  ]
1042
+ },
1043
+ {
1044
+ "id": "review-compliance",
1045
+ "title": "Automated Review Pipeline & Compliance Checking",
1046
+ "content": "## paradigm review\n\nThe automated review pipeline uses a two-stage protocol:\n\n### Stage 1: Spec Compliance (always runs)\n\n- **Purpose coverage**: All touched symbols registered in .purpose files\n- **Portal gate compliance**: Routes declared in portal.yaml with gates\n- **Aspect anchors**: Anchor files still exist, no drift\n- **Broken references**: Parent symbols exist\n- **Route coverage**: New routes have portal.yaml entries\n\n### Stage 2: Code Quality (--deep only)\n\n- **Security**: eval() detection, hardcoded secrets\n- **Convention**: console.log usage (use Paradigm logger)\n- **Test coverage**: Gaps in test files\n\n### ReviewFinding Format\n\nEach finding has:\n- **type**: blocking (must fix), improvement (should fix), note (informational)\n- **category**: purpose-coverage, portal-compliance, aspect-anchors, security, convention\n- **message**: Human-readable description\n- **suggestion**: How to fix it\n\n### Usage\n\n```bash\nparadigm review # Staged changes\nparadigm review --pr 123 # PR via gh CLI\nparadigm review --ci # Exit 1 on blocking\nparadigm review --deep # Include code quality\nparadigm review --json # JSON output\n```\n\n## Dynamic Tool Loading\n\nTools are organized in three tiers:\n- **Core** (~15 tools): Always loaded (search, ripple, status, navigate, etc.)\n- **Feature**: Auto-detected from filesystem (lore → .paradigm/lore/, etc.)\n- **Advanced**: On-demand via `paradigm_tool_activate`\n\n## Response Format\n\n`response_format: 'concise'` on high-traffic tools strips secondary data:\n- paradigm_search: returns only { symbol, type }\n- paradigm_ripple: returns only { symbol, impact, summary }\n- paradigm_status: returns only { project, counts, total }\n\n## compliance-checker.ts\n\nShared logic extracted from pm.ts postflight. Both `paradigm_pm_postflight` and `paradigm review` use the same compliance checks.",
1047
+ "quiz": [
1048
+ {
1049
+ "id": "Q-501-RC-001",
1050
+ "question": "paradigm review --ci finds 2 blocking and 3 improvement findings. What's the exit code?",
1051
+ "options": [
1052
+ "Exit code 0 — improvements are non-blocking",
1053
+ "Exit code 1 — any blocking findings cause non-zero exit in CI mode",
1054
+ "Exit code 2 — one per blocking finding",
1055
+ "Exit code 5 — total findings count"
1056
+ ],
1057
+ "correct": 1,
1058
+ "explanation": "In CI mode, any blocking findings cause exit code 1. Improvements and notes do not affect the exit code."
1059
+ },
1060
+ {
1061
+ "id": "Q-501-RC-002",
1062
+ "question": "A project has no features: section in config.yaml. How many MCP tools are loaded?",
1063
+ "options": [
1064
+ "Only core tools (~15)",
1065
+ "Core + explicitly enabled features",
1066
+ "All of them — auto-detection is generous, defaulting to current behavior",
1067
+ "None — features must be explicitly configured"
1068
+ ],
1069
+ "correct": 2,
1070
+ "explanation": "No features config + generous auto-detection = all tools loaded, matching pre-4.0 behavior for backward compat."
1071
+ },
1072
+ {
1073
+ "id": "Q-501-RC-003",
1074
+ "question": "You call paradigm_search with response_format: 'concise'. What fields are returned?",
1075
+ "options": [
1076
+ "Full results with descriptions, paths, and fuzzy matches",
1077
+ "Only { symbol, type } per result — descriptions and secondary data stripped",
1078
+ "Only symbol names as a flat array",
1079
+ "Compressed binary format"
1080
+ ],
1081
+ "correct": 1,
1082
+ "explanation": "Concise mode strips results to { symbol, type } per entry and removes fuzzyMatched, fuzzyNote, suggestions, workspace data."
1083
+ },
1084
+ {
1085
+ "id": "Q-501-RC-004",
1086
+ "question": "An agent needs the graph generation tool but it's in the advanced tier. What does it do?",
1087
+ "options": [
1088
+ "Request an admin to enable it in config.yaml",
1089
+ "Call paradigm_tool_activate with feature: 'graph'",
1090
+ "Modify the agent's permissions to include graph tools",
1091
+ "Restart the session with --enable-graph flag"
1092
+ ],
1093
+ "correct": 1,
1094
+ "explanation": "paradigm_tool_activate enables advanced-tier modules for the current session. The tools become available immediately."
1095
+ },
1096
+ {
1097
+ "id": "Q-501-RC-005",
1098
+ "question": "What's the relationship between paradigm review Stage 1 and paradigm_pm_postflight?",
1099
+ "options": [
1100
+ "They are completely independent with different checks",
1101
+ "paradigm review calls paradigm_pm_postflight internally",
1102
+ "They share the same compliance logic extracted into compliance-checker.ts",
1103
+ "paradigm_pm_postflight is deprecated in favor of paradigm review"
1104
+ ],
1105
+ "correct": 2,
1106
+ "explanation": "Both use compliance-checker.ts for shared compliance logic — purpose coverage, portal gates, aspect anchors, and broken refs."
1107
+ }
1108
+ ]
1042
1109
  }
1043
1110
  ]
1044
1111
  }