diff --git a/sandbox/fractions/run_TACT_agent_fractions.py b/sandbox/fractions/run_TACT_agent_fractions.py
new file mode 100644
index 0000000000000000000000000000000000000000..c680bfba6f152753cd3517937eb04bc873883b06
--- /dev/null
+++ b/sandbox/fractions/run_TACT_agent_fractions.py
@@ -0,0 +1,162 @@
+from apprentice.agents.glen_agent import GlenAgent
+from apprentice.working_memory.representation import Sai
+
+from tutorenvs.fractions import FractionArithSymbolic
+
+from py_rete import Production
+from py_rete import Fact
+from py_rete import V
+from py_rete import Filter
+
+
+def run_training(agent, n=10):
+
+    env = FractionArithSymbolic()
+
+    p = 0
+
+    while p < n:
+
+        env.render()
+        state = env.get_state()
+        response = agent.request(state)
+
+        if response == {}:
+            print('hint')
+            selection, action, inputs = env.request_demo()
+            sai = Sai(selection=selection, action=action, inputs=inputs)
+
+        else:
+            sai = Sai(selection=response['selection'],
+                      action=response['action'],
+                      inputs=response['inputs'])
+
+            print(response['inputs'])
+
+        # print(sai)
+        reward = env.apply_sai(sai.selection, sai.action, sai.inputs)
+        print('reward', reward)
+
+        if reward == -1:
+            print(sai)
+
+        next_state = env.get_state()
+
+        # from jsondiff import diff
+        # print(diff(state, next_state))
+
+        agent.train(state, sai, reward, next_state=next_state,
+                    skill_label="fractions",
+                    foci_of_attention=[])
+
+        if sai.selection == "done" and reward == 1.0:
+            print('Finished problem {} of {}'.format(p, n))
+            p += 1
+
+
+if __name__ == "__main__":
+
+    @Production(
+        Fact(id='answer_num', contentEditable=False) &
+        Fact(id='answer_denom', contentEditable=False) &
+        Fact(id='done')
+    )
+    def correct_doneSAI():
+        return Sai(selection='done',
+                   action='ButtonPressed',
+                   inputs={'value': -1})
+
+    def is_number(n):
+        try:
+            float(n)
+            return True
+        except Exception:
+            return False
+
+    @Production(
+        Fact(id=V('id1'), value=V('n1')) &
+        Filter(lambda n1: is_number(n1)) &
+        Fact(id=V('id2'), value=V('n2')) &
+        Filter(lambda n2: is_number(n2)) &
+        Filter(lambda id1, id2: id1 <= id2)
+    )
+    def add(id1, id2, n1, n2):
+        n1 = float(n1)
+        n2 = float(n2)
+        s = n1 + n2
+        if int(s) == s:
+            s = int(s)
+
+        return [Fact(id="({}+{})".format(id1, id2),
+                     value="{}".format(s))]
+
+    @Production(
+        Fact(id=V('id1'), value=V('n1')) &
+        Filter(lambda n1: is_number(n1)) &
+        Fact(id=V('id2'), value=V('n2')) &
+        Filter(lambda n2: is_number(n2)) &
+        Filter(lambda id1, id2: id1 <= id2)
+    )
+    def multiply(id1, id2, n1, n2):
+        n1 = float(n1)
+        n2 = float(n2)
+        p = n1 * n2
+        if int(p) == p:
+            p = int(p)
+
+        return [Fact(id="({}*{})".format(id1, id2),
+                     value="{}".format(p))]
+
+    @Production(
+        Fact(id=V('selection'), contentEditable=True) &
+        Fact(value=V('input_value'))
+    )
+    def copySAI(input_value, selection):
+        return Sai(selection=selection, action="UpdateField",
+                   inputs={'value': input_value})
+
+    # @Production(
+    #     Fact(id=V('some_field'), value=V('some_value')),
+    #     Filter(lambda some_value: len(some_value.split()) > 1)
+    # )
+    # def unigram(net, some_field, some_value):
+    #     words = some_value.split()
+    #
+    #     for i, word in enumerate(words):
+    #         net.add_fact(Fact(id="Unigram-{}-of-{}".format(i, some_field),
+    #                           value=word))
+
+    #     new_facts = [Fact(id="Unigram-{}-of-{}".format(i, some_field),
+    #                       value=word) for i, word in enumerate(words)]
+
+    #     return new_facts
+
+    @Production(
+        Fact(id=V('id1'), value=V('v1')) &
+        Filter(lambda v1: is_number(v1)) &
+        Fact(id=V('id2'), value=V('v1')) &
+        Filter(lambda id1, id2: id1 < id2))
+    def equals(id1, v1, id2, v2):
+        return [Fact(relation='equality', first=id1, second=id2)]
+
+
+
+    @Production(
+        Fact(id=V('id1'), value=V('n1')) &
+        Filter(lambda n1: is_number(n1)) &
+        Fact(id=V('id2'), value=V('n2')) &
+        Filter(lambda n2: is_number(n2)) &
+        Fact(id=V('id3'), value=V('n3')) &
+        Filter(lambda n3: is_number(n3)) &
+        Filter(lambda n1, n2, n3: str(int(n1) + int(n2) + int(n3)) == '22'))
+    def beep(n1, n2):
+        print("FOUND pair of numbers that sum to 2")
+        return []
+        return [Sai(selection='answer_denom', action="UpdateField",
+                   inputs={'value': '22'})]
+
+    agent = GlenAgent(skills=[# correct_doneSAI, multiply, add, copySAI, 
+        beep])
+    # agent = GlenAgent(skills=[multiply, copy])
+
+    run_training(agent, n=500)
diff --git a/tutorenvs/fractions.py b/tutorenvs/fractions.py
index 8253811b866b1e0d2c66a8af9a7e3bd0047ff1c8..e16c7347de5ba7aef0fd3bd61740ce57e0512d8e 100644
--- a/tutorenvs/fractions.py
+++ b/tutorenvs/fractions.py
@@ -135,21 +135,21 @@ class FractionArithSymbolic:
                         {'id': attr, 'value': self.state[attr],
                          'type': 'TextField',
                          'contentEditable': self.state[attr] == "",
-                         'dom_class': 'CTATTable--cell',
-                         'above': '',
-                         'below': '',
-                         'to_left': '',
-                         'to_right': ''
+                         # 'dom_class': 'CTATTable--cell',
+                         # 'above': '',
+                         # 'below': '',
+                         # 'to_left': '',
+                         # 'to_right': ''
                          }
                         for attr in self.state}
         state_output['done'] = {
             'id': 'done',
             'type': 'Component',
-            'dom_class': 'CTATDoneButton',
-            'above': '',
-            'below': '',
-            'to_left': '',
-            'to_right': ''
+            # 'dom_class': 'CTATDoneButton',
+            # 'above': '',
+            # 'below': '',
+            # 'to_left': '',
+            # 'to_right': ''
         }
 
         return state_output
@@ -160,6 +160,7 @@ class FractionArithSymbolic:
         denom1 = str(randint(2, 15))
         denom2 = str(randint(2, 15))
         operator = choice(['+', '*'])
+        # operator = choice(['*'])
 
         self.reset(num1, denom1, operator, num2, denom2)
         self.logger.set_problem("%s_%s_%s_%s_%s" % (num1, denom1, operator,