@plainconceptsplatform/agent-harness 2.0.0 → 2.0.1
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.
- package/README.md +423 -419
- package/package.json +3 -3
- package/src/commands/join.js +244 -244
- package/src/commands/shared.js +27 -27
- package/src/commands/single.js +79 -79
- package/src/commands/update.js +109 -109
- package/src/commands/wizard.js +134 -134
- package/src/content/.agents/skills/browser-automation/SKILL.md +66 -66
- package/src/content/.agents/skills/pc-guardrails-generic/SKILL.md +68 -68
- package/src/content/.agents/skills/pc-guardrails-project/SKILL.md +8 -8
- package/src/content/.agents/skills/pc-make-architecture/SKILL.md +51 -51
- package/src/content/.agents/skills/pc-make-architecture/structure-template.md +38 -38
- package/src/content/.agents/skills/pc-make-design/SKILL.md +68 -68
- package/src/content/.agents/skills/pc-make-engineer/SKILL.md +219 -219
- package/src/content/.agents/skills/pc-make-engineer/signal-mapping.md +68 -68
- package/src/content/.agents/skills/pc-make-engineer/template.md +81 -81
- package/src/content/.agents/skills/pc-make-evidence-scaffold/SKILL.md +18 -18
- package/src/content/.agents/skills/pc-make-evidence-scaffold/evidence-contract.md +29 -29
- package/src/content/.agents/skills/pc-make-guardrails/SKILL.md +74 -74
- package/src/content/.agents/skills/pc-make-guardrails/category-reference.md +68 -68
- package/src/content/.agents/skills/pc-make-merge-risk-assess/SKILL.md +70 -70
- package/src/content/.agents/skills/pc-make-merge-risk-assess/category-reference.md +98 -98
- package/src/content/.agents/skills/pc-make-user-model/SKILL.md +66 -66
- package/src/content/.agents/skills/pc-ops-evidence/SKILL.md +127 -127
- package/src/content/.agents/skills/pc-ops-ship/SKILL.md +18 -18
- package/src/content/.agents/skills/pc-plan-apply/SKILL.md +83 -83
- package/src/content/.agents/skills/pc-plan-apply/simple-mode.md +21 -21
- package/src/content/.agents/skills/pc-plan-archive/SKILL.md +63 -63
- package/src/content/.agents/skills/pc-plan-explore/SKILL.md +9 -9
- package/src/content/.agents/skills/pc-plan-goal/SKILL.md +94 -94
- package/src/content/.agents/skills/pc-plan-goal/branching.md +30 -30
- package/src/content/.agents/skills/pc-plan-goal/failure-policy.md +30 -30
- package/src/content/.agents/skills/pc-plan-goal/output-mode.md +9 -9
- package/src/content/.agents/skills/pc-plan-goal/output.md +68 -68
- package/src/content/.agents/skills/pc-plan-propose/SKILL.md +125 -125
- package/src/content/.agents/skills/pc-plan-propose/task-annotation.md +39 -39
- package/src/content/.agents/skills/pc-plan-quick/SKILL.md +62 -62
- package/src/content/.agents/skills/pc-plan-story/SKILL.md +146 -146
- package/src/content/.agents/skills/pc-repo-audit/SKILL.md +44 -44
- package/src/content/.agents/skills/pc-repo-help/SKILL.md +91 -91
- package/src/content/.agents/skills/pc-repo-initialize/SKILL.md +130 -130
- package/src/content/.agents/skills/pc-repo-onboard/SKILL.md +87 -87
- package/src/content/.agents/skills/pc-repo-verify/SKILL.md +34 -34
- package/src/content/.agents/skills/pc-userstory-az/SKILL.md +157 -157
- package/src/content/.agents/skills/pc-userstory-browser/SKILL.md +132 -132
- package/src/content/.agents/skills/pc-userstory-gh/SKILL.md +120 -120
- package/src/content/.agents/skills/pc-userstory-jira/SKILL.md +131 -131
- package/src/content/.opencode/_gitignore +7 -7
- package/src/content/.opencode/commands/init.md +5 -5
- package/src/content/.opencode/commands/make-architecture.md +5 -5
- package/src/content/.opencode/commands/make-design.md +5 -5
- package/src/content/.opencode/commands/make-engineer.md +5 -5
- package/src/content/.opencode/commands/make-evidence-scaffold.md +5 -5
- package/src/content/.opencode/commands/make-guardrails.md +5 -5
- package/src/content/.opencode/commands/make-user-model.md +5 -5
- package/src/content/.opencode/commands/ops-backlog.md +10 -10
- package/src/content/.opencode/commands/ops-evidence.md +9 -9
- package/src/content/.opencode/commands/ops-review.md +8 -8
- package/src/content/.opencode/commands/ops-ship.md +9 -9
- package/src/content/.opencode/commands/plan-apply.md +9 -9
- package/src/content/.opencode/commands/plan-archive.md +5 -5
- package/src/content/.opencode/commands/plan-explore.md +9 -9
- package/src/content/.opencode/commands/plan-goal.md +5 -5
- package/src/content/.opencode/commands/plan-propose.md +9 -9
- package/src/content/.opencode/commands/plan-quick.md +5 -5
- package/src/content/.opencode/commands/plan-story.md +9 -9
- package/src/content/.opencode/commands/repo-audit.md +5 -5
- package/src/content/.opencode/commands/repo-help.md +5 -5
- package/src/content/.opencode/commands/repo-initialize.md +5 -5
- package/src/content/.opencode/commands/repo-onboard.md +5 -5
- package/src/content/.opencode/commands/repo-verify.md +5 -5
- package/src/content/.opencode/plugins/pc-subagent-monitor.js +139 -139
- package/src/content/.opencode/plugins/pc-subagent-tiers.js +179 -179
- package/src/content/.opencode/plugins/pc-system-reminders.js +96 -96
- package/src/content/.opencode/tui/pc-subagents.tsx +98 -98
- package/src/content/.opencode/tui.json +6 -6
- package/src/content/AGENTS.md +71 -71
- package/src/fragments/archive/az.md +95 -95
- package/src/fragments/archive/gh.md +94 -94
- package/src/fragments/archive/gl.md +94 -94
- package/src/fragments/archive/none.md +73 -73
- package/src/fragments/guardrails/codegraph.md +7 -7
- package/src/fragments/guardrails/humanizer.md +4 -4
- package/src/fragments/guardrails/memory.md +4 -4
- package/src/fragments/guardrails/rtk.md +3 -3
- package/src/fragments/guardrails/simple-english.md +4 -4
- package/src/fragments/ops-backlog/az.md +28 -28
- package/src/fragments/ops-backlog/gh.md +29 -29
- package/src/fragments/ops-backlog/jira.md +28 -28
- package/src/fragments/ops-evidence/az.md +41 -41
- package/src/fragments/ops-evidence/gh.md +53 -53
- package/src/fragments/ops-evidence/jira.md +38 -38
- package/src/fragments/ops-review/az.md +62 -62
- package/src/fragments/ops-review/gh.md +52 -52
- package/src/fragments/ops-review/gl.md +56 -56
- package/src/fragments/ops-ship/az.md +80 -80
- package/src/fragments/ops-ship/gh.md +68 -68
- package/src/fragments/ops-ship/gl.md +85 -85
- package/src/index.js +107 -107
- package/src/presets/agents-content.json +53 -53
- package/src/presets/models.json +68 -68
- package/src/steps/copy/agents.js +118 -118
- package/src/steps/copy/commands.js +91 -91
- package/src/steps/copy/fullstack-engineer.js +83 -83
- package/src/steps/copy/index.js +88 -88
- package/src/steps/copy/opencode-json.js +129 -129
- package/src/steps/copy/skills.js +196 -196
- package/src/steps/metadata/index.js +108 -108
- package/src/steps/models/write.js +34 -34
- package/src/steps/optimization/patch-guardrails.js +108 -108
- package/src/utils/copy.js +108 -108
- package/src/utils/legacy-check.js +30 -30
- package/src/utils/models-cache.js +58 -58
- package/src/utils/paths.js +64 -64
- package/src/utils/update-manifest.js +49 -49
- package/src/content/.opencode/plugins/pc-system-reminders.test.js +0 -35
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-plan-archive
|
|
3
|
-
description: Archive a completed OpenSpec change and update documentation. Interactive mode finds the oldest merged unarchived change and opens an archive PR; autonomous mode archives a named change in place on the current branch. Invoked by the /plan-archive command (interactive) and the plan-goal pipeline (autonomous).
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Plan Archive
|
|
8
|
-
|
|
9
|
-
## Input
|
|
10
|
-
|
|
11
|
-
The caller provides (all optional):
|
|
12
|
-
- A mode (see below). Default: `interactive`.
|
|
13
|
-
- In autonomous mode: the change id to archive (required in that mode; the caller knows which change it just implemented).
|
|
14
|
-
|
|
15
|
-
## Modes
|
|
16
|
-
|
|
17
|
-
- interactive (default): full flow below. Find the oldest unarchived change with a completed PR, confirm with the user, archive it, update docs with approval, and open an archive PR. No input required.
|
|
18
|
-
- autonomous: the caller names the change to archive. Skip the working-tree prep, the PR lookup, the confirmation prompt, and the archive-PR step. Instead, archive in place on the current branch:
|
|
19
|
-
1. Archive the change by its id. Prefer the `@openspec-archive-change` skill if it is available. If it is not available, run the CLI directly, and it must be non-interactive, because there is no user to answer prompts:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
openspec archive "<change-id>" -y
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`-y` skips the confirmation prompt (without it the command blocks forever in an unattended run). Add `--skip-specs` only for infra/tooling/doc-only changes that produced no spec deltas. If the command reports the change is already archived, treat that as success.
|
|
26
|
-
2. Verify the archive actually moved. The change folder must no longer exist at `openspec/changes/<change-id>/`, and a dated copy must now exist under `openspec/changes/archive/` (the CLI renames it to `archive/YYYY-MM-DD-<change-id>/`):
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
30
|
-
test ! -d "$REPO_ROOT/openspec/changes/<change-id>" \
|
|
31
|
-
&& ls -d "$REPO_ROOT/openspec/changes/archive/"*"<change-id>" >/dev/null 2>&1 \
|
|
32
|
-
&& echo ARCHIVED_OK || echo ARCHIVE_FAILED
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
If this prints `ARCHIVE_FAILED`, run the archive once more and repeat the check. If it still fails, report it to the caller as a failure; do not pretend it succeeded.
|
|
36
|
-
3. Compare the archived change's specs against `ARCHITECTURE.md` and `DESIGN.md`; apply any needed doc updates directly (no approval prompt).
|
|
37
|
-
4. If the change was a bug fix or new functionality with important impact, check if `@pc-guardrails-project` exists and update it.
|
|
38
|
-
5. Do not commit or push: the caller owns the git operations.
|
|
39
|
-
6. The ARCHIVE stage is complete. Hand control back to the caller (the `/plan-goal` pipeline) so it continues with evidence and output. Do not stop or end the turn here; archiving is not the end of the run.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Interactive flow
|
|
44
|
-
|
|
45
|
-
Steps
|
|
46
|
-
|
|
47
|
-
1. Prepare working tree
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
51
|
-
DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||')"
|
|
52
|
-
[ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH="main"
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
1. If the tree has uncommitted changes: `git stash push -u -m "WIP before archive"` and tell the user their work is stashed (it is restored in step 6).
|
|
56
|
-
2. Sync the default branch (skip the pull if there is no `origin` remote):
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
git switch "$DEFAULT_BRANCH" && git pull origin "$DEFAULT_BRANCH"
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
<!-- PC-PLATFORM-ARCHIVE-START -->
|
|
63
|
-
<!-- PC-PLATFORM-ARCHIVE-END -->
|
|
1
|
+
---
|
|
2
|
+
name: pc-plan-archive
|
|
3
|
+
description: Archive a completed OpenSpec change and update documentation. Interactive mode finds the oldest merged unarchived change and opens an archive PR; autonomous mode archives a named change in place on the current branch. Invoked by the /plan-archive command (interactive) and the plan-goal pipeline (autonomous).
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Plan Archive
|
|
8
|
+
|
|
9
|
+
## Input
|
|
10
|
+
|
|
11
|
+
The caller provides (all optional):
|
|
12
|
+
- A mode (see below). Default: `interactive`.
|
|
13
|
+
- In autonomous mode: the change id to archive (required in that mode; the caller knows which change it just implemented).
|
|
14
|
+
|
|
15
|
+
## Modes
|
|
16
|
+
|
|
17
|
+
- interactive (default): full flow below. Find the oldest unarchived change with a completed PR, confirm with the user, archive it, update docs with approval, and open an archive PR. No input required.
|
|
18
|
+
- autonomous: the caller names the change to archive. Skip the working-tree prep, the PR lookup, the confirmation prompt, and the archive-PR step. Instead, archive in place on the current branch:
|
|
19
|
+
1. Archive the change by its id. Prefer the `@openspec-archive-change` skill if it is available. If it is not available, run the CLI directly, and it must be non-interactive, because there is no user to answer prompts:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
openspec archive "<change-id>" -y
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`-y` skips the confirmation prompt (without it the command blocks forever in an unattended run). Add `--skip-specs` only for infra/tooling/doc-only changes that produced no spec deltas. If the command reports the change is already archived, treat that as success.
|
|
26
|
+
2. Verify the archive actually moved. The change folder must no longer exist at `openspec/changes/<change-id>/`, and a dated copy must now exist under `openspec/changes/archive/` (the CLI renames it to `archive/YYYY-MM-DD-<change-id>/`):
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
30
|
+
test ! -d "$REPO_ROOT/openspec/changes/<change-id>" \
|
|
31
|
+
&& ls -d "$REPO_ROOT/openspec/changes/archive/"*"<change-id>" >/dev/null 2>&1 \
|
|
32
|
+
&& echo ARCHIVED_OK || echo ARCHIVE_FAILED
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
If this prints `ARCHIVE_FAILED`, run the archive once more and repeat the check. If it still fails, report it to the caller as a failure; do not pretend it succeeded.
|
|
36
|
+
3. Compare the archived change's specs against `ARCHITECTURE.md` and `DESIGN.md`; apply any needed doc updates directly (no approval prompt).
|
|
37
|
+
4. If the change was a bug fix or new functionality with important impact, check if `@pc-guardrails-project` exists and update it.
|
|
38
|
+
5. Do not commit or push: the caller owns the git operations.
|
|
39
|
+
6. The ARCHIVE stage is complete. Hand control back to the caller (the `/plan-goal` pipeline) so it continues with evidence and output. Do not stop or end the turn here; archiving is not the end of the run.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Interactive flow
|
|
44
|
+
|
|
45
|
+
Steps
|
|
46
|
+
|
|
47
|
+
1. Prepare working tree
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
51
|
+
DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||')"
|
|
52
|
+
[ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH="main"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
1. If the tree has uncommitted changes: `git stash push -u -m "WIP before archive"` and tell the user their work is stashed (it is restored in step 6).
|
|
56
|
+
2. Sync the default branch (skip the pull if there is no `origin` remote):
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
git switch "$DEFAULT_BRANCH" && git pull origin "$DEFAULT_BRANCH"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
<!-- PC-PLATFORM-ARCHIVE-START -->
|
|
63
|
+
<!-- PC-PLATFORM-ARCHIVE-END -->
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-plan-explore
|
|
3
|
-
description: Explore an idea or requirement before planning. Invoked by the /plan-explore command.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
**READ-ONLY MODE.** From the moment this skill is loaded until the user explicitly invokes a different command (e.g. `/plan-apply`) or explicitly requests implementation, you MUST NOT write, edit, or create any file, including OpenSpec artifacts. You may only read, search, and discuss. If the conversation drifts toward implementation, remind the user that explore mode is active and suggest `/plan-apply` to start implementing. This overrides any permissive stance in `@openspec-explore` about creating OpenSpec artifacts being "fine."
|
|
8
|
-
|
|
9
|
-
Load `@openspec-explore` and follow every step defined in it.
|
|
1
|
+
---
|
|
2
|
+
name: pc-plan-explore
|
|
3
|
+
description: Explore an idea or requirement before planning. Invoked by the /plan-explore command.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
**READ-ONLY MODE.** From the moment this skill is loaded until the user explicitly invokes a different command (e.g. `/plan-apply`) or explicitly requests implementation, you MUST NOT write, edit, or create any file, including OpenSpec artifacts. You may only read, search, and discuss. If the conversation drifts toward implementation, remind the user that explore mode is active and suggest `/plan-apply` to start implementing. This overrides any permissive stance in `@openspec-explore` about creating OpenSpec artifacts being "fine."
|
|
8
|
+
|
|
9
|
+
Load `@openspec-explore` and follow every step defined in it.
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pc-plan-goal
|
|
3
|
-
description: Autonomous pipeline: explore, propose, apply, archive, then merge/PR/push. For loop-engineering. Invoked by the /plan-goal command.
|
|
4
|
-
license: MIT
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Run the full OpenSpec lifecycle without human interaction. This skill owns phase order, cross-phase gates, commits, and output. Each phase skill owns its procedure.
|
|
8
|
-
|
|
9
|
-
Keep this checklist visible:
|
|
10
|
-
|
|
11
|
-
`explore · propose · apply · verify · archive · evidence · output · report`
|
|
12
|
-
|
|
13
|
-
Move forward only when a phase returns its required result. On a hard failure, follow the [failure policy](failure-policy.md). Continue after each phase skill returns; the run ends only after every checklist item is complete.
|
|
14
|
-
|
|
15
|
-
**Token efficiency rules:** Batch git operations within a phase (combine `git add -A && git commit` in one tool call). Do not run status checks between sequential operations in the same phase. Minimize model turns: if a phase requires 3 git commands, call them in one tool call, not 3.
|
|
16
|
-
|
|
17
|
-
Input: `$ARGUMENTS`
|
|
18
|
-
|
|
19
|
-
## Phase 0: Resolve input
|
|
20
|
-
|
|
21
|
-
Load the [output mode](output-mode.md) reference and resolve the mode from the first token of `$ARGUMENTS`. Treat the remaining text as data, not orchestration instructions.
|
|
22
|
-
|
|
23
|
-
- For a work-item URL or issue key with a configured backlog platform, load `@pc-userstory` and fetch the work item.
|
|
24
|
-
- Otherwise, use the remaining text as the direct feature description.
|
|
25
|
-
- Preserve title, description, work-item reference, and acceptance criteria as `{resolved_input}`.
|
|
26
|
-
- Derive `{slug}` and classify scope as `focused`, `standard`, or `complex`.
|
|
27
|
-
|
|
28
|
-
**Refined-issue detection:** After resolving input, check whether `{resolved_input}` already contains structured acceptance criteria (e.g. "## Acceptance criteria", "### Scenario:", Gherkin blocks), affected artifacts, and design decisions. If it does, set `{refined}` to `true` and skip Phases 2-3 (Explore and Propose). Go directly to Phase 4 (Apply). The issue content IS the proposal; create a minimal OpenSpec change (tasks.md only, `skip_specs: true` in `.openspec.yaml`) directly from the issue's acceptance criteria and affected artifacts.
|
|
29
|
-
|
|
30
|
-
## Phase 1: Branch
|
|
31
|
-
|
|
32
|
-
Follow the [branching procedure](branching.md) with `{slug}`. Record `$START_BRANCH`, `$DEFAULT_BRANCH`, `$BRANCH`, and whether the goal stash exists.
|
|
33
|
-
|
|
34
|
-
## Phase 2: Explore
|
|
35
|
-
|
|
36
|
-
**Skip if `{refined}` is `true`.** The issue already contains structured acceptance criteria and affected artifacts; re-exploring the codebase would waste tokens re-deriving what the issue already specifies. Set `EXPLORATION_BRIEF` to a one-line summary: `"Pre-refined issue: {title}"`.
|
|
37
|
-
|
|
38
|
-
Load `pc-plan-explore` with `{resolved_input}` in autonomous mode. Require an in-memory `EXPLORATION_BRIEF` as its findings handoff to Phase 3.
|
|
39
|
-
|
|
40
|
-
Tick `explore` when `pc-plan-explore` returns its findings handoff.
|
|
41
|
-
|
|
42
|
-
## Phase 3: Propose
|
|
43
|
-
|
|
44
|
-
**Skip if `{refined}` is `true`.** Instead, create a minimal OpenSpec change directly: run `openspec new change "{change-id}"`, write `tasks.md` from the issue's acceptance criteria (one task per criterion or artifact group), create `.openspec.yaml` with `skip_specs: true` (the issue already has the spec content), and commit: `git add -A && git commit -m "propose: {title} ({change-id})"`.
|
|
45
|
-
|
|
46
|
-
Load `pc-plan-propose` in autonomous mode with `{resolved_input}`, `EXPLORATION_BRIEF`, and `scope_classification`.
|
|
47
|
-
|
|
48
|
-
Confirm its change directory and actionable `tasks.md` exist. Rename `$BRANCH` when the canonical change slug differs from `{slug}`, then commit the proposal:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
git add -A && git commit -m "propose: {title} ({change-id})"
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Tick `propose` when the proposal commit exists.
|
|
55
|
-
|
|
56
|
-
## Phase 4: Apply and verify
|
|
57
|
-
|
|
58
|
-
Load `pc-plan-apply` in autonomous mode with `start_from: load-plan`. It owns worker resolution, subagent waves, commits, verification, and re-waves.
|
|
59
|
-
|
|
60
|
-
Require it to return every task complete and `VERIFIED`, then load `pc-repo-verify`. Tick `apply` and `verify` only when both phases return `VERIFIED`.
|
|
61
|
-
|
|
62
|
-
## Phase 5: Archive
|
|
63
|
-
|
|
64
|
-
Require `verify` and a clean working tree. Load `pc-plan-archive` in autonomous mode with `{change-id}`. It owns archive verification and retry.
|
|
65
|
-
|
|
66
|
-
Require `ARCHIVED_OK` and the archive path, then commit:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
git add -A && git commit -m "archive: {title} ({change-id})"
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Tick `archive` when the archive commit exists.
|
|
73
|
-
|
|
74
|
-
## Phase 5.5: Evidence
|
|
75
|
-
|
|
76
|
-
Load `pc-ops-evidence` with `operation: capture` and `{change-id}`. It owns evidence decisions, capture, and the manifest. Evidence capture is non-fatal.
|
|
77
|
-
|
|
78
|
-
The evidence skill uses `playwright-cli` (headless, works inside containers) and `pnpm run dev` (starts the full app stack with mock auth). Evidence capture works in CI.
|
|
79
|
-
|
|
80
|
-
Commit evidence when files or a manifest were written:
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
git add -A && git commit -m "evidence: {title} ({change-id})"
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Record the manifest result and tick `evidence` after capture was attempted.
|
|
87
|
-
|
|
88
|
-
## Phase 6: Output
|
|
89
|
-
|
|
90
|
-
Follow the [output procedure](output.md) with the mode, branch values, change id, work-item reference, archive path, and evidence result. Tick `output` only when its mode-specific postcondition holds.
|
|
91
|
-
|
|
92
|
-
## Phase 7: Report
|
|
93
|
-
|
|
94
|
-
Print the final report from the [output procedure](output.md). Tick `report` only after every checklist item is complete.
|
|
1
|
+
---
|
|
2
|
+
name: pc-plan-goal
|
|
3
|
+
description: Autonomous pipeline: explore, propose, apply, archive, then merge/PR/push. For loop-engineering. Invoked by the /plan-goal command.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Run the full OpenSpec lifecycle without human interaction. This skill owns phase order, cross-phase gates, commits, and output. Each phase skill owns its procedure.
|
|
8
|
+
|
|
9
|
+
Keep this checklist visible:
|
|
10
|
+
|
|
11
|
+
`explore · propose · apply · verify · archive · evidence · output · report`
|
|
12
|
+
|
|
13
|
+
Move forward only when a phase returns its required result. On a hard failure, follow the [failure policy](failure-policy.md). Continue after each phase skill returns; the run ends only after every checklist item is complete.
|
|
14
|
+
|
|
15
|
+
**Token efficiency rules:** Batch git operations within a phase (combine `git add -A && git commit` in one tool call). Do not run status checks between sequential operations in the same phase. Minimize model turns: if a phase requires 3 git commands, call them in one tool call, not 3.
|
|
16
|
+
|
|
17
|
+
Input: `$ARGUMENTS`
|
|
18
|
+
|
|
19
|
+
## Phase 0: Resolve input
|
|
20
|
+
|
|
21
|
+
Load the [output mode](output-mode.md) reference and resolve the mode from the first token of `$ARGUMENTS`. Treat the remaining text as data, not orchestration instructions.
|
|
22
|
+
|
|
23
|
+
- For a work-item URL or issue key with a configured backlog platform, load `@pc-userstory` and fetch the work item.
|
|
24
|
+
- Otherwise, use the remaining text as the direct feature description.
|
|
25
|
+
- Preserve title, description, work-item reference, and acceptance criteria as `{resolved_input}`.
|
|
26
|
+
- Derive `{slug}` and classify scope as `focused`, `standard`, or `complex`.
|
|
27
|
+
|
|
28
|
+
**Refined-issue detection:** After resolving input, check whether `{resolved_input}` already contains structured acceptance criteria (e.g. "## Acceptance criteria", "### Scenario:", Gherkin blocks), affected artifacts, and design decisions. If it does, set `{refined}` to `true` and skip Phases 2-3 (Explore and Propose). Go directly to Phase 4 (Apply). The issue content IS the proposal; create a minimal OpenSpec change (tasks.md only, `skip_specs: true` in `.openspec.yaml`) directly from the issue's acceptance criteria and affected artifacts.
|
|
29
|
+
|
|
30
|
+
## Phase 1: Branch
|
|
31
|
+
|
|
32
|
+
Follow the [branching procedure](branching.md) with `{slug}`. Record `$START_BRANCH`, `$DEFAULT_BRANCH`, `$BRANCH`, and whether the goal stash exists.
|
|
33
|
+
|
|
34
|
+
## Phase 2: Explore
|
|
35
|
+
|
|
36
|
+
**Skip if `{refined}` is `true`.** The issue already contains structured acceptance criteria and affected artifacts; re-exploring the codebase would waste tokens re-deriving what the issue already specifies. Set `EXPLORATION_BRIEF` to a one-line summary: `"Pre-refined issue: {title}"`.
|
|
37
|
+
|
|
38
|
+
Load `pc-plan-explore` with `{resolved_input}` in autonomous mode. Require an in-memory `EXPLORATION_BRIEF` as its findings handoff to Phase 3.
|
|
39
|
+
|
|
40
|
+
Tick `explore` when `pc-plan-explore` returns its findings handoff.
|
|
41
|
+
|
|
42
|
+
## Phase 3: Propose
|
|
43
|
+
|
|
44
|
+
**Skip if `{refined}` is `true`.** Instead, create a minimal OpenSpec change directly: run `openspec new change "{change-id}"`, write `tasks.md` from the issue's acceptance criteria (one task per criterion or artifact group), create `.openspec.yaml` with `skip_specs: true` (the issue already has the spec content), and commit: `git add -A && git commit -m "propose: {title} ({change-id})"`.
|
|
45
|
+
|
|
46
|
+
Load `pc-plan-propose` in autonomous mode with `{resolved_input}`, `EXPLORATION_BRIEF`, and `scope_classification`.
|
|
47
|
+
|
|
48
|
+
Confirm its change directory and actionable `tasks.md` exist. Rename `$BRANCH` when the canonical change slug differs from `{slug}`, then commit the proposal:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git add -A && git commit -m "propose: {title} ({change-id})"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Tick `propose` when the proposal commit exists.
|
|
55
|
+
|
|
56
|
+
## Phase 4: Apply and verify
|
|
57
|
+
|
|
58
|
+
Load `pc-plan-apply` in autonomous mode with `start_from: load-plan`. It owns worker resolution, subagent waves, commits, verification, and re-waves.
|
|
59
|
+
|
|
60
|
+
Require it to return every task complete and `VERIFIED`, then load `pc-repo-verify`. Tick `apply` and `verify` only when both phases return `VERIFIED`.
|
|
61
|
+
|
|
62
|
+
## Phase 5: Archive
|
|
63
|
+
|
|
64
|
+
Require `verify` and a clean working tree. Load `pc-plan-archive` in autonomous mode with `{change-id}`. It owns archive verification and retry.
|
|
65
|
+
|
|
66
|
+
Require `ARCHIVED_OK` and the archive path, then commit:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
git add -A && git commit -m "archive: {title} ({change-id})"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Tick `archive` when the archive commit exists.
|
|
73
|
+
|
|
74
|
+
## Phase 5.5: Evidence
|
|
75
|
+
|
|
76
|
+
Load `pc-ops-evidence` with `operation: capture` and `{change-id}`. It owns evidence decisions, capture, and the manifest. Evidence capture is non-fatal.
|
|
77
|
+
|
|
78
|
+
The evidence skill uses `playwright-cli` (headless, works inside containers) and `pnpm run dev` (starts the full app stack with mock auth). Evidence capture works in CI.
|
|
79
|
+
|
|
80
|
+
Commit evidence when files or a manifest were written:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
git add -A && git commit -m "evidence: {title} ({change-id})"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Record the manifest result and tick `evidence` after capture was attempted.
|
|
87
|
+
|
|
88
|
+
## Phase 6: Output
|
|
89
|
+
|
|
90
|
+
Follow the [output procedure](output.md) with the mode, branch values, change id, work-item reference, archive path, and evidence result. Tick `output` only when its mode-specific postcondition holds.
|
|
91
|
+
|
|
92
|
+
## Phase 7: Report
|
|
93
|
+
|
|
94
|
+
Print the final report from the [output procedure](output.md). Tick `report` only after every checklist item is complete.
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# Branching procedure
|
|
2
|
-
|
|
3
|
-
Resolve and record the branch names:
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
START_BRANCH="$(git branch --show-current)"
|
|
7
|
-
DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||')"
|
|
8
|
-
[ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH="main"
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Stash uncommitted work when needed and record that the goal stash exists:
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
git stash push -u -m "goal-wip"
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Create the feature branch from the synchronized default branch:
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
git switch "$DEFAULT_BRANCH"
|
|
21
|
-
|
|
22
|
-
if git remote get-url origin >/dev/null 2>&1; then
|
|
23
|
-
git pull origin "$DEFAULT_BRANCH"
|
|
24
|
-
fi
|
|
25
|
-
|
|
26
|
-
git switch -c "feature/{slug}"
|
|
27
|
-
BRANCH="$(git branch --show-current)"
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Everything through archive and evidence happens on `$BRANCH`.
|
|
1
|
+
# Branching procedure
|
|
2
|
+
|
|
3
|
+
Resolve and record the branch names:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
START_BRANCH="$(git branch --show-current)"
|
|
7
|
+
DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD 2>/dev/null | sed 's|^origin/||')"
|
|
8
|
+
[ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH="main"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Stash uncommitted work when needed and record that the goal stash exists:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git stash push -u -m "goal-wip"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Create the feature branch from the synchronized default branch:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
git switch "$DEFAULT_BRANCH"
|
|
21
|
+
|
|
22
|
+
if git remote get-url origin >/dev/null 2>&1; then
|
|
23
|
+
git pull origin "$DEFAULT_BRANCH"
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
git switch -c "feature/{slug}"
|
|
27
|
+
BRANCH="$(git branch --show-current)"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Everything through archive and evidence happens on `$BRANCH`.
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# Failure policy
|
|
2
|
-
|
|
3
|
-
`/plan-goal` never asks for input, but must halt instead of shipping broken or incoherent work.
|
|
4
|
-
|
|
5
|
-
Use the failure policy when:
|
|
6
|
-
|
|
7
|
-
- exploration cannot produce a safe and coherent functional interpretation after its one retry,
|
|
8
|
-
- exploration determines the goal is infeasible or outside the repository's feasible responsibility,
|
|
9
|
-
- the proposal produces no actionable tasks,
|
|
10
|
-
- the proposal materially contradicts the exploration brief,
|
|
11
|
-
- a task wave stalls because tasks remain but none are eligible,
|
|
12
|
-
- a task exhausts its single retry,
|
|
13
|
-
- tests, lint, build, type checks, or required verification fail and cannot be cleared by re-waving,
|
|
14
|
-
- any verification command (lint, typecheck, test) exits non-zero after the apply phase and re-waving does not clear it,
|
|
15
|
-
- archive verification still prints `ARCHIVE_FAILED` after one retry,
|
|
16
|
-
- required repository state is missing or inconsistent before output,
|
|
17
|
-
- or a merge conflict cannot be resolved cleanly and automatically.
|
|
18
|
-
|
|
19
|
-
On failure:
|
|
20
|
-
|
|
21
|
-
1. Stop the pipeline.
|
|
22
|
-
2. Do not merge.
|
|
23
|
-
3. Do not push the default branch.
|
|
24
|
-
4. Leave `$BRANCH` intact whenever it exists.
|
|
25
|
-
5. Abort any incomplete merge.
|
|
26
|
-
6. Restore the Phase 1 goal stash on `$START_BRANCH`.
|
|
27
|
-
7. If stash restoration conflicts, preserve the stash and report its reference.
|
|
28
|
-
8. Report: the failed phase, the exact failed postcondition, commands or verification that failed, retry attempts, current branch, repository state, completed commits, archive state, and the safest manual next step.
|
|
29
|
-
|
|
30
|
-
For loop-engineering, a clean failure with the feature branch preserved is the correct outcome. Never merge or ship unverified work.
|
|
1
|
+
# Failure policy
|
|
2
|
+
|
|
3
|
+
`/plan-goal` never asks for input, but must halt instead of shipping broken or incoherent work.
|
|
4
|
+
|
|
5
|
+
Use the failure policy when:
|
|
6
|
+
|
|
7
|
+
- exploration cannot produce a safe and coherent functional interpretation after its one retry,
|
|
8
|
+
- exploration determines the goal is infeasible or outside the repository's feasible responsibility,
|
|
9
|
+
- the proposal produces no actionable tasks,
|
|
10
|
+
- the proposal materially contradicts the exploration brief,
|
|
11
|
+
- a task wave stalls because tasks remain but none are eligible,
|
|
12
|
+
- a task exhausts its single retry,
|
|
13
|
+
- tests, lint, build, type checks, or required verification fail and cannot be cleared by re-waving,
|
|
14
|
+
- any verification command (lint, typecheck, test) exits non-zero after the apply phase and re-waving does not clear it,
|
|
15
|
+
- archive verification still prints `ARCHIVE_FAILED` after one retry,
|
|
16
|
+
- required repository state is missing or inconsistent before output,
|
|
17
|
+
- or a merge conflict cannot be resolved cleanly and automatically.
|
|
18
|
+
|
|
19
|
+
On failure:
|
|
20
|
+
|
|
21
|
+
1. Stop the pipeline.
|
|
22
|
+
2. Do not merge.
|
|
23
|
+
3. Do not push the default branch.
|
|
24
|
+
4. Leave `$BRANCH` intact whenever it exists.
|
|
25
|
+
5. Abort any incomplete merge.
|
|
26
|
+
6. Restore the Phase 1 goal stash on `$START_BRANCH`.
|
|
27
|
+
7. If stash restoration conflicts, preserve the stash and report its reference.
|
|
28
|
+
8. Report: the failed phase, the exact failed postcondition, commands or verification that failed, retry attempts, current branch, repository state, completed commits, archive state, and the safest manual next step.
|
|
29
|
+
|
|
30
|
+
For loop-engineering, a clean failure with the feature branch preserved is the correct outcome. Never merge or ship unverified work.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Output mode
|
|
2
|
-
|
|
3
|
-
Determine the mode only from the first whitespace-delimited token of `$ARGUMENTS`.
|
|
4
|
-
|
|
5
|
-
- `pr`: remove the token, push the feature branch, and create a PR.
|
|
6
|
-
- `push`: remove the token and push the feature branch.
|
|
7
|
-
- Any other first token: keep the full input and merge locally into the default branch.
|
|
8
|
-
|
|
9
|
-
Words such as "push notifications" or "PR template" inside the feature description are feature data. They do not change output mode.
|
|
1
|
+
# Output mode
|
|
2
|
+
|
|
3
|
+
Determine the mode only from the first whitespace-delimited token of `$ARGUMENTS`.
|
|
4
|
+
|
|
5
|
+
- `pr`: remove the token, push the feature branch, and create a PR.
|
|
6
|
+
- `push`: remove the token and push the feature branch.
|
|
7
|
+
- Any other first token: keep the full input and merge locally into the default branch.
|
|
8
|
+
|
|
9
|
+
Words such as "push notifications" or "PR template" inside the feature description are feature data. They do not change output mode.
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
# Output procedure
|
|
2
|
-
|
|
3
|
-
Before output, require `verify`, `archive`, a clean working tree, no active change directory, and an archive directory for `{change-id}`.
|
|
4
|
-
|
|
5
|
-
## Restore stash
|
|
6
|
-
|
|
7
|
-
If the goal created `goal-wip`, restore it after the mode-specific operation. When restoration conflicts, leave the stash intact, report its `git stash list` reference, and do not drop user work.
|
|
8
|
-
|
|
9
|
-
## Default mode
|
|
10
|
-
|
|
11
|
-
Synchronize the default branch, merge, delete the feature branch, then restore the stash:
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
git switch "$DEFAULT_BRANCH"
|
|
15
|
-
|
|
16
|
-
if git remote get-url origin >/dev/null 2>&1; then
|
|
17
|
-
git pull origin "$DEFAULT_BRANCH"
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
git merge --no-ff "$BRANCH" -m "goal: {title} ({change-id})"
|
|
21
|
-
git branch -d "$BRANCH"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
If the merge conflicts, abort it and use the failure policy. Do not push the default branch. Evidence remains in the archive and publication is skipped because no commit-pinned repository URL exists.
|
|
25
|
-
|
|
26
|
-
## Push mode
|
|
27
|
-
|
|
28
|
-
Push the feature branch:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
git push -u origin "$BRANCH"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
When a work item exists, load `pc-ops-evidence` with `operation: publish`, `{change-id}`, the work-item reference, and `mode: push`. Publication is non-fatal. Restore the stash and leave the branch available.
|
|
35
|
-
|
|
36
|
-
## PR mode
|
|
37
|
-
|
|
38
|
-
Push the feature branch, then load `pc-ops-ship` to create a PR into `$DEFAULT_BRANCH`. Supply title, change id, functional summary, delivered acceptance criteria, task count, verification result, archive path, evidence result, and commits. Do not merge the PR.
|
|
39
|
-
|
|
40
|
-
When a work item exists, load `pc-ops-evidence` with `operation: publish`, `{change-id}`, the work-item reference, PR number, and `mode: pr`. Publication is non-fatal. Restore the stash.
|
|
41
|
-
|
|
42
|
-
## Final report
|
|
43
|
-
|
|
44
|
-
Print:
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
Goal: {title}
|
|
48
|
-
Change ID: {change-id}
|
|
49
|
-
Scope classification: focused | standard | complex
|
|
50
|
-
Functional outcome: {one-sentence result}
|
|
51
|
-
Branch: {branch}
|
|
52
|
-
Tasks: {completed}/{total}
|
|
53
|
-
Acceptance criteria: {passed}/{total}
|
|
54
|
-
Commits: {proposal, apply, archive, evidence when present}
|
|
55
|
-
Verification: passed | failed
|
|
56
|
-
Archived: yes | no
|
|
57
|
-
Archive path: {path or none}
|
|
58
|
-
Evidence: passed | skipped | failed | blocked
|
|
59
|
-
Evidence assets: {paths or none}
|
|
60
|
-
Evidence publication: {published | skipped | failed}
|
|
61
|
-
Output mode: default | push | pr
|
|
62
|
-
Final state: merged locally | pushed branch | PR URL | branch preserved after failure
|
|
63
|
-
Stash restoration: not needed | restored | preserved after conflict
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## External gate
|
|
67
|
-
|
|
68
|
-
An unattended caller must verify `openspec list --json` is empty and run the project's lint and typecheck commands before any later git operation.
|
|
1
|
+
# Output procedure
|
|
2
|
+
|
|
3
|
+
Before output, require `verify`, `archive`, a clean working tree, no active change directory, and an archive directory for `{change-id}`.
|
|
4
|
+
|
|
5
|
+
## Restore stash
|
|
6
|
+
|
|
7
|
+
If the goal created `goal-wip`, restore it after the mode-specific operation. When restoration conflicts, leave the stash intact, report its `git stash list` reference, and do not drop user work.
|
|
8
|
+
|
|
9
|
+
## Default mode
|
|
10
|
+
|
|
11
|
+
Synchronize the default branch, merge, delete the feature branch, then restore the stash:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git switch "$DEFAULT_BRANCH"
|
|
15
|
+
|
|
16
|
+
if git remote get-url origin >/dev/null 2>&1; then
|
|
17
|
+
git pull origin "$DEFAULT_BRANCH"
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
git merge --no-ff "$BRANCH" -m "goal: {title} ({change-id})"
|
|
21
|
+
git branch -d "$BRANCH"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If the merge conflicts, abort it and use the failure policy. Do not push the default branch. Evidence remains in the archive and publication is skipped because no commit-pinned repository URL exists.
|
|
25
|
+
|
|
26
|
+
## Push mode
|
|
27
|
+
|
|
28
|
+
Push the feature branch:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git push -u origin "$BRANCH"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
When a work item exists, load `pc-ops-evidence` with `operation: publish`, `{change-id}`, the work-item reference, and `mode: push`. Publication is non-fatal. Restore the stash and leave the branch available.
|
|
35
|
+
|
|
36
|
+
## PR mode
|
|
37
|
+
|
|
38
|
+
Push the feature branch, then load `pc-ops-ship` to create a PR into `$DEFAULT_BRANCH`. Supply title, change id, functional summary, delivered acceptance criteria, task count, verification result, archive path, evidence result, and commits. Do not merge the PR.
|
|
39
|
+
|
|
40
|
+
When a work item exists, load `pc-ops-evidence` with `operation: publish`, `{change-id}`, the work-item reference, PR number, and `mode: pr`. Publication is non-fatal. Restore the stash.
|
|
41
|
+
|
|
42
|
+
## Final report
|
|
43
|
+
|
|
44
|
+
Print:
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
Goal: {title}
|
|
48
|
+
Change ID: {change-id}
|
|
49
|
+
Scope classification: focused | standard | complex
|
|
50
|
+
Functional outcome: {one-sentence result}
|
|
51
|
+
Branch: {branch}
|
|
52
|
+
Tasks: {completed}/{total}
|
|
53
|
+
Acceptance criteria: {passed}/{total}
|
|
54
|
+
Commits: {proposal, apply, archive, evidence when present}
|
|
55
|
+
Verification: passed | failed
|
|
56
|
+
Archived: yes | no
|
|
57
|
+
Archive path: {path or none}
|
|
58
|
+
Evidence: passed | skipped | failed | blocked
|
|
59
|
+
Evidence assets: {paths or none}
|
|
60
|
+
Evidence publication: {published | skipped | failed}
|
|
61
|
+
Output mode: default | push | pr
|
|
62
|
+
Final state: merged locally | pushed branch | PR URL | branch preserved after failure
|
|
63
|
+
Stash restoration: not needed | restored | preserved after conflict
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## External gate
|
|
67
|
+
|
|
68
|
+
An unattended caller must verify `openspec list --json` is empty and run the project's lint and typecheck commands before any later git operation.
|