Problem
/cleanup-feature Step 2.5a invokes gate_logic.py, which enforces a hard-coded REQUIRED_PHASES set that includes phases like `smoke` and `e2e`. These phases are Docker/service-dependent and not meaningful for library projects (no service to deploy, no smoke endpoint to hit, no end-to-end flow).
Today the operator must pass --force to bypass — which is a sledgehammer that also bypasses phases that do matter.
Proposed fix
Introduce a project profile mechanism. Options:
- Convention via repo file —
.openspec/project-profile.yml declaring `type: library | service | hybrid` and an explicit list of applicable phases. gate_logic.py reads this and computes REQUIRED_PHASES dynamically.
- Auto-detect — heuristics like "does the repo have a Dockerfile / docker-compose.yml / a `smoke-test` make target". Less reliable; profile file is better.
- CLI flag —
--profile library overrides. Useful as an escape hatch even with option 1.
Recommend (1) + (3): file-based default with CLI override. Document the default profile when not set (probably `service`, to preserve current behavior on existing repos).
Acceptance
- A library project with
type: library in its profile passes cleanup without --force.
- A service project with no profile file behaves exactly as today (no regression).
- gate_logic.py has a unit test covering both profile branches.
Source
Follow-up from wire-autopilot-phase-subagents change run (2026-05-10). The agentic-coding-tools repo itself is a library/tooling project and hit this.
Problem
/cleanup-featureStep 2.5a invokesgate_logic.py, which enforces a hard-codedREQUIRED_PHASESset that includes phases like `smoke` and `e2e`. These phases are Docker/service-dependent and not meaningful for library projects (no service to deploy, no smoke endpoint to hit, no end-to-end flow).Today the operator must pass
--forceto bypass — which is a sledgehammer that also bypasses phases that do matter.Proposed fix
Introduce a project profile mechanism. Options:
.openspec/project-profile.ymldeclaring `type: library | service | hybrid` and an explicit list of applicable phases.gate_logic.pyreads this and computesREQUIRED_PHASESdynamically.--profile libraryoverrides. Useful as an escape hatch even with option 1.Recommend (1) + (3): file-based default with CLI override. Document the default profile when not set (probably `service`, to preserve current behavior on existing repos).
Acceptance
type: libraryin its profile passes cleanup without--force.Source
Follow-up from
wire-autopilot-phase-subagentschange run (2026-05-10). The agentic-coding-tools repo itself is a library/tooling project and hit this.