@plainconceptsplatform/workflows 1.13.0 → 1.14.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 (32) hide show
  1. package/loops/actions/add-issue-labels/action.yml +50 -50
  2. package/loops/actions/agent-output.cjs +17 -17
  3. package/loops/actions/apply-agent-bundle/action.yml +24 -24
  4. package/loops/actions/apply-agent-comments/action.yml +42 -42
  5. package/loops/actions/apply-agent-labels/action.yml +55 -55
  6. package/loops/actions/cleanup-artifacts/action.yml +91 -91
  7. package/loops/actions/close-agent-issues/action.yml +43 -43
  8. package/loops/actions/create-issue-comment/action.yml +29 -29
  9. package/loops/actions/download-agent-output/action.yml +53 -53
  10. package/loops/actions/link-pr-to-issue/action.yml +40 -40
  11. package/loops/actions/list-open-issues/action.yml +33 -33
  12. package/loops/actions/load-issue-context/action.yml +45 -45
  13. package/loops/actions/merge-agent-pr/action.yml +49 -49
  14. package/loops/actions/merge-dependabot/action.yml +10 -2
  15. package/loops/actions/merge-dependabot/merge-dependabot.mjs +47 -17
  16. package/loops/actions/remove-issue-labels/action.yml +37 -37
  17. package/loops/actions/update-agent-issues/action.yml +58 -58
  18. package/loops/actions/validate-review-output/action.yml +35 -35
  19. package/loops/actions/validate-triage-output/action.yml +36 -36
  20. package/loops/actions/verify-composite-actions/action.yml +9 -9
  21. package/loops/actions/verify-refine-output/action.yml +9 -9
  22. package/loops/actions/verify-route-matrix/action.yml +9 -9
  23. package/loops/actions/verify-route-matrix/verify-route-matrix.sh +7 -2
  24. package/loops/templates/agentics/agentics-maintenance.yml +121 -121
  25. package/loops/templates/dependabot-merge/.github/workflows/dependabot-merge.yml +3 -1
  26. package/loops/templates/issues/bug_report.yml +109 -109
  27. package/loops/templates/issues/feature_request.yml +75 -75
  28. package/loops/workflows/agent-implement.md +13 -12
  29. package/loops/workflows/shared/opencode-ci.md +17 -5
  30. package/loops/workflows/shared/platform-defaults.md +53 -53
  31. package/loops/workflows/work-router.yml +4 -0
  32. package/package.json +2 -2
@@ -6,12 +6,12 @@ env:
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
8
  AGENT_LEAD_MODEL: "forge/glm-5-2"
9
- # Every harness tier (plan, build, fast) on one model the CI's Forge account is granted.
10
- # harness.json names quasar-438b and carina-60b, which that account is not granted: Pliny-Bot
11
- # #823's build tasks failed on quasar. Empty runs the tiers harness.json names.
12
- AGENT_TIER_MODEL: "plainconcepts/glm-5-2"
13
- # The fast tier alone, while the CI's Forge account is not granted carina-60b.
14
- AGENT_FAST_MODEL: "plainconcepts/glm-5-2"
9
+ # Let harness.json drive the tiers: plan=glm-5-3, build/fast=glm-5-2. A repository
10
+ # whose CI account is not granted a tier model can still pin every tier to one
11
+ # model by setting AGENT_TIER_MODEL.
12
+ AGENT_TIER_MODEL: ""
13
+ # Empty: harness.json already names glm-5-2 for fast.
14
+ AGENT_FAST_MODEL: ""
15
15
  VERIFY_COMMANDS: ""
16
16
  REPO_RULES: "Implement only the selected issue. Follow repository documentation and existing conventions. Do not weaken tests, lower coverage thresholds, or bypass checks."
17
17
  # Split out of REPO_RULES because one field asked to carry architecture, testing, coverage and
@@ -770,13 +770,14 @@ timeout-minutes: 180
770
770
 
771
771
  1. `pc-plan-goal`, then Phase 0 as it describes.
772
772
 
773
- **Propose and archive run in the `planner` agent, not in this session.** Spawn it with the
774
- task tool (`subagent_type: planner`) and a prompt that names the skill to load
773
+ **Propose and archive run in the `planner-sub` agent, not in this session.** Spawn it with the
774
+ task tool (`subagent_type: planner-sub`) and a prompt that names the skill to load
775
775
  (`pc-plan-propose` or `pc-plan-archive`), the issue context path above, the branch, and that it
776
- runs in autonomous mode with no one to ask. `planner` runs on the repository's plan model, which
777
- is stronger than this session's, and these two steps decide the whole change. Wait for it in the
778
- same turn, then continue with the next phase yourself. Only when no `planner` agent exists
779
- (agent-harness older than 3.4.0) load the skill here instead.
776
+ runs in autonomous mode with no one to ask. `planner-sub` runs on the repository's plan model,
777
+ which these two steps decide the whole change on. Wait for it in the same turn, then continue
778
+ with the next phase yourself. If `planner-sub` is not in the task tool's enum, call
779
+ `report_incomplete` naming it; do not load `pc-plan-propose` here. Only when the harness is
780
+ older than 3.4.0 and has neither `planner` nor `planner-sub` may you load the skill here.
780
781
 
781
782
  2. `pc-plan-propose`, even when the issue is refined. It is what turns the issue into
782
783
  `openspec/changes/<id>/tasks.md` with every task annotated
@@ -208,11 +208,10 @@ pre-agent-steps:
208
208
  # Two of the three run here. pc-system-reminders gates shell and edits on skills a CI
209
209
  # worker's prompt does not load, and has never run in CI; it stays off until it does.
210
210
  #
211
- # The tier models come from AGENT_TIER_MODEL when a worker sets it. The AWF proxy refuses
212
- # a model it has no AI credits price for; harness.json names carina-60b and quasar-438b,
213
- # which had none until the `models.providers` prices at the top of this file (Atlas #2016).
214
- # CI still pins every tier to one model, through the gitignored per-user override the
215
- # plugin reads first, until a run on the newly priced models has passed.
211
+ # The tier models come from AGENT_TIER_MODEL when a worker sets it. The implement worker
212
+ # leaves it empty so harness.json drives: plan=glm-5-3, build/fast=glm-5-2. A repository
213
+ # whose CI account is not granted a tier model can still pin every tier to one model
214
+ # through the gitignored per-user override the plugin reads first.
216
215
  run: |
217
216
  set -euo pipefail
218
217
  if [ ! -f .opencode/package.json ]; then
@@ -246,6 +245,19 @@ pre-agent-steps:
246
245
  echo "Harness plugins: $(ls .opencode/plugins | tr '\n' ' ')"
247
246
  echo "Tier models: $(jq -c '.models' .opencode/harness.user.json 2>/dev/null || jq -c '.models' .opencode/harness.json)"
248
247
 
248
+ - name: Sync harness agents and print model routing
249
+ # The plugin writes these at startup, but OpenCode builds the task enum from what
250
+ # exists when it starts. Generating them here makes planner-sub and the tier
251
+ # variants visible from the first turn; the doctor is the audit line.
252
+ run: |
253
+ set -euo pipefail
254
+ if [ -f .opencode/scripts/sync-agents.mjs ] && [ -f .opencode/plugins/pc-subagent-tiers-core.js ]; then
255
+ node .opencode/scripts/sync-agents.mjs --strict
256
+ fi
257
+ if [ -f .opencode/scripts/harness-doctor.mjs ]; then
258
+ node .opencode/scripts/harness-doctor.mjs --strict
259
+ fi
260
+
249
261
  - name: Merge the CI-only OpenCode provider into opencode.jsonc
250
262
  env:
251
263
  GH_TOKEN: ${{ github.token }}
@@ -1,53 +1,53 @@
1
- ---
2
- # Managed by @plainconceptsplatform/workflows. Source: loops/workflows/shared/platform-defaults.md. Update with `workflows update --force`; consumer edits may be overwritten.
3
- description: Shared network and safe-output defaults for catalog agent workflows, plus the verification rules every worker that builds or pushes has to follow. The body below is runtime-imported into each worker's prompt ahead of its own steps.
4
-
5
- network:
6
- allowed:
7
- - defaults
8
- - forge.plainconcepts.com
9
- # opencode fetches its model registry from models.opencode.ai at startup; without
10
- # this host on the allowlist the fetch blocks bootstrap and the run stalls after
11
- # "init" until the runner kills it. The apex "opencode.ai" is not enough.
12
- - models.opencode.ai
13
- - node
14
- - github
15
- - dotnet
16
- - fonts
17
- - login.microsoftonline.com
18
- # centralised AgentMemory (App Service); the MCP shim needs it through the egress proxy
19
- - agentmemory-pro-01.azurewebsites.net
20
-
21
- safe-outputs:
22
- threat-detection: false
23
- ---
24
-
25
- ## These runs are not interactive
26
-
27
- - Nothing resumes you. A turn that ends with text and no tool call ends the whole run, and the work
28
- is discarded, whatever the text promised. "I'll read the context files first." as a last message
29
- is a finished run: the Pliny-Bot merge gate did exactly that on #801, ended in twenty-three
30
- seconds with exit code 0 and no outcome, and was retried twice before the pull request was handed
31
- to a person for nothing.
32
- - So every message you write carries a tool call until the last one, which is the safe-output call
33
- the task names. Say what you are about to do and do it in the same message. Never announce a step
34
- and stop, never wait for a command, a reviewer or a "next turn".
35
- - A command the bash tool reports as moved to the background is still running: poll its output file
36
- with tool calls (`sleep 40; tail -n 15 <file>`) until it shows an exit status, then go on.
37
-
38
- ## Verification, for every worker that builds or pushes
39
-
40
- - Scope every check to the files you changed. This is the runner, not a preference: a
41
- whole-repository lint, build or test run exhausts its memory and gets killed mid-run, which
42
- fails the job with no useful output. Pass the changed paths to the linter (`pnpm exec biome
43
- check <files>`), build only the projects containing them, and run only the test project that
44
- covers them. Escalate to the full suite only after the scoped run passes and only when the
45
- change crosses a project boundary.
46
- - Run nothing at all for a change that touches only documentation. A cold Release build on a
47
- shared runner is minutes the run does not get back.
48
- - Never make a check pass by weakening it: not a deleted test, not a lowered threshold, not a
49
- skipped step. Fix the cause and run it again.
50
- - Once the checks pass, run the project's lint fix command over the files you changed
51
- (`pnpm lint:fix`, `pnpm exec biome check --write <changed-files>`, or its equivalent), or
52
- correct what lint reports where no fix command exists. A branch that arrives with lint errors
53
- gets sent back for them.
1
+ ---
2
+ # Managed by @plainconceptsplatform/workflows. Source: loops/workflows/shared/platform-defaults.md. Update with `workflows update --force`; consumer edits may be overwritten.
3
+ description: Shared network and safe-output defaults for catalog agent workflows, plus the verification rules every worker that builds or pushes has to follow. The body below is runtime-imported into each worker's prompt ahead of its own steps.
4
+
5
+ network:
6
+ allowed:
7
+ - defaults
8
+ - forge.plainconcepts.com
9
+ # opencode fetches its model registry from models.opencode.ai at startup; without
10
+ # this host on the allowlist the fetch blocks bootstrap and the run stalls after
11
+ # "init" until the runner kills it. The apex "opencode.ai" is not enough.
12
+ - models.opencode.ai
13
+ - node
14
+ - github
15
+ - dotnet
16
+ - fonts
17
+ - login.microsoftonline.com
18
+ # centralised AgentMemory (App Service); the MCP shim needs it through the egress proxy
19
+ - agentmemory-pro-01.azurewebsites.net
20
+
21
+ safe-outputs:
22
+ threat-detection: false
23
+ ---
24
+
25
+ ## These runs are not interactive
26
+
27
+ - Nothing resumes you. A turn that ends with text and no tool call ends the whole run, and the work
28
+ is discarded, whatever the text promised. "I'll read the context files first." as a last message
29
+ is a finished run: the Pliny-Bot merge gate did exactly that on #801, ended in twenty-three
30
+ seconds with exit code 0 and no outcome, and was retried twice before the pull request was handed
31
+ to a person for nothing.
32
+ - So every message you write carries a tool call until the last one, which is the safe-output call
33
+ the task names. Say what you are about to do and do it in the same message. Never announce a step
34
+ and stop, never wait for a command, a reviewer or a "next turn".
35
+ - A command the bash tool reports as moved to the background is still running: poll its output file
36
+ with tool calls (`sleep 40; tail -n 15 <file>`) until it shows an exit status, then go on.
37
+
38
+ ## Verification, for every worker that builds or pushes
39
+
40
+ - Scope every check to the files you changed. This is the runner, not a preference: a
41
+ whole-repository lint, build or test run exhausts its memory and gets killed mid-run, which
42
+ fails the job with no useful output. Pass the changed paths to the linter (`pnpm exec biome
43
+ check <files>`), build only the projects containing them, and run only the test project that
44
+ covers them. Escalate to the full suite only after the scoped run passes and only when the
45
+ change crosses a project boundary.
46
+ - Run nothing at all for a change that touches only documentation. A cold Release build on a
47
+ shared runner is minutes the run does not get back.
48
+ - Never make a check pass by weakening it: not a deleted test, not a lowered threshold, not a
49
+ skipped step. Fix the cause and run it again.
50
+ - Once the checks pass, run the project's lint fix command over the files you changed
51
+ (`pnpm lint:fix`, `pnpm exec biome check --write <changed-files>`, or its equivalent), or
52
+ correct what lint reports where no fix command exists. A branch that arrives with lint errors
53
+ gets sent back for them.
@@ -1835,6 +1835,9 @@ jobs:
1835
1835
  pull-requests: read
1836
1836
  # actions: write cancels workflow runs stuck pending in the fleet queue.
1837
1837
  actions: write
1838
+ # The Dependabot merge reads check runs and statuses with this token, not the App's.
1839
+ checks: read
1840
+ statuses: read
1838
1841
  env:
1839
1842
  BOT_APP_ID: ${{ secrets.BOT_APP_ID }}
1840
1843
  BOT_PRIVATE_KEY: ${{ secrets.BOT_PRIVATE_KEY }}
@@ -1867,6 +1870,7 @@ jobs:
1867
1870
  uses: ./.github/actions/merge-dependabot
1868
1871
  with:
1869
1872
  token: ${{ steps.app-token.outputs.token }}
1873
+ read-token: ${{ github.token }}
1870
1874
  scope: ${{ vars.DEPENDABOT_MERGE || env.DEPENDABOT_MERGE }}
1871
1875
  merge-without-checks: ${{ env.DEPENDABOT_MERGE_WITHOUT_CHECKS }}
1872
1876
  skip-labels: do-not-merge blocked human-review ${{ env.MERGE_TRAIN_HOLD_LABEL }}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plainconceptsplatform/workflows",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "Install and update Platform GitHub agentic workflows.",
5
5
  "keywords": [
6
6
  "github-actions",
@@ -41,6 +41,6 @@
41
41
  "devDependencies": {
42
42
  "@types/node": "^22.0.0",
43
43
  "typescript": "^5.8.0",
44
- "vitest": "^3.0.0"
44
+ "vitest": "^4.1.11"
45
45
  }
46
46
  }