This dependence should be pushed down even further - into the session.io.js file and matching grade. That is - there should be no dependence in name or function from this file session.js on any material related to the "io" hierarchy. I think a little piece of "protoframework" might be helpful here - that is, to replicate just the very simple portion of demands blocks that operate on gradeNames rather than all the rest of the machinery. That is - to generalise your function "{that}.getSessionIOGrade" lookup into a general utility named "{that}.getDynamicGrades" which looks up the required extra grades in a lookup table which may be contributed into from the session.io.js file. The index for this lookup will be very similar to the index for demands blocks - that is, a combination of grades, and the result of the lookup will also be a combination of grades. That is, the registration will look like 
fluid.registerDynamicGrades(["context1", "context2", "context3"], ["result1", "result2", "result3"])
where context1...n are grades which all require to be present, and result1...n are dynamic grades that will result.