scamscript 0.4.0__tar.gz → 0.4.1__tar.gz

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.
Files changed (61) hide show
  1. {scamscript-0.4.0 → scamscript-0.4.1}/CHANGELOG.md +7 -0
  2. {scamscript-0.4.0 → scamscript-0.4.1}/PKG-INFO +15 -1
  3. {scamscript-0.4.0 → scamscript-0.4.1}/README.md +14 -0
  4. {scamscript-0.4.0 → scamscript-0.4.1}/pyproject.toml +1 -1
  5. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/__init__.py +1 -1
  6. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/client.py +1 -1
  7. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_cli.py +1 -1
  8. {scamscript-0.4.0 → scamscript-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  9. {scamscript-0.4.0 → scamscript-0.4.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  10. {scamscript-0.4.0 → scamscript-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  11. {scamscript-0.4.0 → scamscript-0.4.1}/.github/SECURITY.md +0 -0
  12. {scamscript-0.4.0 → scamscript-0.4.1}/.github/pull_request_template.md +0 -0
  13. {scamscript-0.4.0 → scamscript-0.4.1}/.github/workflows/ci.yml +0 -0
  14. {scamscript-0.4.0 → scamscript-0.4.1}/.github/workflows/release.yml +0 -0
  15. {scamscript-0.4.0 → scamscript-0.4.1}/.gitignore +0 -0
  16. {scamscript-0.4.0 → scamscript-0.4.1}/CITATION.cff +0 -0
  17. {scamscript-0.4.0 → scamscript-0.4.1}/CODE_OF_CONDUCT.md +0 -0
  18. {scamscript-0.4.0 → scamscript-0.4.1}/CONTRIBUTING.md +0 -0
  19. {scamscript-0.4.0 → scamscript-0.4.1}/LICENSE +0 -0
  20. {scamscript-0.4.0 → scamscript-0.4.1}/docs/banner.svg +0 -0
  21. {scamscript-0.4.0 → scamscript-0.4.1}/docs/calibration.md +0 -0
  22. {scamscript-0.4.0 → scamscript-0.4.1}/docs/demo.gif +0 -0
  23. {scamscript-0.4.0 → scamscript-0.4.1}/docs/sample-report.md +0 -0
  24. {scamscript-0.4.0 → scamscript-0.4.1}/docs/social-preview.png +0 -0
  25. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/fake_output_json.txt +0 -0
  26. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/fence_escape.txt +0 -0
  27. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/fixed_attack_type.txt +0 -0
  28. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/non_json_demand.txt +0 -0
  29. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/print_system_prompt.txt +0 -0
  30. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/role_switch.txt +0 -0
  31. {scamscript-0.4.0 → scamscript-0.4.1}/examples/adversarial/score_override.txt +0 -0
  32. {scamscript-0.4.0 → scamscript-0.4.1}/examples/crude_robocall.txt +0 -0
  33. {scamscript-0.4.0 → scamscript-0.4.1}/examples/gov_impersonation_vishing.txt +0 -0
  34. {scamscript-0.4.0 → scamscript-0.4.1}/examples/prompt_injection_script.txt +0 -0
  35. {scamscript-0.4.0 → scamscript-0.4.1}/examples/romance_scam_sms.txt +0 -0
  36. {scamscript-0.4.0 → scamscript-0.4.1}/examples/sophisticated_wire_fraud.txt +0 -0
  37. {scamscript-0.4.0 → scamscript-0.4.1}/examples/tech_support_scam.txt +0 -0
  38. {scamscript-0.4.0 → scamscript-0.4.1}/scripts/calibrate.py +0 -0
  39. {scamscript-0.4.0 → scamscript-0.4.1}/scripts/injection_eval.py +0 -0
  40. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/__main__.py +0 -0
  41. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/analysis.py +0 -0
  42. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/cli.py +0 -0
  43. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/config.py +0 -0
  44. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/ingest.py +0 -0
  45. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/models.py +0 -0
  46. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/prompts.py +0 -0
  47. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/redact.py +0 -0
  48. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/render.py +0 -0
  49. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/report.py +0 -0
  50. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/store.py +0 -0
  51. {scamscript-0.4.0 → scamscript-0.4.1}/src/scamscript/verify.py +0 -0
  52. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_analysis.py +0 -0
  53. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_client.py +0 -0
  54. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_ingest.py +0 -0
  55. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_models.py +0 -0
  56. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_prompts.py +0 -0
  57. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_redact.py +0 -0
  58. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_render.py +0 -0
  59. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_report.py +0 -0
  60. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_store.py +0 -0
  61. {scamscript-0.4.0 → scamscript-0.4.1}/tests/test_verify.py +0 -0
@@ -5,6 +5,13 @@ schema are the things that count as public API.
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 0.4.1 - 2026-11-02
9
+
10
+ ### Fixed
11
+
12
+ - README lost the scale and spend section during an earlier edit; restored so the new flags are
13
+ documented where people look.
14
+
8
15
  ## 0.4.0 - 2026-11-02
9
16
 
10
17
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scamscript
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
4
  Summary: Reverse-engineer scam scripts and vishing transcripts into structured counter-playbooks
5
5
  Project-URL: Homepage, https://github.com/sjdsjadjajdjsa/scamscript
6
6
  Project-URL: Repository, https://github.com/sjdsjadjajdjsa/scamscript
@@ -140,6 +140,20 @@ Rich output on stderr, so it pipes:
140
140
  scamscript --json batch examples | jq -s 'map(select(.event == "result")) | length'
141
141
  ```
142
142
 
143
+ ## Scale and spend
144
+
145
+ `--concurrency N` runs up to 16 analyses at once and keeps output in script order. `--max-cost`
146
+ stops scheduling new scripts once the provider reports that much spend, marks the remainder skipped
147
+ and still exits zero when nothing failed.
148
+
149
+ ```bash
150
+ scamscript --concurrency 6 --max-cost 0.25 batch corpus/ --output report.md
151
+ ```
152
+
153
+ The cap reads `usage.cost` from the response, so it works only where the provider reports cost and
154
+ says so when none is sent. Spend is printed and logged per run. In-flight requests can overshoot by
155
+ up to the concurrency, so keep headroom on a hard limit.
156
+
143
157
  ## How it works
144
158
 
145
159
  ```text
@@ -104,6 +104,20 @@ Rich output on stderr, so it pipes:
104
104
  scamscript --json batch examples | jq -s 'map(select(.event == "result")) | length'
105
105
  ```
106
106
 
107
+ ## Scale and spend
108
+
109
+ `--concurrency N` runs up to 16 analyses at once and keeps output in script order. `--max-cost`
110
+ stops scheduling new scripts once the provider reports that much spend, marks the remainder skipped
111
+ and still exits zero when nothing failed.
112
+
113
+ ```bash
114
+ scamscript --concurrency 6 --max-cost 0.25 batch corpus/ --output report.md
115
+ ```
116
+
117
+ The cap reads `usage.cost` from the response, so it works only where the provider reports cost and
118
+ says so when none is sent. Spend is printed and logged per run. In-flight requests can overshoot by
119
+ up to the concurrency, so keep headroom on a hard limit.
120
+
107
121
  ## How it works
108
122
 
109
123
  ```text
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "scamscript"
7
- version = "0.4.0"
7
+ version = "0.4.1"
8
8
  description = "Reverse-engineer scam scripts and vishing transcripts into structured counter-playbooks"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,3 +1,3 @@
1
1
  """scamscript: reverse-engineering analyzer for scam call scripts."""
2
2
 
3
- __version__ = "0.4.0"
3
+ __version__ = "0.4.1"
@@ -63,7 +63,7 @@ class ChatClient:
63
63
  "Authorization": f"Bearer {api_key}",
64
64
  "Content-Type": "application/json",
65
65
  "Accept": "application/json",
66
- "User-Agent": "scamscript/0.4.0",
66
+ "User-Agent": "scamscript/0.4.1",
67
67
  },
68
68
  )
69
69
 
@@ -228,7 +228,7 @@ def test_dry_run_without_endpoint(home, tmp_path, monkeypatch):
228
228
  def test_version(home):
229
229
  result = runner.invoke(cli.app, ["--version"])
230
230
  assert result.exit_code == 0
231
- assert result.stdout.strip() == "scamscript 0.4.0"
231
+ assert result.stdout.strip() == "scamscript 0.4.1"
232
232
 
233
233
 
234
234
  def test_json_output_is_one_object_per_script(home, tmp_path, fake):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes