src/Obj.js
function add(name) {

    function set(v) {
      var oldValue = shadow[name];
      if (oldValue === v) return;
      o[name] = v;
      notifier.notify({type: 'update', object: u, name, oldValue});
      shadow[name] = oldValue.change(v);
    }

    // When property on upwardable object is accessed, report it and return shadow value.
    function get() {
      accessNotifier.notify({type: 'access', object: u, name});
      return shadow[name];
    }

    function observe(changes) {
//      changes.forEach(change => shadow[name] = shadow[name].change(change.newValue));
//      observers[name].reobserve(shadow[name]);
    }

    shadow[name] = makeUpwardable(o[name]);
    observers[name] = Observer(shadow[name], observe, ['upward']).observe();
    defineProperty(u, name, {set: set, get: get, enumerable: true});
  }
function add(name) {

    function set(v) {
      var oldValue = shadow[name];
      if (oldValue === v) return;
      o[name] = v;
      notifier.notify({type: 'update', object: u, name, oldValue});
      shadow[name] = oldValue.change(v);
    }

    // When property on upwardable object is accessed, report it and return shadow value.
    function get() {
      accessNotifier.notify({type: 'access', object: u, name});
      return shadow[name];
    }

    function observe(changes) {
//      changes.forEach(change => shadow[name] = shadow[name].change(change.newValue));
//      observers[name].reobserve(shadow[name]);
    }

    shadow[name] = makeUpwardable(o[name]);
    observers[name] = Observer(shadow[name], observe, ['upward']).observe();
    defineProperty(u, name, {set: set, get: get, enumerable: true});
  }
function add ( name ) { function set ( v ) { var oldValue = shadow [ name ] ; if ( oldValue === v ) return ; o [ name ] = v ; notifier . notify ( { type : 'update' , object : u , name , oldValue } ) ; shadow [ name ] = oldValue . change ( v ) ; } // When property on upwardable object is accessed, report it and return shadow value. function get ( ) { accessNotifier . notify ( { type : 'access' , object : u , name } ) ; return shadow [ name ] ; } function observe ( changes ) { //      changes.forEach(change => shadow[name] = shadow[name].change(change.newValue)); //      observers[name].reobserve(shadow[name]); } shadow [ name ] = makeUpwardable ( o [ name ] ) ; observers [ name ] = Observer ( shadow [ name ] , observe , [ 'upward' ] ) . observe ( ) ; defineProperty ( u , name , { set : set , get : get , enumerable : true } ) ; }
Add a property. Set up getter and setter, Observe. Populate shadow.
Add a property . Set up getter and setter Observe . Populate shadow .