@plainconceptsplatform/workflows 1.6.21 → 1.6.23
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/loops/actions/verify-route-matrix/verify-route-matrix.sh +17 -0
- package/loops/templates/opencode/opencode.ci.json +1 -1
- package/loops/workflows/agent-apply-review.md +5 -2
- package/loops/workflows/agent-audit.md +5 -2
- package/loops/workflows/agent-implement.md +5 -2
- package/loops/workflows/agent-merge-gate.md +5 -2
- package/loops/workflows/agent-refine.md +5 -2
- package/loops/workflows/agent-release.md +5 -2
- package/loops/workflows/agent-triage.md +5 -2
- package/loops/workflows/shared/opencode-ci.md +39 -0
- package/package.json +1 -1
|
@@ -1828,6 +1828,23 @@ if worker_installed implement && ! grep -qF 'subagent_type: planner' "$IMPLEMENT
|
|
|
1828
1828
|
LEAD_OK=0; echo "FAIL: the implement prompt must run propose and archive in the planner agent" >&2
|
|
1829
1829
|
fi
|
|
1830
1830
|
if [ "$LEAD_OK" -eq 1 ]; then PASS=$((PASS + 1)); else FAIL=$((FAIL + 1)); fi
|
|
1831
|
+
# The harness plugins only load with .opencode/node_modules installed; without it every CI run
|
|
1832
|
+
# spawned untiered workers on the session's model. And the tier model a worker pins has to be one
|
|
1833
|
+
# opencode.ci.json declares, under the provider name harness.json uses.
|
|
1834
|
+
PLUGINS_OK=1
|
|
1835
|
+
if ! grep -qF "(cd .opencode && npm install" "${WORKFLOWS_DIR}/shared/opencode-ci.md"; then
|
|
1836
|
+
PLUGINS_OK=0; echo "FAIL: the CI setup must install .opencode's dependencies or the harness plugins never load" >&2
|
|
1837
|
+
fi
|
|
1838
|
+
for route in refine implement triage apply-review merge-gate audit release; do
|
|
1839
|
+
worker_md="${WORKFLOWS_DIR}/agent-${route}.md"
|
|
1840
|
+
[ -f "$worker_md" ] || continue
|
|
1841
|
+
tier=$(sed -n 's/^ AGENT_TIER_MODEL: "\(.*\)"$/\1/p' "$worker_md")
|
|
1842
|
+
[ -n "$tier" ] || continue
|
|
1843
|
+
if [ -f "$CI_JSON" ] && ! jq -e --arg p "${tier%%/*}" --arg m "${tier#*/}" '.providers[$p].models[$m]' "$CI_JSON" > /dev/null; then
|
|
1844
|
+
PLUGINS_OK=0; echo "FAIL: agent-${route} pins its tiers to ${tier}, which opencode.ci.json does not declare" >&2
|
|
1845
|
+
fi
|
|
1846
|
+
done
|
|
1847
|
+
if [ "$PLUGINS_OK" -eq 1 ]; then PASS=$((PASS + 1)); else FAIL=$((FAIL + 1)); fi
|
|
1831
1848
|
# The shape of the tests reaches the agent only through these two prompts (check-diff measures size,
|
|
1832
1849
|
# never shape), so losing the sentence silently brings the pyramid back.
|
|
1833
1850
|
if worker_installed implement; then
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
# Printed by the prompt as the verification block. Consumers set their own commands.
|
|
10
13
|
VERIFY_COMMANDS: ""
|
|
11
14
|
REPO_RULES: "Apply only actionable outstanding reviewer feedback to the selected bot pull request. Make minimal changes that address each comment. Preserve architecture and do not weaken tests. Run full verification after changes."
|
|
@@ -411,7 +414,7 @@ engine:
|
|
|
411
414
|
env:
|
|
412
415
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
413
416
|
|
|
414
|
-
model: openai/
|
|
417
|
+
model: openai/glm-5-2
|
|
415
418
|
|
|
416
419
|
max-turns: 300
|
|
417
420
|
max-turn-cache-misses: 3000
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
REPO_RULES: "Read-only repository audit. Report only reproducible, actionable defects with evidence. Do not modify files, commit, push, or run write operations."
|
|
10
13
|
# Split out of REPO_RULES, which carried both the read-only discipline above and the list
|
|
11
14
|
# below. All four consuming repositories had customised the list and none could touch it
|
|
@@ -72,7 +75,7 @@ engine:
|
|
|
72
75
|
env:
|
|
73
76
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
74
77
|
|
|
75
|
-
model: openai/
|
|
78
|
+
model: openai/glm-5-2
|
|
76
79
|
|
|
77
80
|
max-turns: 300
|
|
78
81
|
max-turn-cache-misses: 3000
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
VERIFY_COMMANDS: ""
|
|
10
13
|
REPO_RULES: "Implement only the selected issue. Follow repository documentation and existing conventions. Do not weaken tests, lower coverage thresholds, or bypass checks."
|
|
11
14
|
# Split out of REPO_RULES because one field asked to carry architecture, testing, coverage and
|
|
@@ -627,7 +630,7 @@ engine:
|
|
|
627
630
|
env:
|
|
628
631
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
629
632
|
|
|
630
|
-
model: openai/
|
|
633
|
+
model: openai/glm-5-2
|
|
631
634
|
|
|
632
635
|
max-turns: 300
|
|
633
636
|
max-turn-cache-misses: 3000
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
VERIFY_COMMANDS: ""
|
|
10
13
|
REPO_RULES: "Review the selected pull request for defects and report what you verified. Do not decide the outcome: the workflow computes it from your report and from facts it measured before you ran."
|
|
11
14
|
# Where to look first, not what to escalate on. This list used to be the check that decided
|
|
@@ -875,7 +878,7 @@ engine:
|
|
|
875
878
|
env:
|
|
876
879
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
877
880
|
|
|
878
|
-
model: openai/
|
|
881
|
+
model: openai/glm-5-2
|
|
879
882
|
|
|
880
883
|
max-turns: 300
|
|
881
884
|
max-turn-cache-misses: 3000
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/glm-5-
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
REPO_RULES: "Refine only the selected issue into a grounded, implementation-ready user story. Read repository documentation for domain context. Write acceptance criteria that match existing patterns. Where a story or its open questions decide how business data (named people, roles, addresses) is stored, resolve it toward the repository's convention for that data -- a database entity or a settings entry -- and record that choice in the acceptance criteria; do not carry a person's name or email address into the story as something the code reads from a constant. Do not implement code. Do not use web search or web fetch tools. The issue body already contains the research that motivated it; derive your domain context from the repository's own code and documentation only."
|
|
10
13
|
# The estimate decides whether a story gets split, and the prompt tells the agent these bands
|
|
11
14
|
# come from this repository's own merged pull requests. They have to actually come from it, or
|
|
@@ -812,7 +815,7 @@ engine:
|
|
|
812
815
|
env:
|
|
813
816
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
814
817
|
|
|
815
|
-
model: openai/glm-5-
|
|
818
|
+
model: openai/glm-5-2
|
|
816
819
|
# 150 rather than 500. With a four-hour clock this is the loop guard, and the worst
|
|
817
820
|
# observed run used 44 turns, so this leaves better than three times the worst case.
|
|
818
821
|
max-turns: 150
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
GIT_AUTHOR_NAME: "github-actions[bot]"
|
|
10
13
|
GIT_AUTHOR_EMAIL: "github-actions[bot]@users.noreply.github.com"
|
|
11
14
|
GIT_COMMITTER_NAME: "github-actions[bot]"
|
|
@@ -47,7 +50,7 @@ engine:
|
|
|
47
50
|
env:
|
|
48
51
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
49
52
|
|
|
50
|
-
model: openai/
|
|
53
|
+
model: openai/glm-5-2
|
|
51
54
|
|
|
52
55
|
max-turns: 100
|
|
53
56
|
max-turn-cache-misses: 3000
|
|
@@ -5,7 +5,10 @@ env:
|
|
|
5
5
|
# every agent without its own model falls back to; the lead is where a wrong call costs a run,
|
|
6
6
|
# so it names its model here. `model:` below only satisfies the compiler. A repository may
|
|
7
7
|
# change it to any model its opencode.ci.json declares.
|
|
8
|
-
AGENT_LEAD_MODEL: "forge/
|
|
8
|
+
AGENT_LEAD_MODEL: "forge/glm-5-2"
|
|
9
|
+
# The model every harness tier (plan, build, fast) runs on in CI, planner included. Unset,
|
|
10
|
+
# the tiers take harness.json, whose models the AWF proxy may not price.
|
|
11
|
+
AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
|
|
9
12
|
REPO_RULES: "Triage issues opened by outside collaborators. Assess template completeness, security risk, change size, danger level, duplicates, clarity, reproducibility, acceptance criteria, and cross-cutting impact. When the request names specific people, email addresses, or business entities as the thing the code acts on, judge where that data is meant to live: business data that belongs in the database or a settings page is a design decision, not a wording detail, and it must not be left for the implementer to decide by hardcoding it. Do not implement code. Do not modify the issue body."
|
|
10
13
|
# What a product owner may ask for, and what has to become a maintainer-owned technical
|
|
11
14
|
# proposal instead. This is business policy, so it belongs to the repository rather than to
|
|
@@ -417,7 +420,7 @@ engine:
|
|
|
417
420
|
env:
|
|
418
421
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
419
422
|
|
|
420
|
-
model: openai/
|
|
423
|
+
model: openai/glm-5-2
|
|
421
424
|
max-turns: 120
|
|
422
425
|
max-turn-cache-misses: 3000
|
|
423
426
|
max-ai-credits: 5000
|
|
@@ -165,6 +165,45 @@ pre-agent-steps:
|
|
|
165
165
|
- name: Install workspace dependencies
|
|
166
166
|
run: pnpm install --frozen-lockfile
|
|
167
167
|
|
|
168
|
+
- name: Cache the agent-harness plugins' dependencies
|
|
169
|
+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
170
|
+
with:
|
|
171
|
+
path: .opencode/node_modules
|
|
172
|
+
key: opencode-plugins-${{ runner.os }}-${{ hashFiles('.opencode/package.json') }}
|
|
173
|
+
|
|
174
|
+
- name: Install the agent-harness plugins' dependencies
|
|
175
|
+
# The harness plugins under .opencode/plugins import @opencode/plugin, which lives in
|
|
176
|
+
# .opencode/node_modules, and that directory is gitignored. Without it OpenCode logs
|
|
177
|
+
# "failed to load plugin ... Cannot find package '@opencode/plugin'" and goes on: no tier
|
|
178
|
+
# workers, no planner, no concurrency cap. Every CI run until 1.6.23 ran that way, so
|
|
179
|
+
# pc-plan-apply spawned the untiered base engineers on the session's model.
|
|
180
|
+
#
|
|
181
|
+
# Two of the three run here. pc-system-reminders gates shell and edits on skills a CI
|
|
182
|
+
# worker's prompt does not load, and has never run in CI; it stays off until it does.
|
|
183
|
+
#
|
|
184
|
+
# The tier models come from AGENT_TIER_MODEL when a worker sets it. The AWF proxy refuses
|
|
185
|
+
# a model it has no AI credits price for, and harness.json names carina-60b and
|
|
186
|
+
# quasar-438b, which it has none for (Atlas #2016), so CI pins every tier to one priced
|
|
187
|
+
# model through the gitignored per-user override the plugin reads first.
|
|
188
|
+
run: |
|
|
189
|
+
set -euo pipefail
|
|
190
|
+
if [ ! -f .opencode/package.json ]; then
|
|
191
|
+
echo "No .opencode/package.json: agent-harness is not installed, nothing to load"; exit 0
|
|
192
|
+
fi
|
|
193
|
+
if [ ! -d .opencode/node_modules/@opencode/plugin ]; then
|
|
194
|
+
(cd .opencode && npm install --no-audit --no-fund --no-package-lock --ignore-scripts --loglevel=error)
|
|
195
|
+
fi
|
|
196
|
+
if [ -f .opencode/plugins/pc-system-reminders.js ]; then
|
|
197
|
+
rm .opencode/plugins/pc-system-reminders.js
|
|
198
|
+
# Tracked, so hide the deletion: an agent that sees it in `git status` restores it.
|
|
199
|
+
git update-index --skip-worktree .opencode/plugins/pc-system-reminders.js 2>/dev/null || true
|
|
200
|
+
fi
|
|
201
|
+
if [ -n "${AGENT_TIER_MODEL:-}" ]; then
|
|
202
|
+
jq -n --arg m "$AGENT_TIER_MODEL" '{models: {plan: $m, build: $m, fast: $m}}' > .opencode/harness.user.json
|
|
203
|
+
fi
|
|
204
|
+
echo "Harness plugins: $(ls .opencode/plugins | tr '\n' ' ')"
|
|
205
|
+
echo "Tier models: $(jq -c '.models' .opencode/harness.user.json 2>/dev/null || jq -c '.models' .opencode/harness.json)"
|
|
206
|
+
|
|
168
207
|
- name: Merge the CI-only OpenCode provider into opencode.jsonc
|
|
169
208
|
run: |
|
|
170
209
|
set -euo pipefail
|