Skip to content

docs: ADR 0031 — reusable workflows for action-installed distribution - #688

Merged
waynesun09 merged 8 commits into
mainfrom
adr-0027-reusable-workflows
May 10, 2026
Merged

waynesun09 merged 8 commits into
mainfrom
adr-0027-reusable-workflows

Conversation

@waynesun09

Copy link
Copy Markdown
Member

Summary

  • Proposes publishing reusable workflows (workflow_call) and a root composite action from fullsend-ai/fullsend
  • Org .fullsend repos shrink from 100-160 line scaffold copies to ~20 line thin callers with secrets: inherit
  • Eliminates cross-org workflow drift — infrastructure patches ship once upstream
  • Preserves ADR 0026 stage-based dispatch, shim workflows, and org-specific content unchanged
  • vars.* mapped to explicit inputs.* since vars don't cross workflow_call boundary

Context

Today fullsend admin install copies full agent workflows into each org's .fullsend repo. When a bug fix or security patch lands in the scaffold, every org must re-run install to pick up the change. This ADR proposes the distribution model change; implementation follows in subsequent PRs.

Test plan

  • Team reviews ADR for completeness and feasibility
  • Verify workflow_call context semantics match assumptions (callee runs in caller's repo context)
  • Validate secrets: inherit passes all required secrets without explicit mapping

@fullsend-ai-review

fullsend-ai-review Bot commented May 6, 2026 •

Copy link
Copy Markdown

Review: #688

Head SHA: 97a9972
Timestamp: 2026-05-10T00:00:00Z
Outcome: comment-only

Summary

This PR adds ADR 0031 proposing reusable workflows for distributing agent infrastructure. The ADR is well-structured, thoroughly considers trade-offs (trust boundary shift, upstream availability, cross-repo debugging), and correctly describes GitHub Actions workflow_call semantics. Two non-blocking issues: a forward reference to an unmerged ADR, and inconsistencies between the PR description and the ADR's actual recommendations.

Findings

Medium

  • [Correctness] docs/ADRs/0031-reusable-workflows-for-action-installed-distribution.md:148 — The ADR references [ADR 0029](0029-central-token-mint-secretless-fullsend.md) but ADR 0029 does not exist on the main branch. PR docs: ADR 0029 — central token mint for secretless .fullsend #655 proposes it but has not merged. This creates a broken relative link for anyone reading the ADR on main after this PR merges. Consider adding a note that ADR 0029 is pending, or coordinate merge ordering so 0029 lands first.

Low

  • [Correctness] PR description (not the ADR itself) — The PR body contains claims that contradict the ADR's actual decision: (1) the summary says callers use secrets: inherit, but the ADR explicitly recommends explicit secrets: declarations over blanket secrets: inherit; (2) the summary says "vars don't cross workflow_call boundary", but the ADR correctly states that vars.* ARE automatically available from the caller's context and are passed as explicit inputs.* for documentation/auditability purposes; (3) the test plan item says "Validate secrets: inherit passes all required secrets without explicit mapping" which again contradicts the ADR's decision. The ADR text itself is accurate — only the PR body is misleading.

    Remediation: Update the PR body to align with the ADR's actual recommendations: explicit secrets: (not secrets: inherit) and vars.* mapped to inputs.* for self-documentation (not because vars can't cross the boundary).

Info

  • [Style] docs/ADRs/0031-reusable-workflows-for-action-installed-distribution.md — The ADR is well-written. The trust boundary analysis, SHA pinning recommendation, and upstream availability consequence are particularly strong. The frontmatter, structure, and cross-references to ADRs 0026 and 0028 follow established conventions.

Footer

Outcome: comment-only
This review applies to SHA 97a99727809e9eb4148428644d5c584bcfbeed99. Any push to the PR head clears this review and requires a new evaluation.

Previous run

Review: #688

Head SHA: 5584a53
Timestamp: 2026-05-10T00:00:00Z
Outcome: comment-only

Summary

This ADR is well-structured and thorough. It correctly documents the dispatch chain, workflow_call context semantics, trust boundary implications, and the trade-offs between scaffold copies and reusable workflows. One factual inaccuracy needs correction: the ADR references a mint-token composite action that does not exist in the codebase, inflating the count from three to four. No critical or high findings; the change is safe to merge after addressing the medium-severity item.

Findings

Medium

  • [Correctness] docs/ADRs/0031-reusable-workflows-for-action-installed-distribution.md:29 — The Context section states "four composite actions (fullsend, mint-token, validate-enrollment, setup-gcp)" and the Decision section repeats this count. However, the scaffold (internal/scaffold/fullsend-repo/.github/actions/) contains only three composite actions: fullsend, validate-enrollment, and setup-gcp. There is no mint-token action anywhere in the codebase (confirmed via repository-wide search). This miscount propagates into the Decision section as well (line 65).
    Remediation: Change "four" to "three" and remove mint-token from both lists, or clarify if mint-token is a planned action that does not yet exist (in which case, distinguish it from the existing three).

Info

  • [Style/conventions] Branch name adr-0027-reusable-workflows does not match the ADR number (0031). This is cosmetic and has no functional impact, but may cause confusion when cross-referencing branches and ADRs.

  • [Correctness] The ADR correctly identifies that vars.* from the caller org/repo context are available in workflow_call reusable workflows, and the decision to pass them as explicit inputs.* for self-documentation is sound. No issue — noting as verified.

  • [Intent alignment] The ADR is appropriately scoped as a design document. It proposes a distribution model change and defers implementation to subsequent PRs, which matches the repo convention of separating decisions from implementation.

  • [Injection defense] No prompt injection patterns, non-rendering Unicode, or bidirectional overrides detected in the PR body, commit messages, or diff content.

Footer

Outcome: comment-only
This review applies to SHA 5584a5337caaf65e8e011103c8d34b2f9bee8fc2. Any push to the PR head clears this review and requires a new evaluation.

Previous run (2)

Review: #688

Head SHA: 92164bc
Timestamp: 2026-05-07T00:00:00Z
Outcome: approve

Summary

Well-structured ADR that proposes a sound distribution model change from scaffold copies to reusable workflow_call workflows. The document thoroughly evaluates three options, correctly identifies the trust boundary shift introduced by secrets: inherit, recommends SHA pinning as the secure default, and properly acknowledges trade-offs (upstream availability, cross-repo debugging, GitHub-specificity). All referenced ADRs (0026, 0028) and PRs (#655) are valid. No critical or high findings.

Findings

Medium / Low / Info

  • [style] Branch name adr-0027-reusable-workflows does not match the ADR number (0030). ADR 0027 already exists as "allowed-and-disallowed-tools-for-agents". Consider renaming the branch in future PRs to avoid confusion.

  • [style] ADR 0030 creates a numbering gap — ADR 0029 does not yet exist on main (PR Add agent execution sandbox architecture ADR #659 is still open). This is common in concurrent ADR workflows but worth noting. The renumber-adr skill may be relevant before merge if 0029's status changes.

Footer

Outcome: approve
This review applies to SHA 92164bc92a9f18ff502d88a7fb3cc1e1e3732881. Any push to the PR head clears this review and requires a new evaluation.

Previous run (3)

Review: #688

Head SHA: 9bd52b4
Timestamp: 2026-05-07T00:00:00Z
Outcome: comment-only

Summary

This is a well-written ADR that clearly articulates the problem (workflow drift from scaffold copies), presents three options with trade-offs, and makes a reasoned decision. The consequences section is thorough — particularly the trust boundary analysis around secrets: inherit and the SHA pinning recommendation. Two non-blocking issues: an ADR number collision with PR #715 (both claim number 30), and an inconsistent cross-reference to ADR 0028.

Findings

Medium

  • [style/conventions] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md — ADR number collision. PR docs: ADR 30 — OpenShell sandbox interaction model #715 ("ADR 30 — OpenShell sandbox interaction model") also claims ADR number 30. Whichever PR merges second will need renumbering. Coordinate with the other PR author or use the renumber-adr process before merge.
    Remediation: Coordinate with PR docs: ADR 30 — OpenShell sandbox interaction model #715 to assign distinct ADR numbers. Consider renumbering this to 0031 or higher depending on which merges first.

Low

  • [style/conventions] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md:131 — Inconsistent ADR cross-reference. The document references "ADR 0028" for multi-forge support but links to PR Add ADR-0028 for GitLab support architecture #601 instead of the ADR file. Other cross-references in the same document (e.g., ADR 0026) correctly link to the ADR markdown file. For consistency, link to 0028-gitlab-support.md.
    Remediation: Change Multi-forge support (ADR 0028, [PR #601](...)) to link the ADR number to the file: [ADR 0028](0028-gitlab-support.md) (keeping the PR link if desired).

Info

  • [style/conventions] Branch name adr-0027-reusable-workflows doesn't match ADR number 0030. Cosmetic only — no action needed, but worth noting for traceability.

Footer

Outcome: comment-only
This review applies to SHA 9bd52b4f2434bc0f828f150782a0837e792b50e6. Any push to the PR head clears this review and requires a new evaluation.

Previous run (4)

Review: #688

Head SHA: 18d3feb
Timestamp: 2026-05-07T00:00:00Z
Outcome: comment-only

Summary

This ADR is well-structured, follows the established template, and provides a thorough analysis of the trade-offs between scaffold copies, composite actions, and reusable workflows. The security analysis around secrets: inherit and SHA pinning is particularly strong. Two minor factual inaccuracies in the Context and Decision sections should be corrected before the ADR is accepted: the stated workflow line-count range and scaffold file count don't match the actual codebase.

Findings

Critical

None.

High

None.

Medium

None.

Low

  • [Correctness] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md:26 — The ADR states agent workflows are "125–354 lines each" but actual scaffold workflow line counts are: triage=78, code=109, review=98, fix=305, retro=146 (range: 78–305). The lower bound is overstated by ~60%.
    Remediation: Update the range to "78–305 lines each" or similar accurate characterization.

  • [Correctness] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md:24 — The ADR states the scaffold contains "~50 files" but the actual count in internal/scaffold/fullsend-repo/ is 64 files. While approximate, "~50" understates by ~28%.
    Remediation: Update to "~60 files" or the exact count.

Info

  • [Style/conventions] ADR numbering skips 0029 — no ADR 0029 exists in the repository. This may be intentional (reserved for another in-flight ADR) but is worth confirming to avoid confusion.

  • [Style/conventions] Branch name adr-0027-reusable-workflows doesn't match the ADR number 0030, suggesting the ADR was renumbered. This is cosmetic and has no functional impact.

Footer

Outcome: comment-only
This review applies to SHA 18d3feb00e236ff495f7faf46689cc7526dc5627. Any push to the PR head clears this review and requires a new evaluation.

Previous run (5)

Review: #688

Head SHA: 85e4054
Timestamp: 2026-05-07T00:00:00Z
Outcome: request-changes

Summary

This ADR is well-written and covers the reusable-workflow distribution model with appropriate depth — the options analysis is clear, the trust boundary discussion is thorough, and cross-references to ADR 0026 and 0028 are valid. However, ADR number 0030 conflicts with PR #715 ("ADR 30 — OpenShell sandbox interaction model"), which is also open and claims the same number. One of the two PRs must be renumbered before merge to avoid a collision. Additionally, the branch name adr-0027-reusable-workflows references ADR 0027 which already exists on main (0027-allowed-and-disallowed-tools-for-agents.md) — this is cosmetic but worth noting.

Findings

High

Info

  • [style/conventions] Branch name adr-0027-reusable-workflows references ADR 0027, but the file is correctly numbered 0030 and ADR 0027 already exists on main. The branch name is misleading but has no functional impact.

  • [correctness] The ADR references "ADR 0028" inline as a parenthetical (ADR 0028, PR #601) but the file is 0028-gitlab-support.md — a relative link like the ADR 0026 references would be more consistent and navigable.

Footer

Outcome: request-changes
This review applies to SHA 85e4054d163705e2615b83b4f831139b9f992057. Any push to the PR head clears this review and requires a new evaluation.

Previous run (6)

Review: #688

Head SHA: 306e2e9
Timestamp: 2026-05-06T00:00:00Z
Outcome: comment-only

Summary

This ADR is well-structured, technically accurate, and follows the established template. The workflow_call semantics (callee runs with caller's github context, secrets: inherit works, vars do not cross the boundary) are correctly described. The dispatch chain nesting analysis (1 level of workflow_call, within the 4-level limit) is correct. The scaffold file counts and workflow line lengths match reality. Two minor findings are worth noting but nothing blocks approval.

Findings

Medium

None.

Low

  • [correctness] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md:28 — The Context section states "copies ~30 files from the Go binary's embedded scaffold" but the actual scaffold directory contains 51 files. Consider updating to "~50 files" for accuracy, or qualifying with "~30 workflow and config files" if non-workflow files (e.g., agent definitions, scripts) are excluded from the count.
    Remediation: Update the file count to match reality or clarify what subset is being counted.

  • [correctness] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md — The Consequences section notes that fullsend-ai/fullsend must remain public for workflow_call references to resolve, and that callers pin by tag or SHA. However, the ADR does not discuss the trust implication: callers using secrets: inherit pass all their secrets to reusable workflow code hosted in a public repository. While this follows the standard uses: trust model, the ADR would benefit from explicitly acknowledging this trust boundary — especially since the existing threat model (CLAUDE.md) prioritizes external injection.
    Remediation: Add a consequence noting that secrets: inherit extends the trust boundary to the upstream public repo, and that tag/SHA pinning is the mitigation.

Info

  • [style/conventions] docs/ADRs/0030-reusable-workflows-for-action-installed-distribution.md:2 — The frontmatter title uses leading zeros ("0030.") which matches ADRs 0025 and 0027 but differs from ADRs 20–24 and 26 which omit leading zeros. The repo has an inconsistent convention for this; this PR follows the newer pattern and is not itself wrong, but the inconsistency across ADRs may be worth a cleanup pass.

Footer

Outcome: comment-only
This review applies to SHA 306e2e96e24191a49f6a82940ab235e85653b5b2. Any push to the PR head clears this review and requires a new evaluation.

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Test review - no comments

@ralphbean
ralphbean dismissed their stale review May 6, 2026 15:12

Replacing with full review

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Review: ADR 0030 — Reusable workflows for action-installed distribution

The direction is sound — scaffold copy-and-drift is a real problem and reusable workflows are a well-understood pattern to address it. The ADR is well-structured and the workflow_call semantics are correct. Two items need addressing before acceptance, plus several observations for consideration.

Requesting changes on:

  1. Multi-forge implications — this design is GitHub Actions-specific (workflow_call, secrets: inherit). PR #601 is adding ADR-0028 for GitLab CI support architecture. Consider adding a consequence noting that this distribution model is GitHub-specific, and that multi-forge support (see #601) will need its own equivalent mechanism. This doesn't need to solve the GitLab problem, just acknowledge the boundary.
  2. secrets: inherit trust boundary — secrets: inherit passes all caller secrets to reusable workflow code in a public repo. Worth adding a consequence comparing trust boundaries:
    • Current model (scaffold copies): org secrets are consumed by workflow code in the org's own repo. Full visibility and control.
    • Proposed model (reusable workflows): org secrets flow to workflow code in an upstream public repo. A compromised upstream tag/SHA could exfiltrate secrets from all downstream orgs simultaneously.
    • Mitigation: SHA pinning (not just tag pinning) gives orgs control. Tag pinning (@v1) is convenient but mutable.
      Given the project's threat model prioritizes external injection, this shift in trust boundary should be explicitly documented.

Additional observations (note, defer):

  • File count (line 28): "~30 files" — the scaffold directory actually contains ~60 files. Consider correcting or qualifying.
  • Line count range (line 30): "100–160 line" — fix.yml is 355 lines, dispatch.yml is 188 lines. Worth correcting for accuracy.
  • Upstream availability (Consequences): Missing consequence — upstream availability becomes a new failure mode. If fullsend-ai/fullsend has an outage or a ref is corrupted, all downstream orgs break simultaneously.
  • Debugging/observability (Consequences): Missing consequence — when workflows fail, the call stack spans two repos. Developers need to look at both the thin caller and the upstream reusable workflow.

@ggallen ggallen left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Review of PR #688 - ADR 0030: Reusable Workflows

This ADR addresses a real maintenance problem (workflow drift), but has several critical gaps that need resolution before acceptance.

1. Breaking Changes and Version Pinning Strategy

Problem: The ADR states "Organizations control upgrade timing by pinning to specific tags or SHAs" but doesn't specify what fullsend admin install generates by default. This creates three possible outcomes:

Scenario A: Moving references (e.g., @v1, @main)

uses: fullsend-ai/fullsend/.github/workflows/reusable-triage.yml@v1
  • ✅ Infrastructure patches propagate automatically
  • ❌ Breaking changes also propagate immediately - no testing window
  • ❌ One bad merge to main breaks all installations instantly
  • ❌ Defeats the purpose of controlled upgrades

Scenario B: Pinned references (e.g., @abc123)

uses: fullsend-ai/fullsend/.github/workflows/reusable-triage.yml@abc123def
  • ✅ Safe - only change when explicitly updated
  • ❌ Defeats the entire purpose - orgs still need to re-run fullsend admin install to get new pins
  • ❌ Brings workflow drift problem back - just moved from infrastructure to version pins

Scenario C: Hybrid approach (not discussed)

  • Some orgs use @v1 for auto-updates, others use pinned SHAs?
  • What's the recommended approach?
  • How do orgs test upstream changes before taking them?

Missing from ADR:

  • What does fullsend admin install generate by default?
  • What's the recommended upgrade workflow?
  • How do orgs test upstream changes before production?
  • What's the rollback procedure if upstream breaks?

This is a fundamental design decision that must be specified before the ADR can be properly evaluated.


2. Multi-Forge Architectural Divergence

This ADR creates architectural divergence with GitLab support (ADR-0028).

Current state (consistent across forges)

  • GitHub: fullsend admin install copies .github/workflows/*.yml
  • GitLab: fullsend admin install copies .gitlab/ci/*.yml
  • Both: Full pipeline files with all infrastructure logic

After ADR 0030 (divergent)

  • GitHub: Thin ~20-line callers using workflow_call
  • GitLab: Still full pipeline files (?)

Why this matters

GitHub Actions workflow_call has no direct GitLab equivalent:

  • GitLab has include: for remote YAML, but no secrets: inherit equivalent
  • GitLab has CI/CD Components (16+), but different syntax/capabilities
  • Child pipelines exist but serve a different architectural role

ADR-0028 assumes full file copying:

Phase 2: CI/CD templates

  • Create .gitlab/ci/dispatch.yml dispatcher
  • Create stage pipelines (triage.yml, code.yml, review.yml, fix.yml)
  • Create templates/shim-pipeline.yml template

Consequences of divergence:

  • Instead of maintaining two parallel template sets, now maintaining:
    • GitHub: upstream reusable workflows + thin local callers
    • GitLab: full pipeline files (100-350 lines each)
  • This is worse than the current state for maintenance burden
  • Violates CLAUDE.md principle: "Parallel architecture: GitLab implementation closely mirrors GitHub"

Recommendation

The ADR should include a section addressing multi-forge implications with one of these paths:

Option A: Keep both forges on full-file copying (reject this ADR)
Option B: Design a forge-neutral reusable component strategy that works for both
Option C: Accept divergence and document the maintenance trade-offs explicitly
Option D: Defer this ADR until GitLab support lands, then design unified approach

Whichever path is chosen, the Consequences section must document the multi-forge implications.


3. Trust Boundary Shift (already flagged by reviewers)

Echoing Ralph Bean's review: secrets: inherit fundamentally changes the trust model from "secrets stay in org repo" to "secrets flow to public upstream code."

Current state:

  • Secrets live in org's .fullsend repo
  • All code executing with secrets is in org-controlled repository

After ADR 0030:

  • All infrastructure code runs from fullsend-ai/fullsend (public repo)
  • Org secrets are accessible to this code via secrets: inherit

Mitigation:

  • SHA pinning ensures orgs know exactly what code runs with their secrets
  • But this only works if orgs actually pin (see issue #1 above)

Recommendation:
Add explicit documentation in the Consequences section about this trust model shift and its dependency on SHA pinning strategy.


4. Technical Accuracy Issues (minor)

The ADR states:

"approximately 30 files via fullsend admin install, including full agent workflows (100–160 lines each)"

Actual counts:

  • Workflow files: 7 (not 30)
  • Line counts: fix.yml is 355 lines, dispatch.yml is 188 lines (not 100-160)

These should be corrected for accuracy.


Summary

This ADR addresses a real problem but has critical design gaps:

  1. Version pinning strategy must be specified - moving refs break installations, pinned refs defeat the purpose
  2. Multi-forge divergence must be addressed - creates architectural inconsistency with GitLab support
  3. Trust boundary shift needs explicit documentation - secrets: inherit changes security model

I recommend requesting changes until these are resolved. The underlying idea may be sound, but the design is incomplete without answering these questions.

waynesun09 added 2 commits May 7, 2026 13:39
Proposes converting org .fullsend repos from full scaffold-copied
workflows to thin callers that delegate to upstream reusable workflows
via workflow_call, eliminating cross-org workflow drift.

Signed-off-by: Wayne Sun <gsun@redhat.com>
Fix file count (~30 → ~50) and line range (100–160 → 125–354) to
match actual scaffold contents. Fix leading zeros in title per lint
rules. Add four missing consequences flagged by reviewers: trust
boundary shift with secrets: inherit, upstream availability as a
new failure mode, cross-repo debugging complexity, and GitHub-specific
mechanism acknowledgment for multi-forge considerations.

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

github-actions Bot commented May 7, 2026 •

Copy link
Copy Markdown

Site preview

Preview: https://0991cc06-site.fullsend-ai.workers.dev

Commit: 97a99727809e9eb4148428644d5c584bcfbeed99

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

See the review comment for full details.

Correct the claim that vars do not cross the workflow_call boundary —
they do resolve from the caller's context automatically. Keep explicit
inputs mapping for auditability, missing-variable safety, and review
checkpoints. Fix nesting limit (4 → 10, changed Nov 2025). Add
consequences for scaffold output changes and transitional PEM-based
token generation.

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown

fullsend review is working on this — view logs

@waynesun09

Copy link
Copy Markdown
Member Author

@ralphbean Thanks for the thorough review. Pushed updates addressing your feedback:

Applied:

  • Multi-forge implications — added consequence noting workflow_call and secrets: inherit are GitHub-specific, with pointer to ADR 0028 / PR Add ADR-0028 for GitLab support architecture #601 for GitLab's equivalent mechanism.
  • secrets: inherit trust boundary — added consequence documenting the trust model shift (secrets flow to upstream public repo code), comparing scaffold-copy vs reusable-workflow models, and recommending SHA pinning as the default for production.
  • File count — corrected ~30 → ~50 (actual: 51).
  • Line count range — corrected 100–160 → 125–354 (accounts for fix.yml at 354 lines).
  • Upstream availability — added as a new consequence (runtime dependency, failure mode).
  • Cross-repo debugging — added as a new consequence (call stack spans two repos, partially mitigated by GitHub's inline reusable workflow UI).

Additional changes from research verification:

  • Corrected the claim that vars do not cross the workflow_call boundary — they do resolve from the caller's context automatically. Kept explicit inputs.* mapping for auditability, missing-variable safety, and review checkpoints.
  • Fixed workflow_call nesting limit from 4 → 10 (changed by GitHub in Nov 2025).
  • Added consequence for scaffold output changes (admin install will emit thin callers).
  • Added consequence noting PEM-based token generation is transitional (token mint PR docs: ADR 0029 — central token mint for secretless .fullsend #655 will replace with OIDC).

@waynesun09

Copy link
Copy Markdown
Member Author

@ggallen Thanks for the detailed review. Here's what was applied and what remains out of scope:

Applied:

  • Trust boundary — documented the secrets: inherit trust model shift and SHA pinning recommendation (same as Ralph's feedback).
  • Multi-forge divergence — acknowledged GitHub-specificity with pointer to ADR 0028 / PR Add ADR-0028 for GitLab support architecture #601. The ADR scopes itself to GitHub Actions only; GitLab needs its own distribution mechanism.
  • File/line count accuracy — corrected to ~50 files and 125–354 lines per workflow.

Not applied (out of ADR scope):

  • Version pinning strategy details — what admin install generates by default (tag vs SHA), recommended upgrade workflow, rollback procedure, and how orgs test upstream changes before production. These are implementation decisions that will be resolved when the reusable workflows are built. The ADR documents that both tag and SHA pinning are available, and recommends SHA pinning for production. The specific default and upgrade workflow belong in the implementation PR or operator docs rather than the ADR.
  • Choosing a specific multi-forge path (your Options A–D) — the ADR acknowledges the GitHub-specific boundary and defers the GitLab distribution design to ADR 0028's scope. Choosing a unified strategy requires the GitLab CI support work to land first.

Your inline comment thread (custom agents) is already self-resolved.

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Review: ADR 0030 — Reusable workflows for action-installed distribution

The ADR is well-written and technically accurate. The workflow_call semantics (callee runs in caller's repo context, secrets: inherit, vars not crossing the boundary) are correct. The nesting analysis (1 of 4 levels) is sound. The second revision successfully addressed prior reviewer feedback on trust boundary, upstream availability, cross-repo debugging, and multi-forge implications.

Two minor notes inline — neither blocks approval.

- composite-action
---

# 30. Reusable workflows for action-installed distribution

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[important] ADR number collision: open PR #715 ("ADR 30 — OpenShell sandbox interaction model") also claims number 0030. Whichever merges second will collide. The /renumber-adr process should be used before merge on one of the two PRs. Already flagged by the review bot — noting for visibility.

Correct scaffold file count (~50 → ~60, actual: 64) and agent
workflow line range (125–354 → 78–305) per review bot findings
against latest main branch scaffold.

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown

fullsend review is working on this — view logs

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown

fullsend review is working on this — view logs

@ggallen

ggallen commented May 8, 2026

Copy link
Copy Markdown
Member

Should we consider using fullsend-ai/workflows rather than fullsend-ai/fullsend?

Reflect PR #503 changes: 4 composite actions (fullsend, mint-token,
validate-enrollment, setup-gcp) must live upstream since uses: ./
resolves to the reusable workflow's repo. Update vars mapping (mint_url
replaces client IDs), add SHA pinning recommendation, document uses: ./
resolution rule.

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

github-actions Bot commented May 9, 2026

Copy link
Copy Markdown

fullsend review is working on this — view logs

Avoids collision with ADR 0030 on main (openshell sandbox interaction
model). Renumber to 0031 to fit the updated ADR numbering scheme
across open PRs.

Signed-off-by: Wayne Sun <gsun@redhat.com>
waynesun09 added a commit that referenced this pull request May 10, 2026
ADR 0031 slot now used by reusable workflows (PR #688). Renumber to
0033 and update internal cross-references from ADR 0030 to 0031.

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

Copy link
Copy Markdown

fullsend review is working on this — view logs

@waynesun09 waynesun09 changed the title docs: ADR 0030 — reusable workflows for action-installed distribution docs: ADR 0031 — reusable workflows for action-installed distribution May 10, 2026
- ~20 line thin callers → ~40 lines (actual)
- secrets: inherit → explicit secret passthrough (least-privilege)
- workflow_call nesting limit 10 → 4 (GitHub actual limit)
- ~60 scaffold files → ~80 (actual count)
- Token generation: remove stale "transitional PEM" paragraph,
  reflect current OIDC mint-token implementation
- ADR 0027 → ADR 0029 (token mint renumbered on PR #655)

Signed-off-by: Wayne Sun <gsun@redhat.com>
@github-actions

Copy link
Copy Markdown

fullsend review is working on this — view logs

@waynesun09

Copy link
Copy Markdown
Member Author

@ggallen Good question. We considered a separate repo but staying with fullsend-ai/fullsend is the right call for now:

  • Composite actions use relative paths — reusable workflows reference uses: ./.github/actions/fullsend etc. Moving workflows to a separate repo would break this; they'd need to cross-repo reference back to fullsend-ai/fullsend for the actions, adding complexity.
  • Single release cut — one tag (v1) pins both reusable workflows and composite actions together. A separate repo means coordinating two release cycles.
  • GitHub's uses: syntax already namespaces — fullsend-ai/fullsend/.github/workflows/reusable-triage.yml@v1 is verbose but unambiguous. A separate fullsend-ai/workflows repo would shorten paths slightly but add a repo to maintain.

If the monorepo grows unwieldy we can split later, but right now co-location keeps things simple.

@waynesun09
waynesun09 added this pull request to the merge queue May 10, 2026
Merged via the queue into main with commit 81576c0 May 10, 2026
13 checks passed
@waynesun09
waynesun09 deleted the adr-0027-reusable-workflows branch May 10, 2026 21:55
@ggallen

ggallen commented May 11, 2026

Copy link
Copy Markdown
Member
  • Composite actions use relative paths — reusable workflows reference uses: ./.github/actions/fullsend etc. Moving workflows to a separate repo would break this; they'd need to cross-repo reference back to fullsend-ai/fullsend for the actions, adding complexity.

Well, the easy answer here is to just include the actions in the new repo as well.

This branch was successfully deployed

1 active deployment
site-preview — 97a99727 Deployed May 10, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants