@plainconceptsplatform/agent-harness 2.0.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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +419 -0
  3. package/package.json +68 -0
  4. package/src/commands/join.js +244 -0
  5. package/src/commands/shared.js +27 -0
  6. package/src/commands/single.js +79 -0
  7. package/src/commands/update.js +109 -0
  8. package/src/commands/wizard.js +134 -0
  9. package/src/content/.agents/skills/browser-automation/SKILL.md +66 -0
  10. package/src/content/.agents/skills/pc-guardrails-generic/SKILL.md +68 -0
  11. package/src/content/.agents/skills/pc-guardrails-project/SKILL.md +8 -0
  12. package/src/content/.agents/skills/pc-make-architecture/SKILL.md +51 -0
  13. package/src/content/.agents/skills/pc-make-architecture/structure-template.md +38 -0
  14. package/src/content/.agents/skills/pc-make-design/SKILL.md +68 -0
  15. package/src/content/.agents/skills/pc-make-engineer/SKILL.md +219 -0
  16. package/src/content/.agents/skills/pc-make-engineer/signal-mapping.md +68 -0
  17. package/src/content/.agents/skills/pc-make-engineer/template.md +81 -0
  18. package/src/content/.agents/skills/pc-make-evidence-scaffold/SKILL.md +18 -0
  19. package/src/content/.agents/skills/pc-make-evidence-scaffold/evidence-contract.md +29 -0
  20. package/src/content/.agents/skills/pc-make-guardrails/SKILL.md +74 -0
  21. package/src/content/.agents/skills/pc-make-guardrails/category-reference.md +68 -0
  22. package/src/content/.agents/skills/pc-make-merge-risk-assess/SKILL.md +70 -0
  23. package/src/content/.agents/skills/pc-make-merge-risk-assess/category-reference.md +98 -0
  24. package/src/content/.agents/skills/pc-make-user-model/SKILL.md +66 -0
  25. package/src/content/.agents/skills/pc-ops-evidence/SKILL.md +127 -0
  26. package/src/content/.agents/skills/pc-ops-ship/SKILL.md +18 -0
  27. package/src/content/.agents/skills/pc-plan-apply/SKILL.md +83 -0
  28. package/src/content/.agents/skills/pc-plan-apply/simple-mode.md +21 -0
  29. package/src/content/.agents/skills/pc-plan-archive/SKILL.md +63 -0
  30. package/src/content/.agents/skills/pc-plan-explore/SKILL.md +9 -0
  31. package/src/content/.agents/skills/pc-plan-goal/SKILL.md +94 -0
  32. package/src/content/.agents/skills/pc-plan-goal/branching.md +30 -0
  33. package/src/content/.agents/skills/pc-plan-goal/failure-policy.md +30 -0
  34. package/src/content/.agents/skills/pc-plan-goal/output-mode.md +9 -0
  35. package/src/content/.agents/skills/pc-plan-goal/output.md +68 -0
  36. package/src/content/.agents/skills/pc-plan-propose/SKILL.md +125 -0
  37. package/src/content/.agents/skills/pc-plan-propose/task-annotation.md +39 -0
  38. package/src/content/.agents/skills/pc-plan-quick/SKILL.md +62 -0
  39. package/src/content/.agents/skills/pc-plan-story/SKILL.md +146 -0
  40. package/src/content/.agents/skills/pc-repo-audit/SKILL.md +44 -0
  41. package/src/content/.agents/skills/pc-repo-help/SKILL.md +91 -0
  42. package/src/content/.agents/skills/pc-repo-initialize/SKILL.md +130 -0
  43. package/src/content/.agents/skills/pc-repo-onboard/SKILL.md +87 -0
  44. package/src/content/.agents/skills/pc-repo-verify/SKILL.md +34 -0
  45. package/src/content/.agents/skills/pc-userstory-az/SKILL.md +157 -0
  46. package/src/content/.agents/skills/pc-userstory-browser/SKILL.md +132 -0
  47. package/src/content/.agents/skills/pc-userstory-gh/SKILL.md +120 -0
  48. package/src/content/.agents/skills/pc-userstory-jira/SKILL.md +131 -0
  49. package/src/content/.opencode/_gitignore +7 -0
  50. package/src/content/.opencode/commands/init.md +5 -0
  51. package/src/content/.opencode/commands/make-architecture.md +5 -0
  52. package/src/content/.opencode/commands/make-design.md +5 -0
  53. package/src/content/.opencode/commands/make-engineer.md +5 -0
  54. package/src/content/.opencode/commands/make-evidence-scaffold.md +5 -0
  55. package/src/content/.opencode/commands/make-guardrails.md +5 -0
  56. package/src/content/.opencode/commands/make-user-model.md +5 -0
  57. package/src/content/.opencode/commands/ops-backlog.md +10 -0
  58. package/src/content/.opencode/commands/ops-evidence.md +9 -0
  59. package/src/content/.opencode/commands/ops-review.md +8 -0
  60. package/src/content/.opencode/commands/ops-ship.md +9 -0
  61. package/src/content/.opencode/commands/plan-apply.md +9 -0
  62. package/src/content/.opencode/commands/plan-archive.md +5 -0
  63. package/src/content/.opencode/commands/plan-explore.md +9 -0
  64. package/src/content/.opencode/commands/plan-goal.md +5 -0
  65. package/src/content/.opencode/commands/plan-propose.md +9 -0
  66. package/src/content/.opencode/commands/plan-quick.md +5 -0
  67. package/src/content/.opencode/commands/plan-story.md +9 -0
  68. package/src/content/.opencode/commands/repo-audit.md +5 -0
  69. package/src/content/.opencode/commands/repo-help.md +5 -0
  70. package/src/content/.opencode/commands/repo-initialize.md +5 -0
  71. package/src/content/.opencode/commands/repo-onboard.md +5 -0
  72. package/src/content/.opencode/commands/repo-verify.md +5 -0
  73. package/src/content/.opencode/package.json +10 -0
  74. package/src/content/.opencode/plugins/pc-subagent-monitor.js +139 -0
  75. package/src/content/.opencode/plugins/pc-subagent-tiers.js +179 -0
  76. package/src/content/.opencode/plugins/pc-system-reminders.js +96 -0
  77. package/src/content/.opencode/plugins/pc-system-reminders.test.js +35 -0
  78. package/src/content/.opencode/tui/pc-subagents.tsx +98 -0
  79. package/src/content/.opencode/tui.json +6 -0
  80. package/src/content/AGENTS.md +71 -0
  81. package/src/content/ARCHITECTURE.md +16 -0
  82. package/src/content/DESIGN.md +16 -0
  83. package/src/content/opencode.jsonc +31 -0
  84. package/src/content/openspec/changes/archive/.gitkeep +0 -0
  85. package/src/content/openspec/config.yaml +20 -0
  86. package/src/content/openspec/specs/.gitkeep +0 -0
  87. package/src/content/skills-lock.json +17 -0
  88. package/src/fragments/archive/az.md +95 -0
  89. package/src/fragments/archive/gh.md +94 -0
  90. package/src/fragments/archive/gl.md +94 -0
  91. package/src/fragments/archive/none.md +73 -0
  92. package/src/fragments/guardrails/codegraph.md +7 -0
  93. package/src/fragments/guardrails/humanizer.md +4 -0
  94. package/src/fragments/guardrails/memory.md +4 -0
  95. package/src/fragments/guardrails/rtk.md +3 -0
  96. package/src/fragments/guardrails/simple-english.md +4 -0
  97. package/src/fragments/ops-backlog/az.md +29 -0
  98. package/src/fragments/ops-backlog/gh.md +30 -0
  99. package/src/fragments/ops-backlog/jira.md +29 -0
  100. package/src/fragments/ops-evidence/az.md +41 -0
  101. package/src/fragments/ops-evidence/gh.md +53 -0
  102. package/src/fragments/ops-evidence/jira.md +38 -0
  103. package/src/fragments/ops-review/az.md +63 -0
  104. package/src/fragments/ops-review/gh.md +53 -0
  105. package/src/fragments/ops-review/gl.md +57 -0
  106. package/src/fragments/ops-ship/az.md +81 -0
  107. package/src/fragments/ops-ship/gh.md +69 -0
  108. package/src/fragments/ops-ship/gl.md +86 -0
  109. package/src/index.js +107 -0
  110. package/src/presets/agents-content.json +53 -0
  111. package/src/presets/browser.json +22 -0
  112. package/src/presets/clean.json +21 -0
  113. package/src/presets/models.json +68 -0
  114. package/src/presets/openspec.json +1 -0
  115. package/src/presets/optimization.json +37 -0
  116. package/src/presets/platforms.json +76 -0
  117. package/src/presets/quota.json +16 -0
  118. package/src/presets/source.json +23 -0
  119. package/src/steps/browser/index.js +91 -0
  120. package/src/steps/clean/index.js +120 -0
  121. package/src/steps/copy/agents.js +118 -0
  122. package/src/steps/copy/commands.js +91 -0
  123. package/src/steps/copy/fullstack-engineer.js +83 -0
  124. package/src/steps/copy/index.js +88 -0
  125. package/src/steps/copy/opencode-json.js +129 -0
  126. package/src/steps/copy/skills.js +196 -0
  127. package/src/steps/metadata/index.js +108 -0
  128. package/src/steps/models/format.js +88 -0
  129. package/src/steps/models/index.js +64 -0
  130. package/src/steps/models/write.js +34 -0
  131. package/src/steps/openspec/index.js +136 -0
  132. package/src/steps/optimization/codegraph.js +127 -0
  133. package/src/steps/optimization/humanizer.js +17 -0
  134. package/src/steps/optimization/index.js +163 -0
  135. package/src/steps/optimization/memory.js +88 -0
  136. package/src/steps/optimization/patch-guardrails.js +108 -0
  137. package/src/steps/optimization/quota.js +119 -0
  138. package/src/steps/optimization/simple-english.js +17 -0
  139. package/src/steps/optimization/skills-lock.js +30 -0
  140. package/src/steps/platform/index.js +109 -0
  141. package/src/steps/source/index.js +123 -0
  142. package/src/utils/copy.js +108 -0
  143. package/src/utils/exec-spinner.js +47 -0
  144. package/src/utils/exec.js +134 -0
  145. package/src/utils/legacy-check.js +30 -0
  146. package/src/utils/models-cache.js +58 -0
  147. package/src/utils/models-pricing.js +42 -0
  148. package/src/utils/paths.js +64 -0
  149. package/src/utils/process.js +3 -0
  150. package/src/utils/terminal.js +6 -0
  151. package/src/utils/update-manifest.js +49 -0
@@ -0,0 +1,29 @@
1
+ # Evidence contract
2
+
3
+ Evidence captured by `/plan-goal` lives at `openspec/changes/archive/<dated>-<id>/evidence/`. A standalone pre-archive capture may use `openspec/changes/<id>/evidence/`, but archive moves it into the archived change before publication. That folder contains only:
4
+ - ordered capture images (`01-{label}.png/webp`, ...) and/or `flow.gif`
5
+ - `evidence.json`: the manifest, schema below.
6
+
7
+ ## version 1 schema
8
+
9
+ ```jsonc
10
+ {
11
+ "version": 1,
12
+ "changeId": "...",
13
+ "required": true,
14
+ "status": "passed", // passed | skipped | failed | blocked
15
+ "assets": [ { "type": "screenshot", "path": "openspec/changes/archive/<dated>-<id>/evidence/01-final.png", "caption": "...", "bytes": 0, "format": "png" } ],
16
+ "reason": "...", // skipped | blocked
17
+ "failedStep": "...", // failed
18
+ "prMarkdown": "## Evidence ..."
19
+ }
20
+ ```
21
+
22
+ ## Statuses
23
+
24
+ - `passed`: evidence required and produced.
25
+ - `skipped`: evidence not required (see decision rule). Exit success.
26
+ - `blocked`: required but could not run (no harness, app won't start, budget exceeded). Not a skip. Surface it.
27
+ - `failed`: a project harness ran and its assertions failed. Surface it.
28
+
29
+ `blocked` (required but unrunnable) is never treated as a skip.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: pc-make-guardrails
3
+ description: Generate or update the pc-guardrails-project skill from ARCHITECTURE.md and relevant project files, then wire it into every engineer agent. Invoked by the /make-guardrails command and the repo-initialize flow.
4
+ license: MIT
5
+ ---
6
+
7
+ # Make Guardrails
8
+
9
+ Analyze `ARCHITECTURE.md` and other project files to generate or update a `pc-guardrails-project` skill: a set of rules and constraints extracted from the project's own documentation that agents must follow.
10
+
11
+ ## Steps
12
+
13
+ 1. **Check current state**
14
+
15
+ Read `.agents/skills/pc-guardrails-project/SKILL.md`. Determine which mode to use:
16
+ - Does not exist: Generate mode. Create from scratch.
17
+ - Exists and has a `<!-- Last updated:` footer: Update mode. Incrementally update.
18
+ - Exists but no timestamp: proceed in Generate mode (full regeneration).
19
+
20
+ 2a. **Generate mode: read source documents**
21
+
22
+ Read ALL of the following that exist:
23
+ - `ARCHITECTURE.md` (primary source)
24
+ - `DESIGN.md` (design system, component conventions)
25
+ - `AGENTS.md` (existing agent instructions, optimizations)
26
+ - `README.md` (setup, conventions)
27
+ - `CONTRIBUTING.md` (if present)
28
+ - `.opencode/harness.json` (platform, models, concurrency)
29
+ - `openspec/config.yaml` (if present: domain context and rules)
30
+ - Root config files: `package.json`, `tsconfig.json`, `biome.json`, `.eslintrc*`, `Cargo.toml`, `go.mod`, `pyproject.toml`, `pom.xml`: whatever exists
31
+ - CI/CD workflows: `.github/workflows/*`, `azure-pipelines.yml`: whatever exists
32
+
33
+ Use file tools to discover constraints: `read` the documents above, `grep` for lint/formatter config rules.
34
+
35
+ 2b. **Update mode: incremental analysis**
36
+
37
+ Extract the `<!-- Last updated: <ISO date> -->` timestamp from the existing skill file. Then:
38
+ - Read `ARCHITECTURE.md` and check its `<!-- Last updated:` timestamp. If ARCHITECTURE.md hasn't changed since the guardrails were last generated, report "Guardrails up to date" and stop.
39
+ - Run `git log --oneline --since="<date>" -- <config files, lint configs, CI workflows>` to find what convention/config files changed.
40
+ - If nothing changed: report "Guardrails up to date" and stop.
41
+ - Update only the affected rule categories. Preserve manually-added rules in unchanged categories.
42
+ - If changes are pervasive (new architecture, new framework, new platform), fall back to Generate mode.
43
+
44
+ 3. **Extract guardrails**
45
+
46
+ From the documents and code graph analysis, extract concrete, actionable rules. Follow the [category reference](category-reference.md) for the full list of categories, rule quality standards, and the skill file template.
47
+
48
+ 4. **Write the skill**
49
+
50
+ Write (or update) `.agents/skills/pc-guardrails-project/SKILL.md` using the template from the [category reference](category-reference.md). Only include sections that have real rules. Omit empty sections.
51
+
52
+ 5. **Update agents**
53
+
54
+ For every `*-engineer.md` in `.opencode/agents/`, add `@pc-guardrails-project` to the Guardrails ability line (skip if already present). Keep the line's existing entries exactly as they are: only insert `@pc-guardrails-project` after `@pc-guardrails-generic`, using this pattern:
55
+ ```markdown
56
+ ## Abilities
57
+ - Guardrails: @pc-guardrails-generic, @pc-guardrails-project[, ...existing entries unchanged]
58
+ ```
59
+
60
+ Exclude tier variant files (`*-engineer.build.md`, `*-engineer.fast.md`, `*-engineer.plan.md`): they are generated copies; only update the base templates.
61
+
62
+ 6. **Store summary in configured persistent context**
63
+
64
+ `write_note` MCP tool with title `guardrails-summary` containing:
65
+ - The ISO timestamp of this run
66
+ - Number of rules per category
67
+
68
+ 7. **Report**
69
+
70
+ Tell the user:
71
+ - Whether the skill was generated or updated (and which categories changed)
72
+ - Number of rules extracted per category
73
+ - Number of agent files updated
74
+ - Tip: "Rerun `/make-guardrails` any time the architecture or conventions change significantly."
@@ -0,0 +1,68 @@
1
+ # Guardrails category reference
2
+
3
+ From the documents and code graph analysis, extract concrete, actionable rules in these categories. Only include a category if you found real evidence for it.
4
+
5
+ - Architecture constraints: layer boundaries, module dependencies, forbidden imports, directory ownership rules (e.g. "src/api/ must not import from src/ui/"). Verify actual import boundaries with the project-selected analysis tools.
6
+ - File organization: avoid god-files and dumping-ground constants. Each file should have one clear responsibility. Split by domain or feature instead (e.g. `user-constants.ts`, `order-types.ts`, `auth-config.ts`). A file that imports from 5+ unrelated modules is a sign it should be split.
7
+ - Naming conventions: file naming, component naming, API route conventions, branch naming
8
+ - Code style: formatter config, lint rules, import ordering, max line length. Derive from actual config files.
9
+ - Testing rules: test file locations, naming, coverage gates, what must be tested before merge
10
+ - Build & deployment: build commands, env requirements, deployment targets, CI gates
11
+ - Data & state: migration rules, schema change process, state management patterns
12
+ - Security: auth boundaries, input validation requirements, secrets handling
13
+ - Dependencies: package manager, lockfile rules, upgrade policy, forbidden packages
14
+ - Git workflow: branch naming, commit message format, PR process (platform-specific from `harness.json`)
15
+ - Domain-specific rules: anything in `openspec/config.yaml` context or `ARCHITECTURE.md` constraints/risks sections
16
+
17
+ Each rule must be:
18
+ - Concrete: "Use `pnpm` not `npm`" not "Use the right package manager"
19
+ - Evidence-based: derive from the files/code graph you analyzed, do not invent rules
20
+ - Actionable: an agent can check it before acting
21
+
22
+ ## Skill template
23
+
24
+ Write (or update) `.agents/skills/pc-guardrails-project/SKILL.md`:
25
+
26
+ ```markdown
27
+ ---
28
+ name: pc-guardrails-project
29
+ description: Project-specific rules and constraints extracted from ARCHITECTURE.md. Load this skill before implementing any change to understand boundaries, conventions, and constraints for this codebase.
30
+ license: MIT
31
+ ---
32
+
33
+ # Project Guardrails
34
+
35
+ > Auto-generated by `/make-guardrails`. Regenerate with the same command when architecture or conventions change.
36
+
37
+ ## Architecture Constraints
38
+ - <rule>
39
+ - <rule>
40
+
41
+ ## Naming Conventions
42
+ - <rule>
43
+
44
+ ## Code Style
45
+ - <rule>
46
+
47
+ ## Testing
48
+ - <rule>
49
+
50
+ ## Build & Deployment
51
+ - <rule>
52
+
53
+ ## Data & State
54
+ - <rule>
55
+
56
+ ## Security
57
+ - <rule>
58
+
59
+ ## Dependencies
60
+ - <rule>
61
+
62
+ ## Git Workflow
63
+ - <rule>
64
+
65
+ <!-- Last updated: <current ISO timestamp> -->
66
+ ```
67
+
68
+ Only include sections that have real rules. Omit empty sections.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: pc-make-merge-risk-assess
3
+ description: Generate or update the pc-merge-risk-assess skill from project guardrails and architecture. Produces a PR-level risk assessment that loop recipes can gate automerge on. Invoked by the /make-merge-risk-assess command and the repo-initialize flow.
4
+ license: MIT
5
+ ---
6
+
7
+ # Make Merge Risk Assess
8
+
9
+ Analyze `ARCHITECTURE.md`, the project guardrails skill, and other project files to generate or update an `pc-merge-risk-assess` skill: a checklist of risk indicators that an AI agent evaluates before auto-merging a pull request. When any indicator matches, the agent blocks automerge and leaves the PR for human review with an explanation.
10
+
11
+ ## Steps
12
+
13
+ 1. **Check current state**
14
+
15
+ Read `.agents/skills/pc-merge-risk-assess/SKILL.md`. Determine which mode to use:
16
+ - Does not exist: Generate mode. Create from scratch.
17
+ - Exists and has a `<!-- Last updated:` footer: Update mode. Incrementally update.
18
+ - Exists but no timestamp: proceed in Generate mode (full regeneration).
19
+
20
+ 2a. **Generate mode: read source documents**
21
+
22
+ Read ALL of the following that exist:
23
+ - `.agents/skills/pc-guardrails-project/SKILL.md` (primary source — project-specific constraints)
24
+ - `.agents/skills/pc-guardrails-generic/SKILL.md` (generic safety rules)
25
+ - `ARCHITECTURE.md` (architecture boundaries, critical paths)
26
+ - `AGENTS.md` (non-negotiable constraints, verification rules)
27
+ - `.opencode/harness.json` (platform, concurrency)
28
+ - CI/CD workflows: `.github/workflows/*`, `azure-pipelines.yml`: whatever exists
29
+ - Loop recipes: `.loops/recipes/*-loop.yaml` (understand the automerge flow)
30
+
31
+ Use file tools to discover risk-critical code paths: `grep` for calculation engines, audit appenders, auth middleware, schema migrations, permission checks, and other sensitive areas.
32
+
33
+ 2b. **Update mode: incremental analysis**
34
+
35
+ Extract the `<!-- Last updated: <ISO date> -->` timestamp from the existing skill file. Then:
36
+ - Read `.agents/skills/pc-guardrails-project/SKILL.md` and check its `<!-- Last updated:` timestamp. If the guardrails haven't changed and ARCHITECTURE.md hasn't changed since the risk skill was last generated, report "Merge risk assessment up to date" and stop.
37
+ - Run `git log --oneline --since="<date>" -- <relevant config and architecture files>` to find what changed.
38
+ - If nothing changed: report "Merge risk assessment up to date" and stop.
39
+ - Update only the affected risk categories. Preserve manually-added risk indicators in unchanged categories.
40
+ - If changes are pervasive, fall back to Generate mode.
41
+
42
+ 3. **Extract risk indicators**
43
+
44
+ From the documents and code analysis, extract concrete, testable risk indicators. Follow the [category reference](category-reference.md) for the full list of categories, indicator quality standards, and the skill file template.
45
+
46
+ Each risk indicator must identify a code path or change pattern that, when touched, makes a PR too dangerous to auto-merge. The indicator must be something an AI agent can detect by reading the PR diff.
47
+
48
+ 4. **Write the skill**
49
+
50
+ Write (or update) `.agents/skills/pc-merge-risk-assess/SKILL.md` using the template from the [category reference](category-reference.md). Only include sections that have real indicators. Omit empty sections.
51
+
52
+ 5. **Update agents**
53
+
54
+ For every `*-engineer.md` in `.opencode/agents/`, add `@pc-merge-risk-assess` to the Agent Workflow ability group (skip if already present). This ensures every engineer can evaluate risk before merge. Use this pattern:
55
+ ```markdown
56
+ ## Abilities
57
+ - Guardrails: @pc-guardrails-generic, @pc-guardrails-project[, ...existing entries unchanged]
58
+ ...
59
+ - Development, Agent Workflow: @pc-merge-risk-assess[, ...existing entries unchanged]
60
+ ```
61
+
62
+ If no "Development, Agent Workflow" line exists, create it. Exclude tier variant files (`*-engineer.build.md`, `*-engineer.fast.md`, `*-engineer.plan.md`): they are generated copies; only update the base templates.
63
+
64
+ 6. **Report**
65
+
66
+ Tell the user:
67
+ - Whether the skill was generated or updated (and which categories changed)
68
+ - Number of risk indicators extracted per category
69
+ - Number of agent files updated
70
+ - Tip: "Rerun `/make-merge-risk-assess` any time the architecture or project guardrails change significantly."
@@ -0,0 +1,98 @@
1
+ # Merge risk assessment category reference
2
+
3
+ From the project guardrails, architecture, and code analysis, extract concrete, testable risk indicators in these categories. Only include a category if you found real evidence for it.
4
+
5
+ - **Calculation integrity**: changes to pricing, quoting, or calculation engines; modifications to formula inputs, salary tables, assumptions, or margin waterfalls. Any file under a calculation or quoting namespace is a risk indicator.
6
+ - **Audit & compliance**: modifications to audit appenders, audit log storage, hash-chaining, or tamper-evident mechanisms. Any change that could affect regulatory traceability.
7
+ - **Authentication & authorization**: changes to auth middleware, permission checks, role definitions, token issuance, or session management. Changes to `.RequirePermission()` calls or permission seed data.
8
+ - **Data schema & migration**: EF Core entity changes, new migrations, column type changes, constraint additions/removals, or seed data modifications. Schema changes are always risky because they affect production data.
9
+ - **Reference data versioning**: changes to effective-dated configuration, salary bands, assumptions, or any "magic number" that affects calculations. Changes to versioning or snapshot logic.
10
+ - **Cross-boundary violations**: imports that break the layering direction (e.g. Domain referencing Application, Application referencing ASP.NET), cross-context data access bypassing ports.
11
+ - **Security surface**: new endpoints without authorization, input validation removal, secrets exposure, dependency version downgrades, or changes to security scanning configuration.
12
+ - **Financial correctness**: any change that could produce incorrect monetary values, incorrect tax calculations, incorrect currency handling, or rounding changes. Money is `decimal` — changes to precision or conversion logic are risk indicators.
13
+ - **State machine transitions**: modifications to entity lifecycle transitions (e.g. quote status flow, approval gates, sign-off logic). Breaking a state machine can leave data in unrecoverable states.
14
+ - **Integration contracts**: changes to external API contracts, webhook payloads, or CRM integration ports. Breaking integrations can cascade to downstream systems.
15
+
16
+ Each indicator must be:
17
+ - **Concrete**: "Changes to `QuoteCalculator.Calculate`" not "Changes to important calculations"
18
+ - **Evidence-based**: derive from the project guardrails, architecture, and actual code paths
19
+ - **Detectable**: an AI agent can find it by reading the PR diff (file paths, class names, method names, import changes)
20
+ - **Exclusive**: do not duplicate indicators across categories — each belongs in its primary category
21
+
22
+ ## Skill template
23
+
24
+ Write (or update) `.agents/skills/pc-merge-risk-assess/SKILL.md`:
25
+
26
+ ```markdown
27
+ ---
28
+ name: pc-merge-risk-assess
29
+ description: Evaluate a pull request for merge risk. Load when a loop recipe or agent needs to decide whether a PR is safe to auto-merge or requires human review. Produces a structured risk assessment with a binary outcome and reasoning.
30
+ license: MIT
31
+ ---
32
+
33
+ # Merge Risk Assessment
34
+
35
+ > Auto-generated by `/make-merge-risk-assess`. Regenerate when architecture or guardrails change.
36
+
37
+ ## Purpose
38
+
39
+ Determine whether a pull request is safe to auto-merge or requires human review. This skill is loaded by AI agents in loop recipes (e.g. `dev-assess-risk`) before merging. The agent inspects the PR diff and evaluates each risk indicator below.
40
+
41
+ ## Output contract
42
+
43
+ On completion, produce a single JSON object on stdout:
44
+
45
+ ```json
46
+ {"riskLevel":"safe"|"risky","reason":"<one-sentence explanation if risky, or 'No risk indicators detected' if safe>"}
47
+ ```
48
+
49
+ - `riskLevel: "risky"` → exit non-zero. The loop recipe routes to the "leave for human review" path.
50
+ - `riskLevel: "safe"` → exit zero. The loop recipe routes to the automerge path.
51
+
52
+ ## Risk indicators
53
+
54
+ ### Calculation Integrity
55
+ - <indicator: file path, class, or method pattern>
56
+ - <indicator>
57
+
58
+ ### Audit & Compliance
59
+ - <indicator>
60
+
61
+ ### Authentication & Authorization
62
+ - <indicator>
63
+
64
+ ### Data Schema & Migration
65
+ - <indicator>
66
+
67
+ ### Reference Data Versioning
68
+ - <indicator>
69
+
70
+ ### Cross-Boundary Violations
71
+ - <indicator>
72
+
73
+ ### Security Surface
74
+ - <indicator>
75
+
76
+ ### Financial Correctness
77
+ - <indicator>
78
+
79
+ ### State Machine Transitions
80
+ - <indicator>
81
+
82
+ ### Integration Contracts
83
+ - <indicator>
84
+
85
+ ## Evaluation rules
86
+
87
+ 1. **Load `@pc-guardrails-project` first.** Every non-negotiable constraint in the project guardrails is a potential risk indicator. If a change violates or weakens any guardrail, the outcome is `risky`.
88
+ 2. **Inspect the full PR diff** using `gh pr diff <url>`. Do not guess based on the PR title or description alone.
89
+ 3. **Check each risk indicator** against the diff. A single matching indicator is sufficient to flag as `risky`.
90
+ 4. **When risky, explain why.** The `reason` field must name the specific indicator that matched and the files involved. Do not give vague explanations.
91
+ 5. **Do not second-guess the developer.** If the changes look intentional and no indicator matches, classify as `safe`. The purpose is to catch dangerous changes, not to block all non-trivial work.
92
+ 6. **Pure additions are lower risk.** New files, new endpoints with authorization, new tests, new UI components that don't touch existing critical paths are generally safe unless they introduce schema changes or cross-boundary imports.
93
+ 7. **Refactors within a single layer are generally safe.** Renaming, extracting methods, or reorganizing within the same bounded context and same architectural layer rarely triggers a risk indicator unless the refactor changes behavior.
94
+
95
+ <!-- Last updated: <current ISO timestamp> -->
96
+ ```
97
+
98
+ Only include sections that have real indicators. Omit empty sections and their headers.
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: pc-make-user-model
3
+ description: Set the model for a tier (plan, build, or fast). Team-wide or user-local override. Invoked by the /make-user-model command.
4
+ license: MIT
5
+ ---
6
+ Set the concrete model for one tier. Writes to `models` in either the team config (shared, git-tracked) or a user-local override (gitignored).
7
+
8
+ Usage:
9
+
10
+ ```
11
+ /make-user-model <tier> <model>
12
+ /make-user-model user <tier> <model>
13
+ ```
14
+
15
+ - `user`: optional prefix. If present, writes to `.opencode/harness.user.json` (gitignored, overrides team config for this machine only). If absent, writes to `.opencode/harness.json` (shared with the team).
16
+ - `<tier>`: one of `plan`, `build`, `fast`.
17
+ - `<model>`: a fully-qualified model id (e.g. `opencode/big-pickle`) OR the keyword `current` to use the model active in this session.
18
+
19
+ Arguments: `$ARGUMENTS`
20
+
21
+ Steps
22
+
23
+ 1. Parse `$ARGUMENTS`** by whitespace.
24
+ - If first token is `user`: `isUser = true`, `<tier>` = second token, `<model>` = third token.
25
+ - Otherwise: `isUser = false`, `<tier>` = first token, `<model>` = second token.
26
+ - If `$ARGUMENTS` is empty: read both `.opencode/harness.json` and `.opencode/harness.user.json` and show the current `models` from each (team first, user override second), then show the usage above. Change nothing.
27
+ - If `<tier>` is not exactly one of `plan` / `build` / `fast`, or `<model>` is missing: print the usage and stop. Change nothing.
28
+
29
+ 2. **Resolve `<model>`:**
30
+ - If it is the literal `current`: use the model id visible in the opencode status line for this session. Use only the model id shown there, not a guessed value.
31
+ - Otherwise use the value verbatim. It must look like `provider/model-id`. If it contains no `/`, warn that it looks malformed and call the `question` tool to confirm before writing:
32
+
33
+ ```json
34
+ {
35
+ "questions": [
36
+ {
37
+ "header": "Malformed model id",
38
+ "question": "\"<model>\" doesn't look like a valid model id (expected provider/model-id). Write it anyway?",
39
+ "options": [
40
+ { "label": "yes", "description": "Write the value as-is to the config file." },
41
+ { "label": "no", "description": "Cancel. Do not write anything." }
42
+ ]
43
+ }
44
+ ]
45
+ }
46
+ ```
47
+
48
+ Only proceed to write if the user answers `yes`.
49
+
50
+ 3. Determine target file.
51
+ - `isUser = false` -> `.opencode/harness.json` (team). If it does not exist, stop and tell the user onboarding has not generated it yet.
52
+ - `isUser = true` -> `.opencode/harness.user.json` (user override). If it does not exist, create it with `{ "models": {} }`.
53
+
54
+ 4. Update the config. Read the target file, set `models.<tier>` to the resolved model id (create `models` if absent). Do not touch any other field. Preserve the existing 2-space JSON formatting, then write the file back.
55
+
56
+ 5. Confirm:
57
+
58
+ ```
59
+ <team|user> config updated
60
+ <tier> model -> <resolved-id>
61
+ file: <path written>
62
+ ```
63
+
64
+ Restart opencode for the change to take effect. The `pc-subagent-tiers` plugin reads the model configs at startup and injects tier-suffixed agent variants (`<engineer>.<tier>`) into the live config. After restart, `/plan-apply` will spawn agents on the new model.
65
+
66
+ This command edits `harness.json` (team) or `harness.user.json` (user) only. It never modifies agent files, `opencode.json`, or `tasks.md`. Tier variants are generated in-memory by the `pc-subagent-tiers` plugin at startup: no file re-stamping needed.
@@ -0,0 +1,127 @@
1
+ ---
2
+ name: pc-ops-evidence
3
+ description: Writes a capturePlan in evidence.json for the Visual Evidence CI workflow to execute on a runner with Docker and Chrome access. Load after a change is implemented. Invoked by /ops-evidence and the plan-goal pipeline.
4
+ license: MIT
5
+ ---
6
+
7
+ # Ops Evidence
8
+
9
+ Write a capture plan so the Visual Evidence CI workflow can capture screenshots on a runner with full Docker and Chrome access.
10
+
11
+ The agent runs inside the awf sandbox where Docker-in-Docker is unsupported and headless Chromium's sandbox is blocked by the container security policy. The agent cannot capture screenshots itself. Instead, it analyzes the diff and writes a `capturePlan` in `evidence.json`. A separate CI workflow executes the plan.
12
+
13
+ ## Convention
14
+
15
+ Every platform project has `pnpm run dev` at root that starts the **full stack** (database + API + web). The app runs with mock auth in development mode (no real authentication needed). This is the only contract — no per-project evidence harness, fixture apps, or scenario registries.
16
+
17
+ ## Input
18
+
19
+ The caller provides (all optional):
20
+ - change id: locates `openspec/changes/{change-id}/` (or the archived `archive/*{change-id}/`).
21
+ - issue / work-item ref and PR number: where to publish.
22
+ - output mode (`default` / `push` / `pr`): whether the branch was pushed.
23
+ - operation: `capture` (default), `publish`, or `both`.
24
+
25
+ ## Part 1: Capture (operation: capture / both)
26
+
27
+ **Step 1: Decide whether evidence is required.** Inspect the change's diff:
28
+ - Required when changed files include user-visible UI: `*.tsx/jsx/vue/svelte`, `*.css/scss/less`, pages, layouts, components, navigation.
29
+ - Skipped when docs-only, internal refactor, dependency-only, test-only, backend-only.
30
+ - Mixed or unknown: required (be safe).
31
+
32
+ If skipped: write `evidence.json` with `status: "skipped"` and reason. Done.
33
+
34
+ **Step 2: Discover routes from git diff.** Parse changed files to determine which routes to screenshot:
35
+ - `pages/**/*.tsx` or `app/**/page.tsx` → extract the route path
36
+ - `features/**/*.tsx` or `components/**/*.tsx` → screenshot the homepage and any routes that import the changed component
37
+ - If no routes found → screenshot `/` only
38
+ - Always include `/` (homepage) as a baseline
39
+
40
+ **Step 3: Write `evidence.json` with `capturePlan`.** The agent never attempts to start the app stack or launch a browser — those always fail inside the awf sandbox. Instead, write a `capturePlan` immediately.
41
+
42
+ ### The `capturePlan` schema
43
+
44
+ ```
45
+ capturePlan:
46
+ routes: # Array of route objects to screenshot (at minimum [{ path: "/" }])
47
+ - path: string # URL path, e.g. "/quotes/:id"
48
+ sampleId: # string | "first" | "any" — how to resolve dynamic segments
49
+ caption: # string — human-readable description of what this screenshot shows
50
+ viewports: # Array of viewport objects
51
+ - width: number
52
+ height: number
53
+ label: string # "desktop" | "mobile" | custom
54
+ requireApi: # boolean — true when the route needs the backend API running
55
+ requireLogin: # boolean — true when the route needs authentication
56
+ loginMethod: # string — "mock-sso" | "none" | custom method identifier
57
+ reason: # string — why evidence was blocked and what the screenshots should show
58
+ ```
59
+
60
+ ### Rules for writing capturePlan
61
+
62
+ 1. `routes` MUST always include `{ path: "/", caption: "Homepage" }` as the first entry.
63
+ 2. Every additional route discovered from the diff goes after the homepage entry.
64
+ 3. `sampleId: "first"` means the CI workflow should use the first record returned by the API (e.g. the first quote from the seed data). `sampleId: "any"` means any valid ID.
65
+ 4. `requireApi` is `true` when any route needs the backend to return data. It is `false` only for purely static pages (login, not-found).
66
+ 5. `requireLogin` is `true` when any route needs authentication. For dev mode with mock auth, `loginMethod` is `"mock-sso"`.
67
+ 6. `reason` should explain both WHY capture was blocked and WHAT the screenshots should show once captured.
68
+
69
+ ### Example `evidence.json`
70
+
71
+ ```json
72
+ {
73
+ "version": 1,
74
+ "changeId": "currency-in-project-details",
75
+ "required": true,
76
+ "status": "blocked",
77
+ "assets": [],
78
+ "capturePlan": {
79
+ "routes": [
80
+ { "path": "/", "sampleId": "any", "caption": "Homepage / accounts list" },
81
+ { "path": "/quotes/:id", "sampleId": "first", "caption": "Quote editor with currency selector in ProjectDetailsCard" }
82
+ ],
83
+ "viewports": [
84
+ { "width": 1280, "height": 720, "label": "desktop" },
85
+ { "width": 375, "height": 667, "label": "mobile" }
86
+ ],
87
+ "requireApi": true,
88
+ "requireLogin": true,
89
+ "loginMethod": "mock-sso",
90
+ "reason": "Currency selector moved from editor body into ProjectDetailsCard; visual change in quote editor page."
91
+ },
92
+ "reason": "Visual evidence cannot be captured inside the awf sandbox (Docker-in-Docker unsupported, headless Chromium sandbox blocked). A capturePlan has been written for the Visual Evidence CI workflow.",
93
+ "prMarkdown": "## Evidence\n\nVisual evidence for this change is **blocked** in this agent run. A `capturePlan` has been written to `evidence.json` — the Visual Evidence CI workflow will execute it on a runner with full Docker and Chrome access.\n\nAutomated verification that did run:\n- Lint: clean\n- Tests: all pass\n- Build: success"
94
+ }
95
+ ```
96
+
97
+ ### When evidence is not required
98
+
99
+ If evidence is skipped (no UI files changed), write without a `capturePlan`:
100
+
101
+ ```json
102
+ {
103
+ "version": 1,
104
+ "changeId": "{change-id}",
105
+ "required": false,
106
+ "status": "skipped",
107
+ "assets": [],
108
+ "reason": "No user-visible UI files changed in this PR.",
109
+ "prMarkdown": "## Evidence\n\nSkipped: no user-visible UI changes."
110
+ }
111
+ ```
112
+
113
+ Capture never commits, stages, or pushes. The caller owns git.
114
+
115
+ ## Part 2: Publish (operation: publish / both)
116
+
117
+ Preconditions:
118
+ - An issue/PR number was provided. Else skip.
119
+ - Image URLs resolve only if the branch was pushed (`pr`/`push` modes).
120
+ - Backlog platform from `.opencode/harness.json`; `none` means skip.
121
+
122
+ <!-- PC-PLATFORM-EVIDENCE-START -->
123
+ <!-- PC-PLATFORM-EVIDENCE-END -->
124
+
125
+ ## Report
126
+
127
+ One block: the `status` (passed/skipped/failed/blocked) and why; capturePlan written or why not. Never present a blocked capture as passed.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: pc-ops-ship
3
+ description: Create a pull request for the current feature branch, with screenshots if UI changed. Load when shipping a finished feature branch. Invoked by the /ops-ship command and the plan-goal pipeline (pr mode).
4
+ license: MIT
5
+ ---
6
+
7
+ # Ops Ship
8
+
9
+ ## Input
10
+
11
+ The caller provides (all optional):
12
+ - PR title and body. When absent, derive them from the change context (change id, tasks completed, commit list).
13
+ - The base branch. When absent, resolve the default branch as shown in the platform steps below.
14
+
15
+ Repo platform is set in `.opencode/harness.json` `platform.repo`. The platform-specific content below is injected by the CLI during onboarding.
16
+
17
+ <!-- PC-PLATFORM-SHIP-START -->
18
+ <!-- PC-PLATFORM-SHIP-END -->
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: pc-plan-apply
3
+ description: Implement tasks from a plan. OpenSpec-annotated tasks (from pc-plan-propose) run as parallel subagent waves; Todo pane tasks (from /plan-quick) run sequentially in-session. Load when implementing a prepared plan. Invoked by the /plan-apply command (interactive) and the plan-goal pipeline (autonomous).
4
+ license: MIT
5
+ ---
6
+
7
+ # Plan Apply
8
+
9
+ ## Input
10
+
11
+ The caller provides (all optional):
12
+ - A mode (see below). Default: `interactive`.
13
+ - A `start_from` hint: `branch` (default, full protocol from step 1) or `load-plan` (the caller already created the feature branch; skip step 1).
14
+
15
+ ## Modes
16
+
17
+ - `interactive` (default): report progress to the user and surface failures for their decision.
18
+ - `autonomous`: do not return control between waves; keep looping until every task is DONE or the progress guard / retry limit trips. On a stall or exhausted retry, stop the wave loop and report to the caller (whose failure policy governs). When all tasks are DONE, the APPLY stage is complete. Hand control back to the caller (the `/plan-goal` pipeline) so it continues with the next phase. Do not end the turn here; "report N/N tasks" is a stage boundary, not a finish line.
19
+
20
+ ## Plan source detection
21
+
22
+ 1. Check if an OpenSpec change exists: inspect `openspec/changes/` for an active change folder with a `tasks.md`.
23
+ 2. If found and tasks have `<!-- agent` annotations (written by `pc-plan-propose`): OpenSpec mode. Follow the protocol below. Annotated tasks run in subagent waves. They never become sequential lead work because the task count seems small, the lead prefers direct implementation, or a worker has not yet been inspected.
24
+ 3. If no OpenSpec change exists, but there are `pending` items in the Todo pane (from `/plan-quick`): Simple mode. Follow the [simple mode](simple-mode.md) reference.
25
+
26
+ ## OpenSpec mode: parallel subagent waves
27
+
28
+ Load `@openspec-apply-change` skill and follow its instructions, replacing Step 6 (Implement) with the protocol below.
29
+
30
+ **Step 6: Implement via native subagent waves. Replace the default step 6 with this protocol.**
31
+
32
+ You are the lead. You orchestrate from this session only; you spawn workers with the native `task` tool. Workers are ephemeral (one batch, then they exit) and navigable (`ctrl+x` arrow down, left/right arrows). There is no board, no claiming, no merging, no external dashboard.
33
+
34
+ Core rule: push, don't pull. A worker is born with its work: every `task()` spawn prompt contains the exact task IDs and text it must do. There is no claim step, so a worker can never sit idle waiting for an assignment.
35
+
36
+ **1. Branch.** Create `feature/{change-slug}` if not already on one. (Skip this step when the caller passed `start_from: load-plan`.)
37
+
38
+ **2. Load the plan and workers.** Parse `tasks.md`. Each task carries `<!-- agent, depends_on, touches -->` (from `pc-plan-propose`). Inspect `.opencode/agents/` for each base engineer and its generated `.<tier>.md` variants. The tier-suffixed name in an annotation (for example, `backend-engineer.build`) is the worker to spawn: `pc-subagent-tiers` resolves its model at startup and registers it as `mode: subagent`. Read `.opencode/harness.json` -> `agents.maxConcurrent` (the wave cap, 1 to 5).
39
+
40
+ Before hydrating the Todo board, resolve every task's annotated worker. If any task has a blank agent annotation, its base template is missing, or its tier variant is unavailable, stop the APPLY stage and report the task ID, expected worker, and missing file. Do not replace the worker with `fullstack-engineer`, `general`, or the lead session.
41
+
42
+ **3. Hydrate the Todo board.** `todowrite` one item per task: `pending`. The Todo pane is the visible subagent board (opencode plugins cannot draw a custom pane, so the native Todo widget is the live UI). While a task is in flight, its label must carry the worker: `<agent> · <model>`: so the pane shows which agent on which model is doing what. The Todo list is a projection only: never read it for recovery; rebuild it from `tasks.md` and git and `.opencode/harness-run.json`.
43
+
44
+ **4. Worker context.** Before each wave, derive file-disjointness from `touches:` globs and `git diff`.
45
+
46
+ <!-- PC-OPTIMIZATION-CODEGRAPH-START -->
47
+ <!-- PC-OPTIMIZATION-CODEGRAPH-END -->
48
+
49
+ <!-- PC-OPTIMIZATION-MEMORY-START -->
50
+ <!-- PC-OPTIMIZATION-MEMORY-END -->
51
+
52
+ **5. The wave loop.** Repeat until no tasks remain:
53
+
54
+ ```
55
+ eligible = unchecked tasks whose every depends_on is DONE (committed/checked)
56
+ if eligible is empty but tasks remain -> STALL: report blocked tasks + the failed
57
+ dependency causing it, then STOP.
58
+ groups = pack eligible tasks that share a file (touches and gathered context)
59
+ into ONE worker each, to run sequentially (the worker uses the task's `agent`)
60
+ wave = pick groups whose file-sets are pairwise DISJOINT, capped at maxConcurrentAgents
61
+ (you enforce the cap: opencode runs every task() you emit at once)
62
+ ```
63
+
64
+ **6. Context per group.** For each group, gather the task text, relevant plan decisions, and source context needed to implement it.
65
+
66
+ **7. Spawn the wave: one assistant turn, multiple `task()` calls (they run in parallel).** For each group:
67
+ - `subagent_type` = the task's `agent` exactly as written in `tasks.md` (e.g. `frontend-engineer.build`, `backend-engineer.fast`). It is the tier-suffixed `mode: subagent` worker created by `pc-subagent-tiers`. Worker resolution happened in step 2; a missing worker stops the stage before spawning. `fullstack-engineer`, `general`, and the lead session are not fallbacks for annotated implementation work.
68
+ - `description` = `"<task-ids>: <short label>"` (e.g. `"2.1,2.2: RPC endpoints"`) so the subagent is legible in the left/right list and the monitor.
69
+ - `prompt` must contain the exact task IDs and text plus the gathered context. The worker follows the Engineer workflow defined in `@pc-guardrails-generic`; do not restate it in the prompt. **Worker output discipline:** instruct each worker to return a compact summary: what it changed (file names, not contents), pass/fail status of any verification it ran, and any blockers. Workers must NOT return file contents or full diffs as their result — the lead can `git diff` if needed.
70
+ - Flip each spawned task's Todo item to `in_progress` and prefix its label with `<agent>: ` (e.g. `frontend-engineer.build: 2.1 Consolidate logic`) so the running worker is visible in the Todo pane. On completion, drop the prefix and mark `completed`.
71
+
72
+ **8. Collect the wave.** Each foreground `task()` returns its result to you. For each group:
73
+ - success: `git add` the group's `touches` paths and commit `"{ids}: {summary}"` in a single tool call (`git add <paths> && git commit -m "..."`); mark its Todo items `completed`; check `[x]` in `tasks.md`.
74
+ - error / empty: revert that group's impact: `git checkout -- <tracked paths> && git clean -f -- <paths>` (one tool call). Mark `failed` and record the reason in `tasks.md`; `.opencode/harness-run.json` is owned by the monitor plugin. Then retry once with a shorter prompt. Still failing: leave failed and surface it; do not loop.
75
+ - A failed group only blocks its dependents; unrelated tasks keep flowing.
76
+
77
+ **9. Progress guard.** If a full wave moved zero tasks to DONE: STOP (do not re-spawn the identical failing set). Otherwise recompute `eligible` and loop to step 5.
78
+
79
+ **10. Verify.** In this (lead) session, run the project's lint, typecheck, test, build, and proposal-required validation commands. Every command must exit 0. On failure, reopen the offending tasks (uncheck, mark failed) so they re-enter `eligible` and run another wave. When every task is checked, no eligible task remains, and every command passes, report `VERIFIED` to the caller.
80
+
81
+ **11. Close.** Mark all `tasks.md` checkboxes, run `openspec status --change "<name>" --json`, and report progress (N/M tasks). The wave state in `.opencode/harness-run.json` persists for resume.
82
+
83
+ Resume: re-loading this skill after any crash recomputes DONE / FAILED / eligible from `tasks.md`, git, and `harness-run.json` and continues. State is on disk, not in this conversation.