@plainconceptsplatform/workflows 0.28.11 → 0.28.13
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 +16 -1
- package/loops/docs/diagrams.md +49 -47
- package/loops/templates/ci/app-ci-dotnet-next.yml +330 -330
- package/loops/templates/ci/app-ci-node-monorepo.yml +260 -260
- package/loops/templates/opencode/opencode.ci.json +24 -2
- package/loops/workflows/agent-implement.md +10 -0
- package/loops/workflows/agent-refine.md +38 -14
- package/package.json +1 -1
|
@@ -927,6 +927,21 @@ if worker_installed implement; then
|
|
|
927
927
|
if [ "$IMPLEMENT_RETRY_OK" -eq 1 ]; then PASS=$((PASS + 1)); else FAIL=$((FAIL + 1)); fi
|
|
928
928
|
fi
|
|
929
929
|
|
|
930
|
+
# A queued worker can start long after it was dispatched. If triage concluded
|
|
931
|
+
# needs-maintainer while the run waited in a queue, the issue carries review and
|
|
932
|
+
# the verdict must stand: the reserve step clears review blindly, so eligibility
|
|
933
|
+
# has to catch it first (Pliny-Bot #372).
|
|
934
|
+
for route in implement refine; do
|
|
935
|
+
worker_md="${WORKFLOWS_DIR}/agent-${route}.md"
|
|
936
|
+
[ -f "$worker_md" ] || continue
|
|
937
|
+
if grep -q 'index("review")' "$worker_md"; then
|
|
938
|
+
PASS=$((PASS + 1))
|
|
939
|
+
else
|
|
940
|
+
FAIL=$((FAIL + 1))
|
|
941
|
+
echo "FAIL: agent-${route} eligibility does not guard against the review label; a queued worker could override a triage verdict" >&2
|
|
942
|
+
fi
|
|
943
|
+
done
|
|
944
|
+
|
|
930
945
|
if worker_installed merge-gate; then
|
|
931
946
|
# A failed attempt must not strip `implement`: identify-gate-subject refuses an issue
|
|
932
947
|
# without it, so the first crash would starve every retry at the subject check.
|
|
@@ -2409,7 +2424,7 @@ if [ -f "$APP_ERRORS_MJS" ]; then
|
|
|
2409
2424
|
# values and cannot see a field somebody adds next year. Compared as a set, so reordering is
|
|
2410
2425
|
# fine and an addition is not. run_id is the one that matters: it is unhashed on this
|
|
2411
2426
|
# telemetry and joins to a conversation and to a person.
|
|
2412
|
-
expected_fields="exceptionType frames fingerprint firstSeen lastSeen occurrences operationName operations problemId roleName"
|
|
2427
|
+
expected_fields="exceptionType frames fingerprint firstSeen lastSeen occurrences operationName operations problemId roleName topFrames message category"
|
|
2413
2428
|
actual_fields="$(sed -n '/export const FINDING_FIELDS = \[/,/\];/p' "$APP_ERRORS_MJS" |
|
|
2414
2429
|
grep -oE '"[a-zA-Z]+"' | tr -d '"' | sort | tr '\n' ' ' | sed 's/ $//')"
|
|
2415
2430
|
if [ "$actual_fields" = "$(echo "$expected_fields" | tr ' ' '\n' | sort | tr '\n' ' ' | sed 's/ $//')" ]; then
|
package/loops/docs/diagrams.md
CHANGED
|
@@ -442,53 +442,6 @@ The version bump, the tag and the Release are deterministic on purpose. The agen
|
|
|
442
442
|
a file on disk, so a confused model cannot publish a release.
|
|
443
443
|
|
|
444
444
|
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## agent-visual-verify.md
|
|
448
|
-
|
|
449
|
-
Runs after the merge gate decides auto-merge and before the merge itself. The agent reads the
|
|
450
|
-
change, writes a verification plan as JSON waypoints, and a post-agent shell step drives
|
|
451
|
-
agent-browser to capture screenshots at each waypoint. A final step attaches the screenshots
|
|
452
|
-
to the linked issue as a comment. Failures never block the merge.
|
|
453
|
-
|
|
454
|
-
```mermaid
|
|
455
|
-
flowchart TD
|
|
456
|
-
vvStart("Merge Gate<br/>auto-merge verdict") --> vvSubject
|
|
457
|
-
vvSubject{"subject (rung 4)<br/>PR open? Visual<br/>verify enabled?"}
|
|
458
|
-
vvSubject -.->|"no"| vvIdle
|
|
459
|
-
vvSubject -->|"yes"| vvActivation
|
|
460
|
-
vvActivation("Activation (rung 3)<br/>Checkout, load issue context,<br/>build the prompt") --> vvAgent
|
|
461
|
-
vvAgent("Agent (rung 5)<br/>Explore the change, write<br/>plan.json with waypoints<br/>(url + selector per step)") --> vvBuild
|
|
462
|
-
vvBuild("Build and start app<br/>VISUAL_VERIFY_BUILD_COMMAND,<br/>then VISUAL_VERIFY_START_COMMAND<br/>on the configured port") --> vvAppUp{"App up on<br/>the port?"}
|
|
463
|
-
vvAppUp -.->|"no"| vvWarn
|
|
464
|
-
vvAppUp -->|"yes"| vvCapture
|
|
465
|
-
vvCapture["Capture screenshots<br/>agent-browser opens each waypoint,<br/>waits for selectors,<br/>screenshot --full --no-sandbox"] --> vvGotShots{"Any captured?"}
|
|
466
|
-
vvGotShots -->|"yes"| vvAttach
|
|
467
|
-
vvGotShots -.->|"no, all failed"| vvWarn
|
|
468
|
-
vvAttach("Attach to issue<br/>post plan + screenshots<br/>as a single comment") --> vvDone
|
|
469
|
-
vvDone(("Screenshots posted<br/>visual evidence on the issue"))
|
|
470
|
-
vvWarn(("Warning posted<br/>no screenshots, merge proceeds"))
|
|
471
|
-
vvIdle(("Idle<br/>not enabled or not our PR"))
|
|
472
|
-
|
|
473
|
-
classDef start fill:#ffffff,stroke:#172033,stroke-width:2px,color:#172033
|
|
474
|
-
classDef action fill:#eef0ff,stroke:#554cff,stroke-width:2px,color:#172033
|
|
475
|
-
classDef decision fill:#fff8e8,stroke:#c75b00,stroke-width:2px,color:#172033
|
|
476
|
-
classDef idle fill:#202c40,stroke:#738198,stroke-width:2px,color:#ffffff
|
|
477
|
-
classDef failure fill:#fff0f0,stroke:#ef2929,stroke-width:2px,color:#8b1a1a
|
|
478
|
-
classDef success fill:#e8f8ec,stroke:#18883c,stroke-width:2px,color:#145a32
|
|
479
|
-
class vvStart start
|
|
480
|
-
class vvActivation,vvAgent,vvBuild,vvCapture,vvAttach action
|
|
481
|
-
class vvSubject,vvAppUp,vvGotShots decision
|
|
482
|
-
class vvIdle idle
|
|
483
|
-
class vvWarn failure
|
|
484
|
-
class vvDone success
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
The agent does not take screenshots itself. It writes a plan; a shell step runs agent-browser
|
|
488
|
-
against the running app. Chromium needs --no-sandbox on CI runners (set via
|
|
489
|
-
AGENT_BROWSER_ARGS), and the explicit apt-get install covers libraries gent-browser
|
|
490
|
-
install --with-deps misses on ubuntu-24.04.
|
|
491
|
-
|
|
492
445
|
---
|
|
493
446
|
|
|
494
447
|
## housekeeping
|
|
@@ -657,3 +610,52 @@ The route matrix asserts the scanner exists, that both exit paths call `setFaile
|
|
|
657
610
|
at least as many scans as upstream writes, that each individual check is still present, and that no
|
|
658
611
|
model or `OPENAI_API_KEY` has appeared in the action. Every one of those was mutation-tested; three
|
|
659
612
|
earlier versions of them passed against a deliberately broken guard and were rewritten.
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## agent-visual-verify.md
|
|
617
|
+
|
|
618
|
+
Runs after merge-gate decides to auto-merge, before the actual merge, and produces **evidence, not
|
|
619
|
+
code changes**: it writes a verification plan, drives a real browser through the app, and attaches
|
|
620
|
+
screenshots to the linked issue. It is called directly by merge-gate's `conclude` job, so it is not
|
|
621
|
+
a router route. Failures never block the merge — a browser that will not start or an app that never
|
|
622
|
+
comes up emits a warning comment and the merge proceeds.
|
|
623
|
+
|
|
624
|
+
```mermaid
|
|
625
|
+
flowchart TD
|
|
626
|
+
vvStart("merge-gate conclude<br/>calls agent-visual-verify") --> vvSubject
|
|
627
|
+
vvSubject["subject (rung 4)<br/>PR open? linked issue found?"] --> vvConfig
|
|
628
|
+
vvConfig{"config (rung 4)<br/>VISUAL_VERIFY_ENABLED and<br/>START_COMMAND set?"}
|
|
629
|
+
vvConfig -.->|"no"| vvIdle
|
|
630
|
+
vvConfig -->|"yes"| vvFacts
|
|
631
|
+
vvFacts["Facts (rung 3)<br/>PR branch checked out,<br/>issue context loaded"] --> vvPlan
|
|
632
|
+
vvPlan{"/repo-verify (rung 5)<br/>reachable UI surface?"}
|
|
633
|
+
vvPlan -.->|"not-applicable"| vvNoUi
|
|
634
|
+
vvPlan -->|"yes"| vvStartCmd
|
|
635
|
+
vvStartCmd{"start command set?<br/>VISUAL_VERIFY_START_COMMAND"}
|
|
636
|
+
vvStartCmd -.->|"empty"| vvNoStart
|
|
637
|
+
vvStartCmd -->|"yes"| vvAgent
|
|
638
|
+
vvAgent["Agent (rung 5)<br/>parse waypoints into plan.json,<br/>one add_comment on the issue"] --> vvCapture
|
|
639
|
+
vvCapture["post-agent (rung 6)<br/>build + start the app,<br/>agent-browser captures per waypoint"] --> vvAttach
|
|
640
|
+
vvAttach["attach-screenshots (rung 6)<br/>always(), subject found + enabled"] --> vvShutdown
|
|
641
|
+
vvShutdown["shut down the app"] --> vvDone
|
|
642
|
+
vvCapture -.->|"app never started,<br/>no plan, or all waypoints failed"| vvPartial
|
|
643
|
+
vvDone(("Verified<br/>screenshots attached,<br/>merge proceeds"))
|
|
644
|
+
vvPartial(("Attach what exists<br/>no-capture explanation,<br/>run stays green"))
|
|
645
|
+
vvNoUi(("No UI surface<br/>summary comment, stop"))
|
|
646
|
+
vvNoStart(("Not configured<br/>warning comment, stop"))
|
|
647
|
+
vvIdle(("Idle<br/>unconfigured or PR not open"))
|
|
648
|
+
|
|
649
|
+
classDef start fill:#ffffff,stroke:#172033,stroke-width:2px,color:#172033
|
|
650
|
+
classDef action fill:#eef0ff,stroke:#554cff,stroke-width:2px,color:#172033
|
|
651
|
+
classDef decision fill:#fff8e8,stroke:#c75b00,stroke-width:2px,color:#172033
|
|
652
|
+
classDef idle fill:#202c40,stroke:#738198,stroke-width:2px,color:#ffffff
|
|
653
|
+
classDef failure fill:#fff0f0,stroke:#ef2929,stroke-width:2px,color:#8b1a1a
|
|
654
|
+
classDef success fill:#e8f8ec,stroke:#18883c,stroke-width:2px,color:#145a32
|
|
655
|
+
class vvStart start
|
|
656
|
+
class vvSubject,vvFacts,vvCapture,vvAttach,vvShutdown action
|
|
657
|
+
class vvConfig,vvPlan,vvStartCmd decision
|
|
658
|
+
class vvIdle idle
|
|
659
|
+
class vvNoUi,vvNoStart,vvPartial failure
|
|
660
|
+
class vvDone success
|
|
661
|
+
```
|