@a-company/paradigm 5.37.11 → 6.0.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 (362) hide show
  1. package/dist/{accept-orchestration-SBZVK3H4.js → accept-orchestration-QQISPINV.js} +1 -1
  2. package/dist/add-UOR4INIV.js +8 -0
  3. package/dist/{agent-loader-RIVI6QPP.js → agent-loader-2WJHD46U.js} +1 -1
  4. package/dist/{agent-loader-RJRVO5GQ.js → agent-loader-YKS2PQWO.js} +1 -1
  5. package/dist/{aggregate-W66DM3GA.js → aggregate-A5S5MTCC.js} +1 -1
  6. package/dist/{ambient-76YMUA5Q.js → ambient-BE3SQXNN.js} +1 -1
  7. package/dist/{ambient-WTLYUAQM.js → ambient-NVKQCW2A.js} +12 -12
  8. package/dist/{assess-UFPYEJKP.js → assess-63WXHWJV.js} +1 -1
  9. package/dist/{beacon-5QVYV5DF.js → beacon-QVUD3MGP.js} +1 -1
  10. package/dist/{calibration-OLJYB5HN.js → calibration-BDHGYJOK.js} +1 -1
  11. package/dist/{chunk-SI6SV76D.js → chunk-3DZK54RU.js} +72 -19
  12. package/dist/{chunk-CHVQNRRT.js → chunk-4PSD5R7N.js} +2 -2
  13. package/dist/chunk-6SKSV5B2.js +24 -0
  14. package/dist/{chunk-KFNHCQ4R.js → chunk-FEYOQMZ5.js} +1 -1
  15. package/dist/{chunk-NEJ4ZLCY.js → chunk-GAFKOFAV.js} +1 -1
  16. package/dist/chunk-GRZQIKST.js +2 -0
  17. package/dist/{chunk-RLCH7DXQ.js → chunk-K7X3Z3GL.js} +1 -1
  18. package/dist/chunk-LPBCQM5Y.js +6 -0
  19. package/dist/{chunk-T6IDXUUA.js → chunk-LWAIVOSF.js} +1 -1
  20. package/dist/{chunk-74SGKSRQ.js → chunk-M2HKWR25.js} +1 -1
  21. package/dist/{chunk-BOYQAMGC.js → chunk-M3PPXJU4.js} +1 -1
  22. package/dist/chunk-PHEX6LU4.js +111 -0
  23. package/dist/chunk-Q527BPUF.js +2 -0
  24. package/dist/chunk-R5ECMBIV.js +11 -0
  25. package/dist/{chunk-X3U3IGYT.js → chunk-TBWWFRL5.js} +1 -1
  26. package/dist/{chunk-MQIG6SMF.js → chunk-TNVWGPCE.js} +1 -1
  27. package/dist/{chunk-SUU6M4JH.js → chunk-TOYQ2QCB.js} +1 -1
  28. package/dist/chunk-TZDYIPVU.js +521 -0
  29. package/dist/{chunk-3XGNXXCT.js → chunk-UZ5H7K6Q.js} +1 -1
  30. package/dist/chunk-VIG5LSGZ.js +2 -0
  31. package/dist/chunk-VNIX5KBT.js +3 -0
  32. package/dist/{chunk-AGFPVSX5.js → chunk-VXIIVMTM.js} +1 -1
  33. package/dist/{chunk-ORDKEGII.js → chunk-WESTEMIM.js} +1 -1
  34. package/dist/{chunk-LBQBWIEX.js → chunk-Y4P4SGZV.js} +1 -1
  35. package/dist/{chunk-DOCDDDTD.js → chunk-YNDPSWOE.js} +5 -5
  36. package/dist/chunk-Z5QW6USC.js +2 -0
  37. package/dist/chunk-ZJQY5PPP.js +7 -0
  38. package/dist/{commands-LMUD5L6R.js → commands-ANRJNG2W.js} +1 -1
  39. package/dist/compliance-BNFWQPKM.js +6 -0
  40. package/dist/config-schema-FLHRVZMI.js +2 -0
  41. package/dist/{constellation-CG7C4WFE.js → constellation-NWLXYATA.js} +1 -1
  42. package/dist/{context-audit-XRPT3OU2.js → context-audit-JVCA6GSV.js} +1 -1
  43. package/dist/{cost-IDNVMAEV.js → cost-24UZSS2P.js} +1 -1
  44. package/dist/{cursorrules-U5O4G5T4.js → cursorrules-ZXPXPZ3P.js} +1 -1
  45. package/dist/decision-loader-HELL2AMX.js +2 -0
  46. package/dist/{delete-P5VULXR4.js → delete-2C6ALLYY.js} +1 -1
  47. package/dist/{diff-JVEYCXUC.js → diff-MF55KQZH.js} +1 -1
  48. package/dist/{dist-KGRCLBJP-2QAPFYNF.js → dist-GQ42YS5N-4HIJZVBB.js} +10 -10
  49. package/dist/dist-JZZJLVMR.js +2 -0
  50. package/dist/{dist-3ZCH25SG.js → dist-OG6MM4VY.js} +1 -1
  51. package/dist/dist-SE67SOXB.js +2 -0
  52. package/dist/{docs-USDAF26F.js → docs-O37YLLRN.js} +1 -1
  53. package/dist/doctor-IG5XM4C4.js +2 -0
  54. package/dist/{edit-GUU3HBVW.js → edit-P3MDAZLU.js} +1 -1
  55. package/dist/{flow-POQP27WA.js → flow-BGXOVE2V.js} +1 -1
  56. package/dist/{hooks-IG2GOAHP.js → hooks-TFMMMB2H.js} +1 -1
  57. package/dist/index.js +6 -6
  58. package/dist/init-M44SO65G.js +2 -0
  59. package/dist/init-V4KSEKPK.js +2 -0
  60. package/dist/{integrity-UYDOOJDP.js → integrity-ROO3G43N.js} +1 -1
  61. package/dist/{list-YKIQNKGB.js → list-2XIWUEMA.js} +1 -1
  62. package/dist/list-CFHINXIS.js +12 -0
  63. package/dist/lore-loader-D2ISOASW.js +2 -0
  64. package/dist/lore-loader-PXFKMKAN.js +2 -0
  65. package/dist/mcp.js +19 -11
  66. package/dist/metrics-UESGUHTA.js +2 -0
  67. package/dist/{migrate-IBDE7VK4.js → migrate-Z5UQN57G.js} +1 -1
  68. package/dist/migrate-assessments-YSITX7KM.js +4 -0
  69. package/dist/migrate-decisions-NPLQOEEH.js +6 -0
  70. package/dist/migrate-plsat-EM2ACIQ3.js +6 -0
  71. package/dist/{nomination-engine-EALA5MGI.js → nomination-engine-QPZJH6XO.js} +1 -1
  72. package/dist/{notebook-loader-PXNRBBXD.js → notebook-loader-3J2OFMS3.js} +1 -1
  73. package/dist/{orchestrate-RCAMBOIB.js → orchestrate-RID7HHHH.js} +1 -1
  74. package/dist/{platform-server-DNAMH4YI.js → platform-server-UD45NTGV.js} +1 -1
  75. package/dist/portal-check-DV2VSJ5E.js +8 -0
  76. package/dist/{portal-compliance-4MG5F2GI.js → portal-compliance-JONQ4SOP.js} +1 -1
  77. package/dist/{probe-B22G2JKF.js → probe-5HAXULAD.js} +1 -1
  78. package/dist/{providers-AWA7WLLM.js → providers-4PXMWA7V.js} +1 -1
  79. package/dist/quiz-WYIZJG5K.js +10 -0
  80. package/dist/{record-YXPB34MY.js → record-N3VNYYKJ.js} +1 -1
  81. package/dist/reindex-FWPD2VGM.js +2 -0
  82. package/dist/{retag-N5XF3KXP.js → retag-72R2OSZV.js} +1 -1
  83. package/dist/{review-77QI6VOC.js → review-2INNWLTW.js} +1 -1
  84. package/dist/{review-6UAH6V3R.js → review-VMSX2PKI.js} +1 -1
  85. package/dist/{ripple-ZGDITCGB.js → ripple-FNZI47SH.js} +1 -1
  86. package/dist/{sentinel-HYAZ3CO5.js → sentinel-EFPEX246.js} +1 -1
  87. package/dist/{sentinel-bridge-VR357PKL.js → sentinel-bridge-UR2MKARY.js} +1 -1
  88. package/dist/sentinel.js +1 -1
  89. package/dist/{serve-U47GULB6.js → serve-MO35XIZE.js} +1 -1
  90. package/dist/serve-OQYUO7CR.js +12 -0
  91. package/dist/{server-4YNUIK4W.js → server-4D77LCST.js} +1 -1
  92. package/dist/server-FGUL2FWQ.js +7 -0
  93. package/dist/session-tracker-KGORN6B5.js +2 -0
  94. package/dist/{session-work-log-PAKXOFGL.js → session-work-log-4IEVE4KK.js} +1 -1
  95. package/dist/{session-work-log-ZP45TREI.js → session-work-log-EE4UIZ33.js} +1 -1
  96. package/dist/{setup-3F5IK7MO.js → setup-ZSEC72BS.js} +2 -2
  97. package/dist/{shift-FDADESC4.js → shift-TVNY2CQF.js} +6 -6
  98. package/dist/{show-PJ5LFLIL.js → show-JH7LJ5MT.js} +1 -1
  99. package/dist/show-WVHAL4VU.js +7 -0
  100. package/dist/{snapshot-L2G56RPL.js → snapshot-3IYB67D4.js} +1 -1
  101. package/dist/{spawn-M5BAV252.js → spawn-UH5RENSE.js} +1 -1
  102. package/dist/{status-77M3SDIF.js → status-DB3KNLW3.js} +1 -1
  103. package/dist/status-S7Z5FVIE.js +6 -0
  104. package/dist/{summary-LXLHFRN7.js → summary-WLI3NF4G.js} +2 -2
  105. package/dist/{sweep-HU74OPVW.js → sweep-7TZFN5NS.js} +1 -1
  106. package/dist/sync-55U6QPIA.js +2 -0
  107. package/dist/{sync-llms-7CAI74QL.js → sync-llms-GF7DDQDI.js} +1 -1
  108. package/dist/team-MGT66HZQ.js +2 -0
  109. package/dist/{test-BQJMS4Y2.js → test-WLEPZQFC.js} +1 -1
  110. package/dist/{timeline-K3ZFKJ3R.js → timeline-RK7O2SCM.js} +1 -1
  111. package/dist/tools-QJHAVYI6.js +2 -0
  112. package/dist/university-content/notes/N-para-001-build-something.md +126 -0
  113. package/dist/university-content/notes/N-para-001-meet-the-team.md +85 -0
  114. package/dist/university-content/notes/N-para-001-shift-setup.md +74 -0
  115. package/dist/university-content/notes/N-para-101-component-types.md +99 -0
  116. package/dist/university-content/notes/N-para-101-first-steps.md +134 -0
  117. package/dist/university-content/notes/N-para-101-five-symbols.md +128 -0
  118. package/dist/university-content/notes/N-para-101-paradigm-logger.md +89 -0
  119. package/dist/university-content/notes/N-para-101-portal-yaml.md +112 -0
  120. package/dist/university-content/notes/N-para-101-project-structure.md +143 -0
  121. package/dist/university-content/notes/N-para-101-purpose-files.md +121 -0
  122. package/dist/university-content/notes/N-para-101-tags-and-classification.md +93 -0
  123. package/dist/university-content/notes/N-para-101-welcome.md +51 -0
  124. package/dist/university-content/notes/N-para-201-architecture-review.md +175 -0
  125. package/dist/university-content/notes/N-para-201-aspect-graph.md +79 -0
  126. package/dist/university-content/notes/N-para-201-aspects-and-anchors.md +112 -0
  127. package/dist/university-content/notes/N-para-201-component-patterns.md +138 -0
  128. package/dist/university-content/notes/N-para-201-cross-cutting-concerns.md +145 -0
  129. package/dist/university-content/notes/N-para-201-disciplines.md +187 -0
  130. package/dist/university-content/notes/N-para-201-flows-deep-dive.md +119 -0
  131. package/dist/university-content/notes/N-para-201-gates-deep-dive.md +165 -0
  132. package/dist/university-content/notes/N-para-201-portal-protocol.md +133 -0
  133. package/dist/university-content/notes/N-para-201-signal-patterns.md +159 -0
  134. package/dist/university-content/notes/N-para-201-symbol-naming.md +149 -0
  135. package/dist/university-content/notes/N-para-301-context-management.md +53 -0
  136. package/dist/university-content/notes/N-para-301-decisions.md +99 -0
  137. package/dist/university-content/notes/N-para-301-doctor-and-validation.md +70 -0
  138. package/dist/university-content/notes/N-para-301-enforcement-levels.md +102 -0
  139. package/dist/university-content/notes/N-para-301-fragility-tracking.md +50 -0
  140. package/dist/university-content/notes/N-para-301-history-system.md +42 -0
  141. package/dist/university-content/notes/N-para-301-navigation-system.md +55 -0
  142. package/dist/university-content/notes/N-para-301-operations-review.md +55 -0
  143. package/dist/university-content/notes/N-para-301-paradigm-shift.md +93 -0
  144. package/dist/university-content/notes/N-para-301-protocols.md +113 -0
  145. package/dist/university-content/notes/N-para-301-ripple-analysis.md +53 -0
  146. package/dist/university-content/notes/N-para-301-sentinel-observability.md +87 -0
  147. package/dist/university-content/notes/N-para-301-sync-and-maintenance.md +57 -0
  148. package/dist/university-content/notes/N-para-301-wisdom-system.md +89 -0
  149. package/dist/university-content/notes/N-para-401-agent-identity.md +99 -0
  150. package/dist/university-content/notes/N-para-401-agent-interop.md +87 -0
  151. package/dist/university-content/notes/N-para-401-agent-roles.md +107 -0
  152. package/dist/university-content/notes/N-para-401-commit-conventions.md +82 -0
  153. package/dist/university-content/notes/N-para-401-mastery-review.md +71 -0
  154. package/dist/university-content/notes/N-para-401-mcp-tools-overview.md +102 -0
  155. package/dist/university-content/notes/N-para-401-multi-agent-coordination.md +80 -0
  156. package/dist/university-content/notes/N-para-401-notebooks-permissions.md +66 -0
  157. package/dist/university-content/notes/N-para-401-orchestration-workflow.md +101 -0
  158. package/dist/university-content/notes/N-para-401-pm-governance.md +71 -0
  159. package/dist/university-content/notes/N-para-401-provider-cascade.md +75 -0
  160. package/dist/university-content/notes/N-para-401-quick-check.md +95 -0
  161. package/dist/university-content/notes/N-para-501-advanced-workflows.md +122 -0
  162. package/dist/university-content/notes/N-para-501-aspect-graph-advanced.md +195 -0
  163. package/dist/university-content/notes/N-para-501-aspect-graph-internals.md +97 -0
  164. package/dist/university-content/notes/N-para-501-assessment-loops.md +116 -0
  165. package/dist/university-content/notes/N-para-501-conductor-workspace.md +77 -0
  166. package/dist/university-content/notes/N-para-501-habits-practice.md +164 -0
  167. package/dist/university-content/notes/N-para-501-hook-enforcement.md +100 -0
  168. package/dist/university-content/notes/N-para-501-lore-system.md +155 -0
  169. package/dist/university-content/notes/N-para-501-platform-agent-ui.md +108 -0
  170. package/dist/university-content/notes/N-para-501-review-compliance.md +72 -0
  171. package/dist/university-content/notes/N-para-501-sentinel-deep-dive.md +173 -0
  172. package/dist/university-content/notes/N-para-501-session-intelligence.md +104 -0
  173. package/dist/university-content/notes/N-para-501-symphony-a-mail.md +120 -0
  174. package/dist/university-content/notes/N-para-501-symphony-networking.md +119 -0
  175. package/dist/university-content/notes/N-para-501-task-management.md +100 -0
  176. package/dist/university-content/notes/N-para-601-agent-renaissance.md +121 -0
  177. package/dist/university-content/notes/N-para-601-attention-scoring.md +129 -0
  178. package/dist/university-content/notes/N-para-601-context-composition.md +146 -0
  179. package/dist/university-content/notes/N-para-601-data-sovereignty.md +140 -0
  180. package/dist/university-content/notes/N-para-601-event-stream.md +126 -0
  181. package/dist/university-content/notes/N-para-601-knowledge-streams.md +144 -0
  182. package/dist/university-content/notes/N-para-601-learning-loop.md +68 -0
  183. package/dist/university-content/notes/N-para-601-maestro-team-collab.md +136 -0
  184. package/dist/university-content/notes/N-para-601-nominations-debates.md +115 -0
  185. package/dist/university-content/notes/N-para-701-agent-notebooks.md +131 -0
  186. package/dist/university-content/notes/N-para-701-agent-pods-nevrland.md +182 -0
  187. package/dist/university-content/notes/N-para-701-agent-profiles.md +197 -0
  188. package/dist/university-content/notes/N-para-701-agent-roster.md +82 -0
  189. package/dist/university-content/notes/N-para-701-agent-state.md +180 -0
  190. package/dist/university-content/notes/N-para-701-learning-feedback-loop.md +188 -0
  191. package/dist/university-content/notes/N-para-701-model-tier-resolution.md +204 -0
  192. package/dist/university-content/notes/N-para-701-orchestration-enforcement.md +169 -0
  193. package/dist/university-content/notes/N-para-701-per-project-rosters.md +198 -0
  194. package/dist/university-content/notes/N-para-701-symphony-visibility.md +142 -0
  195. package/dist/university-content/paths/LP-para-001.yaml +29 -0
  196. package/dist/university-content/paths/LP-para-101.yaml +59 -0
  197. package/dist/university-content/paths/LP-para-201.yaml +69 -0
  198. package/dist/university-content/paths/LP-para-301.yaml +84 -0
  199. package/dist/university-content/paths/LP-para-401.yaml +74 -0
  200. package/dist/university-content/paths/LP-para-501.yaml +89 -0
  201. package/dist/university-content/paths/LP-para-601.yaml +59 -0
  202. package/dist/university-content/paths/LP-para-701.yaml +64 -0
  203. package/dist/university-content/quizzes/Q-para-001-build-something.yaml +46 -0
  204. package/dist/university-content/quizzes/Q-para-001-meet-the-team.yaml +46 -0
  205. package/dist/university-content/quizzes/Q-para-001-shift-setup.yaml +46 -0
  206. package/dist/university-content/quizzes/Q-para-101-component-types.yaml +46 -0
  207. package/dist/university-content/quizzes/Q-para-101-first-steps.yaml +56 -0
  208. package/dist/university-content/quizzes/Q-para-101-five-symbols.yaml +66 -0
  209. package/dist/university-content/quizzes/Q-para-101-paradigm-logger.yaml +56 -0
  210. package/dist/university-content/quizzes/Q-para-101-portal-yaml.yaml +56 -0
  211. package/dist/university-content/quizzes/Q-para-101-project-structure.yaml +66 -0
  212. package/dist/university-content/quizzes/Q-para-101-purpose-files.yaml +56 -0
  213. package/dist/university-content/quizzes/Q-para-101-tags-and-classification.yaml +56 -0
  214. package/dist/university-content/quizzes/Q-para-101-welcome.yaml +56 -0
  215. package/dist/university-content/quizzes/Q-para-201-architecture-review.yaml +66 -0
  216. package/dist/university-content/quizzes/Q-para-201-aspect-graph.yaml +46 -0
  217. package/dist/university-content/quizzes/Q-para-201-aspects-and-anchors.yaml +56 -0
  218. package/dist/university-content/quizzes/Q-para-201-component-patterns.yaml +56 -0
  219. package/dist/university-content/quizzes/Q-para-201-cross-cutting-concerns.yaml +56 -0
  220. package/dist/university-content/quizzes/Q-para-201-disciplines.yaml +66 -0
  221. package/dist/university-content/quizzes/Q-para-201-flows-deep-dive.yaml +66 -0
  222. package/dist/university-content/quizzes/Q-para-201-gates-deep-dive.yaml +66 -0
  223. package/dist/university-content/quizzes/Q-para-201-portal-protocol.yaml +56 -0
  224. package/dist/university-content/quizzes/Q-para-201-signal-patterns.yaml +56 -0
  225. package/dist/university-content/quizzes/Q-para-201-symbol-naming.yaml +66 -0
  226. package/dist/university-content/quizzes/Q-para-301-context-management.yaml +56 -0
  227. package/dist/university-content/quizzes/Q-para-301-decisions.yaml +76 -0
  228. package/dist/university-content/quizzes/Q-para-301-doctor-and-validation.yaml +66 -0
  229. package/dist/university-content/quizzes/Q-para-301-enforcement-levels.yaml +46 -0
  230. package/dist/university-content/quizzes/Q-para-301-fragility-tracking.yaml +46 -0
  231. package/dist/university-content/quizzes/Q-para-301-history-system.yaml +56 -0
  232. package/dist/university-content/quizzes/Q-para-301-navigation-system.yaml +56 -0
  233. package/dist/university-content/quizzes/Q-para-301-operations-review.yaml +66 -0
  234. package/dist/university-content/quizzes/Q-para-301-paradigm-shift.yaml +46 -0
  235. package/dist/university-content/quizzes/Q-para-301-protocols.yaml +56 -0
  236. package/dist/university-content/quizzes/Q-para-301-ripple-analysis.yaml +56 -0
  237. package/dist/university-content/quizzes/Q-para-301-sentinel-observability.yaml +46 -0
  238. package/dist/university-content/quizzes/Q-para-301-sync-and-maintenance.yaml +46 -0
  239. package/dist/university-content/quizzes/Q-para-301-wisdom-system.yaml +56 -0
  240. package/dist/university-content/quizzes/Q-para-401-agent-identity.yaml +66 -0
  241. package/dist/university-content/quizzes/Q-para-401-agent-interop.yaml +46 -0
  242. package/dist/university-content/quizzes/Q-para-401-agent-roles.yaml +56 -0
  243. package/dist/university-content/quizzes/Q-para-401-commit-conventions.yaml +56 -0
  244. package/dist/university-content/quizzes/Q-para-401-mastery-review.yaml +66 -0
  245. package/dist/university-content/quizzes/Q-para-401-mcp-tools-overview.yaml +66 -0
  246. package/dist/university-content/quizzes/Q-para-401-multi-agent-coordination.yaml +76 -0
  247. package/dist/university-content/quizzes/Q-para-401-notebooks-permissions.yaml +61 -0
  248. package/dist/university-content/quizzes/Q-para-401-orchestration-workflow.yaml +66 -0
  249. package/dist/university-content/quizzes/Q-para-401-pm-governance.yaml +66 -0
  250. package/dist/university-content/quizzes/Q-para-401-provider-cascade.yaml +56 -0
  251. package/dist/university-content/quizzes/Q-para-401-quick-check.yaml +46 -0
  252. package/dist/university-content/quizzes/Q-para-501-advanced-workflows.yaml +66 -0
  253. package/dist/university-content/quizzes/Q-para-501-aspect-graph-advanced.yaml +66 -0
  254. package/dist/university-content/quizzes/Q-para-501-aspect-graph-internals.yaml +66 -0
  255. package/dist/university-content/quizzes/Q-para-501-assessment-loops.yaml +46 -0
  256. package/dist/university-content/quizzes/Q-para-501-conductor-workspace.yaml +46 -0
  257. package/dist/university-content/quizzes/Q-para-501-habits-practice.yaml +56 -0
  258. package/dist/university-content/quizzes/Q-para-501-hook-enforcement.yaml +66 -0
  259. package/dist/university-content/quizzes/Q-para-501-lore-system.yaml +66 -0
  260. package/dist/university-content/quizzes/Q-para-501-platform-agent-ui.yaml +66 -0
  261. package/dist/university-content/quizzes/Q-para-501-review-compliance.yaml +61 -0
  262. package/dist/university-content/quizzes/Q-para-501-sentinel-deep-dive.yaml +86 -0
  263. package/dist/university-content/quizzes/Q-para-501-session-intelligence.yaml +66 -0
  264. package/dist/university-content/quizzes/Q-para-501-symphony-a-mail.yaml +66 -0
  265. package/dist/university-content/quizzes/Q-para-501-symphony-networking.yaml +66 -0
  266. package/dist/university-content/quizzes/Q-para-501-task-management.yaml +46 -0
  267. package/dist/university-content/quizzes/Q-para-601-agent-renaissance.yaml +66 -0
  268. package/dist/university-content/quizzes/Q-para-601-attention-scoring.yaml +56 -0
  269. package/dist/university-content/quizzes/Q-para-601-context-composition.yaml +66 -0
  270. package/dist/university-content/quizzes/Q-para-601-data-sovereignty.yaml +56 -0
  271. package/dist/university-content/quizzes/Q-para-601-event-stream.yaml +66 -0
  272. package/dist/university-content/quizzes/Q-para-601-knowledge-streams.yaml +66 -0
  273. package/dist/university-content/quizzes/Q-para-601-learning-loop.yaml +56 -0
  274. package/dist/university-content/quizzes/Q-para-601-maestro-team-collab.yaml +86 -0
  275. package/dist/university-content/quizzes/Q-para-601-nominations-debates.yaml +66 -0
  276. package/dist/university-content/quizzes/Q-para-701-agent-notebooks.yaml +66 -0
  277. package/dist/university-content/quizzes/Q-para-701-agent-pods-nevrland.yaml +66 -0
  278. package/dist/university-content/quizzes/Q-para-701-agent-profiles.yaml +66 -0
  279. package/dist/university-content/quizzes/Q-para-701-agent-roster.yaml +66 -0
  280. package/dist/university-content/quizzes/Q-para-701-agent-state.yaml +66 -0
  281. package/dist/university-content/quizzes/Q-para-701-learning-feedback-loop.yaml +66 -0
  282. package/dist/university-content/quizzes/Q-para-701-model-tier-resolution.yaml +66 -0
  283. package/dist/university-content/quizzes/Q-para-701-orchestration-enforcement.yaml +66 -0
  284. package/dist/university-content/quizzes/Q-para-701-per-project-rosters.yaml +66 -0
  285. package/dist/university-content/quizzes/Q-para-701-symphony-visibility.yaml +66 -0
  286. package/dist/university-content/quizzes/Q-plsat-v2.yaml +904 -0
  287. package/dist/university-content/quizzes/Q-plsat-v3.yaml +2909 -0
  288. package/dist/university-content/reference.json +2 -2
  289. package/dist/university-ui/assets/{index-CecQrfSn.js → index-nNgzO1il.js} +2 -2
  290. package/dist/university-ui/assets/{index-CecQrfSn.js.map → index-nNgzO1il.js.map} +1 -1
  291. package/dist/university-ui/index.html +1 -1
  292. package/dist/{upgrade-GX56QE3C.js → upgrade-NKN63VTY.js} +2 -2
  293. package/dist/{validate-VZXTJHGO.js → validate-BB6LRWIY.js} +1 -1
  294. package/dist/validate-XUQZTF3H.js +9 -0
  295. package/dist/{watch-YCODNIET.js → watch-25GJHQYT.js} +1 -1
  296. package/dist/workspace-VMSPYIBV.js +2 -0
  297. package/lore-ui/dist/assets/{index-Bk-K0qgN.js → index-DKhNxgtW.js} +10 -10
  298. package/lore-ui/dist/index.html +1 -1
  299. package/package.json +3 -2
  300. package/platform-ui/dist/assets/{AmbientSection-BYjt75R1.js → AmbientSection-CwatqcBD.js} +1 -1
  301. package/platform-ui/dist/assets/{CanvasSection-rKvA_vZj.js → CanvasSection-dFAthehN.js} +1 -1
  302. package/platform-ui/dist/assets/{DocsSection-CI9K73M-.js → DocsSection-BZ2SFJBZ.js} +1 -1
  303. package/platform-ui/dist/assets/{GitSection-DSGj_c6S.js → GitSection-MNNYU1tO.js} +1 -1
  304. package/platform-ui/dist/assets/{GraphSection-CawN7pC5.js → GraphSection-COYjb4Pt.js} +1 -1
  305. package/platform-ui/dist/assets/LoreSection-B0hUbfsJ.js +1 -0
  306. package/platform-ui/dist/assets/{SentinelSection-DNgoYMH0.js → SentinelSection-BCxW1DCp.js} +1 -1
  307. package/platform-ui/dist/assets/{SymphonySection-C0zfcqv3.js → SymphonySection-BsucZRqy.js} +1 -1
  308. package/platform-ui/dist/assets/{TeamSection-Bzd3Dt9Q.js → TeamSection-C0QNTudW.js} +1 -1
  309. package/platform-ui/dist/assets/{UniversitySection-tBr62R0S.js → UniversitySection-DN1-g9pw.js} +1 -1
  310. package/platform-ui/dist/assets/{index-BaOmyn11.js → index-DwUT8pju.js} +2 -2
  311. package/platform-ui/dist/index.html +1 -1
  312. package/templates/paradigm/specs/symbols.md +4 -2
  313. package/dist/add-P76GEMGF.js +0 -8
  314. package/dist/chunk-3TR6LLXP.js +0 -111
  315. package/dist/chunk-G7XFK2GI.js +0 -11
  316. package/dist/chunk-J6KWGCHN.js +0 -24
  317. package/dist/chunk-JQKKVAAN.js +0 -2
  318. package/dist/chunk-ODVKPZZ4.js +0 -2
  319. package/dist/chunk-Q2J542ST.js +0 -2
  320. package/dist/chunk-QT2LKB3P.js +0 -7
  321. package/dist/chunk-SHD27BQX.js +0 -6
  322. package/dist/chunk-WS2N27RX.js +0 -3
  323. package/dist/chunk-YT52WLBF.js +0 -521
  324. package/dist/compliance-WJINB5DM.js +0 -6
  325. package/dist/config-schema-GUQY2QN7.js +0 -2
  326. package/dist/decision-loader-2XPZE4EZ.js +0 -2
  327. package/dist/dist-R3RWD35F.js +0 -2
  328. package/dist/dist-VXCZWVVJ.js +0 -2
  329. package/dist/doctor-QJ47XAUP.js +0 -2
  330. package/dist/init-HIBRSVUB.js +0 -2
  331. package/dist/list-5IUGP3ZB.js +0 -7
  332. package/dist/lore-loader-RVQI5GXL.js +0 -2
  333. package/dist/lore-loader-XY5MZRR2.js +0 -2
  334. package/dist/migrate-assessments-GEI5WMI2.js +0 -4
  335. package/dist/portal-check-Z3OCQEQR.js +0 -8
  336. package/dist/quiz-FE5UGAY2.js +0 -10
  337. package/dist/reindex-FO5VMZVQ.js +0 -2
  338. package/dist/serve-OY6XYL7F.js +0 -12
  339. package/dist/server-2MNROHF6.js +0 -7
  340. package/dist/session-tracker-MWJAJA6Z.js +0 -2
  341. package/dist/show-BOAVWZPZ.js +0 -7
  342. package/dist/status-A37ECYNJ.js +0 -6
  343. package/dist/sync-DLUBV5HQ.js +0 -2
  344. package/dist/team-NSP6PMPS.js +0 -2
  345. package/dist/tools-CERDNVCG.js +0 -2
  346. package/dist/university-content/courses/.purpose +0 -492
  347. package/dist/university-content/courses/para-001.json +0 -166
  348. package/dist/university-content/courses/para-101.json +0 -615
  349. package/dist/university-content/courses/para-201.json +0 -794
  350. package/dist/university-content/courses/para-301.json +0 -830
  351. package/dist/university-content/courses/para-401.json +0 -868
  352. package/dist/university-content/courses/para-501.json +0 -1166
  353. package/dist/university-content/courses/para-601.json +0 -719
  354. package/dist/university-content/courses/para-701.json +0 -807
  355. package/dist/university-content/plsat/.purpose +0 -162
  356. package/dist/university-content/plsat/v2.0.json +0 -760
  357. package/dist/university-content/plsat/v3.0.json +0 -3453
  358. package/dist/validate-C6SMKGYD.js +0 -9
  359. package/dist/workspace-MKSQN7B2.js +0 -2
  360. package/platform-ui/dist/assets/LoreSection-oO5dCe6O.js +0 -1
  361. /package/dist/{chunk-BV5PRPLB.js → chunk-IZSBGW6E.js} +0 -0
  362. /package/templates/paradigm/specs/{scan.md → probe.md} +0 -0
@@ -0,0 +1,187 @@
1
+ ---
2
+ id: N-para-201-disciplines
3
+ title: Disciplines
4
+ type: note
5
+ author: paradigm
6
+ created: '2026-04-22'
7
+ updated: '2026-04-22'
8
+ tags:
9
+ - course
10
+ - para-201
11
+ - disciplines-define-how
12
+ - 14-disciplines-web
13
+ - auto-detection-at-init
14
+ symbols: []
15
+ difficulty: beginner
16
+ estimatedMinutes: 7
17
+ prerequisites: []
18
+ category: paradigm-core
19
+ origin: imported
20
+ source: courses/para-201.json
21
+ ---
22
+
23
+ ## How Symbols Map Across Domains
24
+
25
+ A Paradigm `discipline` defines how directory patterns and code structures map to symbol types in a specific development domain. A web frontend project organizes code differently from a backend API, which differs from a CLI tool. Disciplines capture these differences so that tooling — the navigator, the logging conventions, gate recommendations, and auto-scan — works correctly regardless of your tech stack.
26
+
27
+ ## Auto-Detection
28
+
29
+ When you run `paradigm shift` or `paradigm init`, Paradigm automatically detects the discipline from your project structure. It examines `package.json`, `Cargo.toml`, `go.mod`, `pyproject.toml`, and other project markers to infer the best match. The detected discipline is written to `.paradigm/config.yaml`:
30
+
31
+ ```yaml
32
+ discipline: fullstack # auto-detected from Next.js in package.json
33
+ ```
34
+
35
+ Detection heuristics include: monorepo markers (workspaces), framework deps (Next.js → fullstack, React alone → web, Express alone → api), Python ML deps (PyTorch → ml), Rust crate deps (clap → cli, axum → api, bevy → game), and more. You can always override the detected value.
36
+
37
+ ## The 14 Disciplines
38
+
39
+ Paradigm supports 14 disciplines, each with tailored symbol mappings, purpose-required paths, and scan patterns:
40
+
41
+ | Discipline | When to Use | Key Directories |
42
+ |------------|-------------|------------------|
43
+ | `web` | Frontend-only (React, Vue, Svelte) | `components/`, `pages/`, `hooks/`, `stores/` |
44
+ | `backend` | General backend (fallback) | `services/`, `routes/`, `models/` |
45
+ | `fullstack` | SSR or combined frontend+backend (Next.js, Django) | `components/`, `pages/`, `api/`, `services/` |
46
+ | `api` | API-only (Express, FastAPI, Gin) | `routes/`, `endpoints/`, `controllers/` |
47
+ | `cli` | CLI tools (Node bin, Click, clap) | `commands/`, `cmd/` |
48
+ | `ml` | Machine learning (PyTorch, TF, scikit-learn) | `models/`, `experiments/`, `pipelines/` |
49
+ | `mobile` | Mobile apps (React Native, Flutter) | `screens/`, `widgets/`, `navigation/` |
50
+ | `game` | Game dev (Bevy, Godot, Unity) | `gameplay/`, `entities/`, `systems/` |
51
+ | `embedded` | Embedded/IoT (embedded-hal, PlatformIO) | `drivers/`, `hal/`, `protocols/` |
52
+ | `devops` | Infrastructure (Terraform, Ansible) | `modules/`, `pipelines/`, `scripts/` |
53
+ | `data` | Data engineering (dbt, Airflow, Spark) | `models/`, `dags/`, `transforms/` |
54
+ | `library` | Reusable packages (npm, PyPI, crates) | `src/`, `lib/` |
55
+ | `monorepo` | Multi-package repos (workspaces, Nx) | `packages/`, `apps/`, `libs/` |
56
+ | `custom` | User-defined mappings | Whatever you configure |
57
+
58
+ ## Web Discipline
59
+
60
+ In a web project, the primary units are routes, components, and pages:
61
+
62
+ | Directory | Symbol | Rationale |
63
+ |-----------|--------|-----------|
64
+ | `routes/`, `pages/`, `views/` | `#` component | User-facing entry points |
65
+ | `components/` | `#` component | Reusable UI elements |
66
+ | `hooks/` | `#` component | Shared logic (hooks are code units, not signals) |
67
+ | `stores/`, `state/` | `#` component (tag: `[state]`) | Client-side state |
68
+ | `middleware/` | `^` gate | Route guards and auth checks |
69
+ | `api/` | `#` component | API client wrappers |
70
+
71
+ An important distinction: **hooks are components, not signals**. A frontend hook like `useAuth` encapsulates logic — it is `#useAuth`, a component. The `!` signal prefix is reserved for events that trigger decoupled side effects.
72
+
73
+ ## Backend / API Discipline
74
+
75
+ In a backend or API project, the primary units are services, controllers, and models:
76
+
77
+ | Directory | Symbol | Rationale |
78
+ |-----------|--------|-----------|
79
+ | `services/` | `#` component | Business logic |
80
+ | `controllers/`, `handlers/` | `#` component | Request handlers |
81
+ | `models/`, `entities/` | `#` component (tag: `[state]`) | Data models |
82
+ | `middleware/`, `guards/` | `^` gate | Auth and validation |
83
+ | `events/`, `listeners/` | `!` signal | Event emitters and handlers |
84
+ | `jobs/`, `workers/` | `#` component | Background processing |
85
+ | `integrations/`, `clients/` | `#` component (tag: `[integration]`) | External service wrappers |
86
+
87
+ The `api` discipline is like `backend` but focused on HTTP endpoints (adds `endpoints/`, `controllers/`, `webhooks/`).
88
+
89
+ ## Fullstack Discipline
90
+
91
+ The fullstack discipline combines both mappings. Paradigm determines which mapping to use based on the directory path:
92
+
93
+ ```
94
+ src/
95
+ client/ → Web discipline mappings apply
96
+ server/ → Backend discipline mappings apply
97
+ shared/ → Common mappings (# for all code units)
98
+ ```
99
+
100
+ Auto-detected for SSR frameworks like Next.js, Nuxt, SvelteKit, or when both React and Express are present.
101
+
102
+ ## Domain-Specific Disciplines
103
+
104
+ **ML**: Scans `models/`, `experiments/`, `notebooks/`. Pipelines map to `$` flows. Training events map to `!` signals.
105
+
106
+ **Data**: Scans `dbt/`, `dags/`, `transforms/`. ETL pipelines are `$` flows. Data quality checks are `!` signals.
107
+
108
+ **Game**: Scans `gameplay/`, `entities/`, `systems/`. Game loops are `$` flows. Game events are `!` signals.
109
+
110
+ **Embedded**: Scans `drivers/`, `hal/`, `protocols/`. State machines are `$` flows. Interrupts are `!` signals.
111
+
112
+ ## Why Disciplines Matter
113
+
114
+ Disciplines affect four things:
115
+
116
+ 1. **Symbol mappings** — Each discipline populates the `logging.symbol-mapping` section in config.yaml with directory-to-symbol mappings appropriate for your domain.
117
+ 2. **Navigator generation** — `paradigm scan` uses the discipline to categorize directories and suggest symbol types for undocumented code.
118
+ 3. **Gate recommendations** — `paradigm_gates_for_route` uses the discipline to understand which routes exist and what patterns apply.
119
+ 4. **Auto-scan patterns** — `paradigm scan --auto` adds discipline-specific file patterns (e.g., ML scans `.ipynb` notebooks, game scans `.gd` scripts).
120
+
121
+ With auto-detection, most projects get the right discipline without any manual configuration.
122
+
123
+ ## Custom Mappings
124
+
125
+ If your project does not fit a standard discipline, you can override mappings in `config.yaml`:
126
+
127
+ ```yaml
128
+ discipline: backend
129
+ custom-mappings:
130
+ "workers/": "#" # Override default if needed
131
+ "policies/": "^" # Treat policies as gates
132
+ "sagas/": "$" # Treat sagas as flows
133
+ ```
134
+
135
+ Custom mappings extend (not replace) the discipline defaults. Or set `discipline: custom` and define everything yourself.
136
+
137
+ ## Stack Presets
138
+
139
+ Disciplines tell Paradigm *what kind* of project you have (web, backend, mobile). Stack presets go one level deeper — they tell Paradigm *which framework* you are using. A stack preset layers framework-specific configuration on top of the discipline.
140
+
141
+ Paradigm ships 16 stack presets:
142
+
143
+ | Preset | Discipline | What It Adds |
144
+ |--------|------------|-------------|
145
+ | `nextjs` | fullstack | `app/` routes, server actions, RSC patterns |
146
+ | `remix` | fullstack | loader/action patterns, nested routes |
147
+ | `sveltekit` | fullstack | `+page.svelte`, `+server.ts` patterns |
148
+ | `nuxt` | fullstack | `composables/`, auto-imports |
149
+ | `react-spa` | web | CRA/Vite SPA patterns, `hooks/`, `contexts/` |
150
+ | `vue-spa` | web | Composition API, Pinia stores |
151
+ | `express` | api | `app.get/post`, middleware chains |
152
+ | `fastapi` | api | `@app.get`, Pydantic models, dependency injection |
153
+ | `django` | fullstack | `views.py`, `models.py`, `urls.py` |
154
+ | `flask` | api | `@app.route`, blueprints |
155
+ | `gin-go` | api | `r.GET`, handler groups |
156
+ | `axum-rs` | api | Axum extractors, tower middleware |
157
+ | `swift-ios` | mobile | SwiftUI views, `@Observable`, navigation |
158
+ | `kotlin-android` | mobile | Jetpack Compose, ViewModels, Hilt |
159
+ | `react-native` | mobile | Expo/bare RN, navigation, native modules |
160
+ | `flutter` | mobile | Widgets, BLoC/Riverpod, platform channels |
161
+
162
+ Stack presets are auto-detected during `paradigm init` from your dependencies and project files. You can also specify one explicitly:
163
+
164
+ ```bash
165
+ paradigm init --stack nextjs
166
+ ```
167
+
168
+ The detected stack is written to config.yaml:
169
+
170
+ ```yaml
171
+ discipline: fullstack
172
+ stack: nextjs
173
+ ```
174
+
175
+ Stack presets add three things on top of the discipline:
176
+ 1. **Refined symbol mappings** — Framework-specific directories (e.g., `app/api/` for Next.js route handlers)
177
+ 2. **Purpose-required paths** — Directories that should have `.purpose` files for the framework to work well with Paradigm
178
+ 3. **Scan hints** — Framework-specific patterns for component detection, route patterns, auth patterns, and state management
179
+
180
+ To see all available presets:
181
+
182
+ ```bash
183
+ paradigm presets
184
+ paradigm presets --discipline mobile # Filter by discipline
185
+ ```
186
+
187
+ Stack presets solve the cold-start problem: when you run `paradigm init` on an existing Next.js project, the preset knows to look for `app/` routes, server components, and API handlers — producing meaningful `.purpose` scaffolding instead of generic stubs.
@@ -0,0 +1,119 @@
1
+ ---
2
+ id: N-para-201-flows-deep-dive
3
+ title: Flows in Depth
4
+ type: note
5
+ author: paradigm
6
+ created: '2026-04-22'
7
+ updated: '2026-04-22'
8
+ tags:
9
+ - course
10
+ - para-201
11
+ - create-flows-when
12
+ - steps-are-component
13
+ - define-flows-in
14
+ symbols: []
15
+ difficulty: beginner
16
+ estimatedMinutes: 4
17
+ prerequisites: []
18
+ category: paradigm-core
19
+ origin: imported
20
+ source: courses/para-201.json
21
+ ---
22
+
23
+ ## When to Create a Flow
24
+
25
+ Not every process needs a `$flow`. The rule of thumb is: **create a flow when logic spans three or more components in a specific order**. A two-component interaction (service A calls service B) is simple enough to document in the component's `.purpose` entry. But once a third component enters the picture — and the order matters — a flow captures the choreography that no single component can describe.
26
+
27
+ Consider these scenarios:
28
+ - User clicks "Buy" → cart validates → payment charges → order creates → email sends. That is four components in sequence. This needs a `$checkout-flow`.
29
+ - A cron job triggers → data fetches → report generates → file uploads → Slack notifies. Five components. This needs a `$daily-report-flow`.
30
+ - A controller calls a service which returns data. Two components, no sequence ambiguity. This does NOT need a flow.
31
+
32
+ ## Flow Step Structure
33
+
34
+ Each step in a flow is a `component + action` pair. The component references a `#component` defined in a `.purpose` file, and the action describes what that component does in this step:
35
+
36
+ ```yaml
37
+ flows:
38
+ $onboarding:
39
+ description: New user setup from registration to first project
40
+ steps:
41
+ - component: "#auth-handler"
42
+ action: create-account
43
+ description: Validates email, hashes password, creates user record
44
+ - component: "#email-service"
45
+ action: send-welcome
46
+ description: Sends welcome email with verification link
47
+ - component: "#project-service"
48
+ action: create-default-project
49
+ description: Creates a starter project for the new user
50
+ - component: "#notification-service"
51
+ action: notify-team
52
+ description: Alerts the team Slack channel about the new signup
53
+ signals: ["!user-created", "!welcome-email-sent"]
54
+ gates: []
55
+ ```
56
+
57
+ The `description` on each step is optional but valuable — it tells AI agents what happens at each point without reading the source code.
58
+
59
+ ## Documenting Flows in .purpose Files
60
+
61
+ Flows are defined in the `flows` section of a `.purpose` file, usually in the directory of the *initiating* component. If the checkout flow starts in the cart module, define `$checkout-flow` in `src/cart/.purpose`. The flow references components from other directories — that is expected and correct.
62
+
63
+ You can also reference flows from component definitions:
64
+
65
+ ```yaml
66
+ components:
67
+ #cart-service:
68
+ description: Shopping cart management
69
+ flows: ["$checkout-flow", "$cart-abandonment-flow"]
70
+ ```
71
+
72
+ This bidirectional referencing lets `paradigm_ripple` calculate the full impact when you modify a component — it knows which flows pass through it.
73
+
74
+ ## Flow Validation
75
+
76
+ Paradigm provides `paradigm_flow_check` to check that your flow definitions are consistent:
77
+
78
+ ```
79
+ paradigm_flow_check({ flowId: "$checkout-flow", checkImplementation: true })
80
+ ```
81
+
82
+ With `checkImplementation: true`, the validator goes beyond schema checks — it verifies that the referenced components exist in `.purpose` files, that the actions are implemented in the codebase, and that any signals listed are actually emitted. This catches drift between documentation and code.
83
+
84
+ You can also validate all flows at once by omitting the `flowId` parameter. This is useful as a pre-commit check or CI step.
85
+
86
+ ## Circular Dependency Detection
87
+
88
+ When flows reference each other via `relatedFlows` or step-level `$flow` symbols, they form a dependency graph. Paradigm automatically detects circular dependencies in this graph using depth-first search.
89
+
90
+ A circular dependency looks like this:
91
+
92
+ ```yaml
93
+ $checkout-flow:
94
+ relatedFlows: [$payment-flow]
95
+ $payment-flow:
96
+ relatedFlows: [$checkout-flow] # Creates a cycle!
97
+ ```
98
+
99
+ When you run `paradigm_flow_check({})` (validate all flows), the output includes a `circularDependencies` section:
100
+
101
+ ```
102
+ ⚠ Circular Dependencies (1)
103
+
104
+ $checkout-flow → $payment-flow → $checkout-flow
105
+
106
+ Resolution: Break the cycle by extracting shared logic into a
107
+ separate flow, or remove one direction of the dependency.
108
+ ```
109
+
110
+ To resolve circular dependencies:
111
+ 1. **Extract shared logic** into a new flow that both original flows reference
112
+ 2. **Remove one direction** if only one flow truly depends on the other
113
+ 3. **Replace with signals** — use `!signal` communication instead of direct flow references
114
+
115
+ Circular dependencies are not just a documentation problem — they indicate architectural coupling that can lead to cascading failures and maintenance difficulty.
116
+
117
+ ## Flows Are Documentation, Not Orchestration
118
+
119
+ A critical distinction: flows describe *what happens*, not *how to make it happen*. They are not workflow engines or saga orchestrators. Your code still calls services, handles errors, and manages state however it needs to. The flow definition is metadata that helps humans and AI agents understand the sequence — it does not replace your implementation.
@@ -0,0 +1,165 @@
1
+ ---
2
+ id: N-para-201-gates-deep-dive
3
+ title: Gates in Depth
4
+ type: note
5
+ author: paradigm
6
+ created: '2026-04-22'
7
+ updated: '2026-04-22'
8
+ tags:
9
+ - course
10
+ - para-201
11
+ - gate-types-include
12
+ - check-expressions-are
13
+ - gates-chain-via
14
+ symbols: []
15
+ difficulty: beginner
16
+ estimatedMinutes: 4
17
+ prerequisites: []
18
+ category: paradigm-core
19
+ origin: imported
20
+ source: courses/para-201.json
21
+ ---
22
+
23
+ ## Gate Types
24
+
25
+ Gates are general-purpose condition checkers. While authorization is a common use case, gates can check any defined condition — feature flags, environment requirements, data prerequisites, system health, and more. Here are the common gate types:
26
+
27
+ **Auth gates** verify identity — is the user who they claim to be?
28
+ ```yaml
29
+ ^authenticated:
30
+ description: User must have a valid session
31
+ check: req.session.userId != null
32
+ type: auth
33
+ ```
34
+
35
+ **Role gates** verify permission level — does the user hold the right role?
36
+ ```yaml
37
+ ^project-admin:
38
+ description: User must be an admin of the project
39
+ check: project.admins.includes(req.user.id)
40
+ type: role
41
+ requires: [^authenticated]
42
+ ```
43
+
44
+ **Ownership gates** verify resource ownership — does the user own this specific item?
45
+ ```yaml
46
+ ^comment-author:
47
+ description: User must be the author of this comment
48
+ check: comment.authorId === req.user.id
49
+ type: ownership
50
+ requires: [^authenticated]
51
+ ```
52
+
53
+ **State-precondition gates** verify system state — is the system in the right condition?
54
+ ```yaml
55
+ ^payment-method-exists:
56
+ description: User must have a payment method on file
57
+ check: user.paymentMethods.length > 0
58
+ type: state-precondition
59
+ requires: [^authenticated]
60
+ ```
61
+
62
+ **Environment gates** verify deployment context — is the system running in the right environment?
63
+ ```yaml
64
+ ^production-only:
65
+ description: Action is restricted to production environment
66
+ check: process.env.NODE_ENV === 'production'
67
+ type: environment
68
+ ```
69
+
70
+ **Capability gates** verify that a feature or capability is available:
71
+ ```yaml
72
+ ^feature-enabled:
73
+ description: The feature flag must be active for this user
74
+ check: features.isEnabled('new-checkout', req.user)
75
+ type: capability
76
+ ```
77
+
78
+ **Data-readiness gates** verify that required data exists before proceeding:
79
+ ```yaml
80
+ ^profile-complete:
81
+ description: User must have completed their profile before accessing this feature
82
+ check: user.profile.isComplete === true
83
+ type: data-readiness
84
+ ```
85
+
86
+ The `type` field is metadata for humans and tools — Paradigm does not enforce different behavior based on type. But categorizing gates helps AI agents suggest appropriate checks. Auth, role, and ownership are common in web applications, while state-precondition, environment, capability, and data-readiness gates are equally important across all disciplines.
87
+
88
+ ## Check Expressions
89
+
90
+ The `check` field contains a **pseudo-code expression** that describes the gate's condition logic. It is not executable code — it is precise documentation:
91
+
92
+ ```yaml
93
+ # Good: clear and implementable
94
+ check: project.members.some(m => m.userId === req.user.id && m.role === 'admin')
95
+
96
+ # Bad: too vague
97
+ check: user is admin
98
+
99
+ # Bad: too implementation-specific
100
+ check: await db.query('SELECT * FROM project_members WHERE...')
101
+ ```
102
+
103
+ The check should be specific enough that a developer can implement it from reading the expression, but abstract enough that it does not depend on a particular ORM or database.
104
+
105
+ ## Gate Chains
106
+
107
+ Gates chain through the `requires` field. When a route specifies `[^authenticated, ^project-admin]`, the gates are checked in order:
108
+
109
+ 1. `^authenticated` runs first. If it fails, the request is rejected (in HTTP, this is a 401 Unauthorized; other disciplines handle failure differently).
110
+ 2. `^project-admin` runs next (which itself requires `^authenticated`, already passed). If it fails, the request is denied (in HTTP, a 403 Forbidden).
111
+
112
+ Chains prevent redundant checks. You never need to re-check authentication inside a role gate — the `requires` field guarantees it already passed.
113
+
114
+ Deep chains are possible but should be kept shallow for clarity:
115
+ ```yaml
116
+ ^super-admin:
117
+ requires: [^authenticated, ^org-admin] # ^org-admin itself requires ^authenticated
118
+ ```
119
+
120
+ ## The Effects Field
121
+
122
+ Gates can trigger side effects when they pass, defined in the `effects` field:
123
+
124
+ ```yaml
125
+ ^first-purchase:
126
+ description: User is making their first purchase
127
+ check: user.purchaseCount === 0
128
+ type: state-precondition
129
+ requires: [^authenticated]
130
+ effects:
131
+ - id: first-purchase-badge
132
+ oneTime: true
133
+ - id: welcome-discount
134
+ oneTime: true
135
+ ```
136
+
137
+ The `oneTime: true` flag ensures the effect triggers only once per user. Effects are useful for gamification, onboarding rewards, and analytics events. If a gate has no side effects, use `effects: []`.
138
+
139
+ ## Implementing Gates
140
+
141
+ While `portal.yaml` defines *what* gates exist and *where* they apply, your application code must *implement* them. In web applications, the typical pattern is middleware (other disciplines use different enforcement mechanisms):
142
+
143
+ ```typescript
144
+ // Express middleware implementing ^authenticated
145
+ function authenticated(req, res, next) {
146
+ if (!req.session?.userId) {
147
+ return res.status(401).json({ error: 'Authentication required' });
148
+ }
149
+ next();
150
+ }
151
+
152
+ // Express middleware implementing ^project-admin
153
+ function projectAdmin(req, res, next) {
154
+ const project = await Project.findById(req.params.id);
155
+ if (!project.admins.includes(req.user.id)) {
156
+ return res.status(403).json({ error: 'Admin access required' });
157
+ }
158
+ next();
159
+ }
160
+
161
+ // Route applying the gate chain from portal.yaml
162
+ router.put('/api/projects/:id', authenticated, projectAdmin, updateProject);
163
+ ```
164
+
165
+ The key discipline: the `portal.yaml` definition and the implementation must match. If `portal.yaml` says an operation requires `^project-admin`, the code must actually enforce that check.
@@ -0,0 +1,133 @@
1
+ ---
2
+ id: N-para-201-portal-protocol
3
+ title: The Portal Protocol
4
+ type: note
5
+ author: paradigm
6
+ created: '2026-04-22'
7
+ updated: '2026-04-22'
8
+ tags:
9
+ - course
10
+ - para-201
11
+ - specification-before-implementation
12
+ - four-steps-ask
13
+ - paradigmgatesforroute-suggests-gates
14
+ symbols: []
15
+ difficulty: beginner
16
+ estimatedMinutes: 4
17
+ prerequisites: []
18
+ category: paradigm-core
19
+ origin: imported
20
+ source: courses/para-201.json
21
+ ---
22
+
23
+ ## Specification Before Implementation
24
+
25
+ The Portal Protocol is Paradigm's prescribed workflow for adding guarded operations. Its core principle is **specification before implementation** — you define what conditions must be met before you write the handler code. This inverts the common (and dangerous) pattern of building functionality first and bolting on checks later.
26
+
27
+ The idea is universal: define what gates an operation needs before you implement the operation itself. In a web API, this means defining route gates before writing handlers. In a mobile app, it might mean specifying which screens require which conditions before building the UI. In a CLI tool, it means declaring what preconditions a command requires before writing the command logic.
28
+
29
+ ## The Four Steps
30
+
31
+ ### Step 1: Ask Paradigm
32
+
33
+ Before writing any handler, call `paradigm_gates_for_route` with the route and method:
34
+
35
+ ```
36
+ paradigm_gates_for_route({ route: "/api/projects/:id/members", method: "POST" })
37
+ ```
38
+
39
+ This tool analyzes your existing `portal.yaml` and suggests gates based on patterns:
40
+ - The route is under `/api/` → probably needs `^authenticated`
41
+ - It modifies a project resource → probably needs `^project-admin` or `^project-member`
42
+ - It is a POST (mutation) → higher gate requirements than a GET
43
+
44
+ The suggestions are not binding, but they catch common oversights. You might realize you need a gate you had not considered.
45
+
46
+ ### Step 2: Add to portal.yaml
47
+
48
+ Add the route with its required gates:
49
+
50
+ ```yaml
51
+ routes:
52
+ # Existing routes...
53
+ "POST /api/projects/:id/members": [^authenticated, ^project-admin]
54
+ ```
55
+
56
+ If you need a new gate that does not exist yet, define it in the `gates` section:
57
+
58
+ ```yaml
59
+ gates:
60
+ ^project-admin:
61
+ description: User must be an admin of the project
62
+ check: project.admins.includes(req.user.id)
63
+ type: role
64
+ requires: [^authenticated]
65
+ effects: []
66
+ ```
67
+
68
+ ### Step 3: Implement the Gate Checks
69
+
70
+ Write the middleware or handler code that enforces each gate. The implementation must match the `check` expression in portal.yaml. How a failed gate manifests depends on your discipline:
71
+
72
+ - **Web APIs** return HTTP status codes (401 for failed identity checks, 403 for failed authorization)
73
+ - **Mobile apps** might disable UI elements or show an upgrade prompt
74
+ - **CLI tools** might exit with a specific error code and message
75
+ - **Desktop apps** might gray out menu items or show a dialog
76
+
77
+ Here is an example for a web API:
78
+
79
+ ```typescript
80
+ async function projectAdmin(req, res, next) {
81
+ const project = await Project.findById(req.params.id);
82
+ if (!project) {
83
+ return res.status(404).json({ error: 'Project not found' });
84
+ }
85
+ if (!project.admins.includes(req.user.id)) {
86
+ log.gate('^project-admin').warn('Access denied', {
87
+ userId: req.user.id,
88
+ projectId: req.params.id
89
+ });
90
+ return res.status(403).json({ error: 'Admin access required' });
91
+ }
92
+ req.project = project; // Attach for downstream use
93
+ next();
94
+ }
95
+ ```
96
+
97
+ Notice the Paradigm logger usage: `log.gate('^project-admin').warn(...)` for a denied gate.
98
+
99
+ ### Step 4: Test Gate Failures
100
+
101
+ Verify that failing a gate produces the correct behavior. In a web API, this means testing rejection status codes:
102
+
103
+ ```typescript
104
+ it('rejects non-admin attempting to add member', async () => {
105
+ const res = await request(app)
106
+ .post('/api/projects/proj_123/members')
107
+ .set('Authorization', `Bearer ${memberToken}`) // member, not admin
108
+ .send({ email: 'newuser@example.com' });
109
+
110
+ expect(res.status).toBe(403);
111
+ });
112
+ ```
113
+
114
+ Test both the pass path (authorized user succeeds) and the fail path (unauthorized user is rejected). The concept of pass/fail is universal across all disciplines — only the specific failure response varies.
115
+
116
+ ## Common Gate Patterns
117
+
118
+ Over time, projects develop recurring gate patterns:
119
+
120
+ | Pattern | Gate Name | Check |
121
+ |---------|-----------|-------|
122
+ | Any logged-in user | `^authenticated` | `req.user != null` |
123
+ | Resource membership | `^{resource}-member` | `resource.members.includes(req.user.id)` |
124
+ | Resource admin | `^{resource}-admin` | `resource.admins.includes(req.user.id)` |
125
+ | Resource creator | `^{resource}-creator` | `resource.createdBy === req.user.id` |
126
+ | Item author | `^{item}-author` | `item.authorId === req.user.id` |
127
+ | Feature flag | `^feature-{name}` | `features.isEnabled(name, req.user)` |
128
+
129
+ These patterns are reusable across projects. When you call `paradigm_gates_for_route`, the tool draws from these patterns to make suggestions.
130
+
131
+ ## The Cost of Skipping the Protocol
132
+
133
+ The Portal Protocol makes conditions a first thought rather than an afterthought. By defining gates in portal.yaml before writing handlers, you create an auditable specification that is separate from (and checkable against) the implementation. Whether you are protecting API endpoints, gating CLI commands, or controlling feature access in a mobile app, the principle is the same: specify first, implement second.