1. `copy_cache` in `models.py` recursively copies the caches to environment, 
2. which in
```python
def _compute_related(self, records):
        """ Compute the related field ``self`` on ``records``. """
        others = records.sudo() if self.related_sudo else records
        if records.env != others.env:
            copy_cache(records - records.filtered('id'), others.env)
        values = list(others)
        for name in self.related[:-1]:
            values = [first(value[name]) for value in values]
        for record, value in zip(records, values):
            record[self.name] = value[self.related_field.name]
```
3. copies failing cache values that have been produce previously by this line:

`models.py : def _prefetch_field()`
```python

        try:
            # THIS ONE
            result = records.read([f.name for f in fs], load='_classic_write')
        except AccessError:
            # not all records may be accessible, try with only current record
            result = self.read([f.name for f in fs], load='_classic_write')
```
I checked it's exactly the same `FailedValue` object, which is later accessed without intent (not refreshed) by the fact that the buggy environment is copied to sudo (and not refreshed).


odoo/fields.py
cr = model._cr
        rel, id1, id2 = self.relation, self.column1, self.column2
        
        
        
        if not rel.startswith('x_'):
            model._save_relation_table(rel, self._module)
        cr.execute("SELECT relname FROM pg_class WHERE relkind IN ('r','v') AND relname=%s", (rel,))
        if not cr.dictfetchall():
            if self.comodel_name not in model.env:
                raise UserError(_('Many2many comodel does not exist: %r') % (self.comodel_name,))
            comodel = model.env[self.comodel_name]
            cr.execute('CREATE TABLE "%s" ("%s" INTEGER NOT NULL, "%s" INTEGER NOT NULL, UNIQUE("%s","%s"))' % (rel, id1, id2, id1, id2))
            
            cr.execute("SELECT relkind FROM pg_class WHERE relkind IN ('v') AND relname=%s", (comodel._table,))
            if not cr.fetchall():
                model._m2o_add_foreign_key_unchecked(rel, id2, comodel, 'cascade', self._module)
            cr.execute("SELECT relkind FROM pg_class WHERE relkind IN ('v') AND relname=%s", (model._table,))
            if not cr.fetchall():
                model._m2o_add_foreign_key_unchecked(rel, id1, model, 'cascade', self._module)
            cr.execute('CREATE INDEX ON "%s" ("%s")' % (rel, id1))
            cr.execute('CREATE INDEX ON "%s" ("%s")' % (rel, id2))
            cr.execute("COMMENT ON TABLE \"%s\" IS 'RELATION BETWEEN %s AND %s'" % (rel, model._table, comodel._table))
            cr.commit()
            _schema.debug("Create table '%s': m2m relation between '%s' and '%s'", rel, model._table, comodel._table)
            return True
    def read(self, records):