[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
| 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'
|