rung-cli 0.1.2__tar.gz → 0.1.3__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 (115) hide show
  1. {rung_cli-0.1.2 → rung_cli-0.1.3}/.claude-plugin/plugin.json +1 -1
  2. {rung_cli-0.1.2 → rung_cli-0.1.3}/CHANGELOG.md +13 -1
  3. {rung_cli-0.1.2 → rung_cli-0.1.3}/PKG-INFO +27 -3
  4. {rung_cli-0.1.2 → rung_cli-0.1.3}/README.md +26 -2
  5. {rung_cli-0.1.2 → rung_cli-0.1.3}/pyproject.toml +1 -1
  6. {rung_cli-0.1.2 → rung_cli-0.1.3}/skills/setup/SKILL.md +1 -1
  7. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/__init__.py +1 -1
  8. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/property.py +12 -6
  9. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_property.py +4 -0
  10. {rung_cli-0.1.2 → rung_cli-0.1.3}/uv.lock +1 -1
  11. {rung_cli-0.1.2 → rung_cli-0.1.3}/.claude-plugin/marketplace.json +0 -0
  12. {rung_cli-0.1.2 → rung_cli-0.1.3}/.gitignore +0 -0
  13. {rung_cli-0.1.2 → rung_cli-0.1.3}/CODE_OF_CONDUCT.md +0 -0
  14. {rung_cli-0.1.2 → rung_cli-0.1.3}/CONTRIBUTING.md +0 -0
  15. {rung_cli-0.1.2 → rung_cli-0.1.3}/LICENSE +0 -0
  16. {rung_cli-0.1.2 → rung_cli-0.1.3}/SECURITY.md +0 -0
  17. {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/CONFIG.md +0 -0
  18. {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/DESIGN.md +0 -0
  19. {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/RECIPES.md +0 -0
  20. {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/RESEARCH.md +0 -0
  21. {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/ROADMAP.md +0 -0
  22. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/LAWS.md +0 -0
  23. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/README.md +0 -0
  24. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/__init__.py +0 -0
  25. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/drt.py +0 -0
  26. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/queue.py +0 -0
  27. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/rung.toml +0 -0
  28. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/LeaseModel.lean +0 -0
  29. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/Main.lean +0 -0
  30. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lake-manifest.json +0 -0
  31. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lakefile.toml +0 -0
  32. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lean-toolchain +0 -0
  33. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/tla/LeaseQueue.cfg +0 -0
  34. {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/tla/LeaseQueue.tla +0 -0
  35. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/__main__.py +0 -0
  36. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/__init__.py +0 -0
  37. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/hooks.py +0 -0
  38. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/install.py +0 -0
  39. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/__init__.py +0 -0
  40. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/plan.py +0 -0
  41. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/report.py +0 -0
  42. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/survey.py +0 -0
  43. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/__init__.py +0 -0
  44. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/base.py +0 -0
  45. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/command.py +0 -0
  46. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/deps.py +0 -0
  47. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/findings.py +0 -0
  48. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/formal.py +0 -0
  49. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/presets.py +0 -0
  50. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/prove.py +0 -0
  51. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/registry.py +0 -0
  52. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/runner.py +0 -0
  53. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/scan.py +0 -0
  54. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/shortcuts.py +0 -0
  55. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/__init__.py +0 -0
  56. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/__init__.py +0 -0
  57. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/common.py +0 -0
  58. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/draft.py +0 -0
  59. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/manage.py +0 -0
  60. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/run.py +0 -0
  61. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/setup.py +0 -0
  62. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/output.py +0 -0
  63. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/__init__.py +0 -0
  64. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/config.py +0 -0
  65. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/errors.py +0 -0
  66. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/git.py +0 -0
  67. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/laws.py +0 -0
  68. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/ledger.py +0 -0
  69. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/proc.py +0 -0
  70. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/redact.py +0 -0
  71. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/__init__.py +0 -0
  72. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/common.py +0 -0
  73. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/lean.py +0 -0
  74. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/providers.py +0 -0
  75. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/runtime.py +0 -0
  76. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/sandbox.py +0 -0
  77. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/tla.py +0 -0
  78. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/__init__.py +0 -0
  79. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/drt.py +0 -0
  80. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/lean.py +0 -0
  81. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/mutate.py +0 -0
  82. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/sarif.py +0 -0
  83. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/shortcuts.py +0 -0
  84. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/tla.py +0 -0
  85. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/__init__.py +0 -0
  86. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/lean.md +0 -0
  87. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/property.md +0 -0
  88. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/rules.md +0 -0
  89. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/runtime.md +0 -0
  90. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/tla.md +0 -0
  91. {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/verify.md +0 -0
  92. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/__init__.py +0 -0
  93. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/conftest.py +0 -0
  94. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/gitleaks.sarif +0 -0
  95. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/osv.sarif +0 -0
  96. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/zizmor.sarif +0 -0
  97. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_agents_and_report.py +0 -0
  98. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_cli.py +0 -0
  99. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_config.py +0 -0
  100. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_deps.py +0 -0
  101. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_draft.py +0 -0
  102. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_drt.py +0 -0
  103. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_example_integration.py +0 -0
  104. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_gitutil.py +0 -0
  105. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_laws.py +0 -0
  106. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_lean.py +0 -0
  107. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_ledger.py +0 -0
  108. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_prove.py +0 -0
  109. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_release_consistency.py +0 -0
  110. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_review_regressions.py +0 -0
  111. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_sarif_and_findings.py +0 -0
  112. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_scan_checker.py +0 -0
  113. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_shortcuts.py +0 -0
  114. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_survey_and_agents.py +0 -0
  115. {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_tla.py +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rung",
3
3
  "description": "Set up Rung in a repository: record tests and security scans as checks, gate pull requests in CI, and teach coding agents the verification rules.",
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "author": { "name": "CalQuity" },
6
6
  "homepage": "https://github.com/CalQuity/rung",
7
7
  "repository": "https://github.com/CalQuity/rung",
@@ -3,7 +3,19 @@
3
3
  All notable changes to Rung. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
4
4
  and versions follow the policy in [CONTRIBUTING.md](CONTRIBUTING.md#versioning).
5
5
 
6
- ## 0.1.2 (unreleased)
6
+ ## 0.1.3 (2026-11-01)
7
+
8
+ ### Fixed
9
+ - `rung draft property`: a plain `assert` the model wrote that fails on the real code is now a
10
+ finding for a person, not a broken test. Before, a failure without Hypothesis's "Falsifying
11
+ example" marker was sent back to the model to rewrite, up to four times, which could hide the bug
12
+ the tests had found. A mutant that stops the module compiling is still not counted as caught.
13
+
14
+ ### Documentation
15
+ - The README describes the runtime verification kit: the drive script, the `FEATURES.md` feature
16
+ map, the project verification skill for coding agents, and the recordings each run leaves.
17
+
18
+ ## 0.1.2 (2026-11-01)
7
19
 
8
20
  The first release on PyPI, as `rung-cli`.
9
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rung-cli
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: An opinionated verification ladder for software written with coding agents: architecture rules, runtime evidence, properties, TLA+ and Lean, and an evidence ledger that expires when code changes.
5
5
  Project-URL: Homepage, https://github.com/CalQuity/rung
6
6
  Project-URL: Documentation, https://github.com/CalQuity/rung/tree/main/docs
@@ -122,6 +122,30 @@ A refund never exceeds the original charge, even under concurrent retries.
122
122
  `rung laws` shows whether each law currently **holds**: approved, enforced, and every enforcing
123
123
  verdict fresh. Agents may propose laws; only people approve them.
124
124
 
125
+ ## A verification kit for your running app
126
+
127
+ `rung draft runtime --intent "apply a coupon at checkout and see the total update"` gives your
128
+ project a verification kit, written by the model and registered as a check only once it has worked
129
+ against the real app:
130
+
131
+ - **`.rung/verify/drive.py`**, a script that starts the app on a free port, drives a feature the way
132
+ a user does (Playwright for web UIs, HTTP or CLI calls otherwise) and asserts on what a user would
133
+ see. It never calls internal functions or test-only endpoints.
134
+ - **`.rung/verify/FEATURES.md`**, a feature map: for each user-facing feature, how a user reaches it,
135
+ how the script drives it, what observable state proves it works, and the gotchas (seed data,
136
+ logins, flaky spots).
137
+ - **A project verification skill** (`.claude/skills/verify-<project>/`) that tells the project's
138
+ coding agents to drive the app after any user-facing change, extend the script and feature map
139
+ when they add a feature, and treat a failure as a product bug rather than weaken the script.
140
+ - **Recordings.** Every run writes its evidence to a fresh directory: a video of the browser session
141
+ (`--require .webm` demands one), screenshots, request and response logs, a transcript and a
142
+ structured `result.json`. Their hashes go into the verdict, which stays valid only while the code
143
+ it covers is unchanged.
144
+
145
+ Where a script cannot reach a feature (a login flow, a native app), an agent can drive it with its
146
+ own browser or computer-use tool and record it with `rung attest <check> <files> --by <tool>`. Such
147
+ evidence is recorded with who captured it and is never re-run, so it is weaker than a script.
148
+
125
149
  ## Property tests that are tested themselves
126
150
 
127
151
  `rung draft property pricing.py --intent "a total is never negative and equals the discounted sum"`
@@ -171,7 +195,7 @@ jobs:
171
195
  with:
172
196
  fetch-depth: 0
173
197
  persist-credentials: false
174
- - uses: CalQuity/rung@v0.1.2
198
+ - uses: CalQuity/rung@v0.1.3
175
199
  ```
176
200
 
177
201
  The action runs the checks a pull request touches against its merge base. It keeps a single
@@ -186,7 +210,7 @@ To run the same check before every push, add Rung to `.pre-commit-config.yaml`:
186
210
 
187
211
  ```yaml
188
212
  - repo: https://github.com/CalQuity/rung
189
- rev: v0.1.2
213
+ rev: v0.1.3
190
214
  hooks:
191
215
  - id: rung-check
192
216
  ```
@@ -104,6 +104,30 @@ A refund never exceeds the original charge, even under concurrent retries.
104
104
  `rung laws` shows whether each law currently **holds**: approved, enforced, and every enforcing
105
105
  verdict fresh. Agents may propose laws; only people approve them.
106
106
 
107
+ ## A verification kit for your running app
108
+
109
+ `rung draft runtime --intent "apply a coupon at checkout and see the total update"` gives your
110
+ project a verification kit, written by the model and registered as a check only once it has worked
111
+ against the real app:
112
+
113
+ - **`.rung/verify/drive.py`**, a script that starts the app on a free port, drives a feature the way
114
+ a user does (Playwright for web UIs, HTTP or CLI calls otherwise) and asserts on what a user would
115
+ see. It never calls internal functions or test-only endpoints.
116
+ - **`.rung/verify/FEATURES.md`**, a feature map: for each user-facing feature, how a user reaches it,
117
+ how the script drives it, what observable state proves it works, and the gotchas (seed data,
118
+ logins, flaky spots).
119
+ - **A project verification skill** (`.claude/skills/verify-<project>/`) that tells the project's
120
+ coding agents to drive the app after any user-facing change, extend the script and feature map
121
+ when they add a feature, and treat a failure as a product bug rather than weaken the script.
122
+ - **Recordings.** Every run writes its evidence to a fresh directory: a video of the browser session
123
+ (`--require .webm` demands one), screenshots, request and response logs, a transcript and a
124
+ structured `result.json`. Their hashes go into the verdict, which stays valid only while the code
125
+ it covers is unchanged.
126
+
127
+ Where a script cannot reach a feature (a login flow, a native app), an agent can drive it with its
128
+ own browser or computer-use tool and record it with `rung attest <check> <files> --by <tool>`. Such
129
+ evidence is recorded with who captured it and is never re-run, so it is weaker than a script.
130
+
107
131
  ## Property tests that are tested themselves
108
132
 
109
133
  `rung draft property pricing.py --intent "a total is never negative and equals the discounted sum"`
@@ -153,7 +177,7 @@ jobs:
153
177
  with:
154
178
  fetch-depth: 0
155
179
  persist-credentials: false
156
- - uses: CalQuity/rung@v0.1.2
180
+ - uses: CalQuity/rung@v0.1.3
157
181
  ```
158
182
 
159
183
  The action runs the checks a pull request touches against its merge base. It keeps a single
@@ -168,7 +192,7 @@ To run the same check before every push, add Rung to `.pre-commit-config.yaml`:
168
192
 
169
193
  ```yaml
170
194
  - repo: https://github.com/CalQuity/rung
171
- rev: v0.1.2
195
+ rev: v0.1.3
172
196
  hooks:
173
197
  - id: rung-check
174
198
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rung-cli"
3
- version = "0.1.2"
3
+ version = "0.1.3"
4
4
  description = "An opinionated verification ladder for software written with coding agents: architecture rules, runtime evidence, properties, TLA+ and Lean, and an evidence ledger that expires when code changes."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -75,7 +75,7 @@ jobs:
75
75
  with:
76
76
  fetch-depth: 0
77
77
  persist-credentials: false
78
- - uses: CalQuity/rung@v0.1.2
78
+ - uses: CalQuity/rung@v0.1.3
79
79
  ```
80
80
 
81
81
  Install whatever the checks need (language runtimes, scanners) in steps before `CalQuity/rung`.
@@ -1,3 +1,3 @@
1
1
  """Rung: an opinionated verification ladder for software written with coding agents."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.1.3"
@@ -51,7 +51,11 @@ GOOD_ENOUGH = 0.5 # share of viable mutants a property file must catch
51
51
  CANARY = "rung-canary-7f3a"
52
52
  DRAFTS_DIR = Path(".rung") / "cache" / "drafts"
53
53
 
54
- _FAILING_EXAMPLE = re.compile(r"Falsifying example|Failing test case|Counterexample:|Property failed after", re.I)
54
+ # A run that never got as far as running tests: a module that does not compile or import.
55
+ _BUILD_FAILED = re.compile(
56
+ r"Transform failed|Cannot find module|ERR_MODULE_NOT_FOUND|error TS\d+|SyntaxError: |ERROR collecting|"
57
+ r"ImportError while importing test module"
58
+ )
55
59
  # Errors that mean the test's own code is broken, when the failure happens inside the test file.
56
60
  _BROKEN = {"NameError", "ImportError", "ModuleNotFoundError", "SyntaxError", "IndentationError", "ReferenceError",
57
61
  "AttributeError", "TypeError", "UnboundLocalError"} # fmt: skip
@@ -163,15 +167,17 @@ def passed_count(output: str) -> int:
163
167
 
164
168
 
165
169
  def classify(returncode: int, output: str, sources: list[str], test_file: str) -> str:
166
- """pass, finding (a property failed on the code) or error (the test itself is broken, or ran nothing).
170
+ """pass, finding (a test failed on the code) or error (the test itself is broken, or ran nothing).
167
171
 
168
- `sources` and `test_file` are file names, used to tell where a failure happened: an error raised in
169
- the code under test is a finding, even a `NameError`; a non-assertion error raised in the test file
170
- is a broken test; anything Rung cannot place is a finding, for a person to judge.
172
+ Exit status 1 means tests ran and failed. That is a finding, whether or not the failure came with
173
+ a generated example: a plain `assert` the model wrote can catch the bug just as well. The test is
174
+ broken instead when the run could not build or import, or when a non-assertion error (a typo, a
175
+ wrong call) is raised in the test file itself. An error raised in the code under test is always a
176
+ finding, even a `NameError`; anything Rung cannot place goes to a person as a finding.
171
177
  """
172
178
  if returncode == 0:
173
179
  return "pass" if passed_count(output) > 0 else "error"
174
- if returncode != 1 or not _FAILING_EXAMPLE.search(output):
180
+ if returncode != 1 or _BUILD_FAILED.search(output):
175
181
  return "error"
176
182
  py = _PY_LOCATION.findall(output)
177
183
  js = _JS_LOCATION.findall(output)
@@ -95,6 +95,10 @@ def test_classify_separates_findings_from_broken_tests() -> None:
95
95
  assert c(1, broken, ["pricing.ts"], "p.test.ts") == "error"
96
96
  assert c(1, failed + " at total (src/pricing.ts:4:9)", ["pricing.ts"], "p.test.ts") == "finding"
97
97
  assert c(2, "ERROR collecting", src, test) == "error"
98
+ # A plain assert the model wrote, failing on the real code, is a finding too (no generated example).
99
+ assert c(1, "E assert -1 == 0\ntest_p.py:12: AssertionError\n1 failed", src, test) == "finding"
100
+ # A mutant that stops the module compiling is not a caught bug.
101
+ assert c(1, "Transform failed with 1 error:\nsrc/pricing.ts:3:10", ["pricing.ts"], "p.test.ts") == "error"
98
102
 
99
103
 
100
104
  def test_a_property_no_mutant_can_fail_is_sent_back_and_a_strong_one_is_kept(pricing: Path) -> None:
@@ -473,7 +473,7 @@ wheels = [
473
473
 
474
474
  [[package]]
475
475
  name = "rung-cli"
476
- version = "0.1.2"
476
+ version = "0.1.3"
477
477
  source = { editable = "." }
478
478
 
479
479
  [package.dev-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes