verifiers 0.3.2.dev166__py3-none-any.whl → 0.3.2.dev167__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
verifiers/v1/graph.py CHANGED
@@ -90,10 +90,11 @@ class MessageNode(BaseModel):
90
90
  tools: list[Tool] = Field(default_factory=list, exclude_if=lambda tools: not tools)
91
91
  """Tools rendered into this branch's prompt. Populated only on root nodes."""
92
92
  semantic_parents: list[ParentLink] = Field(default_factory=list)
93
- """Additional harness-declared parents in the semantic execution graph.
93
+ """Typed incoming edges from other turns, declared by the harness (for example
94
+ ``subagent_return`` or ``subagent_cancel``).
94
95
 
95
- Unlike ``parent``, these links do not imply an exact token prefix and therefore do
96
- not affect physical branch construction. A list permits multiple parents of the same
96
+ They record causal links, not ancestry: unlike ``parent`` they imply no token prefix,
97
+ do not affect physical branch construction, and may form loops. A list permits multiple parents of the same
97
98
  type, supports incremental appends, and preserves their advertised wire order; edge
98
99
  application prevents duplicate ``(node, type)`` links.
99
100
  """
@@ -69,7 +69,7 @@ class CompactionConfig(BaseConfig):
69
69
 
70
70
  class RLMHarnessConfig(HarnessConfig):
71
71
  version: str = Field(
72
- default="f18f10800f86f13913e19ef930abe5fcde4aa90f", min_length=1
72
+ default="c38e20b60c90bbf625274d3fde2b2a384f390a66", min_length=1
73
73
  )
74
74
  """Git ref (branch, tag, or commit) of nano-rlm to install. Must know every
75
75
  field this harness puts on the wire, i.e. be at least the default ref."""
verifiers/v1/semantic.py CHANGED
@@ -60,11 +60,14 @@ class ParentLink(BaseModel):
60
60
 
61
61
 
62
62
  class SemanticEdgeSet(BaseModel):
63
- """A harness-published set of semantic edges over logical request IDs.
63
+ """A harness-published list of typed edges between logical request IDs.
64
+
65
+ Each edge records that one turn caused or fed another. They are not ancestry, so
66
+ they may form loops: a cancel can land on the child turn whose report triggered it.
64
67
 
65
68
  Edge labels are intentionally extensible. Initial harnesses use ``continuation``,
66
- ``compaction_attempt``, ``compaction``, ``subagent_call``, and ``subagent_return``;
67
- consumers must preserve unknown labels.
69
+ ``compaction_attempt``, ``compaction``, ``subagent_call``, ``subagent_return``,
70
+ ``agent_message``, and ``subagent_cancel``; consumers must preserve unknown labels.
68
71
  """
69
72
 
70
73
  model_config = ConfigDict(extra="forbid", strict=True)
@@ -74,8 +77,6 @@ class SemanticEdgeSet(BaseModel):
74
77
  @model_validator(mode="after")
75
78
  def validate_edges(self) -> SemanticEdgeSet:
76
79
  identities: set[tuple[str, str, str]] = set()
77
- children: dict[str, list[str]] = {}
78
- nodes: set[str] = set()
79
80
  for edge in self.edges:
80
81
  identity = (
81
82
  edge.source_request_id,
@@ -85,27 +86,6 @@ class SemanticEdgeSet(BaseModel):
85
86
  if identity in identities:
86
87
  raise ValueError(f"duplicate semantic edge: {identity!r}")
87
88
  identities.add(identity)
88
- children.setdefault(edge.source_request_id, []).append(
89
- edge.target_request_id
90
- )
91
- nodes.update((edge.source_request_id, edge.target_request_id))
92
-
93
- indegree = dict.fromkeys(nodes, 0)
94
- for targets in children.values():
95
- for target in targets:
96
- indegree[target] += 1
97
-
98
- stack = [node for node, degree in indegree.items() if degree == 0]
99
- visited = 0
100
- while stack:
101
- node = stack.pop()
102
- visited += 1
103
- for child in children.get(node, ()):
104
- indegree[child] -= 1
105
- if indegree[child] == 0:
106
- stack.append(child)
107
- if visited != len(nodes):
108
- raise ValueError("semantic edge cycle detected")
109
89
  return self
110
90
 
111
91
 
verifiers/v1/trace.py CHANGED
@@ -568,7 +568,6 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
568
568
 
569
569
  resolved_identities: set[tuple[int, int, str]] = set()
570
570
  additions: list[tuple[int, ParentLink]] = []
571
- pending_parents: dict[int, list[ParentLink]] = {}
572
571
  for edge in edge_set.edges:
573
572
  endpoints: list[int] = []
574
573
  for request_id in (
@@ -592,28 +591,7 @@ class Trace(BaseModel, Generic[DataT, StateT, AgentConfigT]):
592
591
  if link in self.nodes[target].semantic_parents:
593
592
  continue
594
593
 
595
- # Adding source -> target creates a cycle exactly when target is already an
596
- # ancestor of source. Walk parent links directly so existing nodes and links
597
- # are never rebuilt as cumulative ACP edge sets arrive.
598
- stack = [source]
599
- visited: set[int] = set()
600
- while stack:
601
- node_id = stack.pop()
602
- if node_id == target:
603
- raise ValueError(
604
- "semantic edges create a cycle in the message graph"
605
- )
606
- if node_id in visited:
607
- continue
608
- visited.add(node_id)
609
- node = self.nodes[node_id]
610
- if node.parent is not None:
611
- stack.append(node.parent)
612
- stack.extend(parent.node for parent in node.semantic_parents)
613
- stack.extend(parent.node for parent in pending_parents.get(node_id, ()))
614
-
615
594
  additions.append((target, link))
616
- pending_parents.setdefault(target, []).append(link)
617
595
 
618
596
  for target, link in additions:
619
597
  self.nodes[target].semantic_parents.append(link)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.2.dev166
3
+ Version: 0.3.2.dev167
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -4,16 +4,16 @@ verifiers/v1/agent.py,sha256=746LE0HE4DPyxVcgEkAAs8z9qjsR7CQncfKhT1h4jek,32433
4
4
  verifiers/v1/env.py,sha256=fxXBjVyi0milYViHt6O0vBK3JdM2TYSOoQpXd0P0rFE,18110
5
5
  verifiers/v1/episode.py,sha256=UPtA02aGWA-fY8cJKEuYCMtQVnPN1C0BSN13LggNT8U,5986
6
6
  verifiers/v1/errors.py,sha256=nNabzi55J5aHmAmW9UHZVpI7kcBfy4Xcyt4cQthZbM8,5875
7
- verifiers/v1/graph.py,sha256=4EA1TzUBLf9HycfSifKI5J3XkeJzYjbsszZRVwXSGP0,41420
7
+ verifiers/v1/graph.py,sha256=LW0pJRxCCOXZa2KwB0edHIIqmRrzLFBDNyEeOFVskl8,41502
8
8
  verifiers/v1/harness.py,sha256=AcsCmNHB1UQ75nD7RUawsb65q63NdkcMykD0E6oRDOA,15957
9
9
  verifiers/v1/judge.py,sha256=uqn-djkK2_7Q3kOjkDo6ipOvV_HOvuLa9y6AoDjRux8,9618
10
10
  verifiers/v1/rollout.py,sha256=WiMCJyAypsR1OaXvzJQx7G-T67v__AnnDNoXotuI_VE,25444
11
- verifiers/v1/semantic.py,sha256=VQ_buw6Ya6QtRoh_fiYI5Avs5RmIQCfWH0H0bQc4aoc,4704
11
+ verifiers/v1/semantic.py,sha256=tX8FYEceuMYauuB3Bc8jLDMS2eR06JjLjTo66R190Fg,4053
12
12
  verifiers/v1/session.py,sha256=qVMgKmqkItemR3uYUDAFuDz7huP593kHQbge8FlRba8,28420
13
13
  verifiers/v1/state.py,sha256=EckF2bWp-vV4b1jYJ9sLI5xrfGuI5spIgYYwW926toI,595
14
14
  verifiers/v1/task.py,sha256=6-Tw0iBLsc4hinvVPl_b2EUX8unAAnxtHMXNSIHXsnU,12886
15
15
  verifiers/v1/taskset.py,sha256=LE_3ogL7itU2Amk-N20cHkZ7Ev6MznJ0HpC8B1xb4w0,9482
16
- verifiers/v1/trace.py,sha256=tgzkft4nKF4QGeGXwoqkfXjaUbG65Nn1oBFzMUFp-u0,32234
16
+ verifiers/v1/trace.py,sha256=Npc-TrBh-B3H0OvtfA5X31VAlOhfgLDKGdXohqC2uIk,31156
17
17
  verifiers/v1/types.py,sha256=-In5plgB3mQLqtRKHC3QDCPDvuruAqVd8WIjKrsGB_I,10578
18
18
  verifiers/v1/acp/__init__.py,sha256=Omle2zo7aly_7CCg1N9yQjQcJe4UpqTw9xVBP8_tuT8,13891
19
19
  verifiers/v1/acp/runner.py,sha256=OrJ1VSWTnNosV8OklqM2YdERlbF7olT9PHEdQfXvgGQ,14137
@@ -113,7 +113,7 @@ verifiers/v1/harnesses/pi/harness.py,sha256=ysKOLSRQnbPkMtwvuUoJU7Hd4uM4bDF1duD0
113
113
  verifiers/v1/harnesses/prime_agent/__init__.py,sha256=xfPC4RrlnyYWaf38tPAOZq4YL6M55lMpj5BoRLmaK8I,171
114
114
  verifiers/v1/harnesses/prime_agent/harness.py,sha256=Zs_f5H2hQgDzUS4zwArM5UxCYJI5Zo0ELmayn1oBkK0,10663
115
115
  verifiers/v1/harnesses/rlm/__init__.py,sha256=hwx51xTdEWzzYgMj-p4ETNcptoub3IPMDbEdJ4uB8Ns,122
116
- verifiers/v1/harnesses/rlm/harness.py,sha256=NFJ3u1xC06d9NwjnxFD8cCqIXoGjAIwhmJly-hXSvMA,13538
116
+ verifiers/v1/harnesses/rlm/harness.py,sha256=wyK3f1jYYnJniz9SCJBI8j2oUGycU22HdQN6zAf34ME,13538
117
117
  verifiers/v1/harnesses/terminus_2/__init__.py,sha256=l1pwfg1HyVDEqT9efdnFWcXqaZwtKwe7TrplkyxZSA0,166
118
118
  verifiers/v1/harnesses/terminus_2/harness.py,sha256=cKQJluW01mkxEccTLFwSWsVMavyiwq_w-NA4Hb_JkGU,3052
119
119
  verifiers/v1/harnesses/terminus_2/program.py,sha256=X8MZdyItU3gbXGXnGOlJ9LWcUTnqIDaxlhkZvoRiqKY,2703
@@ -193,8 +193,8 @@ verifiers/v1/utils/scope.py,sha256=bzUEiWDOVdbj7dXOwGOlzsQ_-Xu0j9NR5TalQB-8TS8,8
193
193
  verifiers/v1/utils/score.py,sha256=493yJVMw8teCu9JxapxMFPFzI0hNUqdo0Y2nGW4kckk,6200
194
194
  verifiers/v1/utils/trace_store.py,sha256=RsCDonGR-bs-tvEstcppiJm3jFmAdIiG83fA5KtCbAw,2801
195
195
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
196
- verifiers-0.3.2.dev166.dist-info/METADATA,sha256=PR5ypxpzJMtmrYgaGC5NjI0RT2i-ArYUhlpYVlfZ_hg,4161
197
- verifiers-0.3.2.dev166.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
198
- verifiers-0.3.2.dev166.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
199
- verifiers-0.3.2.dev166.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
200
- verifiers-0.3.2.dev166.dist-info/RECORD,,
196
+ verifiers-0.3.2.dev167.dist-info/METADATA,sha256=_Pni8Imgl22DFAVEK6sGzXCFAipSjzTx9GTRc3PKwGg,4161
197
+ verifiers-0.3.2.dev167.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
198
+ verifiers-0.3.2.dev167.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
199
+ verifiers-0.3.2.dev167.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
200
+ verifiers-0.3.2.dev167.dist-info/RECORD,,