@plainconceptsplatform/workflows 0.27.4 → 0.27.6
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/decide-agent-retry/action.yml +1 -1
- package/loops/actions/verify-route-matrix/verify-route-matrix.sh +1 -1
- package/loops/templates/opencode/opencode.ci.json +4 -4
- package/loops/templates/opencode/opencode.ci.json.md +1 -1
- package/loops/workflows/agent-apply-review.md +2 -2
- package/loops/workflows/agent-audit.md +1 -1
- package/loops/workflows/agent-implement.md +1 -1
- package/loops/workflows/agent-merge-gate.md +1 -1
- package/loops/workflows/agent-refine.md +36 -96
- package/loops/workflows/agent-release.md +1 -1
- package/loops/workflows/agent-triage.md +3 -3
- package/loops/workflows/agent-visual-verify.md +1 -1
- package/package.json +1 -1
|
@@ -35,7 +35,7 @@ runs:
|
|
|
35
35
|
#
|
|
36
36
|
# Written once here because the rule was in the implement worker alone, and refine, triage and
|
|
37
37
|
# apply-review parked instead -- an Odyssey refine died in three minutes on
|
|
38
|
-
# `Model 'glm-5-
|
|
38
|
+
# `Model 'glm-5-2' not found`, a gateway fault that clears in seconds, and waited on the
|
|
39
39
|
# janitor's six-hourly sweep. Five copies of sixty lines is how one rule becomes five.
|
|
40
40
|
- name: Decide whether this failure is worth repeating
|
|
41
41
|
id: decide
|
|
@@ -1990,7 +1990,7 @@ echo "── Retrying a run that died early ────────────
|
|
|
1990
1990
|
|
|
1991
1991
|
# A run that died before producing anything is worth repeating; one that worked and then failed
|
|
1992
1992
|
# produced an answer that was wrong, and repeating it buys the same wrong answer later. Only the
|
|
1993
|
-
# implement worker knew that. An Odyssey refine died in three minutes on `Model 'glm-5-
|
|
1993
|
+
# implement worker knew that. An Odyssey refine died in three minutes on `Model 'glm-5-2' not
|
|
1994
1994
|
# found` -- a gateway fault that clears in seconds -- parked, and waited on the janitor's
|
|
1995
1995
|
# six-hourly sweep.
|
|
1996
1996
|
RETRY_OK=1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://opencode.ai/config.json",
|
|
3
|
-
"model": "forge/glm-5-
|
|
3
|
+
"model": "forge/glm-5-2",
|
|
4
4
|
"plugin": [],
|
|
5
5
|
"default_agent": "ci-workflow-agent",
|
|
6
6
|
"agent": {
|
|
@@ -41,15 +41,15 @@
|
|
|
41
41
|
"apiKey": "{env:OPENAI_API_KEY}"
|
|
42
42
|
},
|
|
43
43
|
"models": {
|
|
44
|
-
"glm-5-
|
|
44
|
+
"glm-5-2": {
|
|
45
45
|
"name": "GLM 5.3",
|
|
46
46
|
"attachment": true
|
|
47
47
|
},
|
|
48
|
-
"
|
|
48
|
+
"quasar-438b": {
|
|
49
49
|
"name": "GLM 5.2",
|
|
50
50
|
"attachment": true
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
}
|
|
55
|
+
}
|
|
@@ -26,7 +26,7 @@ repository root as `opencode.ci.json`.
|
|
|
26
26
|
host, authentication system, or model vendor.
|
|
27
27
|
- Model entries are fallback metadata. Consumers should set `attachment: true`
|
|
28
28
|
only for models whose router supports image input.
|
|
29
|
-
- Default model: `forge/glm-5-
|
|
29
|
+
- Default model: `forge/glm-5-2`.
|
|
30
30
|
|
|
31
31
|
### Agents
|
|
32
32
|
|
|
@@ -14,7 +14,7 @@ env:
|
|
|
14
14
|
REVIEW_MARKER: "<!-- agent-apply-review -->"
|
|
15
15
|
# A run that died before it produced anything is worth repeating; one that worked and then
|
|
16
16
|
# failed produced an answer that was wrong, and repeating it buys the same wrong answer later.
|
|
17
|
-
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-
|
|
17
|
+
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-2' not
|
|
18
18
|
# found`, a gateway fault that clears in seconds, and waited on the janitor's six-hourly sweep
|
|
19
19
|
# because only the implement worker could do this.
|
|
20
20
|
APPLY_REVIEW_ATTEMPT_MARKER: "<!-- agent-apply-review-attempt -->"
|
|
@@ -399,7 +399,7 @@ engine:
|
|
|
399
399
|
env:
|
|
400
400
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
401
401
|
|
|
402
|
-
model: openai/glm-5-
|
|
402
|
+
model: openai/glm-5-2
|
|
403
403
|
|
|
404
404
|
max-turns: 300
|
|
405
405
|
max-turn-cache-misses: 3000
|
|
@@ -26,7 +26,7 @@ env:
|
|
|
26
26
|
REFINE_MARKER: "<!-- agent-refine -->"
|
|
27
27
|
# A run that died before it produced anything is worth repeating; one that worked and then
|
|
28
28
|
# failed produced an answer that was wrong, and repeating it buys the same wrong answer later.
|
|
29
|
-
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-
|
|
29
|
+
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-2' not
|
|
30
30
|
# found`, a gateway fault that clears in seconds, and waited on the janitor's six-hourly sweep
|
|
31
31
|
# because only the implement worker could do this.
|
|
32
32
|
REFINE_ATTEMPT_MARKER: "<!-- agent-refine-attempt -->"
|
|
@@ -483,9 +483,9 @@ engine:
|
|
|
483
483
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
484
484
|
args:
|
|
485
485
|
- "--model"
|
|
486
|
-
- "plainconcepts/glm-5-
|
|
486
|
+
- "plainconcepts/glm-5-2"
|
|
487
487
|
|
|
488
|
-
model: openai/glm-5-
|
|
488
|
+
model: openai/glm-5-2
|
|
489
489
|
# 150 rather than 500. With a four-hour clock this is the loop guard, and the worst
|
|
490
490
|
# observed run used 44 turns, so this leaves better than three times the worst case.
|
|
491
491
|
max-turns: 150
|
|
@@ -548,93 +548,33 @@ timeout-minutes: 90
|
|
|
548
548
|
temporal draft from the earlier pass: reuse what still holds, and resolve its pending
|
|
549
549
|
marks with the author's answers.
|
|
550
550
|
|
|
551
|
-
3. Explore
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
**4a. Trivial path.** Skip `/plan-story`. Do not write Gherkin acceptance criteria or
|
|
579
|
-
Mermaid diagrams. Instead, prepare the replacement issue body as valid Markdown:
|
|
580
|
-
|
|
581
|
-
1. `${{ env.TRIVIAL_MARKER }}`
|
|
582
|
-
2. A short plain-English summary of what needs to change and why (2-3 sentences max)
|
|
583
|
-
3. A simple checklist of concrete steps:
|
|
584
|
-
```
|
|
585
|
-
## Tasks
|
|
586
|
-
- [ ] Change X in file Y
|
|
587
|
-
- [ ] Verify Z
|
|
588
|
-
```
|
|
589
|
-
|
|
590
|
-
No "As a / I want / so that" form. No Given/When/Then. No Mermaid. Just the marker,
|
|
591
|
-
the summary, and the checklist.
|
|
592
|
-
|
|
593
|
-
Load `@humanizer` and prepare the replacement issue body, then go directly to step 8
|
|
594
|
-
(estimate). Skip steps 5-7.
|
|
595
|
-
|
|
596
|
-
5. Before writing the story, verify coverage: list every work unit and confirm each one has
|
|
597
|
-
exploration findings concrete enough for acceptance criteria. If any unit is missing, go back
|
|
598
|
-
and explore it now. Then call skill("pc-plan-story") and run `/plan-story` for the issue,
|
|
599
|
-
passing everything you learned while exploring as the exploration findings. Ground the story
|
|
600
|
-
in the actual codebase by reading the relevant files. Never read outside this repository root.
|
|
601
|
-
`pc-plan-story` owns the story's shape. This workflow's own requirement is coverage: several
|
|
602
|
-
work units become one story that covers all of them, with at least one acceptance scenario
|
|
603
|
-
per unit.
|
|
604
|
-
|
|
605
|
-
Apply repository documentation and established conventions before finalizing the story.
|
|
606
|
-
Adhere to ${{ env.REPO_RULES }}.
|
|
607
|
-
|
|
608
|
-
6. **Wrap the story in the repository's issue form.** The body people read must follow the
|
|
609
|
-
repository's own issue template when one exists; the story is the content, the template
|
|
610
|
-
is the shape.
|
|
611
|
-
|
|
612
|
-
Find the form first:
|
|
613
|
-
|
|
614
|
-
- List the YAML and Markdown forms under `.github/ISSUE_TEMPLATE/`, plus a legacy
|
|
615
|
-
`.github/issue_template.md` or a root `template.yml`. `config.yml` there only declares
|
|
616
|
-
contact links, which are not forms: ignore it.
|
|
617
|
-
- When a form filters by labels and the issue carries one of those labels, that form
|
|
618
|
-
wins. Otherwise use the repository's default form.
|
|
619
|
-
- When the repository has no form at all, keep the free-form story shape from step 5:
|
|
620
|
-
there is nothing to wrap around.
|
|
621
|
-
|
|
622
|
-
Then fill it:
|
|
623
|
-
|
|
624
|
-
- Draw every field's content from your exploration findings. Required fields always get
|
|
625
|
-
real content; optional fields only when you genuinely have something for them.
|
|
626
|
-
- The story narrative lands in the field that asks for it — proposal, description, or
|
|
627
|
-
what-happened, depending on the form.
|
|
628
|
-
- The Given/When/Then scenarios go into the form's acceptance-criteria field when it has
|
|
629
|
-
one; otherwise they stay a section of their own. The Mermaid diagram goes where it
|
|
630
|
-
reads best inside the filled form.
|
|
631
|
-
- The machine-readable lines the later steps add — split markers in step 9, estimate
|
|
632
|
-
lines in step 10 — always sit at the very top of the body, above the form's first
|
|
633
|
-
heading, so the workflow can read them whatever the form's shape.
|
|
634
|
-
|
|
635
|
-
7. Load `@humanizer` and prepare the complete replacement issue body as valid Markdown.
|
|
636
|
-
|
|
637
|
-
8. **Estimate the story in points.** Use the Fibonacci scale, where one point is roughly one
|
|
551
|
+
3. **Explore and write the story.** Split the issue into work units first. If the issue body is
|
|
552
|
+
a bullet list of distinct tasks, treat each bullet as its own work unit. Otherwise treat the
|
|
553
|
+
whole issue as a single work unit.
|
|
554
|
+
|
|
555
|
+
Call `skill("pc-plan-explore")` and pass it the work-unit list. It owns the exploration
|
|
556
|
+
stance: sequential per-unit investigation, self-answered questions from the codebase, and
|
|
557
|
+
findings held as internal working. Never write a self-asked question or its answer to the
|
|
558
|
+
issue. At most ${{ env.MAX_SELF_QUESTIONS }} self-asked questions per work unit, and stop
|
|
559
|
+
sooner once more exploring stops changing your understanding.
|
|
560
|
+
|
|
561
|
+
Then classify the change complexity. A change is **trivial** only if every one of these
|
|
562
|
+
holds: ${{ env.TRIVIAL_CRITERIA }}
|
|
563
|
+
|
|
564
|
+
**Trivial path.** Skip the story skill. Prepare the replacement issue body as valid Markdown:
|
|
565
|
+
`${{ env.TRIVIAL_MARKER }}`, a short plain-English summary (2-3 sentences max), and a simple
|
|
566
|
+
checklist of concrete steps. No "As a / I want / so that" form, no Given/When/Then, no Mermaid.
|
|
567
|
+
Load `@humanizer` and prepare the body, then go directly to step 4 (estimate).
|
|
568
|
+
|
|
569
|
+
**Standard path.** Call `skill("pc-plan-story")` and pass it the work units and the exploration
|
|
570
|
+
findings. `pc-plan-story` owns the story's shape: drafting, coverage gate, repo-docs application,
|
|
571
|
+
issue-form discovery and wrapping, humanizer pass, and the structured implementation plan. Do not
|
|
572
|
+
repeat any of those steps yourself. Adhere to ${{ env.REPO_RULES }}.
|
|
573
|
+
|
|
574
|
+
The story body the skill returns has its machine-readable lines at the very top, above the
|
|
575
|
+
form's first heading, so the workflow can read them whatever the form's shape.
|
|
576
|
+
|
|
577
|
+
4. **Estimate the story in points.** Use the Fibonacci scale, where one point is roughly one
|
|
638
578
|
human day of work for a developer who knows this codebase. Estimate the whole story: code,
|
|
639
579
|
tests, and the edge cases the acceptance criteria imply.
|
|
640
580
|
|
|
@@ -647,7 +587,7 @@ timeout-minutes: 90
|
|
|
647
587
|
Elapsed clock time is not evidence. A large change can land in minutes and a small one can
|
|
648
588
|
wait days for a human, so never reason from how long anything took.
|
|
649
589
|
|
|
650
|
-
|
|
590
|
+
5. **Split when the estimate is ${{ env.SPLIT_THRESHOLD }} or more.** An oversized story is the
|
|
651
591
|
single best predictor of a pull request that never lands.
|
|
652
592
|
|
|
653
593
|
First test whether it *can* split. A story splits when it contains slices that are each
|
|
@@ -672,7 +612,7 @@ timeout-minutes: 90
|
|
|
672
612
|
single story and say so in one sentence in the body, under the estimate. An honest 8 is more
|
|
673
613
|
useful than three fake threes that each break the build.
|
|
674
614
|
|
|
675
|
-
|
|
615
|
+
6. **Record the estimate in every body you write**, parent and children alike, immediately below
|
|
676
616
|
the title line, as exactly these two lines:
|
|
677
617
|
|
|
678
618
|
```
|
|
@@ -683,7 +623,7 @@ timeout-minutes: 90
|
|
|
683
623
|
The visible line is for people and the marker is read by the workflow, which turns it into the
|
|
684
624
|
`sp-N` label. A body without the marker gets no estimate label at all.
|
|
685
625
|
|
|
686
|
-
|
|
626
|
+
7. Decide exactly one outcome:
|
|
687
627
|
|
|
688
628
|
Labels are workflow-owned state. Do not call `add_labels` or `remove_labels`.
|
|
689
629
|
|
|
@@ -691,9 +631,9 @@ timeout-minutes: 90
|
|
|
691
631
|
could not answer. Leave the partial work visible: first call `update_issue` with a
|
|
692
632
|
temporal draft, then call `add_comment` once with the questions.
|
|
693
633
|
|
|
694
|
-
The temporal draft is the replacement body your path would have written — the
|
|
695
|
-
|
|
696
|
-
|
|
634
|
+
The temporal draft is the replacement body your path would have written — the story
|
|
635
|
+
body from the standard path, the marker, summary and checklist from the trivial path —
|
|
636
|
+
holding everything you already established, with every
|
|
697
637
|
part the questions leave open marked `_pending — see questions below_`. Its very
|
|
698
638
|
first line is `${{ env.DRAFT_MARKER }}`; the next run replaces the draft wholesale
|
|
699
639
|
with the final body.
|
|
@@ -19,7 +19,7 @@ env:
|
|
|
19
19
|
TRIAGE_MARKER: "<!-- agent-triage -->"
|
|
20
20
|
# A run that died before it produced anything is worth repeating; one that worked and then
|
|
21
21
|
# failed produced an answer that was wrong, and repeating it buys the same wrong answer later.
|
|
22
|
-
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-
|
|
22
|
+
# Duration is what separates them. Odyssey #190 died in three minutes on `Model 'glm-5-2' not
|
|
23
23
|
# found`, a gateway fault that clears in seconds, and waited on the janitor's six-hourly sweep
|
|
24
24
|
# because only the implement worker could do this.
|
|
25
25
|
TRIAGE_ATTEMPT_MARKER: "<!-- agent-triage-attempt -->"
|
|
@@ -409,9 +409,9 @@ engine:
|
|
|
409
409
|
OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
|
|
410
410
|
args:
|
|
411
411
|
- "--model"
|
|
412
|
-
- "plainconcepts/glm-5-
|
|
412
|
+
- "plainconcepts/glm-5-2"
|
|
413
413
|
|
|
414
|
-
model: openai/glm-5-
|
|
414
|
+
model: openai/glm-5-2
|
|
415
415
|
max-turns: 120
|
|
416
416
|
max-turn-cache-misses: 3000
|
|
417
417
|
max-ai-credits: 5000
|