@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.
- package/dist/{accept-orchestration-SBZVK3H4.js → accept-orchestration-QQISPINV.js} +1 -1
- package/dist/add-UOR4INIV.js +8 -0
- package/dist/{agent-loader-RIVI6QPP.js → agent-loader-2WJHD46U.js} +1 -1
- package/dist/{agent-loader-RJRVO5GQ.js → agent-loader-YKS2PQWO.js} +1 -1
- package/dist/{aggregate-W66DM3GA.js → aggregate-A5S5MTCC.js} +1 -1
- package/dist/{ambient-76YMUA5Q.js → ambient-BE3SQXNN.js} +1 -1
- package/dist/{ambient-WTLYUAQM.js → ambient-NVKQCW2A.js} +12 -12
- package/dist/{assess-UFPYEJKP.js → assess-63WXHWJV.js} +1 -1
- package/dist/{beacon-5QVYV5DF.js → beacon-QVUD3MGP.js} +1 -1
- package/dist/{calibration-OLJYB5HN.js → calibration-BDHGYJOK.js} +1 -1
- package/dist/{chunk-SI6SV76D.js → chunk-3DZK54RU.js} +72 -19
- package/dist/{chunk-CHVQNRRT.js → chunk-4PSD5R7N.js} +2 -2
- package/dist/chunk-6SKSV5B2.js +24 -0
- package/dist/{chunk-KFNHCQ4R.js → chunk-FEYOQMZ5.js} +1 -1
- package/dist/{chunk-NEJ4ZLCY.js → chunk-GAFKOFAV.js} +1 -1
- package/dist/chunk-GRZQIKST.js +2 -0
- package/dist/{chunk-RLCH7DXQ.js → chunk-K7X3Z3GL.js} +1 -1
- package/dist/chunk-LPBCQM5Y.js +6 -0
- package/dist/{chunk-T6IDXUUA.js → chunk-LWAIVOSF.js} +1 -1
- package/dist/{chunk-74SGKSRQ.js → chunk-M2HKWR25.js} +1 -1
- package/dist/{chunk-BOYQAMGC.js → chunk-M3PPXJU4.js} +1 -1
- package/dist/chunk-PHEX6LU4.js +111 -0
- package/dist/chunk-Q527BPUF.js +2 -0
- package/dist/chunk-R5ECMBIV.js +11 -0
- package/dist/{chunk-X3U3IGYT.js → chunk-TBWWFRL5.js} +1 -1
- package/dist/{chunk-MQIG6SMF.js → chunk-TNVWGPCE.js} +1 -1
- package/dist/{chunk-SUU6M4JH.js → chunk-TOYQ2QCB.js} +1 -1
- package/dist/chunk-TZDYIPVU.js +521 -0
- package/dist/{chunk-3XGNXXCT.js → chunk-UZ5H7K6Q.js} +1 -1
- package/dist/chunk-VIG5LSGZ.js +2 -0
- package/dist/chunk-VNIX5KBT.js +3 -0
- package/dist/{chunk-AGFPVSX5.js → chunk-VXIIVMTM.js} +1 -1
- package/dist/{chunk-ORDKEGII.js → chunk-WESTEMIM.js} +1 -1
- package/dist/{chunk-LBQBWIEX.js → chunk-Y4P4SGZV.js} +1 -1
- package/dist/{chunk-DOCDDDTD.js → chunk-YNDPSWOE.js} +5 -5
- package/dist/chunk-Z5QW6USC.js +2 -0
- package/dist/chunk-ZJQY5PPP.js +7 -0
- package/dist/{commands-LMUD5L6R.js → commands-ANRJNG2W.js} +1 -1
- package/dist/compliance-BNFWQPKM.js +6 -0
- package/dist/config-schema-FLHRVZMI.js +2 -0
- package/dist/{constellation-CG7C4WFE.js → constellation-NWLXYATA.js} +1 -1
- package/dist/{context-audit-XRPT3OU2.js → context-audit-JVCA6GSV.js} +1 -1
- package/dist/{cost-IDNVMAEV.js → cost-24UZSS2P.js} +1 -1
- package/dist/{cursorrules-U5O4G5T4.js → cursorrules-ZXPXPZ3P.js} +1 -1
- package/dist/decision-loader-HELL2AMX.js +2 -0
- package/dist/{delete-P5VULXR4.js → delete-2C6ALLYY.js} +1 -1
- package/dist/{diff-JVEYCXUC.js → diff-MF55KQZH.js} +1 -1
- package/dist/{dist-KGRCLBJP-2QAPFYNF.js → dist-GQ42YS5N-4HIJZVBB.js} +10 -10
- package/dist/dist-JZZJLVMR.js +2 -0
- package/dist/{dist-3ZCH25SG.js → dist-OG6MM4VY.js} +1 -1
- package/dist/dist-SE67SOXB.js +2 -0
- package/dist/{docs-USDAF26F.js → docs-O37YLLRN.js} +1 -1
- package/dist/doctor-IG5XM4C4.js +2 -0
- package/dist/{edit-GUU3HBVW.js → edit-P3MDAZLU.js} +1 -1
- package/dist/{flow-POQP27WA.js → flow-BGXOVE2V.js} +1 -1
- package/dist/{hooks-IG2GOAHP.js → hooks-TFMMMB2H.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/init-M44SO65G.js +2 -0
- package/dist/init-V4KSEKPK.js +2 -0
- package/dist/{integrity-UYDOOJDP.js → integrity-ROO3G43N.js} +1 -1
- package/dist/{list-YKIQNKGB.js → list-2XIWUEMA.js} +1 -1
- package/dist/list-CFHINXIS.js +12 -0
- package/dist/lore-loader-D2ISOASW.js +2 -0
- package/dist/lore-loader-PXFKMKAN.js +2 -0
- package/dist/mcp.js +19 -11
- package/dist/metrics-UESGUHTA.js +2 -0
- package/dist/{migrate-IBDE7VK4.js → migrate-Z5UQN57G.js} +1 -1
- package/dist/migrate-assessments-YSITX7KM.js +4 -0
- package/dist/migrate-decisions-NPLQOEEH.js +6 -0
- package/dist/migrate-plsat-EM2ACIQ3.js +6 -0
- package/dist/{nomination-engine-EALA5MGI.js → nomination-engine-QPZJH6XO.js} +1 -1
- package/dist/{notebook-loader-PXNRBBXD.js → notebook-loader-3J2OFMS3.js} +1 -1
- package/dist/{orchestrate-RCAMBOIB.js → orchestrate-RID7HHHH.js} +1 -1
- package/dist/{platform-server-DNAMH4YI.js → platform-server-UD45NTGV.js} +1 -1
- package/dist/portal-check-DV2VSJ5E.js +8 -0
- package/dist/{portal-compliance-4MG5F2GI.js → portal-compliance-JONQ4SOP.js} +1 -1
- package/dist/{probe-B22G2JKF.js → probe-5HAXULAD.js} +1 -1
- package/dist/{providers-AWA7WLLM.js → providers-4PXMWA7V.js} +1 -1
- package/dist/quiz-WYIZJG5K.js +10 -0
- package/dist/{record-YXPB34MY.js → record-N3VNYYKJ.js} +1 -1
- package/dist/reindex-FWPD2VGM.js +2 -0
- package/dist/{retag-N5XF3KXP.js → retag-72R2OSZV.js} +1 -1
- package/dist/{review-77QI6VOC.js → review-2INNWLTW.js} +1 -1
- package/dist/{review-6UAH6V3R.js → review-VMSX2PKI.js} +1 -1
- package/dist/{ripple-ZGDITCGB.js → ripple-FNZI47SH.js} +1 -1
- package/dist/{sentinel-HYAZ3CO5.js → sentinel-EFPEX246.js} +1 -1
- package/dist/{sentinel-bridge-VR357PKL.js → sentinel-bridge-UR2MKARY.js} +1 -1
- package/dist/sentinel.js +1 -1
- package/dist/{serve-U47GULB6.js → serve-MO35XIZE.js} +1 -1
- package/dist/serve-OQYUO7CR.js +12 -0
- package/dist/{server-4YNUIK4W.js → server-4D77LCST.js} +1 -1
- package/dist/server-FGUL2FWQ.js +7 -0
- package/dist/session-tracker-KGORN6B5.js +2 -0
- package/dist/{session-work-log-PAKXOFGL.js → session-work-log-4IEVE4KK.js} +1 -1
- package/dist/{session-work-log-ZP45TREI.js → session-work-log-EE4UIZ33.js} +1 -1
- package/dist/{setup-3F5IK7MO.js → setup-ZSEC72BS.js} +2 -2
- package/dist/{shift-FDADESC4.js → shift-TVNY2CQF.js} +6 -6
- package/dist/{show-PJ5LFLIL.js → show-JH7LJ5MT.js} +1 -1
- package/dist/show-WVHAL4VU.js +7 -0
- package/dist/{snapshot-L2G56RPL.js → snapshot-3IYB67D4.js} +1 -1
- package/dist/{spawn-M5BAV252.js → spawn-UH5RENSE.js} +1 -1
- package/dist/{status-77M3SDIF.js → status-DB3KNLW3.js} +1 -1
- package/dist/status-S7Z5FVIE.js +6 -0
- package/dist/{summary-LXLHFRN7.js → summary-WLI3NF4G.js} +2 -2
- package/dist/{sweep-HU74OPVW.js → sweep-7TZFN5NS.js} +1 -1
- package/dist/sync-55U6QPIA.js +2 -0
- package/dist/{sync-llms-7CAI74QL.js → sync-llms-GF7DDQDI.js} +1 -1
- package/dist/team-MGT66HZQ.js +2 -0
- package/dist/{test-BQJMS4Y2.js → test-WLEPZQFC.js} +1 -1
- package/dist/{timeline-K3ZFKJ3R.js → timeline-RK7O2SCM.js} +1 -1
- package/dist/tools-QJHAVYI6.js +2 -0
- package/dist/university-content/notes/N-para-001-build-something.md +126 -0
- package/dist/university-content/notes/N-para-001-meet-the-team.md +85 -0
- package/dist/university-content/notes/N-para-001-shift-setup.md +74 -0
- package/dist/university-content/notes/N-para-101-component-types.md +99 -0
- package/dist/university-content/notes/N-para-101-first-steps.md +134 -0
- package/dist/university-content/notes/N-para-101-five-symbols.md +128 -0
- package/dist/university-content/notes/N-para-101-paradigm-logger.md +89 -0
- package/dist/university-content/notes/N-para-101-portal-yaml.md +112 -0
- package/dist/university-content/notes/N-para-101-project-structure.md +143 -0
- package/dist/university-content/notes/N-para-101-purpose-files.md +121 -0
- package/dist/university-content/notes/N-para-101-tags-and-classification.md +93 -0
- package/dist/university-content/notes/N-para-101-welcome.md +51 -0
- package/dist/university-content/notes/N-para-201-architecture-review.md +175 -0
- package/dist/university-content/notes/N-para-201-aspect-graph.md +79 -0
- package/dist/university-content/notes/N-para-201-aspects-and-anchors.md +112 -0
- package/dist/university-content/notes/N-para-201-component-patterns.md +138 -0
- package/dist/university-content/notes/N-para-201-cross-cutting-concerns.md +145 -0
- package/dist/university-content/notes/N-para-201-disciplines.md +187 -0
- package/dist/university-content/notes/N-para-201-flows-deep-dive.md +119 -0
- package/dist/university-content/notes/N-para-201-gates-deep-dive.md +165 -0
- package/dist/university-content/notes/N-para-201-portal-protocol.md +133 -0
- package/dist/university-content/notes/N-para-201-signal-patterns.md +159 -0
- package/dist/university-content/notes/N-para-201-symbol-naming.md +149 -0
- package/dist/university-content/notes/N-para-301-context-management.md +53 -0
- package/dist/university-content/notes/N-para-301-decisions.md +99 -0
- package/dist/university-content/notes/N-para-301-doctor-and-validation.md +70 -0
- package/dist/university-content/notes/N-para-301-enforcement-levels.md +102 -0
- package/dist/university-content/notes/N-para-301-fragility-tracking.md +50 -0
- package/dist/university-content/notes/N-para-301-history-system.md +42 -0
- package/dist/university-content/notes/N-para-301-navigation-system.md +55 -0
- package/dist/university-content/notes/N-para-301-operations-review.md +55 -0
- package/dist/university-content/notes/N-para-301-paradigm-shift.md +93 -0
- package/dist/university-content/notes/N-para-301-protocols.md +113 -0
- package/dist/university-content/notes/N-para-301-ripple-analysis.md +53 -0
- package/dist/university-content/notes/N-para-301-sentinel-observability.md +87 -0
- package/dist/university-content/notes/N-para-301-sync-and-maintenance.md +57 -0
- package/dist/university-content/notes/N-para-301-wisdom-system.md +89 -0
- package/dist/university-content/notes/N-para-401-agent-identity.md +99 -0
- package/dist/university-content/notes/N-para-401-agent-interop.md +87 -0
- package/dist/university-content/notes/N-para-401-agent-roles.md +107 -0
- package/dist/university-content/notes/N-para-401-commit-conventions.md +82 -0
- package/dist/university-content/notes/N-para-401-mastery-review.md +71 -0
- package/dist/university-content/notes/N-para-401-mcp-tools-overview.md +102 -0
- package/dist/university-content/notes/N-para-401-multi-agent-coordination.md +80 -0
- package/dist/university-content/notes/N-para-401-notebooks-permissions.md +66 -0
- package/dist/university-content/notes/N-para-401-orchestration-workflow.md +101 -0
- package/dist/university-content/notes/N-para-401-pm-governance.md +71 -0
- package/dist/university-content/notes/N-para-401-provider-cascade.md +75 -0
- package/dist/university-content/notes/N-para-401-quick-check.md +95 -0
- package/dist/university-content/notes/N-para-501-advanced-workflows.md +122 -0
- package/dist/university-content/notes/N-para-501-aspect-graph-advanced.md +195 -0
- package/dist/university-content/notes/N-para-501-aspect-graph-internals.md +97 -0
- package/dist/university-content/notes/N-para-501-assessment-loops.md +116 -0
- package/dist/university-content/notes/N-para-501-conductor-workspace.md +77 -0
- package/dist/university-content/notes/N-para-501-habits-practice.md +164 -0
- package/dist/university-content/notes/N-para-501-hook-enforcement.md +100 -0
- package/dist/university-content/notes/N-para-501-lore-system.md +155 -0
- package/dist/university-content/notes/N-para-501-platform-agent-ui.md +108 -0
- package/dist/university-content/notes/N-para-501-review-compliance.md +72 -0
- package/dist/university-content/notes/N-para-501-sentinel-deep-dive.md +173 -0
- package/dist/university-content/notes/N-para-501-session-intelligence.md +104 -0
- package/dist/university-content/notes/N-para-501-symphony-a-mail.md +120 -0
- package/dist/university-content/notes/N-para-501-symphony-networking.md +119 -0
- package/dist/university-content/notes/N-para-501-task-management.md +100 -0
- package/dist/university-content/notes/N-para-601-agent-renaissance.md +121 -0
- package/dist/university-content/notes/N-para-601-attention-scoring.md +129 -0
- package/dist/university-content/notes/N-para-601-context-composition.md +146 -0
- package/dist/university-content/notes/N-para-601-data-sovereignty.md +140 -0
- package/dist/university-content/notes/N-para-601-event-stream.md +126 -0
- package/dist/university-content/notes/N-para-601-knowledge-streams.md +144 -0
- package/dist/university-content/notes/N-para-601-learning-loop.md +68 -0
- package/dist/university-content/notes/N-para-601-maestro-team-collab.md +136 -0
- package/dist/university-content/notes/N-para-601-nominations-debates.md +115 -0
- package/dist/university-content/notes/N-para-701-agent-notebooks.md +131 -0
- package/dist/university-content/notes/N-para-701-agent-pods-nevrland.md +182 -0
- package/dist/university-content/notes/N-para-701-agent-profiles.md +197 -0
- package/dist/university-content/notes/N-para-701-agent-roster.md +82 -0
- package/dist/university-content/notes/N-para-701-agent-state.md +180 -0
- package/dist/university-content/notes/N-para-701-learning-feedback-loop.md +188 -0
- package/dist/university-content/notes/N-para-701-model-tier-resolution.md +204 -0
- package/dist/university-content/notes/N-para-701-orchestration-enforcement.md +169 -0
- package/dist/university-content/notes/N-para-701-per-project-rosters.md +198 -0
- package/dist/university-content/notes/N-para-701-symphony-visibility.md +142 -0
- package/dist/university-content/paths/LP-para-001.yaml +29 -0
- package/dist/university-content/paths/LP-para-101.yaml +59 -0
- package/dist/university-content/paths/LP-para-201.yaml +69 -0
- package/dist/university-content/paths/LP-para-301.yaml +84 -0
- package/dist/university-content/paths/LP-para-401.yaml +74 -0
- package/dist/university-content/paths/LP-para-501.yaml +89 -0
- package/dist/university-content/paths/LP-para-601.yaml +59 -0
- package/dist/university-content/paths/LP-para-701.yaml +64 -0
- package/dist/university-content/quizzes/Q-para-001-build-something.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-001-meet-the-team.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-001-shift-setup.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-101-component-types.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-101-first-steps.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-five-symbols.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-101-paradigm-logger.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-portal-yaml.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-project-structure.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-101-purpose-files.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-tags-and-classification.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-101-welcome.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-architecture-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-aspect-graph.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-201-aspects-and-anchors.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-component-patterns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-cross-cutting-concerns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-disciplines.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-flows-deep-dive.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-gates-deep-dive.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-201-portal-protocol.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-signal-patterns.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-201-symbol-naming.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-context-management.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-decisions.yaml +76 -0
- package/dist/university-content/quizzes/Q-para-301-doctor-and-validation.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-enforcement-levels.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-fragility-tracking.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-history-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-navigation-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-operations-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-301-paradigm-shift.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-protocols.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-ripple-analysis.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-301-sentinel-observability.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-sync-and-maintenance.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-301-wisdom-system.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-agent-identity.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-agent-interop.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-401-agent-roles.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-commit-conventions.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-mastery-review.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-mcp-tools-overview.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-multi-agent-coordination.yaml +76 -0
- package/dist/university-content/quizzes/Q-para-401-notebooks-permissions.yaml +61 -0
- package/dist/university-content/quizzes/Q-para-401-orchestration-workflow.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-pm-governance.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-401-provider-cascade.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-401-quick-check.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-advanced-workflows.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-aspect-graph-advanced.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-aspect-graph-internals.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-assessment-loops.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-conductor-workspace.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-501-habits-practice.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-501-hook-enforcement.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-lore-system.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-platform-agent-ui.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-review-compliance.yaml +61 -0
- package/dist/university-content/quizzes/Q-para-501-sentinel-deep-dive.yaml +86 -0
- package/dist/university-content/quizzes/Q-para-501-session-intelligence.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-symphony-a-mail.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-symphony-networking.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-501-task-management.yaml +46 -0
- package/dist/university-content/quizzes/Q-para-601-agent-renaissance.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-attention-scoring.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-context-composition.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-data-sovereignty.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-event-stream.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-knowledge-streams.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-601-learning-loop.yaml +56 -0
- package/dist/university-content/quizzes/Q-para-601-maestro-team-collab.yaml +86 -0
- package/dist/university-content/quizzes/Q-para-601-nominations-debates.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-notebooks.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-pods-nevrland.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-profiles.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-roster.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-agent-state.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-learning-feedback-loop.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-model-tier-resolution.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-orchestration-enforcement.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-per-project-rosters.yaml +66 -0
- package/dist/university-content/quizzes/Q-para-701-symphony-visibility.yaml +66 -0
- package/dist/university-content/quizzes/Q-plsat-v2.yaml +904 -0
- package/dist/university-content/quizzes/Q-plsat-v3.yaml +2909 -0
- package/dist/university-content/reference.json +2 -2
- package/dist/university-ui/assets/{index-CecQrfSn.js → index-nNgzO1il.js} +2 -2
- package/dist/university-ui/assets/{index-CecQrfSn.js.map → index-nNgzO1il.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/dist/{upgrade-GX56QE3C.js → upgrade-NKN63VTY.js} +2 -2
- package/dist/{validate-VZXTJHGO.js → validate-BB6LRWIY.js} +1 -1
- package/dist/validate-XUQZTF3H.js +9 -0
- package/dist/{watch-YCODNIET.js → watch-25GJHQYT.js} +1 -1
- package/dist/workspace-VMSPYIBV.js +2 -0
- package/lore-ui/dist/assets/{index-Bk-K0qgN.js → index-DKhNxgtW.js} +10 -10
- package/lore-ui/dist/index.html +1 -1
- package/package.json +3 -2
- package/platform-ui/dist/assets/{AmbientSection-BYjt75R1.js → AmbientSection-CwatqcBD.js} +1 -1
- package/platform-ui/dist/assets/{CanvasSection-rKvA_vZj.js → CanvasSection-dFAthehN.js} +1 -1
- package/platform-ui/dist/assets/{DocsSection-CI9K73M-.js → DocsSection-BZ2SFJBZ.js} +1 -1
- package/platform-ui/dist/assets/{GitSection-DSGj_c6S.js → GitSection-MNNYU1tO.js} +1 -1
- package/platform-ui/dist/assets/{GraphSection-CawN7pC5.js → GraphSection-COYjb4Pt.js} +1 -1
- package/platform-ui/dist/assets/LoreSection-B0hUbfsJ.js +1 -0
- package/platform-ui/dist/assets/{SentinelSection-DNgoYMH0.js → SentinelSection-BCxW1DCp.js} +1 -1
- package/platform-ui/dist/assets/{SymphonySection-C0zfcqv3.js → SymphonySection-BsucZRqy.js} +1 -1
- package/platform-ui/dist/assets/{TeamSection-Bzd3Dt9Q.js → TeamSection-C0QNTudW.js} +1 -1
- package/platform-ui/dist/assets/{UniversitySection-tBr62R0S.js → UniversitySection-DN1-g9pw.js} +1 -1
- package/platform-ui/dist/assets/{index-BaOmyn11.js → index-DwUT8pju.js} +2 -2
- package/platform-ui/dist/index.html +1 -1
- package/templates/paradigm/specs/symbols.md +4 -2
- package/dist/add-P76GEMGF.js +0 -8
- package/dist/chunk-3TR6LLXP.js +0 -111
- package/dist/chunk-G7XFK2GI.js +0 -11
- package/dist/chunk-J6KWGCHN.js +0 -24
- package/dist/chunk-JQKKVAAN.js +0 -2
- package/dist/chunk-ODVKPZZ4.js +0 -2
- package/dist/chunk-Q2J542ST.js +0 -2
- package/dist/chunk-QT2LKB3P.js +0 -7
- package/dist/chunk-SHD27BQX.js +0 -6
- package/dist/chunk-WS2N27RX.js +0 -3
- package/dist/chunk-YT52WLBF.js +0 -521
- package/dist/compliance-WJINB5DM.js +0 -6
- package/dist/config-schema-GUQY2QN7.js +0 -2
- package/dist/decision-loader-2XPZE4EZ.js +0 -2
- package/dist/dist-R3RWD35F.js +0 -2
- package/dist/dist-VXCZWVVJ.js +0 -2
- package/dist/doctor-QJ47XAUP.js +0 -2
- package/dist/init-HIBRSVUB.js +0 -2
- package/dist/list-5IUGP3ZB.js +0 -7
- package/dist/lore-loader-RVQI5GXL.js +0 -2
- package/dist/lore-loader-XY5MZRR2.js +0 -2
- package/dist/migrate-assessments-GEI5WMI2.js +0 -4
- package/dist/portal-check-Z3OCQEQR.js +0 -8
- package/dist/quiz-FE5UGAY2.js +0 -10
- package/dist/reindex-FO5VMZVQ.js +0 -2
- package/dist/serve-OY6XYL7F.js +0 -12
- package/dist/server-2MNROHF6.js +0 -7
- package/dist/session-tracker-MWJAJA6Z.js +0 -2
- package/dist/show-BOAVWZPZ.js +0 -7
- package/dist/status-A37ECYNJ.js +0 -6
- package/dist/sync-DLUBV5HQ.js +0 -2
- package/dist/team-NSP6PMPS.js +0 -2
- package/dist/tools-CERDNVCG.js +0 -2
- package/dist/university-content/courses/.purpose +0 -492
- package/dist/university-content/courses/para-001.json +0 -166
- package/dist/university-content/courses/para-101.json +0 -615
- package/dist/university-content/courses/para-201.json +0 -794
- package/dist/university-content/courses/para-301.json +0 -830
- package/dist/university-content/courses/para-401.json +0 -868
- package/dist/university-content/courses/para-501.json +0 -1166
- package/dist/university-content/courses/para-601.json +0 -719
- package/dist/university-content/courses/para-701.json +0 -807
- package/dist/university-content/plsat/.purpose +0 -162
- package/dist/university-content/plsat/v2.0.json +0 -760
- package/dist/university-content/plsat/v3.0.json +0 -3453
- package/dist/validate-C6SMKGYD.js +0 -9
- package/dist/workspace-MKSQN7B2.js +0 -2
- package/platform-ui/dist/assets/LoreSection-oO5dCe6O.js +0 -1
- /package/dist/{chunk-BV5PRPLB.js → chunk-IZSBGW6E.js} +0 -0
- /package/templates/paradigm/specs/{scan.md → probe.md} +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-201-architecture-review
|
|
3
|
+
title: Putting It All Together
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-201
|
|
11
|
+
- feature-building-follows
|
|
12
|
+
- implementation-comes-last
|
|
13
|
+
- check-existing-aspects
|
|
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
|
+
## Building a Complete Feature
|
|
24
|
+
|
|
25
|
+
You have learned flows, gates, aspects, disciplines, naming conventions, component patterns, signal patterns, and cross-cutting concerns. Now let us walk through building a complete feature from scratch, using every tool in the Paradigm toolkit. The feature: **a team invitation system** where team admins can invite new members via email.
|
|
26
|
+
|
|
27
|
+
## Step 1: Identify Components
|
|
28
|
+
|
|
29
|
+
Start by listing the code units you will need:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
#invitation-service:
|
|
33
|
+
description: Creates and manages team invitations
|
|
34
|
+
tags: [feature, teams]
|
|
35
|
+
|
|
36
|
+
#invitation-email:
|
|
37
|
+
description: Sends invitation emails via SendGrid
|
|
38
|
+
tags: [integration, sendgrid, email]
|
|
39
|
+
|
|
40
|
+
#invitation-token:
|
|
41
|
+
description: Generates and validates secure invitation tokens
|
|
42
|
+
tags: [infrastructure, security]
|
|
43
|
+
|
|
44
|
+
#invitation-store:
|
|
45
|
+
description: Persists invitations with status tracking
|
|
46
|
+
tags: [state, teams]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Four components — one feature, one integration, one infrastructure, one state. Each has a clear responsibility and appropriate tags.
|
|
50
|
+
|
|
51
|
+
## Step 2: Define the Flow
|
|
52
|
+
|
|
53
|
+
The invitation process spans all four components in sequence:
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
$team-invitation-flow:
|
|
57
|
+
description: Admin invites a user, email is sent, user accepts and joins team
|
|
58
|
+
steps:
|
|
59
|
+
- component: "#invitation-service"
|
|
60
|
+
action: create-invitation
|
|
61
|
+
description: Validates admin permissions and creates invitation record
|
|
62
|
+
- component: "#invitation-token"
|
|
63
|
+
action: generate-token
|
|
64
|
+
description: Creates a cryptographically secure token with 7-day expiry
|
|
65
|
+
- component: "#invitation-store"
|
|
66
|
+
action: persist-invitation
|
|
67
|
+
description: Saves invitation with pending status
|
|
68
|
+
- component: "#invitation-email"
|
|
69
|
+
action: send-invite
|
|
70
|
+
description: Sends email with accept link containing the token
|
|
71
|
+
signals: ["!invitation-sent", "!invitation-accepted"]
|
|
72
|
+
gates: ["^authenticated", "^team-admin"]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Step 3: Add Gates
|
|
76
|
+
|
|
77
|
+
Two gates are needed. First, check `portal.yaml` for existing gates. `^authenticated` likely exists. `^team-admin` may need to be created:
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
# In portal.yaml
|
|
81
|
+
gates:
|
|
82
|
+
^team-admin:
|
|
83
|
+
description: User must be an admin of the specified team
|
|
84
|
+
check: team.admins.includes(req.user.id)
|
|
85
|
+
type: role
|
|
86
|
+
requires: [^authenticated]
|
|
87
|
+
effects: []
|
|
88
|
+
|
|
89
|
+
routes:
|
|
90
|
+
"POST /api/teams/:id/invitations": [^authenticated, ^team-admin]
|
|
91
|
+
"POST /api/invitations/:token/accept": [^authenticated]
|
|
92
|
+
"GET /api/teams/:id/invitations": [^authenticated, ^team-admin]
|
|
93
|
+
"DELETE /api/invitations/:id": [^authenticated, ^team-admin]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Notice that accepting an invitation only requires `^authenticated` — any logged-in user with a valid token can accept. But creating, listing, and deleting invitations requires `^team-admin`.
|
|
97
|
+
|
|
98
|
+
## Step 4: Define Signals
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
!invitation-sent:
|
|
102
|
+
description: An invitation email was successfully sent to a prospective team member
|
|
103
|
+
emitters: ["#invitation-service"]
|
|
104
|
+
category: business
|
|
105
|
+
data:
|
|
106
|
+
invitationId: string
|
|
107
|
+
teamId: string
|
|
108
|
+
email: string
|
|
109
|
+
|
|
110
|
+
!invitation-accepted:
|
|
111
|
+
description: A user accepted a team invitation and joined the team
|
|
112
|
+
emitters: ["#invitation-service"]
|
|
113
|
+
category: business
|
|
114
|
+
data:
|
|
115
|
+
invitationId: string
|
|
116
|
+
teamId: string
|
|
117
|
+
userId: string
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
These business signals enable decoupled side effects — an analytics tracker can listen for `!invitation-accepted` to track conversion rates, and a notification service can alert existing team members.
|
|
121
|
+
|
|
122
|
+
## Step 5: Apply Aspects
|
|
123
|
+
|
|
124
|
+
Check which aspects apply to the new components:
|
|
125
|
+
|
|
126
|
+
- `~audit-required` applies to `#*Service` → `#invitation-service` is covered. Ensure the audit middleware is applied.
|
|
127
|
+
- `~rate-limited` applies to `#*-handler` → Not directly applicable here (no handler component), but the API route should go through the rate limiter.
|
|
128
|
+
- `~validated` applies to `#*-handler` → The invitation endpoint should validate input (email format, team existence).
|
|
129
|
+
|
|
130
|
+
## Step 6: Write the .purpose File
|
|
131
|
+
|
|
132
|
+
Assemble everything into `src/invitations/.purpose`:
|
|
133
|
+
|
|
134
|
+
```yaml
|
|
135
|
+
name: Team Invitations
|
|
136
|
+
description: Team admin invitation system with email delivery and token-based acceptance
|
|
137
|
+
context:
|
|
138
|
+
- Invitation tokens expire after 7 days
|
|
139
|
+
- Maximum 50 pending invitations per team
|
|
140
|
+
- Uses SendGrid for email delivery
|
|
141
|
+
|
|
142
|
+
components:
|
|
143
|
+
#invitation-service:
|
|
144
|
+
description: Creates and manages team invitations
|
|
145
|
+
file: invitation-service.ts
|
|
146
|
+
tags: [feature, teams]
|
|
147
|
+
flows: ["$team-invitation-flow"]
|
|
148
|
+
signals: ["!invitation-sent", "!invitation-accepted"]
|
|
149
|
+
gates: ["^authenticated", "^team-admin"]
|
|
150
|
+
aspects: ["~audit-required"]
|
|
151
|
+
# ... (remaining components)
|
|
152
|
+
|
|
153
|
+
flows:
|
|
154
|
+
$team-invitation-flow:
|
|
155
|
+
# ... (as defined above)
|
|
156
|
+
|
|
157
|
+
signals:
|
|
158
|
+
!invitation-sent:
|
|
159
|
+
# ... (as defined above)
|
|
160
|
+
!invitation-accepted:
|
|
161
|
+
# ... (as defined above)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Step 7: Validate
|
|
165
|
+
|
|
166
|
+
Before writing any implementation code, validate the Paradigm definitions:
|
|
167
|
+
|
|
168
|
+
1. `paradigm_purpose_validate` — Checks the .purpose file for schema errors.
|
|
169
|
+
2. `paradigm_flow_check` — Verifies the flow references valid components.
|
|
170
|
+
3. `paradigm_aspect_check` — Confirms aspect anchors are valid for applied aspects.
|
|
171
|
+
4. `paradigm_ripple` — Shows what existing code is affected by the new components.
|
|
172
|
+
|
|
173
|
+
## The Pattern
|
|
174
|
+
|
|
175
|
+
Every feature follows this pattern: **identify components** → **define flows** → **add gates** → **define signals** → **apply aspects** → **write .purpose** → **validate** → **implement**. The implementation comes last — after the architecture is documented and validated. This front-loaded documentation pays dividends: AI agents can navigate the new feature immediately, security is defined before code, and the team has a clear map of what will be built.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-201-aspect-graph
|
|
3
|
+
title: The Aspect Graph
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-201
|
|
11
|
+
- aspect-graph-connects
|
|
12
|
+
- five-aspect-categories
|
|
13
|
+
- five-edge-relations
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 3
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-201.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## What Is the Aspect Graph?
|
|
24
|
+
|
|
25
|
+
In earlier lessons you learned that aspects (`~`) represent cross-cutting rules, constraints, and configuration values anchored to specific lines of code. The **aspect graph** connects those aspects to each other and to the rest of your symbol system — components, gates, flows, and signals — creating a queryable relationship map.
|
|
26
|
+
|
|
27
|
+
Think of it this way: a single aspect like `~token-expiry-24h` is useful on its own. But when you can see that it is *enforced by* `^authenticated`, *related to* `~refresh-token-7d`, and linked to a lore entry explaining why the team chose 24 hours — that is the graph at work.
|
|
28
|
+
|
|
29
|
+
## v3.5 Aspect Fields
|
|
30
|
+
|
|
31
|
+
Paradigm v3.5 extended aspects with structured fields that make them graph-ready:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
aspects:
|
|
35
|
+
~rate-limit-100:
|
|
36
|
+
description: API rate limited to 100 requests per minute
|
|
37
|
+
value: 100/min
|
|
38
|
+
category: constraint
|
|
39
|
+
severity: high
|
|
40
|
+
anchors:
|
|
41
|
+
- src/middleware/rate-limiter.ts:12-18
|
|
42
|
+
applies-to: [#api-gateway]
|
|
43
|
+
edges:
|
|
44
|
+
- symbol: ^authenticated
|
|
45
|
+
relation: enforced-by
|
|
46
|
+
tags: [security, performance]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Key fields:
|
|
50
|
+
- **value** — The concrete value (a number, duration, threshold) making aspects searchable by content
|
|
51
|
+
- **category** — One of five types: `rule` (behavioral), `decision` (architectural choice), `constraint` (hard limit), `configuration` (environment-specific), `invariant` (always-true condition)
|
|
52
|
+
- **severity** — Impact of violation: `low`, `medium`, `high`, `critical`
|
|
53
|
+
- **edges** — Explicit relationships to other symbols with typed relations: `enforced-by`, `depends-on`, `contradicts`, `supersedes`, `related-to`
|
|
54
|
+
- **lore** — References to lore entries providing historical context
|
|
55
|
+
|
|
56
|
+
## Working with the Graph
|
|
57
|
+
|
|
58
|
+
Seven MCP tools let you interact with the aspect graph:
|
|
59
|
+
|
|
60
|
+
| Tool | Purpose |
|
|
61
|
+
|------|---------|
|
|
62
|
+
| `paradigm_aspect_search` | Find aspects by keyword — uses a three-tier search (learned mappings, full-text, fuzzy) |
|
|
63
|
+
| `paradigm_aspect_get` | Deep-dive: full definition, code snippets at anchors, edges, linked lore |
|
|
64
|
+
| `paradigm_aspect_graph` | Explore the neighborhood around a symbol (N hops out) |
|
|
65
|
+
| `paradigm_aspect_heatmap` | See which aspects are accessed most (search, ripple, navigate, direct) |
|
|
66
|
+
| `paradigm_aspect_suggest_scan` | Scan a source file for undocumented aspects (magic numbers, hardcoded strings, rate limits, etc.) |
|
|
67
|
+
| `paradigm_aspect_drift` | Check if code at anchored lines changed since last scan (SHA-256 hash comparison) |
|
|
68
|
+
| `paradigm_aspect_confirm` | Confirm a search result to improve future search accuracy (learning loop) |
|
|
69
|
+
|
|
70
|
+
The graph is stored as a SQLite database at `.paradigm/aspect-graph.db` — a derived artifact rebuilt by `paradigm_reindex`. The YAML `.purpose` files remain the source of truth.
|
|
71
|
+
|
|
72
|
+
## When to Use the Aspect Graph
|
|
73
|
+
|
|
74
|
+
- **Before modifying enforcement code** — call `paradigm_aspect_drift` to check for stale anchors
|
|
75
|
+
- **Exploring unfamiliar rules** — call `paradigm_aspect_search` then `paradigm_aspect_get` for full context
|
|
76
|
+
- **Understanding impact** — call `paradigm_aspect_graph` to see what a change affects
|
|
77
|
+
- **Finding undocumented rules** — call `paradigm_aspect_suggest_scan` on source files
|
|
78
|
+
|
|
79
|
+
> **Deep dive:** PARA 501 covers the SQLite schema, three-tier search internals, the learning loop, edge origins (explicit vs inferred vs learned), and the materialization pipeline in detail.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-201-aspects-and-anchors
|
|
3
|
+
title: Aspects & Code Anchors
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-201
|
|
11
|
+
- aspects-are-the
|
|
12
|
+
- anchor-formats-single
|
|
13
|
+
- applies-to-uses-glob
|
|
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
|
+
## Why Aspects Require Anchors
|
|
24
|
+
|
|
25
|
+
Aspects (`~`) are unique among Paradigm's five symbols because they are the only ones that **require code anchors**. An anchor is a pointer to the exact lines of code where the aspect is enforced. This requirement exists for a practical reason: an aspect without an anchor is just a wish.
|
|
26
|
+
|
|
27
|
+
Consider `~audit-required`. If you define it without anchors, you are saying "financial operations should be audited" — but there is no proof that they actually are. With anchors pointing to `src/middleware/audit.ts:15-35`, you are saying "financial operations are audited, and here is the enforcement code." AI agents can verify the anchor, developers can review it, and `paradigm_aspect_check` can validate that the code still exists.
|
|
28
|
+
|
|
29
|
+
## Anchor Format
|
|
30
|
+
|
|
31
|
+
Anchors support three formats:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
~rate-limited:
|
|
35
|
+
description: API endpoints are rate-limited to prevent abuse
|
|
36
|
+
anchors:
|
|
37
|
+
- src/middleware/rate-limiter.ts:42 # Single line
|
|
38
|
+
- src/middleware/rate-limiter.ts:42-78 # Line range
|
|
39
|
+
- src/decorators/throttle.ts:10,15,22 # Multiple specific lines
|
|
40
|
+
applies-to: ["#*-handler"]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- **Single line** (`file:42`) — Points to one specific line. Use when the enforcement is a single check or decorator.
|
|
44
|
+
- **Range** (`file:42-78`) — Points to a block of code. Use when the enforcement spans multiple lines (a middleware function, a class method).
|
|
45
|
+
- **Multiple lines** (`file:10,15,22`) — Points to several non-contiguous lines. Use when the enforcement is scattered across a file (multiple decorators, multiple conditional checks).
|
|
46
|
+
|
|
47
|
+
Anchors must point to *real files with real code*. If the file does not exist or the lines are outside the file's range, `paradigm_aspect_check` will report an error.
|
|
48
|
+
|
|
49
|
+
## The applies-to Pattern
|
|
50
|
+
|
|
51
|
+
The `applies-to` field uses glob patterns to declare which symbols the aspect covers:
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
~audit-required:
|
|
55
|
+
applies-to: ["#*Service"] # All components ending in 'Service'
|
|
56
|
+
|
|
57
|
+
~rate-limited:
|
|
58
|
+
applies-to: ["#*-handler", "#*-endpoint"] # All handlers and endpoints
|
|
59
|
+
|
|
60
|
+
~cached:
|
|
61
|
+
applies-to: ["#*-query"] # All query components
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This is declarative — it says "this aspect should apply to these components." AI agents use this to check whether a new component matching the pattern has the aspect applied. If you create `#billing-service` and `~audit-required` applies to `#*Service`, the agent knows to apply the audit aspect.
|
|
65
|
+
|
|
66
|
+
## Defining Aspects in .purpose Files
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
aspects:
|
|
70
|
+
~audit-required:
|
|
71
|
+
description: All financial operations must log to the audit trail
|
|
72
|
+
anchors:
|
|
73
|
+
- src/middleware/audit.ts:15-35
|
|
74
|
+
- src/decorators/auditable.ts:1-20
|
|
75
|
+
applies-to: ["#*Service"]
|
|
76
|
+
enforcement: middleware
|
|
77
|
+
tags: [compliance, security]
|
|
78
|
+
|
|
79
|
+
~rate-limited:
|
|
80
|
+
description: API endpoints enforce per-user rate limits
|
|
81
|
+
anchors:
|
|
82
|
+
- src/middleware/rate-limiter.ts:42-78
|
|
83
|
+
applies-to: ["#*-handler"]
|
|
84
|
+
enforcement: middleware
|
|
85
|
+
tags: [security, performance]
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The `enforcement` field is optional metadata that describes *how* the aspect is enforced — via middleware, decorator, wrapper function, etc. It helps AI agents understand the enforcement mechanism when they need to apply the aspect to new components.
|
|
89
|
+
|
|
90
|
+
## Validating Aspects
|
|
91
|
+
|
|
92
|
+
Use `paradigm_aspect_check` to verify that an aspect's anchors are valid:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
paradigm_aspect_check({ aspect: "~audit-required" })
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
This tool checks:
|
|
99
|
+
1. **Anchor existence** — Do the referenced files exist?
|
|
100
|
+
2. **Line validity** — Are the line numbers within the file's range?
|
|
101
|
+
3. **Coverage** — Are all components matching `applies-to` actually covered?
|
|
102
|
+
|
|
103
|
+
Run this after refactoring. If you move or rename files, the anchors break — and a broken anchor means the enforcement code is lost or relocated. The aspect check catches this drift.
|
|
104
|
+
|
|
105
|
+
## Aspects vs Gates
|
|
106
|
+
|
|
107
|
+
A common confusion: when should you use an aspect (`~`) versus a gate (`^`)? The distinction is clear:
|
|
108
|
+
|
|
109
|
+
- **Gates** check a *specific condition at a specific time*. "Can this user access this project?" or "Is this feature flag enabled?" is a gate.
|
|
110
|
+
- **Aspects** enforce rules *across many components as a pattern*. "All financial services must log to the audit trail" is an aspect.
|
|
111
|
+
|
|
112
|
+
Gates are reactive (triggered per request or operation). Aspects are structural (enforced by code patterns). A gate checks one condition at one point; an aspect applies to all components matching a pattern.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-201-component-patterns
|
|
3
|
+
title: Component Patterns
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-201
|
|
11
|
+
- feature-components-user-facing
|
|
12
|
+
- integration-components-third-party
|
|
13
|
+
- state-components-data
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 3
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-201.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## The Many Faces of `#`
|
|
24
|
+
|
|
25
|
+
The `#` component is Paradigm's most used symbol — and intentionally the broadest. It covers everything from a React button to a database service to a CLI command parser. This breadth is a feature, not a bug: it means you never struggle to classify code. But it also means you need **tags** to create meaningful subcategories.
|
|
26
|
+
|
|
27
|
+
This lesson covers the major component patterns and when to use each one.
|
|
28
|
+
|
|
29
|
+
## Feature Components
|
|
30
|
+
|
|
31
|
+
Feature components represent **user-facing functionality**. They are the things your users interact with — checkout, search, profile editing, notification preferences.
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
#checkout:
|
|
35
|
+
description: Shopping cart checkout with payment processing
|
|
36
|
+
file: checkout.ts
|
|
37
|
+
tags: [feature, critical, payments]
|
|
38
|
+
flows: ["$checkout-flow"]
|
|
39
|
+
signals: ["!order-placed"]
|
|
40
|
+
gates: ["^authenticated"]
|
|
41
|
+
|
|
42
|
+
#search:
|
|
43
|
+
description: Full-text search across products and content
|
|
44
|
+
file: search.ts
|
|
45
|
+
tags: [feature, search]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Feature components often have the richest cross-references: they participate in flows, emit signals, and require gates. They are the entry points into your system's behavior.
|
|
49
|
+
|
|
50
|
+
## Integration Components
|
|
51
|
+
|
|
52
|
+
Integration components wrap **third-party services**. They isolate external API calls behind a stable internal interface:
|
|
53
|
+
|
|
54
|
+
```yaml
|
|
55
|
+
#stripe-service:
|
|
56
|
+
description: Stripe API client for payment processing
|
|
57
|
+
file: stripe-service.ts
|
|
58
|
+
tags: [integration, stripe, payments]
|
|
59
|
+
signals: ["!payment-completed", "!payment-failed"]
|
|
60
|
+
|
|
61
|
+
#sendgrid-client:
|
|
62
|
+
description: SendGrid email delivery wrapper
|
|
63
|
+
file: sendgrid.ts
|
|
64
|
+
tags: [integration, sendgrid, email]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The convention is to tag integrations with both `[integration]` and the service name (`[stripe]`, `[sendgrid]`). This lets you search for all integrations OR for all Stripe-related code specifically.
|
|
68
|
+
|
|
69
|
+
## State Components
|
|
70
|
+
|
|
71
|
+
State components manage **data storage and state containers** — databases, caches, in-memory stores, Redux slices:
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
#user-store:
|
|
75
|
+
description: User data persistence and caching layer
|
|
76
|
+
file: user-store.ts
|
|
77
|
+
tags: [state, users, cache]
|
|
78
|
+
|
|
79
|
+
#session-cache:
|
|
80
|
+
description: Redis-backed session storage with 24h TTL
|
|
81
|
+
file: session-cache.ts
|
|
82
|
+
tags: [state, session, redis]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
State components are often referenced by many other components. Use `paradigm_ripple` before modifying them — a change to `#user-store` might impact every feature that reads user data.
|
|
86
|
+
|
|
87
|
+
## Infrastructure Components
|
|
88
|
+
|
|
89
|
+
Infrastructure components provide **foundational services** that other components depend on but users never directly interact with:
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
#logger:
|
|
93
|
+
description: Structured logging with symbol tagging
|
|
94
|
+
file: logger.ts
|
|
95
|
+
tags: [infrastructure, observability]
|
|
96
|
+
|
|
97
|
+
#config-loader:
|
|
98
|
+
description: Environment-aware configuration loading
|
|
99
|
+
file: config.ts
|
|
100
|
+
tags: [infrastructure, config]
|
|
101
|
+
|
|
102
|
+
#database-pool:
|
|
103
|
+
description: PostgreSQL connection pool with health checks
|
|
104
|
+
file: db.ts
|
|
105
|
+
tags: [infrastructure, database, postgres]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Infrastructure components rarely have flows or gates, but they are often the most fragile — many other components depend on them. Check `paradigm_history_fragility` before making changes.
|
|
109
|
+
|
|
110
|
+
## When to Split vs Combine
|
|
111
|
+
|
|
112
|
+
A common question: should a large module be one component or several?
|
|
113
|
+
|
|
114
|
+
**Split when:**
|
|
115
|
+
- The module has distinct responsibilities that could change independently
|
|
116
|
+
- Different parts require different gates or emit different signals
|
|
117
|
+
- The file exceeds ~300 lines and contains clearly separable logic
|
|
118
|
+
|
|
119
|
+
**Combine when:**
|
|
120
|
+
- The parts are tightly coupled and always change together
|
|
121
|
+
- Splitting would create components with trivial descriptions ("calls the other half")
|
|
122
|
+
- The module is a cohesive unit with a single responsibility
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
# Good split — distinct responsibilities
|
|
126
|
+
#payment-processor:
|
|
127
|
+
description: Charges cards via Stripe
|
|
128
|
+
#payment-validator:
|
|
129
|
+
description: Validates payment amounts and currencies
|
|
130
|
+
|
|
131
|
+
# Bad split — artificial separation
|
|
132
|
+
#payment-step-1:
|
|
133
|
+
description: First half of payment processing
|
|
134
|
+
#payment-step-2:
|
|
135
|
+
description: Second half of payment processing
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
If you cannot describe the component without referencing the other half, they should be one component.
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: N-para-201-cross-cutting-concerns
|
|
3
|
+
title: Cross-Cutting Concerns
|
|
4
|
+
type: note
|
|
5
|
+
author: paradigm
|
|
6
|
+
created: '2026-04-22'
|
|
7
|
+
updated: '2026-04-22'
|
|
8
|
+
tags:
|
|
9
|
+
- course
|
|
10
|
+
- para-201
|
|
11
|
+
- cross-cutting-concerns-apply
|
|
12
|
+
- common-aspects-audit
|
|
13
|
+
- applies-to-uses-glob
|
|
14
|
+
symbols: []
|
|
15
|
+
difficulty: beginner
|
|
16
|
+
estimatedMinutes: 3
|
|
17
|
+
prerequisites: []
|
|
18
|
+
category: paradigm-core
|
|
19
|
+
origin: imported
|
|
20
|
+
source: courses/para-201.json
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Rules That Span the System
|
|
24
|
+
|
|
25
|
+
Some requirements do not belong to any single component. "All financial operations must be audited." "All API endpoints must be rate-limited." "All sensitive data must be encrypted at rest." These are **cross-cutting concerns** — rules that apply across multiple components as a structural pattern rather than a per-request check.
|
|
26
|
+
|
|
27
|
+
Paradigm models cross-cutting concerns as **aspects** (`~`). Unlike gates (which check access per request) or signals (which fire per event), aspects describe ongoing constraints that are enforced by code patterns, middleware, decorators, or architectural choices.
|
|
28
|
+
|
|
29
|
+
## Common Aspect Patterns
|
|
30
|
+
|
|
31
|
+
### Audit Trails
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
~audit-required:
|
|
35
|
+
description: All financial operations must log to the audit trail with user, action, and timestamp
|
|
36
|
+
anchors:
|
|
37
|
+
- src/middleware/audit.ts:15-35
|
|
38
|
+
- src/decorators/auditable.ts:1-20
|
|
39
|
+
applies-to: ["#*Service"]
|
|
40
|
+
enforcement: middleware
|
|
41
|
+
tags: [compliance, security]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Audit aspects ensure that certain operations leave a trail. The anchors point to the middleware or decorator that performs the logging. Any service matching `#*Service` is expected to use this middleware.
|
|
45
|
+
|
|
46
|
+
### Rate Limiting
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
~rate-limited:
|
|
50
|
+
description: API endpoints enforce per-user rate limits (100 req/min default)
|
|
51
|
+
anchors:
|
|
52
|
+
- src/middleware/rate-limiter.ts:10-45
|
|
53
|
+
applies-to: ["#*-handler", "#*-endpoint"]
|
|
54
|
+
enforcement: middleware
|
|
55
|
+
tags: [security, performance]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Rate limiting protects against abuse. The aspect documents the default limit (100 req/min) and points to the middleware that enforces it.
|
|
59
|
+
|
|
60
|
+
### Caching
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
~cached:
|
|
64
|
+
description: Read-heavy queries use a 5-minute TTL cache
|
|
65
|
+
anchors:
|
|
66
|
+
- src/lib/cache-wrapper.ts:20-55
|
|
67
|
+
applies-to: ["#*-query"]
|
|
68
|
+
enforcement: wrapper-function
|
|
69
|
+
tags: [performance]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Input Validation
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
~validated:
|
|
76
|
+
description: All API inputs are validated against defined schemas before processing
|
|
77
|
+
anchors:
|
|
78
|
+
- src/middleware/validate.ts:1-30
|
|
79
|
+
- src/schemas/index.ts:1-50
|
|
80
|
+
applies-to: ["#*-handler"]
|
|
81
|
+
enforcement: middleware
|
|
82
|
+
tags: [security, data-integrity]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Idempotency
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
~idempotent:
|
|
89
|
+
description: Mutation endpoints use idempotency keys to prevent duplicate processing
|
|
90
|
+
anchors:
|
|
91
|
+
- src/middleware/idempotency.ts:15-60
|
|
92
|
+
applies-to: ["#*-handler"]
|
|
93
|
+
enforcement: middleware
|
|
94
|
+
tags: [reliability, payments]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Encryption at Rest
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
~encrypted-at-rest:
|
|
101
|
+
description: Sensitive fields are encrypted before storage using AES-256-GCM
|
|
102
|
+
anchors:
|
|
103
|
+
- src/lib/encryption.ts:10-45
|
|
104
|
+
- src/models/base-model.ts:30-50
|
|
105
|
+
applies-to: ["#*-store"]
|
|
106
|
+
enforcement: model-hook
|
|
107
|
+
tags: [security, compliance]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## The applies-to Glob Pattern
|
|
111
|
+
|
|
112
|
+
The `applies-to` field uses glob patterns to declare which symbols the aspect covers:
|
|
113
|
+
|
|
114
|
+
| Pattern | Matches |
|
|
115
|
+
|---------|---------|
|
|
116
|
+
| `#*Service` | `#payment-service`, `#email-service`, `#auth-service` |
|
|
117
|
+
| `#*-handler` | `#login-handler`, `#webhook-handler` |
|
|
118
|
+
| `#*-store` | `#user-store`, `#session-store` |
|
|
119
|
+
| `#*` | All components (use sparingly) |
|
|
120
|
+
|
|
121
|
+
When an AI agent creates a new component matching a pattern, it should check whether any aspects apply. If `~rate-limited` applies to `#*-handler` and the agent creates `#upload-handler`, the agent should ensure rate limiting middleware is applied.
|
|
122
|
+
|
|
123
|
+
## Aspects vs Other Symbols
|
|
124
|
+
|
|
125
|
+
Understanding when to use each symbol avoids misclassification:
|
|
126
|
+
|
|
127
|
+
| If the rule... | Use |
|
|
128
|
+
|----------------|-----|
|
|
129
|
+
| Checks a specific condition per request or operation | `^` Gate |
|
|
130
|
+
| Fires an event that triggers side effects | `!` Signal |
|
|
131
|
+
| Applies the same pattern across many components | `~` Aspect |
|
|
132
|
+
| Describes a multi-step process | `$` Flow |
|
|
133
|
+
|
|
134
|
+
A rate limiter is an aspect (it applies the same pattern to all handlers), not a gate (it does not check authorization). An audit log is an aspect (it applies to all financial services), not a signal (it is a structural requirement, not a one-time event).
|
|
135
|
+
|
|
136
|
+
## Maintaining Aspects During Refactors
|
|
137
|
+
|
|
138
|
+
Aspects are the most maintenance-sensitive symbol because their anchors contain file paths and line numbers. When you refactor:
|
|
139
|
+
|
|
140
|
+
1. Run `paradigm_aspect_check` before the refactor to know the current state.
|
|
141
|
+
2. Make your code changes.
|
|
142
|
+
3. Run `paradigm_aspect_check` again to find broken anchors.
|
|
143
|
+
4. Update the anchors in the `.purpose` file to point to the new locations.
|
|
144
|
+
|
|
145
|
+
This is a conscious trade-off: anchors create maintenance burden, but they prevent the much worse problem of unverified rules that silently stop being enforced.
|