Non-deterministic issue when moving to Oso 0.26

Hi.
I'm trying to port my codebase from 0.25 to 0.26 (branch).
I think I made appropriate modifications. Mainly, use
from polar.data.adapter.sqlalchemy_adapter import SqlAlchemyAdapter

rather than copy-pasting the query_builder recipe from the docs.
I'm seeing what could be a regression but may also well be the consequence of a mistake of mine that wouldn't show up before the Oso upgrade.
Basically, a query generated by the SqlAlchemyAdapter is not correct. What's more, the error is not deterministic. Sometimes, the right query is generated.
Queries below (indentation mine). The order of the JOIN lines seems random.
Good:
INFO sqlalchemy.engine.Engine SELECT DISTINCT timeseries.id AS timeseries_id, timeseries.name AS timeseries_name, timeseries.description AS timeseries_description, timeseries.unit AS timeseries_unit, timeseries.min_value AS timeseries_min_value, timeseries.max_value AS timeseries_max_value, timeseries.group_id AS timeseries_group_id
FROM timeseries
    JOIN timeseries_groups ON timeseries.group_id = timeseries_groups.id
    JOIN timeseries_groups_by_users ON timeseries_groups.id = timeseries_groups_by_users.timeseries_group_id
    JOIN users ON timeseries_groups_by_users.user_id = users.id
WHERE users.id = %(id_1)s

Bad:
INFO sqlalchemy.engine.Engine SELECT DISTINCT timeseries.id AS timeseries_id, timeseries.name AS timeseries_name, timeseries.description AS timeseries_description, timeseries.unit AS timeseries_unit, timeseries.min_value AS timeseries_min_value, timeseries.max_value AS timeseries_max_value, timeseries.group_id AS timeseries_group_id
FROM timeseries
    JOIN timeseries_groups ON timeseries.group_id = timeseries_groups.id
    JOIN users ON timeseries_groups_by_users.user_id = users.id
    JOIN timeseries_groups_by_users ON timeseries_groups.id = timeseries_groups_by_users.timeseries_group_id
WHERE users.id = %(id_1)s

Also bad:
INFO sqlalchemy.engine.Engine SELECT DISTINCT timeseries.id AS timeseries_id, timeseries.name AS timeseries_name, timeseries.description AS timeseries_description, timeseries.unit AS timeseries_unit, timeseries.min_value AS timeseries_min_value, timeseries.max_value AS timeseries_max_value, timeseries.group_id AS timeseries_group_id
FROM timeseries
    JOIN timeseries_groups_by_users ON timeseries_groups.id = timeseries_groups_by_users.timeseries_group_id
    JOIN users ON timeseries_groups_by_users.user_id = users.id
    JOIN timeseries_groups ON timeseries.group_id = timeseries_groups.id
WHERE users.id = %(id_1)s

Polar file

Trace OK
[oso][trace]   ⇒ bind: resource ← resource matches Timeseries{}
[oso][trace]   Query(allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource))
[oso][info]   QUERY RULE: allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource), BINDINGS: {resource => resource matches Timeseries{}}
[oso][info]     APPLICABLE_RULES:
[oso][info]       allow(user: UserActor{}, _action, _resource) at line 13, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][info]       allow(actor, action, resource) at line 7, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][info]       allow(_actor, _action, _resource) at line 10, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(user: UserActor{}, _action, _resource) if _value_2 = true and user.is_admin = _value_2;
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _user_444)
[oso][trace]     ⇒ bind: _user_444 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Isa(_user_444, UserActor{})
[oso][trace]     MATCHES: _user_444 matches UserActor{}, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]     Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]     MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]     IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]     ⇒ bind: _isa_455 ← false
[oso][trace]     Unify(_isa_455, true)
[oso][trace]     Unify(true, true)
[oso][trace]     Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]     MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]     Unify("read", __action_445)
[oso][trace]     ⇒ bind: __action_445 ← "read"
[oso][trace]     Unify(resource, __resource_446)
[oso][trace]     ⇒ bind: resource ← __resource_446
[oso][trace]     Query(__value_2_447 = true and _user_444.is_admin = __value_2_447)
[oso][trace]       TraceStackPush
[oso][trace]       Query(__value_2_447 = true and _user_444.is_admin = __value_2_447)
[oso][trace]       QUERY: __value_2_447 = true and _user_444.is_admin = __value_2_447, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         TraceStackPush
[oso][trace]         Query(__value_2_447 = true)
[oso][trace]         QUERY: __value_2_447 = true, BINDINGS: {}
[oso][trace]           Unify(__value_2_447, true)
[oso][trace]           ⇒ bind: __value_2_447 ← true
[oso][trace]           PopQuery(__value_2_447 = true)
[oso][trace]         Query(_user_444.is_admin = __value_2_447)
[oso][trace]         QUERY: _user_444.is_admin = __value_2_447, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, __value_2_447 => true}
[oso][trace]           Query(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin = __value_2_447)
[oso][trace]           QUERY: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin = __value_2_447, BINDINGS: {__value_2_447 => true}
[oso][trace]             LookupExternal(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`."is_admin")
[oso][trace]             LOOKUP: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin()
[oso][trace]             => false
[oso][trace]             Unify(_lookup_value_456, false)
[oso][trace]             ⇒ bind: _lookup_value_456 ← false
[oso][trace]             CheckError
[oso][trace]             Unify(__value_2_447, _lookup_value_456)
[oso][trace]             Unify(true, false)
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(actor, action, resource) if has_permission(actor, action, resource);
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _actor_448)
[oso][trace]     ⇒ bind: _actor_448 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Unify("read", _action_449)
[oso][trace]     ⇒ bind: _action_449 ← "read"
[oso][trace]     Unify(resource, _resource_450)
[oso][trace]     ⇒ bind: resource ← _resource_450
[oso][trace]     Query(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]       TraceStackPush
[oso][trace]       Query(has_permission(_actor_448, _action_449, _resource_450))
[oso][info]       QUERY RULE: has_permission(_actor_448, _action_449, _resource_450), BINDINGS: {_resource_450 => resource matches Timeseries{} and resource = _resource_450, _action_449 => "read", _actor_448 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         APPLICABLE_RULES:
[oso][trace]           has_permission(actor: Actor{}, "read", timeseries: Timeseries{}) at line 98, column 5 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]         TraceRule(...)
[oso][trace]         RULE: has_permission(actor: Actor{}, "read", timeseries: Timeseries{}) if has_relation(related_timeseriesgroup, "group", timeseries) and has_role(actor, "tg_member", related_timeseriesgroup);
[oso][trace]         TraceStackPush
[oso][trace]         Unify(_actor_448, _actor_518)
[oso][trace]         ⇒ bind: _actor_448 ← _actor_518
[oso][trace]         Isa(_actor_518, Actor{})
[oso][trace]         MATCHES: _actor_518 matches Actor{}, BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         Isa(_actor_518, UserActor{})
[oso][trace]         MATCHES: _actor_518 matches UserActor{}, BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]         MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]         IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]         ⇒ bind: _isa_521 ← false
[oso][trace]         Unify(_isa_521, true)
[oso][trace]         Unify(true, true)
[oso][trace]         Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]         MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]         Unify(_action_449, "read")
[oso][trace]         Unify("read", "read")
[oso][trace]         Unify(_resource_450, _timeseries_519)
[oso][trace]         ⇒ bind: _resource_450 ← _timeseries_519
[oso][trace]         Isa(_timeseries_519, Timeseries{})
[oso][trace]         MATCHES: _timeseries_519 matches Timeseries{}, BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519}
[oso][trace]         Run(...)
[oso][trace]         ⇒ bind: _runnable_result_522 ← false
[oso][trace]         Unify(_runnable_result_522, true)
[oso][trace]         Unify(true, true)
[oso][trace]         Cut { choice_index: 4 }
[oso][trace]         Backtrack
[oso][trace]         BACKTRACK
[oso][trace]         AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2290, right: 2296 }, value: Variable(Symbol("_timeseries_519")) }, Term { source_info: Parser { src_id: 27, left: 2122, right: 2412 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("Timeseries"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]         ⇒ add_constraint: _timeseries_519 matches Timeseries{}
[oso][trace]         Query(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]         QUERY: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}}
[oso][trace]           TraceStackPush
[oso][trace]           Query(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519))
[oso][info]           QUERY RULE: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519), BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}}
[oso][trace]             APPLICABLE_RULES:
[oso][trace]               has_relation(group: TimeseriesGroup{}, "group", ts: Timeseries{}) at line 103, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]             TraceRule(...)
[oso][trace]             RULE: has_relation(group: TimeseriesGroup{}, "group", ts: Timeseries{}) if group = _value_13 and ts.group = _value_13;
[oso][trace]             TraceStackPush
[oso][trace]             Unify(_related_timeseriesgroup_520, _group_528)
[oso][trace]             ⇒ bind: _related_timeseriesgroup_520 ← _group_528
[oso][trace]             Isa(_group_528, TimeseriesGroup{})
[oso][trace]             MATCHES: _group_528 matches TimeseriesGroup{}, BINDINGS: {_group_528 => _related_timeseriesgroup_520}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_531 ← false
[oso][trace]             Unify(_runnable_result_531, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 5 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2427, right: 2432 }, value: Variable(Symbol("_group_528")) }, Term { source_info: Parser { src_id: 27, left: 2434, right: 2449 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("TimeseriesGroup"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _group_528 matches TimeseriesGroup{}
[oso][trace]             Unify("group", "group")
[oso][trace]             Unify(_timeseries_519, _ts_529)
[oso][trace]             ⇒ bind: _timeseries_519 ← _ts_529
[oso][trace]             Isa(_ts_529, Timeseries{})
[oso][trace]             MATCHES: _ts_529 matches Timeseries{}, BINDINGS: {_ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_532 ← false
[oso][trace]             Unify(_runnable_result_532, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 5 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2460, right: 2462 }, value: Variable(Symbol("_ts_529")) }, Term { source_info: Parser { src_id: 27, left: 2464, right: 2474 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("Timeseries"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _ts_529 matches Timeseries{}
[oso][trace]             Query(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               TraceStackPush
[oso][trace]               Query(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               QUERY: _group_528 = __value_13_530 and _ts_529.group = __value_13_530, BINDINGS: {_ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{}, _group_528 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{}}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_group_528 = __value_13_530)
[oso][trace]                 QUERY: _group_528 = __value_13_530, BINDINGS: {_group_528 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{}}
[oso][trace]                   Unify(_group_528, __value_13_530)
[oso][trace]                   ⇒ bind: _group_528 ← __value_13_530
[oso][trace]                   PopQuery(_group_528 = __value_13_530)
[oso][trace]                 Query(_ts_529.group = __value_13_530)
[oso][trace]                 QUERY: _ts_529.group = __value_13_530, BINDINGS: {__value_13_530 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530, _ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{}}
[oso][trace]                   ⇒ add_constraint: __value_13_530 = _ts_529.group
[oso][trace]                   PopQuery(_ts_529.group = __value_13_530)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               TraceStackPop
[oso][trace]               PopQuery(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]             TraceStackPop
[oso][trace]             TraceStackPop
[oso][trace]             PopQuery(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519))
[oso][trace]           Query(has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][info]           QUERY RULE: has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_related_timeseriesgroup_520 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group, _actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]             APPLICABLE_RULES:
[oso][trace]               has_role(user: UserActor{}, "tg_member", tg: TimeseriesGroup{}) at line 76, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]             TraceRule(...)
[oso][trace]             RULE: has_role(user: UserActor{}, "tg_member", tg: TimeseriesGroup{}) if tg.timeseries_groups_by_users = _value_10 and tgbu in _value_10 and user = _value_11 and tgbu.user = _value_11;
[oso][trace]             TraceStackPush
[oso][trace]             Unify(_actor_518, _user_541)
[oso][trace]             ⇒ bind: _actor_518 ← _user_541
[oso][trace]             Isa(_user_541, UserActor{})
[oso][trace]             MATCHES: _user_541 matches UserActor{}, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]             Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]             MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]             IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]             ⇒ bind: _isa_546 ← false
[oso][trace]             Unify(_isa_546, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]             MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]             Unify("tg_member", "tg_member")
[oso][trace]             Unify(_related_timeseriesgroup_520, _tg_542)
[oso][trace]             ⇒ bind: _related_timeseriesgroup_520 ← _tg_542
[oso][trace]             Isa(_tg_542, TimeseriesGroup{})
[oso][trace]             MATCHES: _tg_542 matches TimeseriesGroup{}, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_547 ← false
[oso][trace]             Unify(_runnable_result_547, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_548 ← false
[oso][trace]             Unify(_runnable_result_548, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 6 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 1781, right: 1783 }, value: Variable(Symbol("_tg_542")) }, Term { source_info: Parser { src_id: 27, left: 1785, right: 1800 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("TimeseriesGroup"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _tg_542 matches TimeseriesGroup{}
[oso][trace]             Query(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]             QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]               TraceStackPush
[oso][trace]               Query(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543)
[oso][trace]               QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_tg_542.timeseries_groups_by_users = __value_10_543)
[oso][trace]                 QUERY: _tg_542.timeseries_groups_by_users = __value_10_543, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]                   ⇒ add_constraint: __value_10_543 = _tg_542.timeseries_groups_by_users
[oso][trace]                   PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543)
[oso][trace]                 Query(_tgbu_544 in __value_10_543)
[oso][trace]                 QUERY: _tgbu_544 in __value_10_543, BINDINGS: {__value_10_543 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users}
[oso][trace]                   ⇒ add_constraint: _tgbu_544 in __value_10_543
[oso][trace]                   PopQuery(_tgbu_544 in __value_10_543)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543)
[oso][trace]               Query(_user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]               QUERY: _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_user_541 = __value_11_545)
[oso][trace]                 QUERY: _user_541 = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]                   Unify(_user_541, __value_11_545)
[oso][trace]                   ⇒ bind: _user_541 ← __value_11_545
[oso][trace]                   PopQuery(_user_541 = __value_11_545)
[oso][trace]                 Query(_tgbu_544.user = __value_11_545)
[oso][trace]                 QUERY: _tgbu_544.user = __value_11_545, BINDINGS: {__value_11_545 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543}
[oso][trace]                   ⇒ add_constraint: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` = _tgbu_544.user
[oso][trace]                   PopQuery(_tgbu_544.user = __value_11_545)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]               TraceStackPop
[oso][trace]               PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]             TraceStackPop
[oso][trace]             TraceStackPop
[oso][trace]             PopQuery(has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]           TraceStackPop
[oso][trace]           PopQuery(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]         TraceStackPop
[oso][trace]         TraceStackPop
[oso][trace]         PopQuery(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]       TraceStackPop
[oso][trace]       PopQuery(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]     TraceStackPop
[oso][trace]     TraceStackPop
[oso][trace]     PopQuery(allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource))
[oso][info]   RESULT: {
[oso][info]     resource: _this.group matches TimeseriesGroup{} and _this matches Timeseries{} and _tgbu_544 in _this.group.timeseries_groups_by_users and <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` = _tgbu_544.user
[oso][info]   }
[oso][trace]   BACKTRACK
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(_actor, _action, _resource) if OpenBarPolarClass.get() = _value_1 and _value_1;
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, __actor_451)
[oso][trace]     ⇒ bind: __actor_451 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Unify("read", __action_452)
[oso][trace]     ⇒ bind: __action_452 ← "read"
[oso][trace]     Unify(resource, __resource_453)
[oso][trace]     ⇒ bind: resource ← __resource_453
[oso][trace]     Query(OpenBarPolarClass.get() = __value_1_454 and __value_1_454)
[oso][trace]       TraceStackPush
[oso][trace]       Query(OpenBarPolarClass.get() = __value_1_454 and __value_1_454)
[oso][trace]       QUERY: OpenBarPolarClass.get() = __value_1_454 and __value_1_454, BINDINGS: {OpenBarPolarClass => <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`}
[oso][trace]         TraceStackPush
[oso][trace]         Query(OpenBarPolarClass.get() = __value_1_454)
[oso][trace]         QUERY: OpenBarPolarClass.get() = __value_1_454, BINDINGS: {OpenBarPolarClass => <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`}
[oso][trace]           Query(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454)
[oso][trace]           QUERY: <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454, BINDINGS: {}
[oso][trace]             LookupExternal(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get())
[oso][trace]             LOOKUP: <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get()
[oso][trace]             => false
[oso][trace]             Unify(_lookup_value_549, false)
[oso][trace]             ⇒ bind: _lookup_value_549 ← false
[oso][trace]             CheckError
[oso][trace]             Unify(__value_1_454, _lookup_value_549)
[oso][trace]             ⇒ bind: __value_1_454 ← _lookup_value_549
[oso][trace]             PopQuery(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454)
[oso][trace]           PopQuery(OpenBarPolarClass.get() = __value_1_454)
[oso][trace]         Query(__value_1_454)
[oso][trace]         QUERY: __value_1_454, BINDINGS: {__value_1_454 => false}
[oso][trace]           Query(false)
[oso][trace]           QUERY: false, BINDINGS: {}
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             Halt
[oso][trace]             HALT

Trace KO
[oso][trace]   ⇒ bind: resource ← resource matches Timeseries{}
[oso][trace]   Query(allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource))
[oso][info]   QUERY RULE: allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource), BINDINGS: {resource => resource matches Timeseries{}}
[oso][info]     APPLICABLE_RULES:
[oso][info]       allow(user: UserActor{}, _action, _resource) at line 13, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][info]       allow(actor, action, resource) at line 7, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][info]       allow(_actor, _action, _resource) at line 10, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(user: UserActor{}, _action, _resource) if _value_2 = true and user.is_admin = _value_2;
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _user_444)
[oso][trace]     ⇒ bind: _user_444 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Isa(_user_444, UserActor{})
[oso][trace]     MATCHES: _user_444 matches UserActor{}, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]     Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]     MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]     IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]     ⇒ bind: _isa_455 ← false
[oso][trace]     Unify(_isa_455, true)
[oso][trace]     Unify(true, true)
[oso][trace]     Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]     MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]     Unify("read", __action_445)
[oso][trace]     ⇒ bind: __action_445 ← "read"
[oso][trace]     Unify(resource, __resource_446)
[oso][trace]     ⇒ bind: resource ← __resource_446
[oso][trace]     Query(__value_2_447 = true and _user_444.is_admin = __value_2_447)
[oso][trace]       TraceStackPush
[oso][trace]       Query(__value_2_447 = true and _user_444.is_admin = __value_2_447)
[oso][trace]       QUERY: __value_2_447 = true and _user_444.is_admin = __value_2_447, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         TraceStackPush
[oso][trace]         Query(__value_2_447 = true)
[oso][trace]         QUERY: __value_2_447 = true, BINDINGS: {}
[oso][trace]           Unify(__value_2_447, true)
[oso][trace]           ⇒ bind: __value_2_447 ← true
[oso][trace]           PopQuery(__value_2_447 = true)
[oso][trace]         Query(_user_444.is_admin = __value_2_447)
[oso][trace]         QUERY: _user_444.is_admin = __value_2_447, BINDINGS: {_user_444 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, __value_2_447 => true}
[oso][trace]           Query(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin = __value_2_447)
[oso][trace]           QUERY: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin = __value_2_447, BINDINGS: {__value_2_447 => true}
[oso][trace]             LookupExternal(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`."is_admin")
[oso][trace]             LOOKUP: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`.is_admin()
[oso][trace]             => false
[oso][trace]             Unify(_lookup_value_456, false)
[oso][trace]             ⇒ bind: _lookup_value_456 ← false
[oso][trace]             CheckError
[oso][trace]             Unify(__value_2_447, _lookup_value_456)
[oso][trace]             Unify(true, false)
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(actor, action, resource) if has_permission(actor, action, resource);
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _actor_448)
[oso][trace]     ⇒ bind: _actor_448 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Unify("read", _action_449)
[oso][trace]     ⇒ bind: _action_449 ← "read"
[oso][trace]     Unify(resource, _resource_450)
[oso][trace]     ⇒ bind: resource ← _resource_450
[oso][trace]     Query(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]       TraceStackPush
[oso][trace]       Query(has_permission(_actor_448, _action_449, _resource_450))
[oso][info]       QUERY RULE: has_permission(_actor_448, _action_449, _resource_450), BINDINGS: {_action_449 => "read", _resource_450 => resource matches Timeseries{} and resource = _resource_450, _actor_448 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         APPLICABLE_RULES:
[oso][trace]           has_permission(actor: Actor{}, "read", timeseries: Timeseries{}) at line 98, column 5 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]         TraceRule(...)
[oso][trace]         RULE: has_permission(actor: Actor{}, "read", timeseries: Timeseries{}) if has_relation(related_timeseriesgroup, "group", timeseries) and has_role(actor, "tg_member", related_timeseriesgroup);
[oso][trace]         TraceStackPush
[oso][trace]         Unify(_actor_448, _actor_518)
[oso][trace]         ⇒ bind: _actor_448 ← _actor_518
[oso][trace]         Isa(_actor_518, Actor{})
[oso][trace]         MATCHES: _actor_518 matches Actor{}, BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         Isa(_actor_518, UserActor{})
[oso][trace]         MATCHES: _actor_518 matches UserActor{}, BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]         MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]         IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]         ⇒ bind: _isa_521 ← false
[oso][trace]         Unify(_isa_521, true)
[oso][trace]         Unify(true, true)
[oso][trace]         Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]         MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]         Unify(_action_449, "read")
[oso][trace]         Unify("read", "read")
[oso][trace]         Unify(_resource_450, _timeseries_519)
[oso][trace]         ⇒ bind: _resource_450 ← _timeseries_519
[oso][trace]         Isa(_timeseries_519, Timeseries{})
[oso][trace]         MATCHES: _timeseries_519 matches Timeseries{}, BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519}
[oso][trace]         Run(...)
[oso][trace]         ⇒ bind: _runnable_result_522 ← false
[oso][trace]         Unify(_runnable_result_522, true)
[oso][trace]         Unify(true, true)
[oso][trace]         Cut { choice_index: 4 }
[oso][trace]         Backtrack
[oso][trace]         BACKTRACK
[oso][trace]         AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2290, right: 2296 }, value: Variable(Symbol("_timeseries_519")) }, Term { source_info: Parser { src_id: 27, left: 2122, right: 2412 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("Timeseries"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]         ⇒ add_constraint: _timeseries_519 matches Timeseries{}
[oso][trace]         Query(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]         QUERY: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}, _actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]           TraceStackPush
[oso][trace]           Query(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519))
[oso][info]           QUERY RULE: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519), BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}}
[oso][trace]             APPLICABLE_RULES:
[oso][trace]               has_relation(group: TimeseriesGroup{}, "group", ts: Timeseries{}) at line 103, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]             TraceRule(...)
[oso][trace]             RULE: has_relation(group: TimeseriesGroup{}, "group", ts: Timeseries{}) if group = _value_13 and ts.group = _value_13;
[oso][trace]             TraceStackPush
[oso][trace]             Unify(_related_timeseriesgroup_520, _group_528)
[oso][trace]             ⇒ bind: _related_timeseriesgroup_520 ← _group_528
[oso][trace]             Isa(_group_528, TimeseriesGroup{})
[oso][trace]             MATCHES: _group_528 matches TimeseriesGroup{}, BINDINGS: {_group_528 => _related_timeseriesgroup_520}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_531 ← false
[oso][trace]             Unify(_runnable_result_531, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 5 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2427, right: 2432 }, value: Variable(Symbol("_group_528")) }, Term { source_info: Parser { src_id: 27, left: 2434, right: 2449 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("TimeseriesGroup"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _group_528 matches TimeseriesGroup{}
[oso][trace]             Unify("group", "group")
[oso][trace]             Unify(_timeseries_519, _ts_529)
[oso][trace]             ⇒ bind: _timeseries_519 ← _ts_529
[oso][trace]             Isa(_ts_529, Timeseries{})
[oso][trace]             MATCHES: _ts_529 matches Timeseries{}, BINDINGS: {_ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_532 ← false
[oso][trace]             Unify(_runnable_result_532, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 5 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 2460, right: 2462 }, value: Variable(Symbol("_ts_529")) }, Term { source_info: Parser { src_id: 27, left: 2464, right: 2474 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("Timeseries"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _ts_529 matches Timeseries{}
[oso][trace]             Query(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               TraceStackPush
[oso][trace]               Query(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               QUERY: _group_528 = __value_13_530 and _ts_529.group = __value_13_530, BINDINGS: {_ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{}, _group_528 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{}}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_group_528 = __value_13_530)
[oso][trace]                 QUERY: _group_528 = __value_13_530, BINDINGS: {_group_528 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{}}
[oso][trace]                   Unify(_group_528, __value_13_530)
[oso][trace]                   ⇒ bind: _group_528 ← __value_13_530
[oso][trace]                   PopQuery(_group_528 = __value_13_530)
[oso][trace]                 Query(_ts_529.group = __value_13_530)
[oso][trace]                 QUERY: _ts_529.group = __value_13_530, BINDINGS: {__value_13_530 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530, _ts_529 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{}}
[oso][trace]                   ⇒ add_constraint: __value_13_530 = _ts_529.group
[oso][trace]                   PopQuery(_ts_529.group = __value_13_530)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]               TraceStackPop
[oso][trace]               PopQuery(_group_528 = __value_13_530 and _ts_529.group = __value_13_530)
[oso][trace]             TraceStackPop
[oso][trace]             TraceStackPop
[oso][trace]             PopQuery(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519))
[oso][trace]           Query(has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][info]           QUERY RULE: has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _related_timeseriesgroup_520 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group}
[oso][trace]             APPLICABLE_RULES:
[oso][trace]               has_role(user: UserActor{}, "tg_member", tg: TimeseriesGroup{}) at line 76, column 1 of file /mnt/projets/bemserver/bemserver-core/bemserver_core/authorization.polar
[oso][trace]             TraceRule(...)
[oso][trace]             RULE: has_role(user: UserActor{}, "tg_member", tg: TimeseriesGroup{}) if tg.timeseries_groups_by_users = _value_10 and tgbu in _value_10 and user = _value_11 and tgbu.user = _value_11;
[oso][trace]             TraceStackPush
[oso][trace]             Unify(_actor_518, _user_541)
[oso][trace]             ⇒ bind: _actor_518 ← _user_541
[oso][trace]             Isa(_user_541, UserActor{})
[oso][trace]             MATCHES: _user_541 matches UserActor{}, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]             Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, UserActor{})
[oso][trace]             MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches UserActor{}, BINDINGS: {}
[oso][trace]             IsaExternal { instance: Term { source_info: Ffi, value: ExternalInstance(ExternalInstance { instance_id: 171, constructor: None, repr: None, class_repr: Some("User") }) }, literal: InstanceLiteral { tag: Symbol("UserActor"), fields: Dictionary { fields: {} } } }
[oso][trace]             ⇒ bind: _isa_546 ← false
[oso][trace]             Unify(_isa_546, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Isa(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, {})
[oso][trace]             MATCHES: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` matches {}, BINDINGS: {}
[oso][trace]             Unify("tg_member", "tg_member")
[oso][trace]             Unify(_related_timeseriesgroup_520, _tg_542)
[oso][trace]             ⇒ bind: _related_timeseriesgroup_520 ← _tg_542
[oso][trace]             Isa(_tg_542, TimeseriesGroup{})
[oso][trace]             MATCHES: _tg_542 matches TimeseriesGroup{}, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542}
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_547 ← false
[oso][trace]             Unify(_runnable_result_547, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Run(...)
[oso][trace]             ⇒ bind: _runnable_result_548 ← false
[oso][trace]             Unify(_runnable_result_548, true)
[oso][trace]             Unify(true, true)
[oso][trace]             Cut { choice_index: 6 }
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             AddConstraint { term: Term { source_info: TemporaryVariable, value: Expression(Operation { operator: Isa, args: [Term { source_info: Parser { src_id: 27, left: 1781, right: 1783 }, value: Variable(Symbol("_tg_542")) }, Term { source_info: Parser { src_id: 27, left: 1785, right: 1800 }, value: Pattern(Instance(InstanceLiteral { tag: Symbol("TimeseriesGroup"), fields: Dictionary { fields: {} } })) }] }) } }
[oso][trace]             ⇒ add_constraint: _tg_542 matches TimeseriesGroup{}
[oso][trace]             Query(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]             QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}, _user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]               TraceStackPush
[oso][trace]               Query(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543)
[oso][trace]               QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_tg_542.timeseries_groups_by_users = __value_10_543)
[oso][trace]                 QUERY: _tg_542.timeseries_groups_by_users = __value_10_543, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]                   ⇒ add_constraint: __value_10_543 = _tg_542.timeseries_groups_by_users
[oso][trace]                   PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543)
[oso][trace]                 Query(_tgbu_544 in __value_10_543)
[oso][trace]                 QUERY: _tgbu_544 in __value_10_543, BINDINGS: {__value_10_543 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users}
[oso][trace]                   ⇒ add_constraint: _tgbu_544 in __value_10_543
[oso][trace]                   PopQuery(_tgbu_544 in __value_10_543)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543)
[oso][trace]               Query(_user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]               QUERY: _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543}
[oso][trace]                 TraceStackPush
[oso][trace]                 Query(_user_541 = __value_11_545)
[oso][trace]                 QUERY: _user_541 = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]                   Unify(_user_541, __value_11_545)
[oso][trace]                   ⇒ bind: _user_541 ← __value_11_545
[oso][trace]                   PopQuery(_user_541 = __value_11_545)
[oso][trace]                 Query(_tgbu_544.user = __value_11_545)
[oso][trace]                 QUERY: _tgbu_544.user = __value_11_545, BINDINGS: {_tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543, __value_11_545 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]                   ⇒ add_constraint: <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` = _tgbu_544.user
[oso][trace]                   PopQuery(_tgbu_544.user = __value_11_545)
[oso][trace]                 TraceStackPop
[oso][trace]                 PopQuery(_user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]               TraceStackPop
[oso][trace]               PopQuery(_tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545)
[oso][trace]             TraceStackPop
[oso][trace]             TraceStackPop
[oso][trace]             PopQuery(has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]           TraceStackPop
[oso][trace]           PopQuery(has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520))
[oso][trace]         TraceStackPop
[oso][trace]         TraceStackPop
[oso][trace]         PopQuery(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]       TraceStackPop
[oso][trace]       PopQuery(has_permission(_actor_448, _action_449, _resource_450))
[oso][trace]     TraceStackPop
[oso][trace]     TraceStackPop
[oso][trace]     PopQuery(allow(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, "read", resource))
[oso][info]   RESULT: {
[oso][info]     resource: _this.group matches TimeseriesGroup{} and _this matches Timeseries{} and _tgbu_544 in _this.group.timeseries_groups_by_users and <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User` = _tgbu_544.user
[oso][info]   }
[oso][trace]   BACKTRACK
[oso][trace]     TraceRule(...)
[oso][trace]     RULE: allow(_actor, _action, _resource) if OpenBarPolarClass.get() = _value_1 and _value_1;
[oso][trace]     TraceStackPush
[oso][trace]     Unify(<User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, __actor_451)
[oso][trace]     ⇒ bind: __actor_451 ← <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`
[oso][trace]     Unify("read", __action_452)
[oso][trace]     ⇒ bind: __action_452 ← "read"
[oso][trace]     Unify(resource, __resource_453)
[oso][trace]     ⇒ bind: resource ← __resource_453
[oso][trace]     Query(OpenBarPolarClass.get() = __value_1_454 and __value_1_454)
[oso][trace]       TraceStackPush
[oso][trace]       Query(OpenBarPolarClass.get() = __value_1_454 and __value_1_454)
[oso][trace]       QUERY: OpenBarPolarClass.get() = __value_1_454 and __value_1_454, BINDINGS: {OpenBarPolarClass => <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`}
[oso][trace]         TraceStackPush
[oso][trace]         Query(OpenBarPolarClass.get() = __value_1_454)
[oso][trace]         QUERY: OpenBarPolarClass.get() = __value_1_454, BINDINGS: {OpenBarPolarClass => <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`}
[oso][trace]           Query(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454)
[oso][trace]           QUERY: <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454, BINDINGS: {}
[oso][trace]             LookupExternal(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get())
[oso][trace]             LOOKUP: <class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get()
[oso][trace]             => false
[oso][trace]             Unify(_lookup_value_549, false)
[oso][trace]             ⇒ bind: _lookup_value_549 ← false
[oso][trace]             CheckError
[oso][trace]             Unify(__value_1_454, _lookup_value_549)
[oso][trace]             ⇒ bind: __value_1_454 ← _lookup_value_549
[oso][trace]             PopQuery(<class 'bemserver_core.authorization.OpenBarPolarClass'> TYPE `UNKNOWN`.get() = __value_1_454)
[oso][trace]           PopQuery(OpenBarPolarClass.get() = __value_1_454)
[oso][trace]         Query(__value_1_454)
[oso][trace]         QUERY: __value_1_454, BINDINGS: {__value_1_454 => false}
[oso][trace]           Query(false)
[oso][trace]           QUERY: false, BINDINGS: {}
[oso][trace]             Backtrack
[oso][trace]             BACKTRACK
[oso][trace]             Halt
[oso][trace]             HALT

Not so many differences between traces. Just a few lines. Below, only differing lines:
Good:
[oso][info]       QUERY RULE: has_permission(_actor_448, _action_449, _resource_450), BINDINGS: {_resource_450 => resource matches Timeseries{} and resource = _resource_450, _action_449 => "read", _actor_448 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         QUERY: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}}
[oso][info]           QUERY RULE: has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_related_timeseriesgroup_520 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group, _actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]             QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}}
[oso][trace]                 QUERY: _tgbu_544.user = __value_11_545, BINDINGS: {__value_11_545 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543}

Bad:
[oso][info]       QUERY RULE: has_permission(_actor_448, _action_449, _resource_450), BINDINGS: {_action_449 => "read", _resource_450 => resource matches Timeseries{} and resource = _resource_450, _actor_448 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]         QUERY: has_relation(_related_timeseriesgroup_520, "group", _timeseries_519) and has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_timeseries_519 => resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{}, _actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][info]           QUERY RULE: has_role(_actor_518, "tg_member", _related_timeseriesgroup_520), BINDINGS: {_actor_518 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`, _related_timeseriesgroup_520 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group}
[oso][trace]             QUERY: _tg_542.timeseries_groups_by_users = __value_10_543 and _tgbu_544 in __value_10_543 and _user_541 = __value_11_545 and _tgbu_544.user = __value_11_545, BINDINGS: {_tg_542 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{}, _user_541 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}
[oso][trace]                 QUERY: _tgbu_544.user = __value_11_545, BINDINGS: {_tgbu_544 => _group_528 = _related_timeseriesgroup_520 and _group_528 matches TimeseriesGroup{} and _group_528 = __value_13_530 and resource matches Timeseries{} and resource = _resource_450 and _resource_450 = _timeseries_519 and _timeseries_519 matches Timeseries{} and _timeseries_519 = _ts_529 and _ts_529 matches Timeseries{} and __value_13_530 = _ts_529.group and _related_timeseriesgroup_520 = _tg_542 and _tg_542 matches TimeseriesGroup{} and __value_10_543 = _tg_542.timeseries_groups_by_users and _tgbu_544 in __value_10_543, __value_11_545 => <User John<EMAIL_ADDRESS>admin: False, active: True> TYPE `User`}

Debian 11.2
Python 3.9.2
SQLAlchemy==1.4.28
I'm not using sqlalchemy-oso (maybe I should).
Any other useful information I could provide to investigate this?
Thanks.

Hi @lafrech , this exact issue was supposed to have been fixed (full disclosure: by me) on 0.26.0. Sorry to ask, but are you sure you're seeing it on 0.26 and not 0.25?

Oh, boy. Glad you ask, actually. I do have issues with the 0.26 migration, but after getting back and forth between my oso 0.26 branch and my (0.25) dev branch, I got mixed up. You're right, the issue I reported happens with 0.25.

I'm going from [0.25 + old copy-pasted query_builder] to [0.26 + SqlAlchemyAdapter], so that's two changes at once.
I'll investigate the real issue(s) and open new issue(s) here if needed.
Sorry about the noise. And thanks for the hard work.


Empty Net navigation faulty

Selecting a net in the Netlist Tab is supposed to center the viewport on the net. With empty nets however, this will result in faulty coordinate calculation of the (empty) net, thus centering on an area outside the fabric.
When selecting an empty net, there should be no changes in the Fabric view.

Fixed by https://github.com/FPGA-Research-Manchester/FABulator/commit/43c2e89c35e85afe45ca3517f99286ff39920428
Will keep this open until it's merged with main.


DONOTMERGE [top,dv,rv_dm] ndm reset request test

NDM reset request test
This test does csr write to  lc / sys reset regions. Then it toggles ndm reset.
After toggling reset, it reads back the same csrs to check
the csr under lc reset region doesn't change the value
while the csr under sys reset region has reset value.
Signed-off-by: Jaedon Kim<EMAIL_ADDRESS>

i just triggered an fpga re-run, should we work on merging this PR now?

i just triggered an fpga re-run, should we work on merging this PR now?

yep, will do soon.

@tjaychen I had to re submit to clean-up some debug codes.


adds check for existence of global navigator variable

Signed-off-by: Adam Taylor<EMAIL_ADDRESS>

awesome, thanks!


Question about dsl

Must the supervised model be trained in advance? Can I use DSL to train a model both with labeled samples and unlabeled samples from the begining(just with pretrained model of backbone)?

@heiyuxiaokai Yeah, the supervised model should be trained first so as to produce the initial pseudo-labels. This will encourage the better performances.

@heiyuxiaokai Yeah, the supervised model should be trained first so as to produce the initial pseudo-labels. This will encourage the better performances.

I get it, and thanks!


fix #1063: ignore _quarto.yml from nbdev-template

I don't think we can remove _quarto.yml from nbdev-template since we're currently using the same nbdev-template in all nbdev versions, and <2.3.0 still requires _quarto.yml.


Various path related fix for Windows

This PR:

fix Files_js.normalize_path: add a special case for absolute paths.
They start with "C:".

fix issue with ROOT_PROJECT variable on Windows

fix error-location display (use '/' to keep simplify runtests.sh)

handle backslashes in .flowconfig in the ignore section
We extend the regexp to catch backslashes as a separator for Windows
compatibility. Thanks to this, there is no need to modify
.flowconfig on Windows.

PS: This work was done in order to make version 0.19.1 work on
Windows. We couldn't rebase it as it depends on previous PR that have
not been merged in master yet.

@facebook-github-bot shipit
looks great, thanks!

@facebook-github-bot shipit


FFS-2175: Installing skylight on dev

Ticket
Relates to FFS-2175.
Changes

Installs Skylight
Profiles slower Rails methods

Context for reviewers

Acceptance testing

[x] No acceptance testing needed

This change will not affect the user experience (bugfix, dependency updates, etc.)

[ ] Acceptance testing prior to merge

This change can be verified visually via screenshots attached below or by sending a link to a local development environment to the acceptance tester
Acceptance testing should be done by design for visual changes, product for behavior/logic changes, or both for changes that impact both.

[ ] Acceptance testing after merge

This change is hard to test locally, so we'll test it in the demo environment (deployed automatically after merge.)
Make sure to notify the team once this PR is merged so we don't inadvertently deploy the unaccepted change to production. (e.g. :alert: Deploy block! @ffs-eng I just merged PR [#123] and will be doing acceptance testing in demo - please don't deploy until I'm finished!)

Cool, ok, you didn't have to cherry-pick my commit but that's fine. Is there any initialization or configuration required for Skylight? I would presume there's some config file or API token required?

From a barebones setup, the docs simply mention adding the Gem and running a bundle cmd. Seems too good to be true, but we'll find out.


Missing header files for C++ unit tests

Some file seem to be missing when trying to compile for C++ using commands given in the README.
cpp:test:
       [cc] 13 total files to be compiled.
       [cc] /home/adrien/simple-binary-encoding/test/cpp/BoundsCheckTest.cpp:19:50: fatal error: code_generation_test/MessageHeader.hpp: No such file or directory
       [cc] compilation terminated.
       [cc] In file included from /home/adrien/simple-binary-encoding/test/cpp/OtfGroupTest.cpp:16:0:
       [cc] /home/adrien/simple-binary-encoding/target/test/cpp/gtest-1.7.0/include/gtest/gtest.h: In instantiation of ‘testing::AssertionResult testing::internal::CmpHelperEQ(const char*, const char*, const T1&, const T2&) [with T1 = long unsigned int; T2 = int]’:
       [cc] /home/adrien/simple-binary-encoding/target/test/cpp/gtest-1.7.0/include/gtest/gtest.h:1485:30:   required from ‘static testing::AssertionResult testing::internal::EqHelper<lhs_is_null_literal>::Compare(const char*, const char*, const T1&, const T2&) [with T1 = long unsigned int; T2 = int; bool lhs_is_null_literal = false]’
       [cc] /home/adrien/simple-binary-encoding/test/cpp/OtfGroupTest.cpp:74:13:   required from here
       [cc] /home/adrien/simple-binary-encoding/target/test/cpp/gtest-1.7.0/include/gtest/gtest.h:1448:3: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       [cc] /home/adrien/simple-binary-encoding/test/cpp/CompositeOffsetsCodeGenTest.cpp:19:52: fatal error: composite_offsets_test/MessageHeader.hpp: No such file or directory
       [cc] compilation terminated.

The test source files impacted are the following:

BoundsCheckTest.cpp
CompositeOffsetsCodeGenTest.cpp
CompositeOffsetsIrTest.cpp
MessageBlockLengthTest.cpp
OtfFullIrTest.cpp
CodeGenTest.cpp

When removing those tests, compilation can be done with ant cpp (after modifying some .xml files for cpp:test:codegen target)
I do not know if I missed something in the installation process, or if some files are missing. For example, BoundsCheckTest.cpp includes the following files that cannot be found:
#include "code_generation_test/MessageHeader.hpp"
#include "code_generation_test/Car.hpp"

Anyway, either those header files need to be generated, which means build.xml or README needs to be modified to let user generate those files, or these files are missing, in which case they need to be added.

It seems it's my issue: I was not able to generate files using sbe tool in ant. Running sbetool by hand removes the problem.


Unknown Manufacturer/Product/Product Code after upgrade

After upgrading from version 9.3.2 to 9.5 (and later 9.6) I noticed that several of my devices are now showing as "Unknow" as depicted from the attached.  I was able to fix a few by removing them and re-adding them.

After. Trying to reinterview the affected devices did not help.
I am running the software inside a docker. Here is the script:
`root@IOT:~/docker_compose/zwavejs2mqtt# more docker-compose.yml
version: '3.7'
services:
zwavejs2mqtt:
container_name: zwavejs2mqtt
image: zwavejs/zwavejs2mqtt:latest
restart: always
tty: true
stop_signal: SIGINT
environment:
- SESSION_SECRET=XXXXXXXXXXXXXXXX
- ZWAVEJS_EXTERNAL_CONFIG=/usr/src/app/store/.config-db
# Uncomment if you want logs time and dates to match your timezone instead of UTC
# Available at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- TZ=America/New_York
networks:
- zwave
devices:
# Do not use /dev/ttyUSBX serial devices, as those mappings can change over time.
# Instead, use the /dev/serial/by-id/X serial device for your Z-Wave stick.
- '/dev/serial/by-id/usb-Zooz_800_Z-Wave_Stick_533D004242-if00:/dev/zwave'
volumes:
#- ./zwave-config:/usr/src/app/store
- $PWD/store:/usr/src/app/store
ports:
- '8091:8091' # port for web interface
- '3005:3000' # port for Z-Wave JS websocket server
networks:
zwave:
#volumes:
zwave-config:
name: zwave-config`
Also, here is the output of the 'ls' command for the USB stick:
root@IOT:~/docker_compose/zwavejs2mqtt# ls -al /dev/serial/by-id/usb-Zooz_800_Z-Wave_Stick_533D004242-if00 lrwxrwxrwx 1 root root 13 Dec  2 21:36 /dev/serial/by-id/usb-Zooz_800_Z-Wave_Stick_533D004242-if00 -> ../../ttyACM0
I am also attaching the log file (large)
zwavejs_2023-12-19.log
Is removing/adding the only solution?
Thank you for your help.
Renato

Fist I'm not sure volume is setup correctly: - $PWD/store:/usr/src/app/store
If you check your local folder directory (the one next to the docker-compose file) do you see something inside it?
Also did you tried to re-interview unknown devices? You can easily do that by pressing on Advanced button on an expanded node row

Good morning. The docker-compose file exists within the /root/docker_compose/zwavejs2mqtt directory.
The /root/docker_compose/zwavejs2mqtt/store does exist and contains the following:
root@IOT:~/docker_compose/zwavejs2mqtt/store# ls -al /root/docker_compose/zwavejs2mqtt/store total 492 drwxr-xr-x 14 root root   4096 Dec 20 08:54 . drwxr-xr-x  3 root root   4096 Dec  2 21:54 .. -rw-r--r--  1 root root    544 May 28  2023 c145e9a3.jsonl drwxr-xr-x  2 root root   4096 May 29  2023 c145e9a3.jsonl.lock -rw-r--r--  1 root root   1106 May 28  2023 c145e9a3.metadata.jsonl drwxr-xr-x  2 root root   4096 May 29  2023 c145e9a3.metadata.jsonl.lock -rw-r--r--  1 root root    829 May 28  2023 c145e9a3.values.jsonl drwxr-xr-x  2 root root   4096 May 29  2023 c145e9a3.values.jsonl.lock drwxr-xr-x  2 root root   4096 Nov 28  2022 config drwxr-xr-x  3 root root   4096 Dec 19 15:06 .config-db drwxr-xr-x  3 root root   4096 Dec 14 08:01 .config-db_old -rw-r--r--  1 root root  29701 Dec 20 08:55 d133c078.jsonl drwxr-xr-x  2 root root   4096 Dec 20 08:57 d133c078.jsonl.lock -rw-r--r--  1 root root 302511 Dec 20 08:34 d133c078.metadata.jsonl drwxr-xr-x  2 root root   4096 Dec 20 08:57 d133c078.metadata.jsonl.lock -rw-r--r--  1 root root  75324 Dec 20 08:34 d133c078.values.jsonl drwxr-xr-x  2 root root   4096 Dec 20 08:57 d133c078.values.jsonl.lock drwxr-xr-x  2 root root  12288 Dec 20 00:06 logs -rw-r--r--  1 root root    691 Dec  4 08:50 nodes.json drwxr-xr-x  2 root root   4096 Nov 28  2022 sessions -rw-r--r--  1 root root   1283 Dec 14 18:15 settings.json drwxr-xr-x  2 root root   4096 Nov 28  2022 snippets -rw-r--r--  1 root root    186 Nov 28  2022 users.json
Here is a screenshot before the re-interview:

and a screenshot after:

As you can see, nothing changes.
Thank you
Renato

Please make a driver log, loglevel debug and attach it here as a file (drag & drop into the text field).

Here it is.
zwavejs_2023-12-20.log
Thank you


non-reflective code for CXXLanguageFrontend::getLocationFromRawNode is wrong

If reflective access fails, we currently provide another way to retrieve the "parent signature", i.e. the signature of the file where the AST node is located in.
https://github.com/Fraunhofer-AISEC/cpg/blob/b8801eb7f38b04e4254f0876e7e439cb56824c41/src/main/java/de/fraunhofer/aisec/cpg/frontends/cpp/CXXLanguageFrontend.java#L261-L266
However this horribly fails if it tries to retrieve the code for an AST element that is inside a header that is included in a cpp file. In this case, the loop will traverse all the way to the CPP file while the code region refers to the header file, because (for some reason) CDT considers the CPP the "parent" of the included header.
There are not many scenarios where this non-reflective code is actually needed. Currently one is, if the cpg is executed in Graal/Substrate VM - however there is a workaround to allow reflection for certain fields there as well. So the easy thing would be to just remove this code, because I am not quite sure if we can really fix it.

It seems we could use parentRawSig = new CharArray(node.getTranslationUnit().getRawSignature());


Add Levant dispatch command to dispatch against Nomad jobs.

Levant now has the functionality to dispatch against Nomad jobs
using the dispatch command. Jobs that are dispatched go through
the job status checker and so dispatched jobs can be confirm to
reach the running state.
Closes #113

@sevagh I had some time to complete my started work today so raised this PR and would love any feedback you have.

I'll compare this directly to my code later today, but it looks good. Mine is definitely more hacky (e.g. not supporting payloads, and passing -meta as a single comma-separated list instead of multiple flags).
I suspect the dispatch behavior is the same as nomad job dispatch? Return a successful allocation.
I'll compile your branch and run it with my arguments today as a sanity check.

The run behaviour is identical; but it will go through the additional checking that Levant provides and so will ensure that the dispatched job reaches the running state as well as all the allocations that are part of it.

I use the heck out of dispatch jobs. Nice work!

Works nice for me.
I still rely on code from here (-monitor and -timeout) to poll Nomad and check for the end result of the dispatched job.


Format JSON responses from CLI as Table

Related to #1069

I have some issues @AlirezaHaghshenas

@MichalLytek I've fixed this in #1095


Make 'keyof T' a literal contextual type

Fixes #12455.

👍
@mhegazy can we get Pick-ed this into release-2.1?


Refactor Sentry integration

Our Sentry integration wasn’t up-to-date, we make sure everything works without Raven or a secret DSN since they're both deprecated

🦀 Requesting reviewers for this pull request:

@simonprev (contributor with 0 commits in the last 90 days and 4 commits overall)


Maintainers needed

The project is not totally unmaintained but only minimal maintenance is done, and only obvious bugfixes will be quickly merged and released.
If you want your pull request to be merged, please ask some other competent contributors to review your patch.
If you are interested in maintaining this project, please answer this issue.

Hi. Thank you for your volunteering. Honestly, there is no roadmap at all, I suppose you can choose anything task you want :)

This project was built to run many Selenium tests in parallel. To achieve that, it patches several pytest internals. As pytest changes, these patches become ever more precarious.
Additionally, it has several errors and is missing several features that make the project usable (see the 47 currently open issues). I last used the project years ago, so I can't recommend pytest-parallel in good faith.
If someone, or an organization, is willing to take on the Herculean effort of maintaining a concurrent pytest runner, please reach out, because pytest-parallel is unmaintained.
Until then, I recommend pytest-xdist, which is very active.

Could you archive the project and add a disclaimer to https://pypi.org/project/pytest-parallel/
thanks

Could you archive the project and add a disclaimer to https://pypi.org/project/pytest-parallel/ thanks

@kevlened ...that would indeed be great, and save people some time.


Mazda CX-5 2022: steer from zero

For all other cars minSteerSpeed will not be zero, so behavior will not be changed. And for the CX5 2022, we will only show unavailable alert when leaving standstill (takes a few seconds for steering to become available again which we don't want to ignore).

@alancyau do you mind trying this out?

Tested this branch. The warning went away when the car comes to a stop, but when the lead car starts to accelerate, a Steering Temporarily Unavailable warning pops up and OP will disengage. Here are two instances of that happening.
a4af1602d8e668ac|2022-06-17--17-36-07--3
a4af1602d8e668ac|2022-06-17--17-36-07--4

That should be normal, to openpilot it sees the car not steering and throws the appropriate warning. It shouldn't disengage though

@Jafaral do the Mazdas not steer right away when you engage? Resuming from a stop should be similar, but it takes multiple seconds to start steering again. Can we somehow reset the EPS so it resumes steering immediately?

@sshane , they do steer right away when you engage, but there is a lag for the EPS to  respond for steer commands  if it was in an LKAS_BLOCK state

So I think an alert is fine, and maybe we need a list of cars we know can steer to zero to ignore "faults" and just show a steer unavailable alert

Yeah, in practice the user will hardly notice that steer   "warm up" when coming out of a full stop. With ACC, the car is already a bit too slow to accelerate anyway.

In the example I posted to Discord, the user's car didn't start steering until 20 mph or so.

Waiting on a stock route from @alancyau in sng to see what the camera does, odd that it doesn't steer for this long.

Which fork did you want a stop and go route for?

Just master, as long as dashcam mode is on (openpilot is disabled).

Any updates? @alancyau

Any updates? @alancyau

I should be able to do a test today and send you a log.

@sshane here’s a log from master-ci in dashcam mode.
a4af1602d8e668ac|2022-06-25--18-10-44--1

Did you engage in that route? We need to see an example where you're stopped behind the lead engaged, the car pulls away, and the Mazda starts steering on its own.

I’ll need to do another route. It was only in dashcam mode. Got confused with the requested route.

Yes correct, dashcan mode uses your stock car's system and the C3 just records the data for us. If you can get it to resume from a stop and have it steer as fast as possible, that'll be helpful.

@sshane there should be a few SnG in this log running master-ci.
a4af1602d8e668ac|2022-07-01--14-41-25--13

Thanks for that data! But we need a route with the stock system (openpilot turned OFF in the settings) to evaluate how stock handles resuming from a stop, steering wise.

@sshane that makes sense now. I'll get you another route running the factory ACC/LKAS system tomorrow in similar situation.
Starting with the 2022 CX5, traffic jam assist is offered on the highest Touring trim. I have the lower Select trim. Traffic Jam Assist allows steering below 37mph. I think above 37, Lane Keep Assist takes over. I believe all the trims just run the same EPS, so it's able to accept steering commands below 37.
https://insidemazda.mazdausa.com/press-release/2022-mazda-cx-5-pricing-and-packaging/

Oh, so yours wouldn't be able to steer under 37 with the stock system? Dang, that would have been helpful to see what the camera does. I checked your route and it seems very variable, most of the time it waits until ~10 mph to enable steering, while others (when not engaged) it's 2 mph.

I'm not really sure what the stock system does actually. The marketing brochure is a bit confusing on what Traffic Jam Assist actually does. I'll just test the stock system tomorrow and see what the data looks like.

It actually looks like there's a 3.2 second delay coming from a stop, which even exists when not engaged. So I'll fix this PR up to hide the alert when coming to a stop, I think the alert when resuming is appropriate considering it isn't steering for 3 seconds.

Here’s a log in dashcam mode with ACC and LKAS engaged on release3.
a4af1602d8e668ac|2022-07-02--18-12-53--17

Thanks for the route. It's about as expected, LKAS_BLOCK rises at around 19 m/s on stock, so it's not any better (maybe a different trim would shine some light on this though).

@alancyau can you try the branch now? I will tune the thresholds through your data and clean the branch up, but this should work

@alancyau can you try the branch now? I will tune the thresholds through your data and clean the branch up, but this should work

Any specific scenarios you’d like to see?

Coming to a stop engaged and resuming from a stop engaged, as many times as possible (so I can verify the time it takes to lose lkas_block)

Coming to a stop engaged and resuming from a stop engaged, as many times as possible (so I can verify the time it takes to lose lkas_block). Let me know if it ever shows that alert

Just saw this. Which UI alert?
Here’s a log with 4 full stops while engaged running this branch.
a4af1602d8e668ac|2022-07-14--08-32-13--19

The Steering Temporarily Unavailable alert you complained of above is what we're looking to avoid.

Yeah, I was getting the chime sound and orange screen in that previous drive.

Since these steer to zero cars consistently take 3.2 seconds to start steering again after resuming, we'll have to keep track of the time resuming from a stop and show an alert if we still can't steer after that time

@Jafaral seems to have found that LKAS_BLOCK doesn't mean anything on the CX5 and the stock system applies torque when it's high. @alancyau can you test this branch now to see if your car steers from a stop now? The alert should be gone now, but we want to make sure that it can steer immediately after resuming from a stop.

Yeah I’ll have access to the car in a few days to test.

Just in case someone reads these comments, This only affects CX-5 2022,. LKAS_BLOCK still applies for  all other models/years

@sshane , can you update the PR title to say CX-5 2022 please?

@sshane I was able to only get one instance of a full stop and go. See a4af1602d8e668ac|2022-08-28--15-20-10--8. It appears the wheel immediately moved when the car started accelerating. Do you want to check the logs to confirm this?

Nice that this just works! Checking the logs now. @Jafaral I see the comment says it can also block for a no-user-torque condition. Can we test that as well? How does it work? Or is the comment outdated?

@Jafaral does this look like it was applying torque?

@Jafaral does this look like it was applying torque? There was only one example @alancyau can you try to get a few more?

Yeah I’ll get a few more in the next couple of days.

Interesting. This drive seems to indicate there was a delay in applying torque. Good to see more drives. Can you please share the drives with me @alancyau?
I wonder if  @kravatch's cars is a bit different since he has "official" TJA support. I didn't see any delay in his drives. The next thing would be to look at firmware versions for both the EPS and FSC for both cars. Also look for any difference/bits in the FSC signals.

Here's a log with a few more stop and go testing on @Jafaral's https://github.com/Jafaral/openpilot/tree/mazda-tja branch.
a4af1602d8e668ac|2022-09-02--22-30-21--7
When the lead car starts moving, seems like the steering wheel will move right away for the first second, then appear dead for about 2 seconds, then start moving again.

@Jafaral do you know if there is an apply bit for steering control? perhaps the EPS doesn't like us setting it while stopped or LKAS_BLOCKED is true

Any of you guys active here?

Any of you guys with this issue active here?

I don’t have a C3 device anymore, so unable to test this issue.

Any of you guys with this issue active here?

I don’t have a C3 device anymore, so unable to test this issue.

I'm around and able to test. Can you confirm the branch to try and specific scenario to simulate?

@kravatch In stop and go, can your car steer from a stop? Or does it fail to steer?

@kravatch In stop and go, can your car steer from a stop? Or does it fail to steer?

Using OP, my car does fail to steer from a stop. It throws a warning but reengages very quickly once I start up

Can you provide a route/segment and let me know at what speed it actually started steering at?

Closing, unclear if the stock system even does this. We would merge a well tested PR for this though.


admission-control flag replaced by enable/disable-admission-plugins flags

This PR relates to Issue #7235
Language is moving away from 'admission controllers' to 'admission plugins', but still in transition.
Order of plugins is not relevant in 1.10
Removed some additional version-specific info in the list plugins (as not relevant for >1.10)
There are two generated files that remain oustanding:
reference/generated/federation-apiserver.md
reference/generated/kube-apiserver.md
As I understand it, these will need to be modified in a separate PR

This change is

/assign

👋 @errordeveloper, @mikedanese, @wlan0, or @davidopp - would love a technical/accuracy review from one of you, if good - please add a /lgtm comment to the PR

/approve

@aburdenthehand this needs a rebase - I looked at this, but wasn't familiar enough to know the correct rebase for the 1.10 content here. Could you rebase please to resolve the merge conflict?

@heckj should be rebased now. Cheers!
(Sorry for the delay - a medical issue unexpectedly kept me offline)

/lgtm


initial import of remote serve

Signed-off-by: Vasiliy Tolstov<EMAIL_ADDRESS>

@ncw  please check this, i have a problem with lsd inside another dir and ls inside dir.
may be i miss something...

url for test http://cdn.swiftbird.org/

If you make this change, then you can use -vv --dump-bodies and you can see clearly what is wrong
diff --git a/serve/serve.go b/serve/serve.go
index a1e8df2..96dd87f 100644
--- a/serve/serve.go
+++ b/serve/serve.go
@@ -78,12 +78,7 @@ func NewFs(name, root string) (fs.Fs, error) {
 		port = "80"
 	}

-	tr := &http.Transport{
-		MaxIdleConns:       10,
-		IdleConnTimeout:    30 * time.Second,
-		DisableCompression: false,
-	}
-	client := &http.Client{Transport: tr}
+	client := fs.Config.Client()

 	_, err := client.Head(host + ":" + port)
 	if err != nil {

rclone ls -vv --dump-bodies serve:atomic

2017/02/23 13:24:33 DEBUG : HEAD /atomicatomic HTTP/1.1

THanks!  Now rclone lsd and rclone ls can output listing.
Does i need something specific for mount command?
Also - does it possible to force when mount to readonly mode ?

@ncw can you check my code ?

also if i have two servers or more that serve identical content, does it possible to add to fs.Config.Client ability to round-robin each endpoint or do failover?
and what happening when remote when request arrived not responding, but after one second works fine - does rclone mount supports reconnection ability or it fails with transport endpoint not connected?

i found packages that can act as load balancers, but may be we need to reimplement something like this inside rclone? What do you think ?
https://godoc.org/github.com/olivere/balancers
https://godoc.org/github.com/linkosmos/rehttp

Does i need something specific for mount command?

I don't think so

Also - does it possible to force when mount to readonly mode

--read-only flag for mount will do it

also if i have two servers or more that serve identical content, does it possible to add to fs.Config.Client ability to round-robin each endpoint or do failover?

If you put both the IPs into the DNS then the transport will round robin them I think.

and what happening when remote when request arrived not responding, but after one second works fine - does rclone mount supports reconnection ability or it fails with transport endpoint not connected?

The mount will retry failed opens

If you put both the IPs into the DNS then the transport will round robin them I think.

this is not possible, firstly because i have more than one hostname, also path can be different but contents is the same, for example see the various mirrors...

@ncw i'm fix all my issues. So by providing http endpoiny i can list and mount any path.

i'm fix all my issues. So by providing http endpoint i can list and mount any path

Nice one!
Do you want me to merge this as a sort of special purpose remote?
If so can you squash all the commits and separate the vendor changes from code changes?
It needs some docs, and some tests too ideally, though the normal integration tests won't work if the remote can't read and write.
I think we should probably rename it to be the http remote which makes more sense than calling it the serve remote.

@ncw ok, i'm squash and add vendoring in separate commit.

I'm switch base branch, squash and separate deps commit. Sorry i don't know hot to write tests =(

build failed for strange reasons in travis with go 1.8.
Can you suggest me or write tests ? What i need? Does i need t spawn http server and connect it to this remote ?

gentle ping..

Sorry have been busy with home life (wife been in hospital)!  Also trying to get the 1.36 release out the door!

build failed for strange reasons in travis with go 1.8.

It looks like the goimports check is failing... Just format the code with goimports.

Can you suggest me or write tests ? What i need? Does i need t spawn http server and connect it to this remote ?

In an ideal world you'd use the auto-generated tests that all the other remotes have.  However that isn't going to work since your remote is read-only :-(
The easiest way of testing will be with https://golang.org/pkg/net/http/httptest/
You then use that to test each individual part of your remote - a simple example here: https://gist.github.com/cespare/4992458

goimports fixed

Apologies for the delay - been very busy with home and work life.
I've been having a go with this prior to merging into master.
It works very well for your test URL, but when I tried it with some other examples

https://www.craig-wood.com/nick/pub/
http://beta.rclone.org/

The results were mixed, including adding ./ in the remote names, and including the URLS with & in.
That makes me think that this module needs a test suite.  It should be able to simlulate various different types of web server (have some stored output from various web browsers to make sure the parsing of the page works properly).
The parsing also needs to be stricter so it includes http://example.com/file but not http://example.com/file&size=43 or http://example.com/subdir/file/
What do you think about adding a test suite and trying to make it more generic?
I merged this into a branch "http" along with some fixes from me - send future PRs against that branch.
PS you can test new remotes like this
RCLONE_CONFIG_HLS_TYPE=http RCLONE_CONFIG_HLS_ENDPOINT=http://beta.rclone.org/ rclone lsl hls:

Thanks! I'm try to fix issues.

What do you think about filter-out files which names contains ? & nbsp;

please check new pr, and as i understand i need to create 3 tests:

nginx
apache
caddy

Just show you know I've merged this to master now along with tests and docs.
Thank you very much for contributing it, and sorry it has taken me such a long time.
-- Nick

Bit thanks! And sorry for absent test (i'm forget about it =().
Thanks again and waiting for new release =)


refactor: js - binary search

thanks @aakhtar3 !

@aakhtar3 if you have any interest in becoming a collaborator on this repo let us know! your PR quality is great, and we'd always appreciate more folks to help review PRs and keep the repo squeaky clean :)

@mitchellirvin Yes, I am interested in becoming a collaborator!

awesome. @neetcode-gh has the owner role on the repo, thoughts on adding @aakhtar3 as a collaborator? he's made several high quality contributions and has been a pleasure to interact with through all of them


Adding an attribute to a filtered

This issue is imported from pivotal - Originaly created at Apr 25, 2019 by Bart Geesink
When the IdP sends the values of a multivalued attribute in a different order as before, consent is shown again.
Steps to reproduce:
Have EduPersonEntitlement enabled in the ARP
Log in using mujina, add two values for EduPersonEntitlement
Accept consent
Start another session
Log in using mujina, add two values for EduPersonEntitlement but now in opposite order
Consent is shown again

need to discuss migration strategy (Thijs Kinkhorst - Sep 11, 2019)


chore(tekton,quay): add OWNERS file to tekton and quay plugins

Description:
Add OWNERS file to tekton and quay plugin.

cc: @rohitkrai03