@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.
@@ -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
@@ -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
+ ```