Name: [ADD] KG temporal Wave-2 (ADR-006): _as_of reconstruction + live KG tools + memory-brain bridge

State: Failed finished in 20m

PR State: merged

PR Author: David Tran

PR Author Email:

PR: #60

Committer: David Tran

Committer Email: davidtran.hp@gmail.com

Commit: 2c76fd8e91690a2b65260c2bd99bada2c385f218

Description:

                                            [FIX] viin_ai: address PR #60 review (temporal_diff ACL, BFS N+1, as-of test gaps, conventions)

H-A: add ACL post-filter in tool_brain_temporal_diff - batch-search readable
page ids after edge set-diff, drop edges where either endpoint is unreadable
(same D6 fix class applied to graph_traverse in Wave-1).

H-B: batch the fallback BFS _acl_filter call - collect all candidate to_page
ids per BFS step BEFORE the ACL check (single Page.search per step, not one
per link, mirroring the primary delegate path).

H-C: add test_observation_recall_as_of_filters - protects the third temporal
leg (created_at <= as_of on observations); RED-then-GREEN verified.

M1: rename _search_active_at -> _find_active_at in viin.brain.link and all
call sites in brain_tools.py and tests (avoids ORM _search_<field> prefix
collision, no active_at field exists).

M2: fix assertIsNotNone(link_a.superseded_at) -> assertTrue (Odoo Datetime
null is False, not None; assertIsNotNone(False) passes silently).

M3: replace (6, 0, [...]) legacy tuples with Command.set([...]) in
viin_ai_memory_brain/tests/test_vault_id_isolation.py (AGENTS.md #7).

M4: move imports (datetime, fields.Datetime/Date) from inside function body
to module top-level in brain_tools.py (python.md imports rule).

Claude-Session: https://claude.ai/code/session_01JTYAzu8ndxtrQGJeTNa3pf
                                            

Branch: 17.0

Instance ID: 0

Age:

Up-time:

Subbuilds Name State Detail
Build 386486 Check the quality with Pylint: from test_lint to test_pylint 19m Failed Log
Build 386487 At install tests: from account to website_twitter 214m Succeed Log
Build 386488 Post install tests: step install all modules 124m Succeed Log
Build 386489 Post install tests: from account to payment_bidv_viin 194m Succeed Log
Build 386490 Post install tests: from payment_buckaroo to to_account_asset 218m Succeed Log
Build 386491 Post install tests: from to_account_asset_purchase to viin_account 89m Succeed Log
Build 386492 Post install tests: from viin_account_auto_transfer to viin_estimate 99m Failed Log
Build 386493 Post install tests: from viin_estimate_approval to viin_project 39m Succeed Log
Build 386494 Post install tests: from viin_project_access_timesheet to website_twitter 68m Succeed Log
Build 386495 Test install all modules without demo data: from account to website_twitter 93m Succeed Log
Create Date Level Message
06/20/2026 11:40:20 INFO
Updated repository Viindoo-odoo
06/20/2026 11:40:20 INFO
Updated repository Viindoo-tvtmaaddons
06/20/2026 11:40:20 INFO
Updated repository Viindoo-erponline-enterprise
06/20/2026 11:40:20 INFO
Updated repository Viindoo-branding
06/20/2026 11:40:20 INFO
Cloned repository Viindoo-ai
06/20/2026 12:00:23 ERROR
Subbuild # 386486: odoo.addons.test_pylint.tests.test_pylint: FAIL: TestPyLint.test_pylint Traceback (most recent call last): File "/data/build/Viindoo-tvtmaaddons-17.0/test_pylint/tests/test_pylint.py", line 147, in test_pylint self.fail("pylint test failed:\n" + (b"\n" + out + b"\n" + err).decode('utf-8').strip()) AssertionError: pylint test failed: ************* Module viin_ai_brain.tests.test_record_historian Same Odoo module absolute import. You should use relative import with "." instead of "odoo.addons.viin_ai_brain" (W8150) at rb-2c76fd8-222275/viin_ai_brain/tests/test_record_historian.py:53 Same Odoo module absolute import. You should use relative import with "." instead of "odoo.addons.viin_ai_brain" (W8150) at rb-2c76fd8-222275/viin_ai_brain/tests/test_record_historian.py:113 Same Odoo module absolute import. You should use relative import with "." instead of "odoo.addons.viin_ai_brain" (W8150) at rb-2c76fd8-222275/viin_ai_brain/tests/test_record_historian.py:158 ------------------------------------ Your code has been rated at 10.00/10
06/20/2026 12:00:23 ERROR
Subbuild # 386486: odoo.modules.loading: Module test_pylint: 1 failures, 0 errors of 7 tests
06/20/2026 12:00:23 ERROR
Subbuild # 386486: odoo.modules.loading: At least one test failed when loading the modules.
06/20/2026 12:00:23 ERROR
Subbuild # 386486: odoo.tests.result: 1 failed, 0 error(s) of 24 tests when loading database 'rb-2c76fd8-222275-386486'
06/20/2026 15:35:04 ERROR
Subbuild # 386492: odoo.addons.viin_ai_brain.tests.test_brain_tools_kg_temporal: ERROR: TestBrainToolsKgTemporalSignature.test_record_state_as_of_with_args_returns_state_dict Traceback (most recent call last): File "/data/build/rb-2c76fd8-222275/viin_ai_brain/tests/test_brain_tools_kg_temporal.py", line 185, in test_record_state_as_of_with_args_returns_state_dict result = self.tools.tool_brain_record_state_as_of(args, as_of=None) File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/brain_tools.py", line 727, in tool_brain_record_state_as_of state = self._as_of_record(res_model, int(res_id), as_of_val) File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/record_historian.py", line 71, in _as_of_record result = self._as_of_records(model_name, [record_id], timestamp) File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/record_historian.py", line 88, in _as_of_records ts = fields.Datetime.to_datetime(timestamp) File "/data/build/Viindoo-odoo-17.0/odoo/fields.py", line 2301, in to_datetime return datetime.strptime(value, DATETIME_FORMAT[:len(value)-2]) File "/usr/lib/python3.10/_strptime.py", line 568, in _strptime_datetime tt, fraction, gmtoff_fraction = _strptime(data_string, format) File "/usr/lib/python3.10/_strptime.py", line 349, in _strptime raise ValueError("time data %r does not match format %r" % ValueError: time data '2026-01-01T00:00:00' does not match format '%Y-%m-%d %H:%M:%S'
06/20/2026 15:35:04 ERROR
Subbuild # 386492: odoo.addons.viin_ai_brain.tests.test_brain_tools_kg_temporal_run: ERROR: TestBrainToolsKgTemporalRun.test_record_state_as_of_sale_order_run_boundary Traceback (most recent call last): File "/data/build/rb-2c76fd8-222275/viin_ai_brain/tests/test_brain_tools_kg_temporal_run.py", line 204, in test_record_state_as_of_sale_order_run_boundary result = _run_tool_action( File "/data/build/rb-2c76fd8-222275/viin_ai_brain/tests/test_brain_tools_kg_temporal_run.py", line 37, in _run_tool_action return action.with_context(**ctx).run() File "/data/build/Viindoo-odoo-17.0/odoo/addons/base/models/ir_actions.py", line 943, in run res = runner(run_self, eval_context=eval_context) File "/data/build/Viindoo-odoo-17.0/addons/website/models/ir_actions_server.py", line 61, in _run_action_code_multi res = super(ServerAction, self)._run_action_code_multi(eval_context) File "/data/build/Viindoo-odoo-17.0/odoo/addons/base/models/ir_actions.py", line 775, in _run_action_code_multi safe_eval(self.code.strip(), eval_context, mode="exec", nocopy=True, filename=str(self)) # nocopy allows to return 'action' File "/data/build/Viindoo-odoo-17.0/odoo/tools/safe_eval.py", line 408, in safe_eval return unsafe_eval(c, globals_dict, locals_dict) File "ir.actions.server(1355,)", line 1, in <module> File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/brain_tools.py", line 727, in tool_brain_record_state_as_of state = self._as_of_record(res_model, int(res_id), as_of_val) File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/record_historian.py", line 71, in _as_of_record result = self._as_of_records(model_name, [record_id], timestamp) File "/data/build/rb-2c76fd8-222275/viin_ai_brain/models/record_historian.py", line 123, in _as_of_records messages = self.env['mail.message'].search([ File "/data/build/Viindoo-tvtmaaddons-17.0/viin_mail_route/models/mail_message.py", line 23, in search return super(MailMessage, self).search(domain, offset, limit, order) File "/data/build/Viindoo-odoo-17.0/odoo/models.py", line 1623, in search return self.search_fetch(domain, [], offset=offset, limit=limit, order=order) File "/data/build/Viindoo-odoo-17.0/odoo/models.py", line 1646, in search_fetch query = self._search(domain, offset=offset, limit=limit, order=order or self._order) File "/data/build/Viindoo-odoo-17.0/addons/mail/models/mail_message.py", line 301, in _search query = super()._search(domain, offset, limit, order, access_rights_uid) File "/data/build/Viindoo-odoo-17.0/odoo/models.py", line 5443, in _search self._flush_search(domain, order=order) File "/data/build/Viindoo-odoo-17.0/odoo/models.py", line 5397, in _flush_search self.env[model_name].check_field_access_rights('read', field_names) File "/data/build/Viindoo-odoo-17.0/odoo/models.py", line 3544, in check_field_access_rights raise AccessError(_( odoo.exceptions.AccessError: The requested operation can not be completed due to security restrictions. Document type: Message (mail.message) Operation: read User: 513 Fields: - tracking_value_ids (allowed for groups 'Administration / Settings')
06/20/2026 15:35:04 ERROR
Subbuild # 386492: odoo.addons.viin_ai_brain.tests.test_record_historian: FAIL: TestRecordHistorian.test_sale_order_reconstruction_returns_old_partner Traceback (most recent call last): File "/data/build/rb-2c76fd8-222275/viin_ai_brain/tests/test_record_historian.py", line 173, in test_sale_order_reconstruction_returns_old_partner self.assertIn('partner_id', state, "partner_id must appear in reconstructed state.") AssertionError: 'partner_id' not found in {} : partner_id must appear in reconstructed state.
06/20/2026 15:35:04 ERROR
Subbuild # 386492: odoo.tests.result: 1 failed, 2 error(s) of 2160 tests when loading database 'rb-2c76fd8-222275-386492'