claude-dev-env 8.11.0 → 8.12.0

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 (47) hide show
  1. package/.agents/skills/e-code-review/SKILL.md +24 -71
  2. package/.agents/skills/e-code-review/reference/fix.md +7 -78
  3. package/.agents/skills/e-code-review/reference/high.md +129 -0
  4. package/.agents/skills/e-code-review/reference/low.md +20 -51
  5. package/.agents/skills/e-code-review/reference/max.md +169 -0
  6. package/.agents/skills/e-code-review/reference/medium.md +7 -191
  7. package/.agents/skills/e-code-review/reference/xhigh.md +47 -91
  8. package/_shared/pr-loop/scripts/fix_pr_test_proof.py +113 -12
  9. package/_shared/pr-loop/scripts/pr_loop_shared_constants/fix_pr_test_proof_constants.py +5 -1
  10. package/_shared/pr-loop/scripts/test_fix_pr_test_proof.py +63 -3
  11. package/bin/codex-skill-load-block.mjs +67 -19
  12. package/bin/codex-skill-load-block.test.mjs +87 -25
  13. package/bin/install.agents-home.test.mjs +9 -9
  14. package/bin/install.mjs +4 -2
  15. package/bin/install.test.mjs +20 -0
  16. package/commands/sr-loop.md +3 -1
  17. package/hooks/blocking/pii_prevention_blocker_parts/repository_exemption.py +3 -3
  18. package/hooks/blocking/tests/test_repository_exemption.py +7 -0
  19. package/hooks/hooks_constants/code_rules_path_utils_constants.py +0 -1
  20. package/package.json +1 -1
  21. package/rules/build-needs-a-user.md +1 -1
  22. package/rules/testing.md +1 -1
  23. package/scripts/policy_lint/config/constants.py +1 -1
  24. package/scripts/repository_checks/tracked_private_terms.py +15 -1
  25. package/scripts/tests/test_policy_lint_rules_callers.py +14 -0
  26. package/scripts/tests/test_tracked_private_terms.py +35 -0
  27. package/.agents/skills/e-code-review/preflight-proposal.contract.test.mjs +0 -20
  28. package/.agents/skills/e-code-review/reference/effort-evaluation.md +0 -35
  29. package/.agents/skills/e-code-review/reference/loop.md +0 -261
  30. package/.agents/skills/e-code-review/reference/mode-contract.test.mjs +0 -67
  31. package/.agents/skills/e-code-review/reference/preflight-proposal.md +0 -75
  32. package/.agents/skills/e-code-review/reference/runner-selection.md +0 -40
  33. package/.agents/skills/e-code-review/scripts/config/e_code_review_effort_constants/__init__.py +0 -41
  34. package/.agents/skills/e-code-review/scripts/config/e_code_review_effort_constants/effort_constants.py +0 -40
  35. package/.agents/skills/e-code-review/scripts/e_code_review_scripts_constants/__init__.py +0 -1
  36. package/.agents/skills/e-code-review/scripts/e_code_review_scripts_constants/finding_pipeline_constants.py +0 -49
  37. package/.agents/skills/e-code-review/scripts/e_code_review_scripts_constants/grok_code_review_constants.py +0 -55
  38. package/.agents/skills/e-code-review/scripts/effort_defaults_evidence.json +0 -186
  39. package/.agents/skills/e-code-review/scripts/effort_evaluation.py +0 -362
  40. package/.agents/skills/e-code-review/scripts/finding_pipeline.py +0 -140
  41. package/.agents/skills/e-code-review/scripts/fixtures/demanding.json +0 -26
  42. package/.agents/skills/e-code-review/scripts/fixtures/easy.json +0 -14
  43. package/.agents/skills/e-code-review/scripts/fixtures/medium.json +0 -20
  44. package/.agents/skills/e-code-review/scripts/grok_code_review.py +0 -230
  45. package/.agents/skills/e-code-review/scripts/test_effort_evaluation.py +0 -180
  46. package/.agents/skills/e-code-review/scripts/test_finding_pipeline.py +0 -197
  47. package/.agents/skills/e-code-review/scripts/test_grok_code_review.py +0 -289
@@ -1,197 +0,0 @@
1
- """Red fixtures: low-severity findings survive collection; filter is separate."""
2
-
3
- from __future__ import annotations
4
-
5
- import sys
6
- from pathlib import Path
7
-
8
- import pytest
9
-
10
- _SCRIPTS_DIR = Path(__file__).resolve().parent
11
- if str(_SCRIPTS_DIR) not in sys.path:
12
- sys.path.insert(0, str(_SCRIPTS_DIR))
13
-
14
- from e_code_review_scripts_constants.finding_pipeline_constants import (
15
- ALL_COLLECTION_SEVERITIES,
16
- COLLECTION_STAGE_NAME,
17
- FILTER_STAGE_NAME,
18
- FINDING_FIELD_CATEGORY,
19
- FINDING_FIELD_EVIDENCE,
20
- FINDING_FIELD_FILE,
21
- FINDING_FIELD_LINE,
22
- FINDING_FIELD_SEVERITY,
23
- REPORT_EVERY_FINDING_INSTRUCTION,
24
- SEVERITY_BLOCKER,
25
- SEVERITY_HIGH,
26
- SEVERITY_LOW,
27
- SEVERITY_MEDIUM,
28
- SEVERITY_NIT,
29
- )
30
- from finding_pipeline import (
31
- CollectedFinding,
32
- FindingCollection,
33
- collect_findings,
34
- filter_findings_by_severity,
35
- )
36
-
37
-
38
- def _seeded_findings() -> list[CollectedFinding]:
39
- return [
40
- CollectedFinding(
41
- file_path="pkg/a.py",
42
- line_number=10,
43
- severity=SEVERITY_BLOCKER,
44
- category="correctness",
45
- evidence="raises on empty input",
46
- ),
47
- CollectedFinding(
48
- file_path="pkg/b.py",
49
- line_number=20,
50
- severity=SEVERITY_HIGH,
51
- category="security",
52
- evidence="shell=True with user text",
53
- ),
54
- CollectedFinding(
55
- file_path="pkg/c.py",
56
- line_number=30,
57
- severity=SEVERITY_MEDIUM,
58
- category="api-contracts",
59
- evidence="return type narrowed",
60
- ),
61
- CollectedFinding(
62
- file_path="pkg/d.py",
63
- line_number=40,
64
- severity=SEVERITY_LOW,
65
- category="simplification",
66
- evidence="duplicated helper body",
67
- ),
68
- CollectedFinding(
69
- file_path="pkg/e.py",
70
- line_number=50,
71
- severity=SEVERITY_NIT,
72
- category="conventions",
73
- evidence="typo in comment",
74
- ),
75
- ]
76
-
77
-
78
- def test_collection_retains_every_seeded_severity_including_low_and_nit() -> None:
79
- all_seeded = _seeded_findings()
80
- collection = collect_findings(all_seeded)
81
-
82
- assert collection.stage_name == COLLECTION_STAGE_NAME
83
- all_severities = {
84
- each.severity for each in collection.all_findings
85
- }
86
- assert all_severities == set(ALL_COLLECTION_SEVERITIES)
87
- assert len(collection.all_findings) == len(all_seeded)
88
- low_finding = next(
89
- each for each in collection.all_findings if each.severity == SEVERITY_LOW
90
- )
91
- assert low_finding.file_path == "pkg/d.py"
92
- assert low_finding.line_number == 40
93
- assert low_finding.evidence == "duplicated helper body"
94
- assert low_finding.category == "simplification"
95
-
96
-
97
- def test_each_collected_finding_keeps_file_line_evidence_and_category() -> None:
98
- collection = collect_findings(_seeded_findings())
99
- for each_finding in collection.all_findings:
100
- as_mapping = each_finding.as_mapping()
101
- assert as_mapping[FINDING_FIELD_FILE]
102
- assert as_mapping[FINDING_FIELD_LINE] > 0
103
- assert as_mapping[FINDING_FIELD_EVIDENCE]
104
- assert as_mapping[FINDING_FIELD_CATEGORY]
105
- assert as_mapping[FINDING_FIELD_SEVERITY] in ALL_COLLECTION_SEVERITIES
106
-
107
-
108
- def test_filter_is_explicit_later_stage_and_does_not_mutate_collection() -> None:
109
- collection = collect_findings(_seeded_findings())
110
- collected_snapshot = [
111
- (
112
- each.file_path,
113
- each.line_number,
114
- each.severity,
115
- each.category,
116
- each.evidence,
117
- )
118
- for each in collection.all_findings
119
- ]
120
-
121
- filtered = filter_findings_by_severity(
122
- collection,
123
- minimum_severity=SEVERITY_MEDIUM,
124
- )
125
-
126
- assert filtered.stage_name == FILTER_STAGE_NAME
127
- all_filtered_severities = {each.severity for each in filtered.all_findings}
128
- assert SEVERITY_LOW not in all_filtered_severities
129
- assert SEVERITY_NIT not in all_filtered_severities
130
- assert SEVERITY_MEDIUM in all_filtered_severities
131
- assert SEVERITY_BLOCKER in all_filtered_severities
132
-
133
- after_filter_snapshot = [
134
- (
135
- each.file_path,
136
- each.line_number,
137
- each.severity,
138
- each.category,
139
- each.evidence,
140
- )
141
- for each in collection.all_findings
142
- ]
143
- assert after_filter_snapshot == collected_snapshot
144
- assert len(collection.all_findings) == 5
145
-
146
-
147
- def test_filter_rejects_unknown_minimum_severity() -> None:
148
- collection = collect_findings(_seeded_findings())
149
- with pytest.raises(ValueError, match="unknown minimum severity"):
150
- filter_findings_by_severity(collection, minimum_severity="P1")
151
-
152
-
153
- def test_filter_rejects_unknown_finding_severity_with_value_error() -> None:
154
- collection = FindingCollection(
155
- stage_name=COLLECTION_STAGE_NAME,
156
- all_findings=(
157
- CollectedFinding(
158
- file_path="pkg/x.py",
159
- line_number=1,
160
- severity="P0",
161
- category="correctness",
162
- evidence="bypass collect",
163
- ),
164
- ),
165
- )
166
- with pytest.raises(ValueError, match="unknown collection severity"):
167
- filter_findings_by_severity(collection, minimum_severity=SEVERITY_LOW)
168
-
169
-
170
- def test_collect_rejects_finding_missing_required_fields() -> None:
171
- with pytest.raises(ValueError, match="file"):
172
- collect_findings(
173
- [
174
- CollectedFinding(
175
- file_path="",
176
- line_number=1,
177
- severity=SEVERITY_LOW,
178
- category="correctness",
179
- evidence="x",
180
- )
181
- ]
182
- )
183
-
184
-
185
- def test_report_every_finding_instruction_names_all_severities() -> None:
186
- for each_severity in ALL_COLLECTION_SEVERITIES:
187
- assert each_severity in REPORT_EVERY_FINDING_INSTRUCTION
188
- assert "consumer stage" in REPORT_EVERY_FINDING_INSTRUCTION
189
- assert "Do not drop findings by severity during collection" in (
190
- REPORT_EVERY_FINDING_INSTRUCTION
191
- )
192
-
193
-
194
- def test_collection_record_type_is_immutable() -> None:
195
- collection = collect_findings(_seeded_findings())
196
- assert isinstance(collection, FindingCollection)
197
- assert collection.stage_name == COLLECTION_STAGE_NAME
@@ -1,289 +0,0 @@
1
- """Behavioral tests for Grok medium-review discovery and verification."""
2
-
3
- from __future__ import annotations
4
-
5
- import sys
6
- from pathlib import Path
7
-
8
- import pytest
9
-
10
- _SCRIPTS = Path(__file__).resolve().parent
11
- if str(_SCRIPTS) not in sys.path:
12
- sys.path.insert(0, str(_SCRIPTS))
13
-
14
- from e_code_review_scripts_constants.grok_code_review_constants import ( # noqa: E402
15
- ALL_MEDIUM_FINDER_ANGLES,
16
- MEDIUM_REVIEW_FINDER_COUNT,
17
- VERDICT_CONFIRMED,
18
- VERDICT_PLAUSIBLE,
19
- VERDICT_REFUTED,
20
- )
21
- from grok_code_review import ( # noqa: E402
22
- FinderCandidate,
23
- deduplicate_candidates,
24
- require_exact_finder_set,
25
- retain_verified_findings,
26
- run_medium_review,
27
- )
28
-
29
-
30
- def _candidate(
31
- angle: str,
32
- *,
33
- file_path: str = "a.py",
34
- line_number: int = 1,
35
- mechanism: str = "m",
36
- scenario: str = "short",
37
- suffix: str = "",
38
- head: str = "head1",
39
- ) -> FinderCandidate:
40
- token = suffix or angle
41
- return FinderCandidate(
42
- angle=angle,
43
- file_path=file_path,
44
- line_number=line_number,
45
- mechanism=mechanism,
46
- scenario=scenario,
47
- worktree_path=f"/wt/{token}",
48
- leader_socket=f"sock-{token}",
49
- advisor_session_id=f"adv-{token}",
50
- reviewed_head=head,
51
- )
52
-
53
-
54
- def test_require_exact_finder_set_accepts_all_angles() -> None:
55
- require_exact_finder_set(ALL_MEDIUM_FINDER_ANGLES)
56
- with pytest.raises(ValueError):
57
- require_exact_finder_set(ALL_MEDIUM_FINDER_ANGLES[:-1])
58
-
59
-
60
- def test_deduplicate_keeps_most_concrete_scenario() -> None:
61
- short = _candidate("correctness", scenario="short")
62
- long = _candidate("security", scenario="much more concrete failure path")
63
- # same key different angles - force same file/line/mech
64
- short = FinderCandidate(
65
- angle="correctness",
66
- file_path="a.py",
67
- line_number=3,
68
- mechanism="null",
69
- scenario="x",
70
- worktree_path="/wt/a",
71
- leader_socket="s1",
72
- advisor_session_id="a1",
73
- reviewed_head="h",
74
- )
75
- long = FinderCandidate(
76
- angle="security",
77
- file_path="a.py",
78
- line_number=3,
79
- mechanism="null",
80
- scenario="concrete long scenario",
81
- worktree_path="/wt/b",
82
- leader_socket="s2",
83
- advisor_session_id="a2",
84
- reviewed_head="h",
85
- )
86
- kept = deduplicate_candidates([short, long])
87
- assert len(kept) == 1
88
- assert kept[0].scenario == "concrete long scenario"
89
-
90
-
91
- def test_run_medium_review_happy_path() -> None:
92
- head = "abc123"
93
- all_finders = [
94
- _candidate(each_angle, head=head, suffix=each_angle)
95
- for each_angle in ALL_MEDIUM_FINDER_ANGLES
96
- ]
97
- # make unique keys per angle
98
- all_finders = [
99
- FinderCandidate(
100
- angle=each_angle,
101
- file_path=f"{each_angle}.py",
102
- line_number=1,
103
- mechanism="m",
104
- scenario=f"scenario {each_angle}",
105
- worktree_path=f"/wt/{each_angle}",
106
- leader_socket=f"sock-{each_angle}",
107
- advisor_session_id=f"adv-{each_angle}",
108
- reviewed_head=head,
109
- )
110
- for each_angle in ALL_MEDIUM_FINDER_ANGLES
111
- ]
112
- verdicts = {
113
- (f"{each}.py", 1, "m"): VERDICT_CONFIRMED
114
- for each in ALL_MEDIUM_FINDER_ANGLES
115
- }
116
- severities = {
117
- (f"{each}.py", 1, "m"): "medium" for each in ALL_MEDIUM_FINDER_ANGLES
118
- }
119
- # refute one
120
- first = ALL_MEDIUM_FINDER_ANGLES[0]
121
- verdicts[(f"{first}.py", 1, "m")] = VERDICT_REFUTED
122
- batch = run_medium_review(
123
- target_head=head,
124
- diff_base="base",
125
- all_finder_candidates=all_finders,
126
- verdict_by_key=verdicts,
127
- severity_by_key=severities,
128
- live_head=head,
129
- )
130
- assert batch.is_rejected is False
131
- assert len(batch.all_finder_angles) == MEDIUM_REVIEW_FINDER_COUNT
132
- assert all(each.reviewed_head == head for each in batch.all_retained_findings)
133
- assert all(each.verdict in {VERDICT_CONFIRMED, VERDICT_PLAUSIBLE} for each in batch.all_retained_findings)
134
- assert len(batch.all_retained_findings) == MEDIUM_REVIEW_FINDER_COUNT - 1
135
-
136
-
137
- def _one_candidate_per_angle(head: str) -> list[FinderCandidate]:
138
- return [
139
- FinderCandidate(
140
- angle=each_angle,
141
- file_path=f"{each_angle}.py",
142
- line_number=1,
143
- mechanism="m",
144
- scenario=f"scenario {each_angle}",
145
- worktree_path=f"/wt/{each_angle}",
146
- leader_socket=f"sock-{each_angle}",
147
- advisor_session_id=f"adv-{each_angle}",
148
- reviewed_head=head,
149
- )
150
- for each_angle in ALL_MEDIUM_FINDER_ANGLES
151
- ]
152
-
153
-
154
- def test_a_finder_reporting_several_candidates_is_not_a_identity_clash() -> None:
155
- head = "abc123"
156
- all_finders = _one_candidate_per_angle(head)
157
- first = all_finders[0]
158
- second_from_first_finder = FinderCandidate(
159
- angle=first.angle,
160
- file_path="second.py",
161
- line_number=9,
162
- mechanism="m",
163
- scenario="a second finding from the same finder",
164
- worktree_path=first.worktree_path,
165
- leader_socket=first.leader_socket,
166
- advisor_session_id=first.advisor_session_id,
167
- reviewed_head=head,
168
- )
169
- all_finders.append(second_from_first_finder)
170
- all_keys = [
171
- (each.file_path, each.line_number, each.mechanism) for each in all_finders
172
- ]
173
- batch = run_medium_review(
174
- target_head=head,
175
- diff_base="base",
176
- all_finder_candidates=all_finders,
177
- verdict_by_key={each_key: VERDICT_CONFIRMED for each_key in all_keys},
178
- severity_by_key={each_key: "medium" for each_key in all_keys},
179
- live_head=head,
180
- )
181
- assert batch.is_rejected is False
182
- assert batch.rejection_reason is None
183
- assert len(batch.all_retained_findings) == len(all_finders)
184
-
185
-
186
- def test_two_finders_sharing_one_socket_reject_the_batch() -> None:
187
- head = "abc123"
188
- all_finders = _one_candidate_per_angle(head)
189
- first = all_finders[0]
190
- second = all_finders[1]
191
- all_finders[1] = FinderCandidate(
192
- angle=second.angle,
193
- file_path=second.file_path,
194
- line_number=second.line_number,
195
- mechanism=second.mechanism,
196
- scenario=second.scenario,
197
- worktree_path=second.worktree_path,
198
- leader_socket=first.leader_socket,
199
- advisor_session_id=second.advisor_session_id,
200
- reviewed_head=head,
201
- )
202
- batch = run_medium_review(
203
- target_head=head,
204
- diff_base="base",
205
- all_finder_candidates=all_finders,
206
- verdict_by_key={},
207
- severity_by_key={},
208
- live_head=head,
209
- )
210
- assert batch.is_rejected is True
211
- assert batch.rejection_reason == "non_unique_finder_identity"
212
-
213
-
214
- def test_head_drift_rejects_batch() -> None:
215
- head = "h1"
216
- all_finders = [
217
- FinderCandidate(
218
- angle=each_angle,
219
- file_path=f"{each_angle}.py",
220
- line_number=1,
221
- mechanism="m",
222
- scenario="s",
223
- worktree_path=f"/wt/{each_angle}",
224
- leader_socket=f"sock-{each_angle}",
225
- advisor_session_id=f"adv-{each_angle}",
226
- reviewed_head=head,
227
- )
228
- for each_angle in ALL_MEDIUM_FINDER_ANGLES
229
- ]
230
- batch = run_medium_review(
231
- target_head=head,
232
- diff_base="b",
233
- all_finder_candidates=all_finders,
234
- verdict_by_key={},
235
- severity_by_key={},
236
- live_head="other",
237
- )
238
- assert batch.is_rejected is True
239
- assert batch.rejection_reason == "head_drift"
240
-
241
-
242
- def test_advisor_blocked_rejects_batch() -> None:
243
- head = "h1"
244
- all_finders = [
245
- FinderCandidate(
246
- angle=each_angle,
247
- file_path=f"{each_angle}.py",
248
- line_number=1,
249
- mechanism="m",
250
- scenario="s",
251
- worktree_path=f"/wt/{each_angle}",
252
- leader_socket=f"sock-{each_angle}",
253
- advisor_session_id=f"adv-{each_angle}",
254
- reviewed_head=head,
255
- )
256
- for each_angle in ALL_MEDIUM_FINDER_ANGLES
257
- ]
258
- batch = run_medium_review(
259
- target_head=head,
260
- diff_base="b",
261
- all_finder_candidates=all_finders,
262
- verdict_by_key={},
263
- severity_by_key={},
264
- live_head=head,
265
- is_any_advisor_blocked=True,
266
- )
267
- assert batch.is_rejected is True
268
- assert batch.rejection_reason == "advisor_blocked"
269
-
270
-
271
- def test_retain_verified_findings_keeps_confirmed() -> None:
272
- candidate = FinderCandidate(
273
- angle="correctness",
274
- file_path="a.py",
275
- line_number=2,
276
- mechanism="null",
277
- scenario="boom",
278
- worktree_path="/wt/x",
279
- leader_socket="s",
280
- advisor_session_id="a",
281
- reviewed_head="h",
282
- )
283
- kept = retain_verified_findings(
284
- all_candidates=[candidate],
285
- verdict_by_key={("a.py", 2, "null"): VERDICT_CONFIRMED},
286
- severity_by_key={("a.py", 2, "null"): "high"},
287
- )
288
- assert len(kept) == 1
289
- assert kept[0].verdict == VERDICT_CONFIRMED