qaas-python 0.2.2__py3-none-any.whl → 0.2.3__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.
qaas/cli.py CHANGED
@@ -500,14 +500,18 @@ def validate(config_dir: Path | None = ConfigDir) -> None:
500
500
  # never dispatched. The mode meant for every pull request could not file a
501
501
  # ticket. It took a live run to notice; this check makes it free.
502
502
  for mode_name, mode in sorted(cfg.run_modes.items()):
503
- needed = sum(
504
- cfg.agents[a].max_budget_usd for a in mode.agents if a in cfg.agents
505
- )
506
- if needed > mode.max_budget_usd:
503
+ # Only meaningful when both sides declare a cap. The shipped config
504
+ # declares none, so this check simply does not fire there.
505
+ agent_caps = [
506
+ cfg.agents[a].max_budget_usd for a in mode.agents
507
+ if a in cfg.agents and cfg.agents[a].max_budget_usd is not None
508
+ ]
509
+ needed = sum(agent_caps)
510
+ if mode.max_budget_usd is not None and agent_caps and needed > mode.max_budget_usd:
507
511
  missing = [a for a in mode.agents if a in cfg.agents][-1]
508
512
  problems.append(
509
- f"mode '{mode_name}': agents can spend ${needed:.2f} but the cap is "
510
- f"${mode.max_budget_usd:.2f}, so the run stops before it reaches "
513
+ f"mode '{mode_name}': the agents' caps exceed the mode's cap, so "
514
+ f"its cap, so the run stops before it reaches "
511
515
  f"{missing} and files nothing. Raise max_budget_usd or drop an agent"
512
516
  )
513
517
 
@@ -567,7 +571,7 @@ def validate(config_dir: Path | None = ConfigDir) -> None:
567
571
  filing = "" if rm.files_tickets else " [dim](no filing)[/dim]"
568
572
  console.print(
569
573
  f"[bold]{mode}[/bold]: {', '.join(rm.agents)} "
570
- f"[dim]budget ${rm.max_budget_usd:.2f}, {rm.max_wall_clock_s}s[/dim]{filing}"
574
+ f"[dim]{rm.max_wall_clock_s}s[/dim]{filing}"
571
575
  )
572
576
 
573
577
  if notes:
@@ -834,7 +838,7 @@ def runs(root: Path = Root, limit: int = 10) -> None:
834
838
  console.print("[dim]no runs yet[/dim]")
835
839
  return
836
840
  table = Table(header_style="bold")
837
- for col in ("run", "envelopes", "agents", "cost"):
841
+ for col in ("run", "envelopes", "agents"):
838
842
  table.add_column(col)
839
843
  for run_id in ids:
840
844
  store = RunStore(run_id, root)
@@ -843,7 +847,6 @@ def runs(root: Path = Root, limit: int = 10) -> None:
843
847
  run_id,
844
848
  str(len(store.envelopes())),
845
849
  str(len(results)),
846
- f"${store.total_cost_usd():.2f}",
847
850
  )
848
851
  console.print(table)
849
852
 
@@ -872,9 +875,6 @@ def show(run_id: str, root: Path = Root) -> None:
872
875
  header.append(f"started {summary.started:%Y-%m-%d %H:%M:%S}Z")
873
876
  if summary.duration_s is not None:
874
877
  header.append(f"duration {summary.duration_s:.0f}s")
875
- header.append(f"cost ${summary.cost_usd:.2f}")
876
- if summary.budget_usd:
877
- header.append(f"of ${summary.budget_usd:.2f} budget")
878
878
  console.print(" " + " ".join(header))
879
879
  if summary.target_sha:
880
880
  dirty = " [yellow](dirty tree)[/yellow]" if summary.target_dirty else ""
@@ -960,7 +960,6 @@ def trace(
960
960
  table.add_column("agent", style="cyan")
961
961
  table.add_column("kind")
962
962
  table.add_column("detail", overflow="fold")
963
- table.add_column("cost", justify="right", style="dim")
964
963
  for row in trace_mod.timeline(entries):
965
964
  label = f"{row.kind} ×{row.count}" if row.count > 1 else row.kind
966
965
  table.add_row(
@@ -968,7 +967,6 @@ def trace(
968
967
  row.agent,
969
968
  f"[{KIND_STYLE.get(row.kind, 'white')}]{label}[/]",
970
969
  row.detail,
971
- f"${row.cost_usd:.2f}" if row.cost_usd is not None else "",
972
970
  )
973
971
  console.print(table)
974
972
  console.print(f"\n[dim]{len(entries)} entries[/dim]")
@@ -1082,7 +1080,7 @@ def run(
1082
1080
  rm = cfg.run_modes[mode]
1083
1081
  console.print(
1084
1082
  f"[bold]{mode}[/bold] — {len(specs)} agents, "
1085
- f"budget ${rm.max_budget_usd:.2f}, concurrency {rm.max_concurrency}"
1083
+ f"concurrency {rm.max_concurrency}"
1086
1084
  )
1087
1085
 
1088
1086
  if dry_run:
@@ -1093,7 +1091,7 @@ def run(
1093
1091
  d = describe(spec, prompt_dirs)
1094
1092
  console.print(
1095
1093
  f" [bold]{spec.name:14s}[/bold] {spec.model:18s} effort={spec.effort:7s} "
1096
- f"turns<={spec.max_turns:<3d} ${spec.max_budget_usd:.2f}"
1094
+ f"turns<={spec.max_turns}"
1097
1095
  )
1098
1096
  console.print(f" tools: {', '.join(d['allowed_tools'])}")
1099
1097
  console.print(f" prompt: {d['prompt_chars']} chars")
@@ -1101,11 +1099,11 @@ def run(
1101
1099
 
1102
1100
  def on_event(kind: str, detail: dict) -> None:
1103
1101
  if kind == "agent_started":
1104
- console.print(f"[dim]->[/dim] {detail.get('agent')} [dim](${detail.get('budget', 0):.2f})[/dim]")
1102
+ console.print(f"[dim]->[/dim] {detail.get('agent')}")
1105
1103
  elif kind == "finished":
1106
1104
  console.print(
1107
1105
  f"[dim]<-[/dim] {detail.get('agent')} "
1108
- f"[dim]${detail.get('cost', 0):.3f}, {detail.get('envelopes', 0)} findings[/dim]"
1106
+ f"[dim]{detail.get('envelopes', 0)} findings[/dim]"
1109
1107
  )
1110
1108
  elif kind == "stopped":
1111
1109
  console.print(f"[yellow]stopped: {detail.get('reason')}[/yellow]")
@@ -1172,11 +1170,6 @@ def score(
1172
1170
  table.add_row("false positives", f"{s['false_positives']} ({s['false_positive_rate']:.0%})")
1173
1171
  table.add_row("duplicates", f"{s['duplicates']} ({s['duplicate_rate']:.0%})")
1174
1172
  table.add_row("severity agreement", f"{s['severity_agreement']:.0%}")
1175
- table.add_row("cost", f"${s['cost_usd']:.2f}")
1176
- table.add_row(
1177
- "cost per accepted",
1178
- f"${s['cost_per_accepted']:.2f}" if s["cost_per_accepted"] is not None else "-",
1179
- )
1180
1173
  console.print(table)
1181
1174
 
1182
1175
  if card.matches:
qaas/conductor.py CHANGED
@@ -110,7 +110,7 @@ class RunReport:
110
110
  class Budget:
111
111
  """The spend and wall-clock governor. Checked before every dispatch."""
112
112
 
113
- def __init__(self, max_usd: float, max_seconds: int, *, already_spent: float = 0.0):
113
+ def __init__(self, max_usd: float | None, max_seconds: int, *, already_spent: float = 0.0):
114
114
  self.max_usd = max_usd
115
115
  self.max_seconds = max_seconds
116
116
  #: What this run has already cost, including earlier invocations.
@@ -130,23 +130,28 @@ class Budget:
130
130
  return time.monotonic() - self.started
131
131
 
132
132
  @property
133
- def remaining_usd(self) -> float:
134
- return max(0.0, self.max_usd - self.spent)
133
+ def remaining_usd(self) -> float | None:
134
+ return None if self.max_usd is None else max(0.0, self.max_usd - self.spent)
135
135
 
136
136
  def spend(self, amount: float) -> None:
137
137
  self.spent += amount
138
138
 
139
139
  def check(self) -> None:
140
- if self.spent >= self.max_usd:
140
+ # `max_usd is None` means no spend ceiling -- the shipped config sets
141
+ # none, because a dollar figure bakes one vendor's pricing into a tool
142
+ # meant to run against local models too. The wall-clock cap and each
143
+ # agent's `max_turns` still bound a run; those are model-agnostic.
144
+ if self.max_usd is not None and self.spent >= self.max_usd:
141
145
  raise BudgetExceeded(f"spend cap reached: ${self.spent:.2f} of ${self.max_usd:.2f}")
142
146
  if self.elapsed >= self.max_seconds:
143
147
  raise BudgetExceeded(
144
148
  f"wall-clock cap reached: {self.elapsed:.0f}s of {self.max_seconds}s"
145
149
  )
146
150
 
147
- def allowance(self, spec: AgentSpec) -> float:
148
- """What this agent may spend: its own cap, or what the run has left."""
149
- return max(0.01, min(spec.max_budget_usd, self.remaining_usd))
151
+ def allowance(self, spec: AgentSpec) -> float | None:
152
+ """What this agent may spend, or None when neither it nor the run caps it."""
153
+ caps = [c for c in (spec.max_budget_usd, self.remaining_usd) if c is not None]
154
+ return max(0.01, min(caps)) if caps else None
150
155
 
151
156
 
152
157
  class Conductor:
qaas/config.py CHANGED
@@ -74,7 +74,8 @@ class AgentSpec(BaseModel):
74
74
  model: str = "claude-opus-5"
75
75
  effort: Literal["low", "medium", "high", "xhigh", "max"] = "high"
76
76
  max_turns: int = 40
77
- max_budget_usd: float = 2.0
77
+ max_budget_usd: float | None = None
78
+
78
79
 
79
80
  mcp_servers: list[str] = Field(default_factory=list)
80
81
  builtin_tools: list[str] = Field(default_factory=list)
@@ -165,7 +166,8 @@ class RunMode(BaseModel):
165
166
 
166
167
  trigger: str
167
168
  agents: list[str]
168
- max_budget_usd: float = 10.0
169
+ max_budget_usd: float | None = None
170
+
169
171
  max_wall_clock_s: int = 3600
170
172
  max_concurrency: int = 3
171
173
  files_tickets: bool = True
@@ -9,7 +9,6 @@ prompt: ARBITER.md
9
9
  model: claude-opus-5
10
10
  effort: high
11
11
  max_turns: 50
12
- max_budget_usd: 3.0
13
12
  mcp_servers: [envelope, vcs, contract_diff, test_runner]
14
13
  builtin_tools: [Read, Grep, Glob]
15
14
  skills: [adversarial-review, root-cause-vs-symptom, regression-risk-scoring, test-quality-audit]
@@ -7,7 +7,6 @@ prompt: CARTOGRAPHER.md
7
7
  model: claude-sonnet-5 # extraction, not judgment
8
8
  effort: medium
9
9
  max_turns: 60
10
- max_budget_usd: 2.0
11
10
  mcp_servers: [envelope]
12
11
  builtin_tools: [Read, Grep, Glob]
13
12
  policy: {} # read-only
@@ -8,7 +8,6 @@ prompt: CLERK.md
8
8
  model: claude-sonnet-5 # composition against a fixed rubric and house format
9
9
  effort: high
10
10
  max_turns: 50
11
- max_budget_usd: 2.0
12
11
  mcp_servers: [envelope, tracker, defect_memory]
13
12
  builtin_tools: [Read]
14
13
  policy:
@@ -8,7 +8,6 @@ prompt: CONDUIT.md
8
8
  model: claude-opus-5
9
9
  effort: high
10
10
  max_turns: 60
11
- max_budget_usd: 3.0
12
11
  mcp_servers: [envelope, contract_diff, env_control, defect_memory]
13
12
  builtin_tools: [Read, Grep, Glob]
14
13
  policy: {}
@@ -8,7 +8,6 @@ prompt: FORGE.md
8
8
  model: claude-opus-5
9
9
  effort: high
10
10
  max_turns: 80
11
- max_budget_usd: 4.0
12
11
  mcp_servers: [envelope, test_runner, env_control, vcs]
13
12
  builtin_tools: [Read, Grep, Glob, Write, Edit, Bash]
14
13
  policy:
@@ -10,7 +10,6 @@ prompt: MENDER.md
10
10
  model: claude-opus-5
11
11
  effort: high
12
12
  max_turns: 80
13
- max_budget_usd: 5.0
14
13
  mcp_servers: [envelope, test_runner, env_control, vcs, tracker, contract_diff]
15
14
  builtin_tools: [Read, Grep, Glob, Write, Edit, Bash]
16
15
  skills: [test-first-fix, minimal-diff-discipline, root-cause-vs-symptom, rollback-plan-authoring]
@@ -8,7 +8,6 @@ prompt: PROOF.md
8
8
  model: claude-opus-5
9
9
  effort: high
10
10
  max_turns: 60
11
- max_budget_usd: 4.0
12
11
  mcp_servers: [envelope, test_runner, env_control, tracker, vcs]
13
12
  builtin_tools: [Read, Grep, Glob, Bash]
14
13
  policy:
@@ -8,7 +8,6 @@ prompt: SURFACE.md
8
8
  model: claude-opus-5
9
9
  effort: high
10
10
  max_turns: 80
11
- max_budget_usd: 4.0
12
11
  mcp_servers: [envelope, env_control, playwright]
13
12
  builtin_tools: [Read, Grep, Glob]
14
13
  policy: {}
@@ -10,7 +10,6 @@ prompt: VAULT.md
10
10
  model: claude-opus-5
11
11
  effort: high
12
12
  max_turns: 60
13
- max_budget_usd: 3.0
14
13
  mcp_servers: [envelope, env_control, defect_memory]
15
14
  builtin_tools: [Read, Grep, Glob]
16
15
  policy: {}
@@ -9,10 +9,6 @@ prompt: WARDEN.md
9
9
  model: claude-opus-5
10
10
  effort: high
11
11
  max_turns: 60
12
- # Measured: WARDEN exhausted $3.00 on its first real run against the demo app
13
- # and was killed mid-audit. Building the endpoint-by-role matrix and actually
14
- # impersonating each role costs more than reading a spec does.
15
- max_budget_usd: 5.0
16
12
  mcp_servers: [envelope, env_control, defect_memory]
17
13
  builtin_tools: [Read, Grep, Glob]
18
14
  policy: {}
@@ -9,6 +9,11 @@ target:
9
9
  tracker: local # local | jira -- swap to file against real Jira
10
10
  vcs: local # local | github
11
11
 
12
+ # No spend cap by default. A dollar figure bakes one vendor's pricing into
13
+ # the config, and this is meant to run against local models too. `max_turns`
14
+ # is the model-agnostic bound. Set `max_budget_usd` here if you want a
15
+ # ceiling; the governor enforces one whenever it is present.
16
+
12
17
  thresholds:
13
18
  min_confidence_to_file: 0.6 # §7 confidence gate
14
19
  max_findings_per_agent_run: 25 # §8.3 loop breaker: pause and escalate, don't file
@@ -21,30 +26,18 @@ run_modes:
21
26
  pr-check:
22
27
  trigger: pull_request
23
28
  agents: [CARTOGRAPHER, CONDUIT, SURFACE, FORGE, CLERK]
24
- # Was 6.0, which this roster could not complete. Measured on a real run:
25
- # CARTOGRAPHER $0.69 + CONDUIT $2.25 + SURFACE $3.16 = $6.09, so the governor
26
- # stopped the run before FORGE or CLERK ever dispatched. The mode meant to
27
- # run on every pull request could not file a ticket, and it failed silently:
28
- # agents ran, findings landed in the ledger, nothing errored. `qaas validate`
29
- # now refuses a mode whose agents cannot fit inside its cap.
30
- max_budget_usd: 16.0
31
29
  max_wall_clock_s: 900
32
30
  max_concurrency: 2
33
31
 
34
32
  nightly:
35
33
  trigger: cron
36
34
  agents: [CARTOGRAPHER, CONDUIT, SURFACE, VAULT, WARDEN, FORGE, CLERK]
37
- # FORGE runs once per finding, so the deep sweep's budget scales with how
38
- # much discovery found, not with the number of agents. Measured: discovery
39
- # ~$6, then roughly $1-2 per finding reproduced.
40
- max_budget_usd: 50.0
41
35
  max_wall_clock_s: 7200
42
36
  max_concurrency: 3
43
37
 
44
38
  incident:
45
39
  trigger: alert
46
40
  agents: [CONDUIT]
47
- max_budget_usd: 4.0
48
41
  max_wall_clock_s: 600
49
42
  max_concurrency: 2
50
43
  files_tickets: false # §9: diagnostic only, read-only, no filing
@@ -55,7 +48,6 @@ run_modes:
55
48
  fix-cycle:
56
49
  trigger: agent_ready_ticket
57
50
  agents: [PROOF, MENDER, ARBITER]
58
- max_budget_usd: 20.0
59
51
  max_wall_clock_s: 3600
60
52
  max_concurrency: 1
61
53
 
@@ -64,6 +56,5 @@ run_modes:
64
56
  full-loop:
65
57
  trigger: on_demand
66
58
  agents: [CARTOGRAPHER, CONDUIT, SURFACE, VAULT, WARDEN, FORGE, CLERK, MENDER, ARBITER, PROOF]
67
- max_budget_usd: 70.0
68
59
  max_wall_clock_s: 10800
69
60
  max_concurrency: 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: qaas-python
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: A multi-agent QA system: finds real defects, reproduces them, files tickets, fixes them, and proves the fix
5
5
  Project-URL: Homepage, https://github.com/allaabdella2-us/qa-multi-agent-system
6
6
  Project-URL: Repository, https://github.com/allaabdella2-us/qa-multi-agent-system
@@ -1,6 +1,6 @@
1
- qaas/cli.py,sha256=X8CZfVzVWxRpk3No1i-Ev0vD_Sle8Zba-b_uY9jv8c8,65366
2
- qaas/conductor.py,sha256=woPR7tGiGWTWIqikn69ucMP_C5Bjo4NGwBK6RUpE9fI,24181
3
- qaas/config.py,sha256=ZzgK0KUy7MR31w0o7fe1D2tYl--jkZCN_VaWR2kK1Xs,17528
1
+ qaas/cli.py,sha256=JFCTa5rRK9i6rIyiBhofT4Jr31FdrDDOEFnbnTRCCUo,64939
2
+ qaas/conductor.py,sha256=Ft6QVkUCSiIzHEsrsOghkQhZrSyfcfmEEUY4np6bqYw,24650
3
+ qaas/config.py,sha256=bYJuErdUutD6oFAMIFPtskShQtwol5hLKkqYA2Q8Gmo,17545
4
4
  qaas/discover.py,sha256=L5ejBsYs_s41OWAL-Dhc8VlQ5EWw2hGayWTDzfj05R8,8524
5
5
  qaas/envelope.py,sha256=IiqyOy96CHZw2A0pSDWBNIg6yQ2MzfcwkpQWmgMNvzY,9095
6
6
  qaas/guardrails.py,sha256=4JIQGFnQpQeIU92c2_E7PQFwXBnQnzolurwp6Zf-Cnk,18797
@@ -16,17 +16,17 @@ qaas/trace.py,sha256=V-uFqh1iCYRqgWL3VzDbRdHgAkwLsr1uRFfwwycWZ94,11461
16
16
  qaas/adapters/__init__.py,sha256=bw2pqtDqhZGP730gwV28BJ-8TF-rhanwCEjdIizjP6A,882
17
17
  qaas/adapters/tracker.py,sha256=K1U7weiA_K2MM58yji3WQn3PEATVqDD9_qcRbrcZwik,54348
18
18
  qaas/adapters/vcs.py,sha256=9su-4QLLxR6yTyLZWCJAky9BROJci80M5jV6nGo6pjg,19430
19
- qaas/defaults/config/system.yaml,sha256=io7NRqtiU9HLvV5dUkQn7YUNxCCzi5TOdnnQUOK5bc0,2837
20
- qaas/defaults/config/agents/arbiter.yaml,sha256=HuPv4E9-p2LW3-bzt3ard9QTJSw98HZYKf-ae6Skd1o,739
21
- qaas/defaults/config/agents/cartographer.yaml,sha256=9FWySvbwD1bHuMm8CkyaJhmrtgIJrRuRGrli_ZZa_pw,772
22
- qaas/defaults/config/agents/clerk.yaml,sha256=VgjdqROYr7khipxmou-Ol3Bv-FWj5CZENspUQDA1UB4,768
23
- qaas/defaults/config/agents/conduit.yaml,sha256=TR9pMOcD5kEzCV-t9oBZ1hS2JklnFPrWsZy9-z7Oikg,728
24
- qaas/defaults/config/agents/forge.yaml,sha256=WGwkueX0HvaKep-5m2bWR7v6Hx29bs-nuoZbfb4avWA,879
25
- qaas/defaults/config/agents/mender.yaml,sha256=-HoSJtm5GQSlozgr0O5BOvyibJanYSuJuUYhSs7MRQE,2182
26
- qaas/defaults/config/agents/proof.yaml,sha256=JbXl2yKUHRv7q-A6MEcz88E3gJn78vNxw6fdmsDbXus,853
27
- qaas/defaults/config/agents/surface.yaml,sha256=IqmWhQQYArEsNiiRKyw2uTue04CfYreHF9yxJ6z7p_Y,532
28
- qaas/defaults/config/agents/vault.yaml,sha256=Ib8gqKxW7LGSlxQ4UGWSZgJB7t78FYPQrphxKrgef1g,795
29
- qaas/defaults/config/agents/warden.yaml,sha256=iu3FHRRxsRraN68PtlfrlUqbBu4x9OIjc4F0XAjQsYQ,1002
19
+ qaas/defaults/config/system.yaml,sha256=iMOdpuA0ds3VQTFvCAzjDpXgH0ZZ0F45oVluJxNSSsM,2322
20
+ qaas/defaults/config/agents/arbiter.yaml,sha256=nRajKdxgis7YnJq6SOJ6t6Ics2SdF67D5rHfWjQjAUo,719
21
+ qaas/defaults/config/agents/cartographer.yaml,sha256=3X7Y3_xGOxLzvoV1LHupdLLLkZo_sEcVh_hBDjcSO6o,752
22
+ qaas/defaults/config/agents/clerk.yaml,sha256=PHS20Ge7BVnSiia5OTEY1WXasbXgMNaqN7iJvAwStU0,748
23
+ qaas/defaults/config/agents/conduit.yaml,sha256=haYnhoN_4nC2QVwolimY8LjVoQ67uMaJiWINgj2QbwE,708
24
+ qaas/defaults/config/agents/forge.yaml,sha256=-qk_fu0muJQdJb7coxjC780ySQ0Vscx6px_ARRGYFgU,859
25
+ qaas/defaults/config/agents/mender.yaml,sha256=Koryb7a3m9lJexxutTs0ORN3KVWKWGthqW_6nTWBgbo,2162
26
+ qaas/defaults/config/agents/proof.yaml,sha256=J_kvh851zcvT-4JBj8WwpHmwvdswG5fUe7veBGkQuFU,833
27
+ qaas/defaults/config/agents/surface.yaml,sha256=_HLA5Orb3m2Hj2tNAY5PtYciQzKimtm6B_H4LxA2noA,512
28
+ qaas/defaults/config/agents/vault.yaml,sha256=9xtggyEnP1D3Cn5HUQ5ZtbvwuQ97jAeWR56scrPxbvw,775
29
+ qaas/defaults/config/agents/warden.yaml,sha256=GGO90G71JGtkHkkoevxemjTj_-HPzj4eGcrrdKFbFsQ,763
30
30
  qaas/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  qaas/mcp/context.py,sha256=Z45wQuP0nIZOmM5GTfxs6KHxFckLQ61H4zbsVqiVqr8,2551
32
32
  qaas/mcp/contract_diff.py,sha256=efuma0WQSnxHC0NE7adF_8ctCZoovdB4k080QdiEJK8,43942
@@ -78,8 +78,8 @@ qaas/prompts/SURFACE.md,sha256=cZ9df27bXXRh39yEkwByyxvHskpcNmh6HvC9C3Jt83Y,2220
78
78
  qaas/prompts/VAULT.md,sha256=Ansowimx-wMbinQkn9_gGgZFmvmMFMc9v_N8s2Ahws4,2915
79
79
  qaas/prompts/WARDEN.md,sha256=39KsbwWRwe7mtjYEik1owBIDgu4qyD52UHG_T_7gTMw,2950
80
80
  qaas/prompts/_shared.md,sha256=lN_s_rAmakhGuyRuWItC--iyy-Er6ohT_dzGeE_g-fo,2620
81
- qaas_python-0.2.2.dist-info/METADATA,sha256=14s_84tja39SMIyEwaYPKZ_fLHtFJr9rgSpPmAykY5s,15528
82
- qaas_python-0.2.2.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
83
- qaas_python-0.2.2.dist-info/entry_points.txt,sha256=6UScfruyhP9N_xGx3tXJGkaoAiB36dkINuKyOH6OkK4,38
84
- qaas_python-0.2.2.dist-info/licenses/LICENSE,sha256=pHWke5oMtv7PLjIQbN6hRa31J0AKj51VCd5TCTUbbX0,1069
85
- qaas_python-0.2.2.dist-info/RECORD,,
81
+ qaas_python-0.2.3.dist-info/METADATA,sha256=xrDJZ-XXq8PELDmzdINfRrsI2JiGStY57LzeOA9F9X0,15528
82
+ qaas_python-0.2.3.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
83
+ qaas_python-0.2.3.dist-info/entry_points.txt,sha256=6UScfruyhP9N_xGx3tXJGkaoAiB36dkINuKyOH6OkK4,38
84
+ qaas_python-0.2.3.dist-info/licenses/LICENSE,sha256=pHWke5oMtv7PLjIQbN6hRa31J0AKj51VCd5TCTUbbX0,1069
85
+ qaas_python-0.2.3.dist-info/RECORD,,