Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
682d53a
docs(verify-pr): record TC-5805 environment + resolution findings
mrizzi Aug 27, 2026
7f2bc8c
feat(verify-pr): add standalone root-level fullsend harness
mrizzi Aug 31, 2026
118ca19
feat(verify-pr): add Vertex AI provider and profile for fullsend harness
mrizzi Aug 31, 2026
2cb0b75
feat(verify-pr): add read-only sandbox policy with no tier-1 egress
mrizzi Aug 31, 2026
8282947
fix(verify-pr): add **/pi to sandbox policy binary allowlist
mrizzi Aug 31, 2026
4cfc42d
feat(verify-pr): split-trust I/O — schemas, prefetch, native validati…
mrizzi Aug 31, 2026
859cbaa
fix(verify-pr): derive PR diffstat with git apply --stat
mrizzi Sep 1, 2026
fd05082
fix(verify-pr): paginate gh api review/comment fetches in prefetch
mrizzi Sep 1, 2026
d668e20
fix(verify-pr): coerce null Jira description to {} in prefetch transform
mrizzi Sep 1, 2026
8838ba0
fix(verify-pr): end-anchor pre-verify-pr.sh PR-URL regex
mrizzi Sep 1, 2026
f002c1a
fix(verify-pr): derive COMMIT_SHA from headRefOid in pre-verify-pr.sh
mrizzi Sep 1, 2026
f3bb34b
docs(verify-pr): sync github-bundle schema descriptions to shipped de…
mrizzi Sep 1, 2026
752c43b
feat(verify-pr): add host-side write path with native Jira comments
mrizzi Sep 1, 2026
1695632
fix(verify-pr): render post_comment body_adf to markdown for native J…
mrizzi Sep 1, 2026
3ca8ba9
fix(verify-pr): accept result.json fallback in post-verify-pr.sh
mrizzi Sep 1, 2026
32e8577
fix(verify-pr): select highest-numbered iteration output numerically
mrizzi Sep 1, 2026
99da584
fix(verify-pr): render ADF taskList/taskItem in adf_to_markdown
mrizzi Sep 1, 2026
a75e12a
fix(verify-pr): make execute_post_report GitHub comment idempotent on…
mrizzi Sep 1, 2026
239c0df
fix(verify-pr): parse paginated gh api output in _find_report_comment_id
mrizzi Sep 1, 2026
1213fb1
fix(verify-pr): escape markdown-active chars in _render_adf_inline li…
mrizzi Sep 1, 2026
7b01dc5
fix(verify-pr): render non-text inline ADF nodes in _render_adf_inline
mrizzi Sep 1, 2026
fcacee5
fix(verify-pr): constrain post_comment "issue" to Jira-key format in …
mrizzi Sep 1, 2026
dac5676
docs(verify-pr): document same-commit report retry-update in Step 9
mrizzi Sep 1, 2026
1bd5f4a
fix(verify-pr): accept {{ref.key}} placeholder in post_comment.issue …
mrizzi Sep 2, 2026
c8c59a3
fix(verify-pr): guard _render_adf_date against out-of-range timestamps
mrizzi Sep 2, 2026
2302f64
fix(verify-pr): fail fast on empty issue_type in create_issue
mrizzi Sep 2, 2026
b7c3470
fix(verify-pr): scope Jira sticky comment marker per purpose
mrizzi Sep 2, 2026
9f5b335
fix(verify-pr): normalize commit_sha in GitHub report dedup marker
mrizzi Sep 2, 2026
1a25fe3
fix(verify-pr): resolve report_md refs independent of action order
mrizzi Sep 2, 2026
931466a
fix(verify-pr): render ADF table/panel/blockquote/media blocks
mrizzi Sep 2, 2026
b399dd9
fix(verify-pr): escape line-leading markdown block markers in ADF text
mrizzi Sep 2, 2026
7ce05af
fix(verify-pr): canonicalize commit SHA up to full form for dedup marker
mrizzi Sep 2, 2026
2197cc7
docs(conventions): document Python test suite and enforce pytest exec…
mrizzi Sep 2, 2026
6fc19c1
ci(scripts): run pytest suite on push and PR to main
mrizzi Sep 2, 2026
1aeb30d
ci(scripts): temporarily run pytest on the feature branch
mrizzi Sep 2, 2026
3283e42
ci(scripts): run pytest on a Python 3.11-3.14 matrix
mrizzi Sep 2, 2026
b8592cf
docs(conventions): correct script test-coverage and dependency claims
mrizzi Sep 2, 2026
2c8defa
feat(verify-pr): re-sync FULLSEND_OUTPUT_DIR sandbox dual-mode onto S…
mrizzi Sep 2, 2026
8df7aa2
fix(verify-pr): validate prefetched sandbox input against schema
mrizzi Sep 2, 2026
683b957
fix(verify-pr): fail fast on bad sandbox prefetch instead of credenti…
mrizzi Sep 2, 2026
d0ce26e
feat(verify-pr): prefetch related-issue metadata for sandbox idempotency
mrizzi Sep 2, 2026
bb028cb
fix(verify-pr): post Jira report from report_adf, not report_md
mrizzi Sep 2, 2026
e526abd
fix(verify-pr): require idempotency bundle in sandbox prefetch schema
mrizzi Sep 3, 2026
e827402
fix(verify-pr): require per-item fields in idempotency.related_issues
mrizzi Sep 3, 2026
e696d00
fix(verify-pr): fail fast on exported-but-empty FULLSEND_OUTPUT_DIR
mrizzi Sep 3, 2026
34e6362
feat(verify-pr): make URL-pinnable base harness + root plugin.json ma…
mrizzi Sep 4, 2026
888a178
feat(verify-pr): post GitHub report + Jira comments via native fullse…
mrizzi Sep 7, 2026
8fdaa49
chore(verify-pr): pin fullsend base to 888a1781 + re-lock; add .fullsend
mrizzi Sep 7, 2026
198fbb7
fix(verify-pr): compute Commit Traceability deterministically on runner
mrizzi Sep 7, 2026
3ff588f
chore(verify-pr): re-pin .fullsend base to 198fbb7c + re-lock
mrizzi Sep 7, 2026
e5c8253
fix(verify-pr): anchor own bundled files to ${CLAUDE_PLUGIN_ROOT}
mrizzi Sep 7, 2026
56a1c9e
chore(verify-pr): re-pin .fullsend base URL to e5c82535, re-lock
mrizzi Sep 7, 2026
b75e964
fix(verify-pr): use ${CLAUDE_PLUGIN_ROOT} as a body token, not an env…
mrizzi Sep 7, 2026
efa39e0
chore(verify-pr): re-pin .fullsend base URL to b75e9648, re-lock
mrizzi Sep 7, 2026
1d59ab5
fix(verify-pr): make PR-URL extraction format-agnostic
mrizzi Sep 8, 2026
ff5fb29
chore(verify-pr): re-pin .fullsend base URL to 1d59ab57, re-lock
mrizzi Sep 8, 2026
87f7e9b
fix(verify-pr): hyphenate Jira post_comment sticky marker
mrizzi Sep 8, 2026
f6eb102
chore(verify-pr): re-pin .fullsend base URL to 87f7e9b5, re-lock
mrizzi Sep 8, 2026
430a29c
docs(verify-pr): migrate Step 9 report-posting to native fullsend CLI
mrizzi Sep 8, 2026
7e6d461
chore(verify-pr): re-pin .fullsend base URL to 430a29c8, re-lock
mrizzi Sep 8, 2026
9c899c8
Merge pull request #291 from RHEcosystemAppEng/TC-5813
mrizzi Sep 8, 2026
1712e2d
docs(verify-pr): rewrite fullsend.md for native v0.37.0 path
mrizzi Sep 8, 2026
4ed6d79
docs(verify-pr): correct pre_script PR-head checkout claim in fullsen…
mrizzi Sep 8, 2026
fa427da
Merge pull request #292 from mrizzi/TC-5814
mrizzi Sep 9, 2026
c67f691
fix(verify-pr): stop post_script writing __pycache__ into fullsend ca…
mrizzi Sep 9, 2026
dca34de
chore(verify-pr): re-pin .fullsend base URL to c67f6911, re-lock
mrizzi Sep 9, 2026
6371a92
Merge pull request #293 from RHEcosystemAppEng/TC-6112
mrizzi Sep 9, 2026
6572360
fix(verify-pr): condense SKILL.md under Skillsaw 16k context budget
mrizzi Sep 9, 2026
c0bbad9
chore(verify-pr): re-pin .fullsend base URL to 6572360e, re-lock
mrizzi Sep 9, 2026
ffdca91
Merge pull request #294 from RHEcosystemAppEng/TC-6137
mrizzi Sep 9, 2026
438cde0
docs(verify-pr): record TC-5815 end-to-end acceptance run
mrizzi Sep 9, 2026
a3cfdcb
chore(fullsend): reconcile per-repo setup scaffold for verify-pr
mrizzi Sep 11, 2026
296b671
feat(verify-pr): CI-gated dispatch workflow + review-role harness tri…
mrizzi Sep 14, 2026
36ea4cb
chore(verify-pr): re-pin .fullsend base to 296b6711, add child trigge…
mrizzi Sep 14, 2026
5c64fd0
fix(verify-pr): grant contents:write so reusable-dispatch passes startup
mrizzi Sep 14, 2026
a66fdab
Merge pull request #297 from RHEcosystemAppEng/TC-6188-6189
mrizzi Sep 14, 2026
e6e35c1
feat(verify-pr): derive + gate Jira key from PR URL via JQL in pre_sc…
mrizzi Sep 14, 2026
c8ca570
chore(verify-pr): re-pin .fullsend base to e6e35c10, re-lock
mrizzi Sep 14, 2026
7b85069
fix(verify-pr): wire Jira secrets by canonical name, pin fullsend v0.…
mrizzi Sep 14, 2026
dedb0e2
fix(jira): migrate search to /rest/api/3/search/jql (410 Gone on legacy)
mrizzi Sep 14, 2026
9da74ef
chore(verify-pr): re-pin .fullsend base to dedb0e2d, re-lock
mrizzi Sep 14, 2026
69f59da
fix(jira): POST search/jql with fields array so custom fields return
mrizzi Sep 14, 2026
c813d5e
chore(verify-pr): re-pin .fullsend base to 69f59da9, re-lock
mrizzi Sep 14, 2026
069f255
diag(verify-pr): log JQL search result on gate failure
mrizzi Sep 14, 2026
f64a48e
chore(verify-pr): re-pin .fullsend base to 069f255f, re-lock
mrizzi Sep 14, 2026
b747a44
ci(verify-pr): bump fullsend CLI pin v0.37.0 -> v0.43.0 for sandbox r…
mrizzi Sep 15, 2026
27856e5
fix(verify-pr): pin harness model to claude-opus-4-8 (not floating op…
mrizzi Sep 15, 2026
bcff605
chore(verify-pr): re-pin .fullsend base to 27856e55, re-lock
mrizzi Sep 15, 2026
fcddf54
fix(verify-pr): agent reads task_id from verify-pr-input.json
mrizzi Sep 15, 2026
9a2be0e
fix(verify-pr): paginate gating JQL search so a match beyond page 1 i…
mrizzi Sep 15, 2026
5aaf02c
fix(verify-pr): re-validate status/label gate on full issue before wr…
mrizzi Sep 15, 2026
f958516
chore(verify-pr): re-pin .fullsend base to 5aaf02c2, re-lock
mrizzi Sep 15, 2026
a9099de
fix(verify-pr): request least-privilege GitHub token levels per run-s…
mrizzi Sep 15, 2026
45104b9
chore(verify-pr): re-pin .fullsend base to a9099de0, re-lock
mrizzi Sep 15, 2026
e90c0ef
ci(python-tests): run pytest on PRs targeting verify-pr-fullsend
mrizzi Sep 15, 2026
198f0b2
ci(validate-plugins,skillsaw): gate PRs into verify-pr-fullsend
mrizzi Sep 15, 2026
6229a91
Merge pull request #298 from RHEcosystemAppEng/TC-6190
mrizzi Sep 15, 2026
b752bee
docs(fullsend): record TC-6192 E2E CI-dispatch acceptance evidence
mrizzi Sep 15, 2026
b309bae
docs(fullsend): fix TC-6192 AC count (four → five)
mrizzi Sep 15, 2026
60dffa2
docs(fullsend): note vendor Jira-table limitation (fullsend#7345)
mrizzi Sep 16, 2026
14b8be6
feat(verify-pr): prefetch CI check-run outcomes into sandbox input
mrizzi Sep 16, 2026
fa3f4b7
feat(verify-pr): prefetch failed-CI logs into sandbox input for Check 1b
mrizzi Sep 16, 2026
1185ae2
build(verify-pr): re-pin harness base to activate CI check-run prefetch
mrizzi Sep 16, 2026
12c2bde
docs(fullsend): record TC-6257 CI check-run prefetch E2E acceptance
mrizzi Sep 16, 2026
59ed61d
Merge pull request #302 from mrizzi/TC-6257
mrizzi Sep 16, 2026
2b0785a
docs(fullsend): document CI install, dispatch design, and upgrade pro…
mrizzi Sep 17, 2026
3f3b621
ci(verify-pr): enable fork-PR dispatch via pull_request_target + ok-t…
mrizzi Sep 17, 2026
654cf01
fix(verify-pr): self-exclude own workflow check-runs from CI Status
mrizzi Sep 17, 2026
da053ba
docs(verify-pr): document best-effort CI-Status self-exclusion fallback
mrizzi Sep 17, 2026
02f271b
ci(verify-pr): re-pin harness to da053ba1 so the fixed pre-script runs
mrizzi Sep 17, 2026
162be4a
Merge pull request #307 from RHEcosystemAppEng/TC-6343
mrizzi Sep 17, 2026
e6a07ed
chore(verify-pr): resolve conflicts with main
mrizzi Sep 18, 2026
a084081
fix(ci): run verify-pr on main and publish eval reports
mrizzi Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .fullsend/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# fullsend-managed local resource cache — regenerated from the pinned URLs in
# lock.yaml on every run/lock; never committed.
.fullsend-cache/

# Local-only run scaffolding (env files with live secrets, launchers).
.local-run/
24 changes: 24 additions & 0 deletions .fullsend/config.base.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# fullsend per-repo configuration
# https://github.com/fullsend-ai/fullsend
#
# This file configures fullsend for per-repo installation mode.
# See ADR 0033 for details.
#
# The "runtime" key selects which agent runtime runs the agents, claude
# (default when unset) or pi. For one run, the 'fullsend run --runtime'
# flag wins, then FULLSEND_RUNTIME, then this file. See docs/runtimes.md.
version: "1"
kill_switch: false
# The registered source is the LOCAL composing child harness (base + runner-local
# host_files); its `base:` pins the repo content by raw URL. See
# .fullsend/harness/verify-pr.yaml. The base URL's host prefix must remain listed
# in allowed_remote_resources below (base URLs are not inherited — they are
# validated against this allowlist).
agents:
- name: verify-pr
source: harness/verify-pr.yaml
allowed_remote_resources:
# Exactly one prefix: this harness's base URL is self-hosted on
# RHEcosystemAppEng and its children resolve relative to that base (no
# fullsend-ai remote overlay in the native v0.37.0 pinned-URL model).
- https://raw.githubusercontent.com/RHEcosystemAppEng/sdlc-plugins/
20 changes: 20 additions & 0 deletions .fullsend/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# fullsend per-repo configuration (overlay)
# https://github.com/fullsend-ai/fullsend
#
# This file is the per-repo overlay for fullsend configuration.
# Base settings are provided by config.base.yaml (vendor preset).
# Values set here override the base layer. Omitted fields inherit
# from config.base.yaml, then from compiled-in code defaults.
#
# See ADR 0069 for the layered configuration model.
#
# The verify-pr agent is registered in config.base.yaml (the base layer), so
# `fullsend dispatch` / `fullsend run` resolve it while the vendor shim — which
# greps only THIS file for agents — does not dispatch it. CI-gated dispatch
# lives in .github/workflows/fullsend-verify-pr.yml.

# Repo-specific inference override (hosted Vertex AI via Workload Identity
# Federation). The base preset supplies everything else.
inference:
project: it-gcp-tpa
wif_provider: projects/442181572212/locations/global/workloadIdentityPools/fullsend-inference/providers/gh-rhecosystemappeng-sdlc-plugin
68 changes: 68 additions & 0 deletions .fullsend/harness/verify-pr.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Local composing child for the verify-pr harness.
#
# fullsend v0.37.0 rejects an absolute host_files.src that is inherited from a
# URL-sourced harness, so the runner-local credential and pre_script-output
# mounts cannot live in the URL-pinned base (harness/verify-pr.yaml). This local
# child pins that base by raw URL (so the pinned bytes are byte-identical across
# local and CI) and adds those absolute mounts directly. host_files are
# concatenated base+child, deduplicated by dest with the child winning (ADR-0045;
# harness-fields.md). Absolute host_files declared directly in this local child
# are NOT URL-sourced, so they are accepted.
#
# ONE child serves BOTH environments — the mounts are env-expanded and the OIDC
# token is optional:
# GOOGLE_APPLICATION_CREDENTIALS local: service-account key JSON
# CI: WIF external_account config
# GCP_OIDC_TOKEN_FILE local: unset → optional mount skipped
# CI: runner-refreshed OIDC token file
# Only the runtime environment differs — fullsend's sanctioned "same harness,
# different runtime env" model (ADR-0055; running-agents-locally.md).
#
# PIN: the base cannot be a cross-boundary local path — fullsend rejects a
# `base:` that escapes the .fullsend workspace root, and a URL base is required
# anyway so the base's relative children resolve as pinned raw URLs. The base is
# pinned to a commit SHA (not a branch) plus the base file's sha256; both local
# and CI resolve these exact bytes. lock.yaml freezes every child SHA256.
# The base URL host prefix must stay listed in config.yaml allowed_remote_resources
# (base URLs are validated against that allowlist, not inherited).
# Re-pin after any base edit: push harness/verify-pr.yaml, set the SHA to the new
# commit + the sha256 to `shasum -a 256 harness/verify-pr.yaml`, `fullsend lock`.
base: https://raw.githubusercontent.com/RHEcosystemAppEng/sdlc-plugins/da053ba1649ef9368436d69a639e121138b97801/harness/verify-pr.yaml#sha256=3c9dc221e2a37e7aa7ff294381b6b5b1580771ba70432c42924fc3a85f078e63

# CEL trigger (ADR 0061) — MUST be declared here, on the composing child, not
# only on the base. `fullsend dispatch` registers this child (config.base.yaml
# source: harness/verify-pr.yaml resolves under .fullsend/) and composes the
# base, but mergeBaseIntoChild (internal/harness/compose.go) carries `role` and
# other scalars from base->child while intentionally NOT carrying `trigger`. A
# trigger set only on the base is therefore inert; ListTriggeredHarnesses reads
# the composed child's Trigger. Kept byte-identical to the base's trigger (which
# documents intent and covers direct-base consumption). Fires on a PR
# change_proposal that is opened / synchronized / reopened — the dispatch-path
# equivalent of the CI poller's `on: pull_request` types in
# .github/workflows/fullsend-verify-pr.yml.
trigger: |
event.entity.kind == "change_proposal" &&
event.transition.kind in ["synchronized", "opened", "reopened"]

host_files:
- src: ${GOOGLE_APPLICATION_CREDENTIALS}
dest: /tmp/.gcp-credentials.json
- src: ${GCP_OIDC_TOKEN_FILE}
dest: /sandbox/workspace/.gcp-oidc-token
optional: true
# pre_script prefetch output — pre-verify-pr.sh writes /tmp/fullsend-pre-output
# on the runner; mounted read-only into the sandbox (optional — absent until
# the pre_script runs, and skipped on an ADR-0072 skip).
- src: /tmp/fullsend-pre-output/verify-pr-input.json
dest: /sandbox/workspace/.pre-script/verify-pr-input.json
optional: true
# Concatenated failed-check logs — pre-verify-pr.sh always writes this file
# (empty when no check failed) next to verify-pr-input.json. correctness.md
# Check 1b reads it on a FAIL via the bundle's github.check_run_logs_path (dest
# below); the large log text stays off the input bundle and off the agent's
# context until then. host_files mounts single files only, so per-check logs
# are concatenated into this one file. optional: absent until the pre_script
# runs, and skipped on an ADR-0072 skip.
- src: /tmp/fullsend-pre-output/check-run-logs.txt
dest: /sandbox/workspace/.pre-script/check-run-logs.txt
optional: true
Loading
Loading