Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
436a7f8
feat(install): add --vendor for self-contained workflow and agent assets
ifireball Jun 10, 2026
0a0561b
feat(vendor): add manifest-driven cleanup and split analyze reporting
ifireball Jun 10, 2026
f19f1e3
fix: address remaining PR review nits for vendor work
ifireball Jun 10, 2026
32aaf9d
fix(binary): restore download tests dropped in prior commit
ifireball Jun 10, 2026
b5baa69
fix(vendor): batch stale cleanup and address review nits
ifireball Jun 10, 2026
8a9681e
docs(vendor): note --vendor-fullsend-binary removal without alias
ifireball Jun 10, 2026
0b50f96
fix(vendor): restore layer docs and normalize cleanup step messages
ifireball Jun 11, 2026
1f678e7
fix(vendor): single-commit upload and address Bugbot findings
ifireball Jun 11, 2026
1881e3b
fix(forge): include mode and type in DeleteFiles tree entries
ifireball Jun 11, 2026
88ecef4
test(forge): assert DeleteFiles tree entry mode and type
ifireball Jun 11, 2026
0013c75
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball Jun 11, 2026
893d1af
fix(vendor): address post-review findings from fullsend-ai-review
ifireball Jun 11, 2026
52dc9d2
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball Jun 11, 2026
b7b04f5
docs: address review feedback on ADR 0046 and testing guide
ifireball Jun 11, 2026
7d71e38
chore: re-trigger fullsend-ai-review after doc fixes
ifireball Jun 11, 2026
d330766
fix(scaffold): include check-e2e-authorization in vendored infra paths
ifireball Jun 11, 2026
99ddc9d
docs(forge): note base64 encoding in CommitFiles comment
ifireball Jun 11, 2026
fed552c
fix(install): combine vendor commit with scaffold and retry enrollmen…
ifireball Jun 11, 2026
1d3da39
fix(install): wait for workflow registration and activate repo-mainte…
ifireball Jun 11, 2026
73dea45
fix(forge): write text files as UTF-8 in CommitFiles, blob API for bi…
ifireball Jun 11, 2026
63c27e4
docs: add design spec for triage prerequisites action (#401)
ralphbean Jun 11, 2026
ba99ae3
docs: add implementation plan for triage prerequisites action (#401)
ralphbean Jun 11, 2026
9a35c91
feat(config): add create_issues allowlist config (#401)
ralphbean Jun 11, 2026
d4a394e
refactor: update NewOrgConfig/NewPerRepoConfig callers for create_iss…
ralphbean Jun 11, 2026
e492ac7
feat(schema): replace blocked with prerequisites action (#401)
ralphbean Jun 11, 2026
b2055cb
feat(triage): replace blocked action with prerequisites in agent prom…
ralphbean Jun 11, 2026
c48a832
docs: document prerequisites action and create_issues config (#401)
ralphbean Jun 11, 2026
3a44b0c
feat(triage): handle prerequisites action in post-script (#401)
ralphbean Jun 11, 2026
6f79d87
fix(triage): correct label name in agent prompt and remove dead code …
ralphbean Jun 11, 2026
080368c
fix(triage): update post-triage tests for prerequisites action (#401)
ralphbean Jun 11, 2026
11bae49
fix(triage): update schema validation tests for prerequisites action …
ralphbean Jun 12, 2026
e57f10a
fix(triage): address review feedback on prerequisites action (#401)
ralphbean Jun 12, 2026
602f75b
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball Jun 14, 2026
d1baca8
fix(docs): renumber vendored-install ADR to 0047 after main merge
ifireball Jun 14, 2026
47e61b6
fix: address review feedback on dispatch retry and vendor docs
ifireball Jun 14, 2026
368890e
fix(test): wrap dispatch retry stub errors as APIError
ifireball Jun 14, 2026
2e040b5
chore(skills): add e2e-health skill
ralphbean Jun 15, 2026
7c40a70
fix(skills): escape example link in e2e-health SKILL.md
ralphbean Jun 15, 2026
162dce2
fix(skills): address review feedback on e2e-health skill
ralphbean Jun 15, 2026
80a414d
fix: widen CSMA jitter after rate-limit reset to prevent thundering herd
ralphbean Jun 15, 2026
22c6e28
fix(#2014): remove protected-path block from post-fix.sh
jhutar Jun 15, 2026
f126581
feat(#1665): add Containerfile/Dockerfile/images to protected paths
jhutar Jun 15, 2026
bbbb0b5
fix(#2014): update fix agent definition to reflect review-layer enfor…
jhutar Jun 16, 2026
22be06d
feat(harness): add remote harness agent discovery via forge API (ADR-…
ggallen Jun 16, 2026
7ecf899
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball Jun 16, 2026
61f467d
test: add Phase 2 integration tests for ADR-0045 forge-portable harne…
ggallen Jun 16, 2026
5e3d932
fix(vendor): harden vendoring and address PR review findings
ifireball Jun 16, 2026
ecf5175
test(vendor): cover appendVendorTreeFiles and VendorBinary helpers
ifireball Jun 16, 2026
3305c1a
feat(harness): add Lint() diagnostic method for non-fatal harness war…
ggallen Jun 16, 2026
4c360c8
test(vendor): raise PR patch coverage above 80% threshold
ifireball Jun 16, 2026
ac64c91
test(cli): cover admin per-repo vendor dry-run path
ifireball Jun 16, 2026
ded059b
fix(#2130): mint fresh tokens for status comments on demand
ggallen Jun 16, 2026
3c9f0db
Merge pull request #2304 from fullsend-ai/fix/csma-jitter-window
ralphbean Jun 16, 2026
7249b34
fix(skills): remove markdown link syntax from e2e-health example table
ralphbean Jun 16, 2026
df020f5
Merge pull request #2301 from fullsend-ai/add-e2e-health-skill
ralphbean Jun 16, 2026
3ae6f72
fix(#2343): add post-reset spread to _github_csma_sleep_after_rate_limit
fullsend-ai-coder[bot] Jun 16, 2026
966abbf
Merge pull request #2344 from fullsend-ai/agent/2343-csma-spread-rate…
ralphbean Jun 16, 2026
65b155c
feat(mint): share ROLE_APP_IDS per role across orgs
ifireball Jun 16, 2026
d988d32
merge: resolve conflict with main in admin.go
ralphbean Jun 16, 2026
e66f2d9
fix(#2348): stop swallowing gh pr create stderr in post-code.sh
fullsend-ai-coder[bot] Jun 16, 2026
a24ffd1
style: gofmt config.go after merge
ralphbean Jun 16, 2026
d6988a9
Merge pull request #2299 from ggallen/worktree-fix-2130-status-token
ggallen Jun 16, 2026
515e49b
Merge pull request #2321 from ggallen/worktree-phase2-pr6
ggallen Jun 16, 2026
387968a
test(cli): cover runDryRun, runAnalyze, and per-org setup dry-run
ifireball Jun 16, 2026
133ed6e
Merge pull request #2197 from fullsend-ai/rbean/401-triage-decompose-…
ralphbean Jun 16, 2026
6832b14
Merge pull request #2327 from fullsend-ai/worktree-adr-0045-phase3-pr2
ggallen Jun 16, 2026
32f73a4
Merge pull request #2322 from ggallen/worktree-investigate-adr-0045
ggallen Jun 16, 2026
b4d1c97
fix(mint): fail /health when ROLE_APP_IDS needs migration
ifireball Jun 16, 2026
a9bd135
test(cli): cover runInstall mint check and skip path
ifireball Jun 16, 2026
2b93fff
test: raise patch coverage for install, vendor, and download paths
ifireball Jun 16, 2026
3fb219c
Signed-off-by: Barak Korren <bkorren@redhat.com>
ifireball Jun 16, 2026
9241475
Merge pull request #2349 from fullsend-ai/agent/2348-fix-pr-create-st…
ralphbean Jun 16, 2026
22d710d
docs(adr): document trust boundary for vendored defaults gate
ifireball Jun 16, 2026
25a286f
refactor(cli): migrate uninstall flows to harness-first agent discovery
ggallen Jun 16, 2026
7905dfc
Merge pull request #1954 from ifireball/feat/distribution-mode-layere…
ifireball Jun 16, 2026
6f7ddf6
refactor: remove deprecated status-token fallback paths
ggallen Jun 16, 2026
f322448
Merge pull request #2295 from jhutar/2-protected
ralphbean Jun 16, 2026
560ace4
Merge pull request #2331 from ifireball/feat/role-only-app-ids
ifireball Jun 16, 2026
7aef782
Merge pull request #2364 from ggallen/worktree-adr-0045-phase3-pr5
ggallen Jun 17, 2026
f902ef8
refactor(harness): migrate loadKnownSlugs to harness-first discovery
ggallen Jun 17, 2026
f4e19d5
feat(harness): wire Lint() diagnostics into fullsend run and lock
ggallen Jun 17, 2026
f71504f
Merge pull request #2361 from ggallen/worktree-adr-0045-phase3-pr4
ggallen Jun 17, 2026
b04ecb3
Merge pull request #2362 from ggallen/worktree-adr-0045-phase3-pr3
ggallen Jun 17, 2026
ed8c416
Merge pull request #2365 from ggallen/worktree-cleanup-status-token-d…
ggallen Jun 17, 2026
854d2e0
chore(ci): bump OpenShell to 0.0.63, extract install scripts, add Ren…
rh-hemartin Jun 16, 2026
5c5e14d
fix(scaffold): add openshell scripts to vendoredDefaultsInfraPaths
rh-hemartin Jun 17, 2026
c7ad026
Merge pull request #2315 from fullsend-ai/feat/openshell-update-and-o…
rh-hemartin Jun 17, 2026
e385941
fix(#2378): report failure when agent errors with no commits
fullsend-ai-coder[bot] Jun 17, 2026
39b9a4a
Add STP output for GH-55 [skip ci]
Jun 21, 2026
92fe475
Add QualityFlow output for GH-55 [skip ci]
Jun 21, 2026
378e0d2
Add QualityFlow output for GH-55 [skip ci]
Jun 21, 2026
bb09277
Add STD output for GH-55 [skip ci]
Jun 21, 2026
7e367d1
Add QualityFlow STD review output for GH-55 [skip ci]
Jun 21, 2026
71d7fc2
Add QualityFlow STD review fixes for GH-55 [skip ci]
Jun 21, 2026
307481c
Add QualityFlow test generator output for GH-55 [skip ci]
Jun 21, 2026
4520ea8
Add QualityFlow tests for GH-55
guyoron1 Jun 21, 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: 0 additions & 6 deletions .github/dependabot.yml

This file was deleted.

18 changes: 18 additions & 0 deletions .github/scripts/install-openshell.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Install the pinned OpenShell version via upstream install.sh.
#
# Sources openshell-version.sh for the version and commit SHA, then
# runs the upstream installer. Requires sudo for RPM installation.
#
# Usage:
# .github/scripts/install-openshell.sh
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
source "${SCRIPT_DIR}/openshell-version.sh"

echo "Installing OpenShell ${OPENSHELL_VERSION} (${OPENSHELL_SHA})"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] curl-pipe-to-shell

Downloads and executes remote script via curl | sh. URL is pinned to a specific commit SHA but no checksum validation is performed.

Suggested fix: Download to file first, compute SHA-256 hash, and compare against pinned expected hash before execution.

curl -LsSf "https://raw.githubusercontent.com/NVIDIA/OpenShell/${OPENSHELL_SHA}/install.sh" \
| OPENSHELL_VERSION="v${OPENSHELL_VERSION}" sh

openshell --version
20 changes: 20 additions & 0 deletions .github/scripts/openshell-version.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Single source of truth for the pinned OpenShell version.
#
# Source this script to set OPENSHELL_VERSION and OPENSHELL_SHA in the
# current shell. In GitHub Actions it also exports them to GITHUB_ENV
# for downstream steps.
#
# Usage:
# source .github/scripts/openshell-version.sh

# renovate: datasource=github-tags depName=NVIDIA/OpenShell
OPENSHELL_VERSION=0.0.63
OPENSHELL_SHA=ec197a43ef349e36c3fff04e9aaea9599fb83b31

export OPENSHELL_VERSION OPENSHELL_SHA

if [[ -n "${GITHUB_ENV:-}" ]]; then
echo "OPENSHELL_VERSION=${OPENSHELL_VERSION}" >> "${GITHUB_ENV}"
echo "OPENSHELL_SHA=${OPENSHELL_SHA}" >> "${GITHUB_ENV}"
fi
5 changes: 4 additions & 1 deletion .github/workflows/reusable-code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
# Keep in sync with --vendor marker paths (see internal/scaffold/vendorcontent.go VendoredMarkerPath).
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -102,6 +104,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -178,4 +181,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
4 changes: 3 additions & 1 deletion .github/workflows/reusable-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -114,6 +115,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -380,4 +382,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ steps.context.outputs.pr_number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
2 changes: 2 additions & 0 deletions .github/workflows/reusable-prioritize.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -104,6 +105,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh
- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/reusable-retro.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -100,6 +101,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -153,4 +155,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
3 changes: 2 additions & 1 deletion .github/workflows/reusable-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -169,4 +170,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
4 changes: 3 additions & 1 deletion .github/workflows/reusable-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -100,6 +101,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -149,4 +151,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
2 changes: 2 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ repos:
- property "workflow_repository" is not defined
- -ignore
- SC2016
- -ignore
- '__REUSABLE_(WORKFLOW|DISPATCH)__'

- repo: local
hooks:
Expand Down
3 changes: 0 additions & 3 deletions CLAUDE.md

This file was deleted.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ This is not a product spec. It's an evolving exploration of a hard problem space
- [Vertex AI Inference Provisioning](docs/plans/vertex-inference-provisioning.md) — Provisioning and configuration for Vertex AI inference endpoints
- [ADR-0045 Forge-Portable Harness Schema — Phase 1](docs/plans/adr-0045-forge-portable-harness-phase1.md) — Implementation plan for ADR-0045 forge-portable harness schema (Phase 1)
- [ADR-0045 Forge-Portable Harness Schema — Phase 2](docs/plans/adr-0045-forge-portable-harness-phase2.md) — Implementation plan for ADR-0045 Phase 2: adopt new schema fields across install, scaffold, and lock flows
- [ADR-0045 Forge-Portable Harness Schema — Phase 3](docs/plans/adr-0045-forge-portable-harness-phase3.md) — Implementation plan for ADR-0045 Phase 3: deprecate config.yaml agents block, add Lint() diagnostics, migrate to harness-first discovery
- [ADR-0046 Drift Scanner](docs/plans/2026-03-06-adr46-drift-scanner.md) — Implementation plan for ADR-0046 drift detection tool
- **[docs/guides/](docs/guides/)** — Practical how-to documentation for administrators and developers (see [ADR 0023](docs/ADRs/0023-user-documentation-structure.md))
- **[docs/ADRs/](docs/ADRs/)** — Architecture Decision Records for crystallizing specific decisions (see [ADR 0001](docs/ADRs/0001-use-adrs-for-decision-making.md))
Expand Down
45 changes: 17 additions & 28 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@ inputs:
status-number:
description: Issue/PR number for status comments (optional).
default: ""
status-token:
description: Token for status comments (defaults to GH_TOKEN env var).
mint-url:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[high] breaking-api-change

Breaking change to GitHub Action input interface: renamed status-token input to mint-url. Any workflows in other repositories that invoke this action with status-token will break, as the input parameter has been removed without a deprecation period.

Suggested fix: Keep both status-token (deprecated) and mint-url inputs during a transition period. Add fallback logic and remove status-token only in a major version bump.

description: >-
Mint service URL for on-demand status comment tokens. The binary
mints a fresh short-lived token before each status API call.
default: ""

runs:
Expand Down Expand Up @@ -73,7 +75,7 @@ runs:
done
}

# Use vendored binary if present (placed by fullsend admin install --vendor-fullsend-binary).
# Use vendored binary if present (placed by fullsend admin install --vendor).
# Per-org mode stores it at bin/fullsend (in .fullsend config repo);
# per-repo mode stores it at .fullsend/bin/fullsend (in the target repo).
# GitHub Contents API does not preserve the executable bit, so check -f not -x.
Expand Down Expand Up @@ -263,23 +265,17 @@ runs:
podman info
systemctl --user start podman.socket

- name: Set OpenShell version
shell: bash
run: |
echo "OPENSHELL_VERSION=0.0.54" >> "${GITHUB_ENV}"
# SHA corresponding to 0.0.54
echo "OPENSHELL_SHA=79aa355dd008e496a7d8f97b361a7b2866066fbc" >> "${GITHUB_ENV}"

- name: Install OpenShell CLI
- name: Configure OpenShell gateway
shell: bash
run: |
mkdir -p $HOME/.config/openshell/
cat > $HOME/.config/openshell/gateway.env << EOF
OPENSHELL_BIND_ADDRESS=0.0.0.0
EOF

curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/${OPENSHELL_SHA}/install.sh | OPENSHELL_VERSION=v${OPENSHELL_VERSION} sh
openshell --version
- name: Install OpenShell CLI
shell: bash
run: "$GITHUB_ACTION_PATH/.github/scripts/install-openshell.sh"

- name: Restore cached sandbox image
id: sandbox-cache
Expand Down Expand Up @@ -363,7 +359,7 @@ runs:
STATUS_RUN_URL: ${{ inputs.run-url }}
STATUS_REPO: ${{ inputs.status-repo }}
STATUS_NUMBER: ${{ inputs.status-number }}
STATUS_TOKEN: ${{ inputs.status-token }}
MINT_URL: ${{ inputs.mint-url }}
run: |
set -euo pipefail
FULLSEND_DIR="${FULLSEND_DIR:-${GITHUB_WORKSPACE}}"
Expand All @@ -373,17 +369,14 @@ runs:
# Post-scripts enforce secret scanning, protected-path blocks,
# and review-downgrade controls. Skipping them in CI bypasses
# all post-push security gates.
if [[ -n "${STATUS_TOKEN}" ]]; then
echo "::add-mask::${STATUS_TOKEN}"
fi
STATUS_FLAGS=()
if [[ -n "${STATUS_REPO}" && -n "${STATUS_NUMBER}" ]]; then
STATUS_FLAGS+=(--status-repo "${STATUS_REPO}" --status-number "${STATUS_NUMBER}")
if [[ -n "${STATUS_RUN_URL}" ]]; then
STATUS_FLAGS+=(--run-url "${STATUS_RUN_URL}")
fi
if [[ -n "${STATUS_TOKEN}" ]]; then
STATUS_FLAGS+=(--status-token "${STATUS_TOKEN}")
if [[ -n "${MINT_URL}" ]]; then
STATUS_FLAGS+=(--mint-url "${MINT_URL}")
fi
fi
fullsend run "${AGENT}" \
Expand All @@ -393,10 +386,11 @@ runs:
"${STATUS_FLAGS[@]+"${STATUS_FLAGS[@]}"}"

- name: Finalize orphaned status comment
if: always() && inputs.agent != '__install_only__' && inputs.status-repo != '' && inputs.status-number != ''
if: always() && inputs.agent != '__install_only__' && inputs.status-repo != '' && inputs.status-number != '' && inputs.mint-url != ''
shell: bash
env:
STATUS_TOKEN: ${{ inputs.status-token }}
MINT_URL: ${{ inputs.mint-url }}
AGENT: ${{ inputs.agent }}
STATUS_REPO: ${{ inputs.status-repo }}
STATUS_NUMBER: ${{ inputs.status-number }}
RUN_ID: ${{ github.run_id }}
Expand All @@ -409,13 +403,8 @@ runs:
# the deferred PostCompletion call never runs and the status comment
# remains in "Started" state. This step runs unconditionally (if:
# always()) to detect and finalize orphaned comments. See #2149.
TOKEN="${STATUS_TOKEN:-${GITHUB_TOKEN:-}}"
if [[ -z "${TOKEN}" ]]; then
echo "::warning::No token available for status comment reconciliation"
exit 0
fi
echo "::add-mask::${TOKEN}"
RECONCILE_FLAGS=(--repo "${STATUS_REPO}" --number "${STATUS_NUMBER}" --run-id "${RUN_ID}" --token "${TOKEN}")
RECONCILE_FLAGS=(--repo "${STATUS_REPO}" --number "${STATUS_NUMBER}" --run-id "${RUN_ID}")
RECONCILE_FLAGS+=(--mint-url "${MINT_URL}" --role "${AGENT}")
if [[ -n "${RUN_URL}" ]]; then
RECONCILE_FLAGS+=(--run-url "${RUN_URL}")
fi
Expand Down
4 changes: 3 additions & 1 deletion docs/ADRs/0035-layered-content-resolution.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ they are populated at runtime from upstream.
replaced the earlier checkout at `@v0` with a checkout at a
caller-controlled ref), copies them into the main dirs (`agents/`, `skills/`,
etc.), then copies customizations on top so override files replace upstream
defaults. The workflow inspects `install_mode` to resolve the correct
defaults. When `--vendor` has committed upstream mirror content under
`.defaults/`, the sparse checkout is skipped (see
[ADR 0047](0047-vendored-installs-with-vendor-flag.md)). The workflow inspects `install_mode` to resolve the correct
customization base:

- `per-org`: reads from `customized/`
Expand Down
14 changes: 7 additions & 7 deletions docs/ADRs/0045-forge-portable-harness-schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,9 @@ agent definition `.md` file). `agent` describes *how* the agent behaves;
`role` describes *what function* the agent serves in the pipeline; `slug`
describes *who* the agent authenticates as. During Phase 1-2, `role` and
`slug` are optional — `Validate()` does not require them. In Phase 3,
`Validate()` emits warnings when `role` is missing. In Phase 4,
`Validate()` requires `role`.
`Validate()` continues to allow missing `role`, but `Lint()` emits
warnings when `role` is missing. In Phase 4, `Validate()` requires
`role`.

`base` references another harness file whose fields serve as defaults for
this harness. Any field set in the child overrides the corresponding base
Expand Down Expand Up @@ -516,11 +517,10 @@ func (h *Harness) ResolveForge(platform string) error { ... }
Note: `role`/`slug` becoming required is independent of the `forge:`
section — a harness that only targets one platform still needs `role`
and `slug` but does not need `forge:`.
Implementation note: the current `Validate()` method returns hard errors
only — there is no warning/advisory path. Phase 3 will need a separate
`Lint()` method or log-level warnings to emit non-fatal diagnostics
without breaking existing callers that treat any `Validate()` error as
a hard stop.
Implementation note: `Validate()` returns hard errors only. Phase 3
adds a separate `Lint()` method that returns non-fatal `[]Diagnostic`
warnings without breaking existing callers that treat any `Validate()`
error as a hard stop.

4. **Phase 4 (remove):** Require `role` in all harness files. Remove the
`agents:` block from config.yaml entirely. Agent identity and
Expand Down
Loading
Loading