verifiers 0.2.2.dev93__py3-none-any.whl → 0.2.2.dev95__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.
@@ -15,6 +15,7 @@ from verifiers.envs.experimental.utils.git_checkout_cache import (
15
15
  validate_git_checkout,
16
16
  )
17
17
  from verifiers.types import Messages, State, SystemMessage, TrajectoryStep
18
+ from verifiers.utils.path_utils import CACHE_DIR
18
19
 
19
20
  DEFAULT_RLM_REPO_URL = "github.com/PrimeIntellect-ai/rlm-harness.git"
20
21
  DEFAULT_RLM_REF = "main"
@@ -24,9 +25,7 @@ DEFAULT_RLM_MAX_DEPTH = 0
24
25
  DEFAULT_APPEND_TO_SYSTEM_PROMPT_PATH = "/task/append_to_system_prompt.txt"
25
26
  DEFAULT_RLM_CHECKOUT_PATH = "/tmp/rlm-checkout"
26
27
  DEFAULT_RLM_CHECKOUT_UPLOAD_NAME = "rlm_checkout"
27
- DEFAULT_RLM_LOCAL_CHECKOUT_CACHE_ROOT = (
28
- Path.home() / ".cache" / "verifiers" / "rlm-checkouts"
29
- )
28
+ DEFAULT_RLM_LOCAL_CHECKOUT_CACHE_ROOT = CACHE_DIR / "rlm-checkouts"
30
29
  _REQUIRED_CHECKOUT_FILES = ("install.sh", "pyproject.toml")
31
30
 
32
31
  COMPACTION_BOUNDARY_MARKER = "--- context compacted ---"
@@ -16,6 +16,7 @@ from verifiers.envs.experimental.utils.file_locks import (
16
16
  exclusive_path_lock,
17
17
  sibling_lock_path,
18
18
  )
19
+ from verifiers.utils.path_utils import CACHE_DIR
19
20
 
20
21
  _IN_USE_LOCK_SUFFIX = ".in-use.lock"
21
22
 
@@ -23,7 +24,7 @@ _IN_USE_LOCK_SUFFIX = ".in-use.lock"
23
24
  # resolved checkout's in-use lock file. See ``_acquire_in_use_lock``.
24
25
  _held_in_use_locks: dict[Path, IO] = {}
25
26
 
26
- DEFAULT_GIT_CHECKOUT_CACHE_ROOT = Path.home() / ".cache" / "verifiers" / "git-checkouts"
27
+ DEFAULT_GIT_CHECKOUT_CACHE_ROOT = CACHE_DIR / "git-checkouts"
27
28
  _FULL_COMMIT_SHA_RE = re.compile(r"^[0-9a-fA-F]{40}$")
28
29
 
29
30
  logger = logging.getLogger(__name__)
@@ -9,6 +9,18 @@ from verifiers.types import EvalConfig
9
9
  logger = logging.getLogger(__name__)
10
10
 
11
11
 
12
+ def home_dir() -> Path:
13
+ """Best-effort home directory; fall back to the temp dir so import never fails."""
14
+ try:
15
+ return Path.home()
16
+ except RuntimeError:
17
+ return Path(tempfile.gettempdir())
18
+
19
+
20
+ CACHE_DIR = home_dir() / ".cache" / "verifiers"
21
+ """User-local cache root for verifiers-managed state."""
22
+
23
+
12
24
  def write_temp_file(content: str, suffix: str = ".txt") -> str:
13
25
  """Write content to a named temporary file and return its path.
14
26
 
@@ -36,6 +36,7 @@ from acp.schema import (
36
36
  )
37
37
 
38
38
  MAX_PACKET_BYTES = 128 * 1024 * 1024
39
+ LATE_UPDATE_GRACE_SECONDS = 1.0
39
40
 
40
41
 
41
42
  class VerifiersACPClient(Client):
@@ -43,6 +44,7 @@ class VerifiersACPClient(Client):
43
44
  self.visible_reply = ""
44
45
  self.message_id: str | None = None
45
46
  self.tool_calls: dict[str, str] = {}
47
+ self.output_changed = asyncio.Condition()
46
48
 
47
49
  def reset(self) -> None:
48
50
  self.visible_reply = ""
@@ -50,22 +52,23 @@ class VerifiersACPClient(Client):
50
52
  self.tool_calls = {}
51
53
 
52
54
  async def session_update(self, session_id: str, update: Any, **kwargs: Any) -> None:
53
- if isinstance(update, ToolCall):
54
- self.tool_calls[update.tool_call_id] = update.status or "pending"
55
- return
56
- if isinstance(update, ToolCallUpdate):
57
- if update.status:
58
- self.tool_calls[update.tool_call_id] = update.status
59
- return
60
- if not isinstance(update, AgentMessageChunk) or not isinstance(
61
- update.content, TextContentBlock
62
- ):
63
- return
64
- message_id = getattr(update, "message_id", None)
65
- if message_id is not None and message_id != self.message_id:
66
- self.visible_reply = ""
67
- self.message_id = message_id
68
- self.visible_reply += update.content.text
55
+ async with self.output_changed:
56
+ if isinstance(update, ToolCall):
57
+ self.tool_calls[update.tool_call_id] = update.status or "pending"
58
+ elif isinstance(update, ToolCallUpdate):
59
+ if update.status:
60
+ self.tool_calls[update.tool_call_id] = update.status
61
+ elif isinstance(update, AgentMessageChunk) and isinstance(
62
+ update.content, TextContentBlock
63
+ ):
64
+ message_id = getattr(update, "message_id", None)
65
+ if message_id is not None and message_id != self.message_id:
66
+ self.visible_reply = ""
67
+ self.message_id = message_id
68
+ self.visible_reply += update.content.text
69
+ else:
70
+ return
71
+ self.output_changed.notify_all()
69
72
 
70
73
  async def request_permission(
71
74
  self,
@@ -172,6 +175,25 @@ async def prompt(
172
175
  except RequestError as error:
173
176
  detail = error.data.get("details") if isinstance(error.data, dict) else None
174
177
  raise RuntimeError(detail or str(error)) from error
178
+
179
+ # ACP 0.11 dispatches notifications in background tasks but resolves a request
180
+ # response directly in its receive loop. An agent that sends its final
181
+ # session/update immediately before session/prompt returns can therefore wake
182
+ # this coroutine before the update handler has run. Wait specifically for text:
183
+ # a completed tool update may also arrive first and must not hide a later reply.
184
+ def has_visible_reply() -> bool:
185
+ return bool(client.visible_reply.strip())
186
+
187
+ if not has_visible_reply():
188
+ async with client.output_changed:
189
+ try:
190
+ await asyncio.wait_for(
191
+ client.output_changed.wait_for(has_visible_reply),
192
+ timeout=LATE_UPDATE_GRACE_SECONDS,
193
+ )
194
+ except asyncio.TimeoutError: # noqa: UP041 - Python 3.10 compatibility
195
+ pass
196
+
175
197
  tool_statuses = list(client.tool_calls.values())
176
198
  completed_tool_turn = (
177
199
  config.get("allow_empty_tool_reply", False)
@@ -179,7 +201,7 @@ async def prompt(
179
201
  and bool(tool_statuses)
180
202
  and all(status in ("completed", "failed") for status in tool_statuses)
181
203
  )
182
- if not client.visible_reply.strip() and not completed_tool_turn:
204
+ if not has_visible_reply() and not completed_tool_turn:
183
205
  raise RuntimeError(
184
206
  "ACP agent produced no visible reply "
185
207
  f"(stop_reason={response.stop_reason}, tool_statuses={tool_statuses})"
@@ -13,7 +13,7 @@ from verifiers.v1.runtimes.limiters import creation_limiter
13
13
  from verifiers.v1.utils.aio import run_shielded
14
14
 
15
15
  # The prime_tunnel service caps tunnel starts at 512/min per API token — a property of the
16
- # tunnel service, shared by every process on the host that opens one. One host-global
16
+ # tunnel service, shared by every process for the user that opens one. One user-global
17
17
  # limiter, not a per-runtime config knob.
18
18
  _TUNNELS_PER_MIN = 512
19
19
  TUNNEL_LIMITER = creation_limiter(_TUNNELS_PER_MIN / 60, "prime-tunnel")
@@ -30,7 +30,7 @@ class PrimeTunnel(Tunnel[PrimeTunnelConfig]):
30
30
  @contextlib.asynccontextmanager
31
31
  async def expose(self, port: int) -> AsyncIterator[str]:
32
32
  """Bridge the host `port` to a public URL via prime_tunnel (frpc). Tunnel creation
33
- is network-bound and globally rate-capped (512/min, host-wide via the shared
33
+ is network-bound and globally rate-capped (512/min, user-wide via the shared
34
34
  `TUNNEL_LIMITER`), so transient failures are retried; a terminal one raises
35
35
  `TunnelError`. The tunnel is torn down on exit."""
36
36
  from prime_tunnel import Tunnel as TunnelClient
@@ -1,41 +1,45 @@
1
- """Host-global creation-rate limiters for the remote runtimes.
1
+ """User-global creation-rate limiters for the remote runtimes.
2
2
 
3
- A leaky bucket backed by a lock file, so a provider's per-account creation rate (Modal
4
- sandboxes, Prime tunnels) is enforced across EVERY process on the host — the single-process
5
- eval and all the elastically-spawned env-server worker processes alike — not just within one
6
- process. So the configured rate is the actual account-wide rate (assuming one env-server
7
- host). Keyed by name: one bucket file per name, shared by every process (and run) on the host.
3
+ A leaky bucket backed by a lock file under the user cache (``~/.cache/verifiers``, falling
4
+ back to the temp dir when no home is resolvable), so a provider's per-account creation rate
5
+ (Modal sandboxes, Prime tunnels) is enforced across EVERY process for the user —
6
+ the single-process eval and all the elastically-spawned env-server worker processes alike — not
7
+ just within one process. Keyed by name: one bucket file per name, shared by every process (and
8
+ run) for the user.
8
9
  """
9
10
 
10
11
  import asyncio
11
12
  import fcntl
12
13
  import os
13
- import tempfile
14
14
  import time
15
15
  from typing import Self
16
16
 
17
- _LIMITER_DIR = os.path.join(tempfile.gettempdir(), "vf-rate-limiters")
17
+ from verifiers.utils.path_utils import CACHE_DIR
18
+
19
+ LIMITER_DIR = CACHE_DIR / "limiter"
18
20
 
19
21
 
20
22
  class CreationLimiter:
21
23
  """An async leaky bucket shared across processes via a lock file: each `async with`
22
24
  reserves the next `1/per_sec`-spaced slot (advancing the on-disk cursor under an exclusive
23
- flock) and sleeps until it, so the aggregate creation rate across all host processes stays
24
- at `per_sec`. The reservation runs off the event loop; the wait does not hold the lock."""
25
+ flock) and sleeps until it, so the aggregate creation rate across all of the user's
26
+ processes stays at `per_sec`. The reservation runs off the event loop; the wait does not
27
+ hold the lock."""
25
28
 
26
29
  def __init__(self, name: str, per_sec: float) -> None:
27
30
  self._interval = 1 / per_sec
28
- self._path = os.path.join(_LIMITER_DIR, f"{name}.bucket")
31
+ self._path = LIMITER_DIR / f"{name}.bucket"
29
32
 
30
33
  def _reserve(self) -> float:
31
- os.makedirs(_LIMITER_DIR, exist_ok=True)
32
- # monotonic is host-wide on Linux, so the cursor is comparable across processes.
34
+ os.makedirs(LIMITER_DIR, exist_ok=True)
35
+ # Wall clock persists across reboots (monotonic does not), so a cursor left in
36
+ # ~/.cache from a previous boot cannot turn into a huge stale wait.
33
37
  with open(self._path, "a+") as f:
34
38
  fcntl.flock(f.fileno(), fcntl.LOCK_EX)
35
39
  try:
36
40
  f.seek(0)
37
41
  data = f.read().strip()
38
- now = time.monotonic()
42
+ now = time.time()
39
43
  slot = max(now, float(data) if data else 0.0)
40
44
  f.seek(0)
41
45
  f.truncate()
@@ -59,7 +63,7 @@ _creation_limiters: dict[str, CreationLimiter] = {}
59
63
 
60
64
 
61
65
  def creation_limiter(per_sec: float | None, name: str) -> CreationLimiter | None:
62
- """A host-global limiter pacing `name`'s creation to `per_sec`/s (None/<= 0 disables).
66
+ """A user-global limiter pacing `name`'s creation to `per_sec`/s (None/<= 0 disables).
63
67
 
64
68
  All callers (and processes) sharing a `name` share one bucket, so use one rate per name."""
65
69
  if not per_sec or per_sec <= 0:
@@ -53,7 +53,7 @@ class ModalConfig(BaseConfig):
53
53
  """Disk in GB. Modal sandboxes have no disk knob, so this is accepted (so a task can
54
54
  declare it without a warning) but not enforced."""
55
55
  creates_per_sec: float | None = 40.0
56
- """Pace sandbox creation to this many per second, enforced host-wide across every
56
+ """Pace sandbox creation to this many per second, enforced user-wide across every
57
57
  env-server worker process (None/<= 0 disables it)."""
58
58
 
59
59
 
@@ -66,7 +66,7 @@ class PrimeConfig(NetworkPolicyConfig):
66
66
  idle_timeout: float | None = 3600
67
67
  """Seconds of inactivity before the sandbox self-deletes (None disables)."""
68
68
  creates_per_min: int | None = None
69
- """Pace sandbox creation to this many per minute, enforced host-wide across every
69
+ """Pace sandbox creation to this many per minute, enforced user-wide across every
70
70
  env-server worker process (None/<= 0 disables it). (Tunnel creation is limited separately
71
71
  and globally — see interception.tunnel.prime.TUNNEL_LIMITER.)"""
72
72
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev93
3
+ Version: 0.2.2.dev95
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
@@ -52,7 +52,7 @@ verifiers/envs/experimental/composable/harnesses/__init__.py,sha256=cL29z-h8RY8v
52
52
  verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py,sha256=-oJ4Nz2DZOzMEbVtxgcGvnzAZYXt-pdz3B-6hNsoU2A,8882
53
53
  verifiers/envs/experimental/composable/harnesses/opencode.py,sha256=u7raPlUrAL2C_nX4WTAt-1dWkEVR5iLeQhvjXJB3Pkk,10338
54
54
  verifiers/envs/experimental/composable/harnesses/prompt.txt,sha256=dpQFIXxhad0EFZ0SeYuRvt5upTrhfb-d4BxfRL-i0OY,1633
55
- verifiers/envs/experimental/composable/harnesses/rlm.py,sha256=aIjYcvjhp4C7RWcJQ2Hb-dhYU5lcZ8V-e4YYZXZnh24,13081
55
+ verifiers/envs/experimental/composable/harnesses/rlm.py,sha256=keRKbNK1zsCqxewlbp-8cCQHgC2L90GyPJxNOcp7EY8,13095
56
56
  verifiers/envs/experimental/composable/tasksets/__init__.py,sha256=5VKUn5W11Ekx6Issyg0l5rs1n0kNapJYPAIpVnaNBsg,1995
57
57
  verifiers/envs/experimental/composable/tasksets/cp/__init__.py,sha256=Aj5uBcEbzkgmBz5ZX7Wl044fEJcFxS0q0CZqs-SU75s,92
58
58
  verifiers/envs/experimental/composable/tasksets/cp/cp_task.py,sha256=aODpFS85pVqArflN0IZ22dA-u_oGH_cB4X-RjvFnuuo,7882
@@ -92,7 +92,7 @@ verifiers/envs/experimental/harbor_env/env.py,sha256=ObexUEWqPRDnjbnDmDi4zo4frWK
92
92
  verifiers/envs/experimental/harbor_env/mcp.py,sha256=_XrwnqnkIHUp_GA6sMua5cMTLm0boD-EJulQ8KqVTxw,12343
93
93
  verifiers/envs/experimental/utils/__init__.py,sha256=MLspkUZeGYH3TNv8FXIq2knBEnUAS8bvkK4pMXeKs7M,575
94
94
  verifiers/envs/experimental/utils/file_locks.py,sha256=S6e4Z8lFSepp-Bbvl3xA4uT9WbcuyI_6ZcV8k0q9DXc,1424
95
- verifiers/envs/experimental/utils/git_checkout_cache.py,sha256=wt0EqNQGZMVVWr0ERY67dHunpoKfLSaXp09FPj0bhKI,12117
95
+ verifiers/envs/experimental/utils/git_checkout_cache.py,sha256=iEZIJIbYV-6RBleHoPZPHQ8zDIPiZBGcH3RSdYRxjf4,12139
96
96
  verifiers/envs/integrations/README.md,sha256=trk8lpwTq7uCQBIbid8aNa4O0Q5YnQWmx-X7xQsZQHM,7226
97
97
  verifiers/envs/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  verifiers/envs/integrations/openenv_env.py,sha256=MrthKsss3QmuphyW4cHLH14yXBGilRiXtZs4Vn5rzIw,35745
@@ -156,7 +156,7 @@ verifiers/utils/interception_utils.py,sha256=JFppjEGmx2bWcX8VOMjd786DcStkt0xhBTY
156
156
  verifiers/utils/logging_utils.py,sha256=ORhY77WdhjhExTC8ckXBMubVt-bLwzETYKzZL-zuH9U,8529
157
157
  verifiers/utils/message_utils.py,sha256=c1orN5CVFSK4Hk2ai__LhBV4xboZcSyyWtpltAt15w4,17884
158
158
  verifiers/utils/metric_utils.py,sha256=sdjoixAwjcRBfRHPKH33RSrPB8HVpLXlGa9CzvB8Z-o,6825
159
- verifiers/utils/path_utils.py,sha256=DU1xOkGUWuQZ6d4LoDI8Thh5blmPCSa3OQXQP67YKLg,6077
159
+ verifiers/utils/path_utils.py,sha256=s0Nnx2x2sXqDQ5Ml7vVwteLHnXa8ZsFAgVevF2NON28,6401
160
160
  verifiers/utils/pricing_utils.py,sha256=V5FaqVUOL02z7JDy4NtPe98UZ9OC-5Sd0oMHSZlwwvg,5156
161
161
  verifiers/utils/process_utils.py,sha256=tFizSYGIUFieg4eGP3dYM2EonB2qmlCzl5EZX8qjmak,2873
162
162
  verifiers/utils/response_utils.py,sha256=E3CrgZ9N_6pCQGxQEI78xAHH0LUGK6utuI01g5Q1NEk,5579
@@ -184,7 +184,7 @@ verifiers/v1/taskset.py,sha256=fp2E0IEhL_Ybj9cegZwljfTmW27p_30zTWHFKw_kXE4,4374
184
184
  verifiers/v1/trace.py,sha256=zhNlt_DLsQAydDnq6o_aQSKujqndNwG0qfgBwp-ez_g,20374
185
185
  verifiers/v1/types.py,sha256=1PxamJspmoTc3OlFZAwH6o_2i_Tg9ZNvHxttIHWIxq8,8948
186
186
  verifiers/v1/acp/__init__.py,sha256=RusAr7bFDHOjQc3mgqnADfhgen9bJlyLs8wQke2fUUs,11675
187
- verifiers/v1/acp/runner.py,sha256=4VWM-KWS7jD2tuU_CxO4wwnYNrii6hTDawX_4q4qoLc,14730
187
+ verifiers/v1/acp/runner.py,sha256=0gvXv8BWA2Uih5b3mvMGu-9K2v_KOGJD5vUBMJSd8iU,15820
188
188
  verifiers/v1/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
189
  verifiers/v1/cli/debug.py,sha256=WGCiapH2CCwyPfESca5623-_csQv93PoglR8yX5-D3g,11488
190
190
  verifiers/v1/cli/gepa.py,sha256=hLIbS_4jBx0vvy4PXoePR5riFXcNvzQCMixZ-g2OR_U,4026
@@ -287,7 +287,7 @@ verifiers/v1/interception/server.py,sha256=jJmAkzQpDOEQggJNwCQlJlboMZFrsoF0YpuL7
287
287
  verifiers/v1/interception/tunnel/__init__.py,sha256=eVNZJszj6myrKhx9jmJz7VRd9qlfj0AUvUZwI2bXEj8,893
288
288
  verifiers/v1/interception/tunnel/base.py,sha256=DZB6uPLwM4Qy7n7m0vKeyg-Px87MhsmpYTpe2vpPEng,1998
289
289
  verifiers/v1/interception/tunnel/custom.py,sha256=yL4UbGf4bAuMsxk42mEP-t1wITQCT8BE9FHQIz0qRMA,1708
290
- verifiers/v1/interception/tunnel/prime.py,sha256=PP3Be3PfbfsLlhF4FfpsZt7IkiYiC1DBF-EidlKQio4,2530
290
+ verifiers/v1/interception/tunnel/prime.py,sha256=0CjoQ2YoxwRUFRU1BftNgqGvqFlbM5is8KaWGrD7eQ0,2531
291
291
  verifiers/v1/judges/__init__.py,sha256=MUIBWcx6c70BykrTDHhB0ITIyJPxXe6xDBou4VM7jDQ,286
292
292
  verifiers/v1/judges/reference.py,sha256=iEVHw-iJ6dbwLOOqrvWrEMJOcUEYJ0YspT04rZz7Sd4,3868
293
293
  verifiers/v1/judges/reference.txt,sha256=Ej35kGXiT2uJ0LcHIeez49rCS_9uHmCQKoVdn93V6A8,353
@@ -299,9 +299,9 @@ verifiers/v1/mcp/server.py,sha256=dRBxytFgS6rv1BS6t5EgBd3xeF6U1nTyt0ArDCLk3VE,12
299
299
  verifiers/v1/mcp/toolset.py,sha256=T8Ioiq4wphxVOTHUDf28ZoQBM2ZYEevGnGgw8TFEMiA,1002
300
300
  verifiers/v1/runtimes/__init__.py,sha256=Tt1x_rS08R_5f6vkqW0EmrhXRXQAp23czHyoFrWSPHM,2671
301
301
  verifiers/v1/runtimes/base.py,sha256=lqTTnJk-NcN18QTP9lDIqkSKRCw8lK_jZXN1THpGl98,17175
302
- verifiers/v1/runtimes/limiters.py,sha256=ZjjYUFEt20yH8ggL5uU9w9U500AOB44qSUTQ7bYyh0c,2730
303
- verifiers/v1/runtimes/modal.py,sha256=QMNVQtiTTN6ZDiS-TA3nJZGfZw_HVlkuxHvPx55Yk8Q,12591
304
- verifiers/v1/runtimes/prime.py,sha256=QtDtkZITorFdHyWSr-i37RB7HStZ9pxp-I-I6zkkZmA,16240
302
+ verifiers/v1/runtimes/limiters.py,sha256=F8HD3Sbn7XFum9cblUzvtDnyVKA1LnoYwi_J-GHUIzQ,2814
303
+ verifiers/v1/runtimes/modal.py,sha256=XLCXLXYee7-6xY9kg2CFd-o83ztwYZESW1WAa5bJZ3A,12591
304
+ verifiers/v1/runtimes/prime.py,sha256=FZ0ePwcpooWcviUbobbpJjE9bF_61cXGe4BWjCYlMqw,16240
305
305
  verifiers/v1/runtimes/subprocess.py,sha256=4WBdLJrDF347FDGqTcazBVb2g_jRw0Q0r3AlCbqy9PE,7552
306
306
  verifiers/v1/runtimes/docker/__init__.py,sha256=LvClYPNVchcrnW2wVbOhi8-bzXUu3E4hdwZv2iNMrXQ,20346
307
307
  verifiers/v1/runtimes/docker/egress.py,sha256=37UXgNX9gnoLxjMg4KZaJIGoApCAM6MK22eJGNoMi38,14514
@@ -339,8 +339,8 @@ verifiers/v1/utils/platform.py,sha256=56Ixmk1SER6q5LvzyYcA0hgzGpzhxKZL8Hiqp4c_XV
339
339
  verifiers/v1/utils/retries.py,sha256=Y2ZgrAjn-qNkRKZP_RVNL_7EK0iaRcZeCa404lpGYi4,5417
340
340
  verifiers/v1/utils/score.py,sha256=-R5Cog14r_tJ6Q_oOfGr5VPAm2CCUhofYZB6B9lm4wM,5787
341
341
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
342
- verifiers-0.2.2.dev93.dist-info/METADATA,sha256=_pdVCoMMm12f8FgJJ76WMoSn3VPNGpiVng843RMPErc,4545
343
- verifiers-0.2.2.dev93.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
344
- verifiers-0.2.2.dev93.dist-info/entry_points.txt,sha256=v6v0QT9vVExnfn4br42MostI_o3f3ZbWYlTormz-U3g,515
345
- verifiers-0.2.2.dev93.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
346
- verifiers-0.2.2.dev93.dist-info/RECORD,,
342
+ verifiers-0.2.2.dev95.dist-info/METADATA,sha256=HuZdKHuTiRsuQppcAhe3smS-Rz-Czj0iFJKNXBYfKzY,4545
343
+ verifiers-0.2.2.dev95.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
344
+ verifiers-0.2.2.dev95.dist-info/entry_points.txt,sha256=v6v0QT9vVExnfn4br42MostI_o3f3ZbWYlTormz-U3g,515
345
+ verifiers-0.2.2.dev95.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
346
+ verifiers-0.2.2.dev95.dist-info/RECORD,,