@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.
@@ -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-3' not found`, a gateway fault that clears in seconds, and waited on the
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-3' not
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",
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-3": {
44
+ "glm-5-2": {
45
45
  "name": "GLM 5.3",
46
46
  "attachment": true
47
47
  },
48
- "glm-5-2": {
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-3`.
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-3' not
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-3
402
+ model: openai/glm-5-2
403
403
 
404
404
  max-turns: 300
405
405
  max-turn-cache-misses: 3000
@@ -67,7 +67,7 @@ engine:
67
67
  env:
68
68
  OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
69
69
 
70
- model: openai/glm-5-3
70
+ model: openai/glm-5-2
71
71
 
72
72
  max-turns: 300
73
73
  max-turn-cache-misses: 3000
@@ -615,7 +615,7 @@ engine:
615
615
  env:
616
616
  OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
617
617
 
618
- model: openai/glm-5-3
618
+ model: openai/glm-5-2
619
619
 
620
620
  max-turns: 300
621
621
  max-turn-cache-misses: 3000
@@ -685,7 +685,7 @@ engine:
685
685
  env:
686
686
  OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
687
687
 
688
- model: openai/glm-5-3
688
+ model: openai/glm-5-2
689
689
 
690
690
  max-turns: 300
691
691
  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-3' not
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-3"
486
+ - "plainconcepts/glm-5-2"
487
487
 
488
- model: openai/glm-5-3
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 before you write. Call skill("pc-plan-explore"); it owns the stance for this step.
552
-
553
- Split the issue into work units first. If the issue body is a bullet list of distinct tasks
554
- (for example "- check the button component", "- then check the login", "- then suggest a
555
- register page"), treat each bullet as its own work unit. Otherwise treat the whole issue as a
556
- single work unit.
557
-
558
- Create a todo entry for each work unit before you start exploring. Process them one at a
559
- time, strictly sequentially: explore unit 1, self-answer its questions, mark the todo
560
- complete, then move to unit 2. Do not explore multiple work units in the same pass. Do not
561
- start unit N+1 until unit N is marked complete.
562
-
563
- For the current work unit, answer your own questions from the codebase and the docs, and
564
- set one aside for the author only when it is a business or product decision the code cannot
565
- settle. A unit's todo is complete when its findings would support acceptance criteria: if you
566
- read a file but cannot say what changes for this unit, it is not.
567
-
568
- At most ${{ env.MAX_SELF_QUESTIONS }} self-asked questions per work unit, and stop sooner
569
- once more exploring stops changing your understanding. Never write a self-asked question or
570
- its answer to the issue: this is internal working, and the issue is read by people.
571
-
572
- 4. **Classify the change complexity.** Based on your exploration, determine whether this is a
573
- trivial change. A change is **trivial** only if every one of these holds:
574
- ${{ env.TRIVIAL_CRITERIA }}
575
-
576
- If all hold → **trivial path** (step 4a). If any fails → **standard path** (step 5).
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
- 9. **Split when the estimate is ${{ env.SPLIT_THRESHOLD }} or more.** An oversized story is the
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
- 10. **Record the estimate in every body you write**, parent and children alike, immediately below
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
- 11. Decide exactly one outcome:
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 filled
695
- issue form from step 6 on the standard path, the marker, summary and checklist from
696
- step 4a on the trivial path — holding everything you already established, with every
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.
@@ -41,7 +41,7 @@ engine:
41
41
  env:
42
42
  OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
43
43
 
44
- model: openai/glm-5-3
44
+ model: openai/glm-5-2
45
45
 
46
46
  max-turns: 100
47
47
  max-turn-cache-misses: 3000
@@ -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-3' not
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-3"
412
+ - "plainconcepts/glm-5-2"
413
413
 
414
- model: openai/glm-5-3
414
+ model: openai/glm-5-2
415
415
  max-turns: 120
416
416
  max-turn-cache-misses: 3000
417
417
  max-ai-credits: 5000
@@ -206,7 +206,7 @@ engine:
206
206
  env:
207
207
  OPENAI_BASE_URL: https://forge.plainconcepts.com/v1
208
208
 
209
- model: openai/glm-5-3
209
+ model: openai/glm-5-2
210
210
  max-turns: 120
211
211
  max-turn-cache-misses: 3000
212
212
  max-ai-credits: 5000
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plainconceptsplatform/workflows",
3
- "version": "0.27.4",
3
+ "version": "0.27.6",
4
4
  "description": "Install and update Platform GitHub agentic workflows.",
5
5
  "keywords": [
6
6
  "github-actions",