agentic-dev-loop 0.10.3__tar.gz → 0.10.4__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 (127) hide show
  1. {agentic_dev_loop-0.10.3/src/agentic_dev_loop.egg-info → agentic_dev_loop-0.10.4}/PKG-INFO +1 -1
  2. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/pyproject.toml +1 -1
  3. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/extensions/aidlc.py +10 -4
  4. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4/src/agentic_dev_loop.egg-info}/PKG-INFO +1 -1
  5. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_aidlc.py +15 -0
  6. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_publish.py +11 -58
  7. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/LICENSE +0 -0
  8. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/README.md +0 -0
  9. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/setup.cfg +0 -0
  10. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/__init__.py +0 -0
  11. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/__init__.py +0 -0
  12. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/config.py +0 -0
  13. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/paths.py +0 -0
  14. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/profiles/__init__.py +0 -0
  15. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/profiles/data/dotnet-node.yaml +0 -0
  16. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/profiles/data/python.yaml +0 -0
  17. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/results.py +0 -0
  18. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/core/verdict.py +0 -0
  19. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/__init__.py +0 -0
  20. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/actions.py +0 -0
  21. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/agent_error_guide.md +0 -0
  22. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/agent_error_guide.py +0 -0
  23. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/agents.py +0 -0
  24. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/allowlist.py +0 -0
  25. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/brief_coverage.py +0 -0
  26. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/brief_prompt.md +0 -0
  27. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/brief_prompt.py +0 -0
  28. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/cli.py +0 -0
  29. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/containers.py +0 -0
  30. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/deps.py +0 -0
  31. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/dryrun.py +0 -0
  32. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/egress_policy.py +0 -0
  33. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/egress_proxy.py +0 -0
  34. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/extensions/__init__.py +0 -0
  35. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/forbidden.py +0 -0
  36. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/graph.py +0 -0
  37. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/hostboundary.py +0 -0
  38. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/isolation.py +0 -0
  39. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/llm.py +0 -0
  40. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/loaders.py +0 -0
  41. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/mounts.py +0 -0
  42. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/__init__.py +0 -0
  43. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/checks.py +0 -0
  44. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/doctor.py +0 -0
  45. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/init.py +0 -0
  46. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/recipes/dotnet-node.yaml +0 -0
  47. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/recipes/python.yaml +0 -0
  48. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/recipes.py +0 -0
  49. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates/dev.agent.md +0 -0
  50. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates/env.example +0 -0
  51. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates/qa.agent.md +0 -0
  52. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates/review.agent.md +0 -0
  53. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates/trigger-agentic-dev-loop.sh +0 -0
  54. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/onboarding/templates.py +0 -0
  55. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/outputs.py +0 -0
  56. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/presets.py +0 -0
  57. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/proc.py +0 -0
  58. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/registry.py +0 -0
  59. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/seccomp/__init__.py +0 -0
  60. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/seccomp/chromium-userns.json +0 -0
  61. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/secrets.py +0 -0
  62. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/stages.py +0 -0
  63. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/step_workspace.py +0 -0
  64. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/engine/sync_back.py +0 -0
  65. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/py.typed +0 -0
  66. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/viz/__init__.py +0 -0
  67. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/viz/__main__.py +0 -0
  68. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop/viz/server.py +0 -0
  69. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop.egg-info/SOURCES.txt +0 -0
  70. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop.egg-info/dependency_links.txt +0 -0
  71. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop.egg-info/entry_points.txt +0 -0
  72. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop.egg-info/requires.txt +0 -0
  73. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/src/agentic_dev_loop.egg-info/top_level.txt +0 -0
  74. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_029_merge_on_conflict.py +0 -0
  75. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_033_brief_step.py +0 -0
  76. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_035_finalize_nudge.py +0 -0
  77. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_036_banned_commands_and_lane_boundary.py +0 -0
  78. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_041_brief_coverage.py +0 -0
  79. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_046_brief_prompt.py +0 -0
  80. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_cli.py +0 -0
  81. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_doctor.py +0 -0
  82. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_init.py +0 -0
  83. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_profile_loading.py +0 -0
  84. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_profiles.py +0 -0
  85. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_recipes.py +0 -0
  86. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_schema_lock.py +0 -0
  87. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_055_templates.py +0 -0
  88. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_actions.py +0 -0
  89. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_agent_error_guide.py +0 -0
  90. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_agents.py +0 -0
  91. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_cli.py +0 -0
  92. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_config.py +0 -0
  93. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_containers.py +0 -0
  94. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_deps.py +0 -0
  95. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_dry_run.py +0 -0
  96. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_e2e_fixtures.py +0 -0
  97. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_egress_proxy.py +0 -0
  98. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_graph.py +0 -0
  99. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_hostboundary.py +0 -0
  100. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_hostboundary_integration.py +0 -0
  101. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_isolation.py +0 -0
  102. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_isolation_integration.py +0 -0
  103. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_isolation_pbt.py +0 -0
  104. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_llm.py +0 -0
  105. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_loaders.py +0 -0
  106. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_module_contract.py +0 -0
  107. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_outputs.py +0 -0
  108. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_outputs_pbt.py +0 -0
  109. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_proc.py +0 -0
  110. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_qa_prompt.py +0 -0
  111. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_registry.py +0 -0
  112. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_repo_ascii.py +0 -0
  113. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_results.py +0 -0
  114. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_sdk_compat.py +0 -0
  115. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_secrets.py +0 -0
  116. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_secrets_integration.py +0 -0
  117. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_secrets_pipeline.py +0 -0
  118. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_source_resolution.py +0 -0
  119. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_stages.py +0 -0
  120. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_step_workspace.py +0 -0
  121. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_sync_back.py +0 -0
  122. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_trigger_script.py +0 -0
  123. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_unit5_config.py +0 -0
  124. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_unit5_pbt.py +0 -0
  125. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_unit5_pure.py +0 -0
  126. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_verdict.py +0 -0
  127. {agentic_dev_loop-0.10.3 → agentic_dev_loop-0.10.4}/tests/test_viz.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 0.10.3
3
+ Version: 0.10.4
4
4
  Summary: Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
5
5
  Author: Luke Wilson
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agentic-dev-loop"
7
- version = "0.10.3"
7
+ version = "0.10.4"
8
8
  description = "Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -74,12 +74,18 @@ def resolve_unit_docs_with_sources(
74
74
  sources[f"inception/{file.name}"] = file
75
75
 
76
76
  # The unit's code-generation plans are the build spec - absent is fine,
77
- # present is how the spec reaches agents.
77
+ # present is how the spec reaches agents. Two shapes are in the wild:
78
+ # bare (`unit-3-code-generation-plan.md`) and infixed
79
+ # (`unit-3-scan-core-types-code-generation-plan.md`); the bare shape must
80
+ # not be lost, and neither pattern may leak into a slug that merely
81
+ # extends this one (unit-3 must not match a unit-30 plan).
78
82
  plans_dir = docs_dir / "construction" / "plans"
79
83
  if plans_dir.is_dir():
80
- for file in sorted(plans_dir.glob(f"{unit_slug}-*-code-generation-plan.md")):
81
- docs[f"plans/{file.name}"] = file.read_text(encoding="utf-8")
82
- sources[f"plans/{file.name}"] = file
84
+ for pattern in (f"{unit_slug}-code-generation-plan.md",
85
+ f"{unit_slug}-*-code-generation-plan.md"):
86
+ for file in sorted(plans_dir.glob(pattern)):
87
+ docs[f"plans/{file.name}"] = file.read_text(encoding="utf-8")
88
+ sources[f"plans/{file.name}"] = file
83
89
 
84
90
  return docs, sources
85
91
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentic-dev-loop
3
- Version: 0.10.3
3
+ Version: 0.10.4
4
4
  Summary: Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
5
5
  Author: Luke Wilson
6
6
  License-Expression: Apache-2.0
@@ -135,6 +135,21 @@ class TestResolveUnitDocs:
135
135
  assert not any("nfr-design" in k for k in docs)
136
136
  assert not any("unit-2" in k for k in docs)
137
137
 
138
+ def test_loads_bare_slug_code_generation_plan(self, tmp_path):
139
+ """`{slug}-code-generation-plan.md` (no infix) is the build spec -
140
+ the repo's actual plan filenames, e.g. unit-3-code-generation-plan.md,
141
+ must load, not only infixed variants like unit-3-scan-*."""
142
+ unit_dir = tmp_path / "construction" / "unit-3"
143
+ unit_dir.mkdir(parents=True)
144
+ (unit_dir / "design.md").write_text("# Design")
145
+ plans = tmp_path / "construction" / "plans"
146
+ plans.mkdir(parents=True)
147
+ (plans / "unit-3-code-generation-plan.md").write_text("# Build spec")
148
+
149
+ docs = resolve_unit_docs(tmp_path, "unit-3")
150
+
151
+ assert docs["plans/unit-3-code-generation-plan.md"] == "# Build spec"
152
+
138
153
  def test_missing_plans_dir_is_not_an_error(self, tmp_path):
139
154
  unit_dir = tmp_path / "construction" / "unit-2"
140
155
  unit_dir.mkdir(parents=True)
@@ -264,79 +264,32 @@ class TestConsumerAdoption:
264
264
  assert proc.returncode == 0, proc.stderr
265
265
  assert read_version(repo) == "0.2.1"
266
266
 
267
- def test_049_marker_without_adoption_section_fails(self, tmp_path):
268
- """Plan 049 adds consumer pipeline obligations, so its slug must be
269
- registered: a release entry referencing it without a
270
- `### Consumer adoption` note gets refused."""
267
+ def test_dry_run_refuses_violating_entry(self, tmp_path):
268
+ """The dry run is the pre-cut gate: it runs the same refusal checks
269
+ as the real cut, so a violating entry is caught before anything is
270
+ written, committed, or tagged."""
271
271
  repo, _ = make_repo(
272
272
  tmp_path,
273
273
  unreleased=(
274
274
  "### Changed\n\n"
275
- "- feat: implement plan 049-native-brief-step-type\n"
276
- ),
277
- )
278
- proc = run_publish(repo, "--patch")
279
- assert proc.returncode != 0
280
- assert "Consumer adoption" in proc.stderr
281
- assert read_version(repo) == "0.2.0"
282
- assert tags(repo) == []
283
-
284
- def test_046_marker_without_adoption_section_fails(self, tmp_path):
285
- """Plan 046 obligates consumers to delete the vendored brief prompt
286
- and declare brief_inputs.sections, so its slug is registered too:
287
- a release entry referencing it without a `### Consumer adoption`
288
- note gets refused."""
289
- repo, _ = make_repo(
290
- tmp_path,
291
- unreleased=(
292
- "### Changed\n\n"
293
- "- feat: tweak plan 046-embed-brief-prompt\n"
294
- ),
295
- )
296
- proc = run_publish(repo, "--patch")
297
- assert proc.returncode != 0
298
- assert "Consumer adoption" in proc.stderr
299
- assert read_version(repo) == "0.2.0"
300
- assert tags(repo) == []
301
-
302
- def test_054_marker_without_adoption_section_fails(self, tmp_path):
303
- """Plan 054 flips reasoning passback to config-gated: pipelines
304
- whose llm:/llms: entries point at a thinking model must set
305
- reasoning_effort (absent effort now forwards nothing and raises a
306
- D12 engine error), so its slug is registered: a release entry
307
- referencing it without a `### Consumer adoption` note gets
308
- refused."""
309
- repo, _ = make_repo(
310
- tmp_path,
311
- unreleased=(
312
- "### Changed\n\n"
313
- "- feat: implement plan 054-per-step-model\n"
275
+ "- feat: construct plan 031-qa-environmental-verdict.md\n"
314
276
  ),
315
277
  )
316
- proc = run_publish(repo, "--patch")
278
+ proc = run_publish(repo, "--patch", "--dry-run")
317
279
  assert proc.returncode != 0
318
280
  assert "Consumer adoption" in proc.stderr
319
281
  assert read_version(repo) == "0.2.0"
320
282
  assert tags(repo) == []
283
+ assert last_subject(repo) == "chore: initial"
321
284
 
322
- def test_055_marker_without_adoption_section_fails(self, tmp_path):
323
- """Plan 055 migrates consumer repos onto profiles and recipes
324
- (profile key, trigger rewrite, isolation-block deletion), so its
325
- slug is registered: a release entry referencing it without a
326
- `### Consumer adoption` note gets refused."""
285
+ def test_dry_run_passes_violation_free_entry(self, tmp_path):
327
286
  repo, _ = make_repo(
328
287
  tmp_path,
329
- unreleased=(
330
- "### Changed\n\n"
331
- "- feat: implement plan 055-consumer-onboarding-init-doctor\n"
332
- ),
288
+ unreleased="### Changed\n\n- feat: add kernel sandbox\n",
333
289
  )
334
- proc = run_publish(repo, "--patch")
335
- assert proc.returncode != 0
336
- assert "Consumer adoption" in proc.stderr
290
+ proc = run_publish(repo, "--patch", "--dry-run")
291
+ assert proc.returncode == 0, proc.stderr
337
292
  assert read_version(repo) == "0.2.0"
338
- assert tags(repo) == []
339
-
340
293
 
341
294
  class TestGitOps:
342
295
  def test_commit_tag_and_push(self, tmp_path):