Repository navigation
Add contributor licence agreement and enforcement workflow #351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| # CLA enforcement via CLA Assistant Lite (contributor-assistant/github-action). | ||
| # | ||
| # NOTE: the upstream repository (contributor-assistant/github-action) was | ||
| # archived in March 2026 and is read-only. Existing releases keep working. | ||
| # This is deliberate: unlike the hosted cla-assistant.io app, this action | ||
| # stores signatures inside this repository, which is a hard requirement. | ||
| # Consequences: | ||
| # - The action is pinned to a commit SHA (of the last release, v2.6.1). | ||
| # - Treat it as frozen: do not add Dependabot/Renovate config for it, and | ||
| # do not expect upstream updates or fixes. | ||
| # | ||
| # Signature versioning: signatures are stored under signatures/version1/. | ||
| # If CLA.md is ever materially changed, bump the path to signatures/version2/ | ||
| # (and so on) so that prior signatures do not silently appear to cover text | ||
| # nobody agreed to. | ||
| name: CLA Assistant | ||
| on: | ||
| issue_comment: | ||
| types: [created] | ||
| pull_request_target: | ||
| types: [opened, closed, synchronize] | ||
|
|
||
| permissions: | ||
| actions: write | ||
| contents: write | ||
| pull-requests: write | ||
| statuses: write | ||
|
|
||
| jobs: | ||
| cla: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| # The `github.event.issue.pull_request` guard is required: without it, | ||
| # comments on ordinary issues (not PRs) trigger the action. The upstream | ||
| # README example omits it; that is a known upstream bug. | ||
| - uses: contributor-assistant/github-action@ca4a40a7d1004f18d9960b404b97e5f30a505a08 # v2.6.1 — upstream archived 2026-03 | ||
| if: > | ||
| github.event_name == 'pull_request_target' || | ||
| (github.event.issue.pull_request && | ||
| contains(fromJSON('["recheck","I have read the CLA Document and I hereby sign the CLA"]'), | ||
| github.event.comment.body)) | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| with: | ||
| path-to-signatures: 'signatures/version1/cla.json' | ||
| path-to-document: 'https://github.com/tower/tower-cli/blob/main/CLA.md' | ||
| branch: 'main' | ||
| allowlist: dependabot[bot],renovate[bot] | ||
| # lock-on-merge is left at its default (enabled) on purpose: locking | ||
| # the PR conversation after merge is what makes the signature | ||
| # comments immutable, which is the evidentiary value of the record. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,156 @@ | ||
| # Tower Individual Contributor License Agreement | ||
|
|
||
| <!-- Based on the Apache Software Foundation Individual Contributor License | ||
| Agreement ("Agreement") V2.2, retrieved from | ||
| https://www.apache.org/licenses/icla.pdf. Substantive deviations from the | ||
| Apache text are marked with LEGAL REVIEW REQUIRED comments. --> | ||
|
|
||
| Before your pull request can be merged, Tower asks you to sign this | ||
| contributor license agreement. Signing does not transfer ownership of your | ||
| work: you keep the copyright in your contributions and grant Tower and users | ||
| of Tower's software a license to use, modify, and distribute them. You sign | ||
| by replying to the CLA bot's comment on your pull request, and the signature | ||
| is recorded in this repository. | ||
|
|
||
| --- | ||
|
|
||
| Thank you for your interest in Tower <!-- ENTITY: confirm Inc. vs GmbH --> | ||
| ("Tower"). To clarify the intellectual property license granted with | ||
| Contributions from any person or entity, Tower must have on file a signed | ||
| Contributor License Agreement ("CLA") from each Contributor, indicating | ||
| agreement with the license terms below. This agreement is for your protection | ||
| as a Contributor as well as the protection of Tower and its users. It does not | ||
| change your rights to use your own Contributions for any other purpose. | ||
|
|
||
| <!-- LEGAL REVIEW REQUIRED: signing mechanics. The Apache form is executed by | ||
| written signature and emailed to the Foundation, and collects the | ||
| signer's name, address, and email on the form itself. This version is | ||
| executed electronically: the Contributor posts the signature comment | ||
| requested by the CLA workflow on their GitHub pull request, and the | ||
| workflow records the Contributor's GitHub account and signature metadata | ||
| in this repository. Confirm this execution method and the associated | ||
| record-keeping are sufficient. --> | ||
| You sign this Agreement electronically by posting the signature comment | ||
| requested by the CLA workflow on your GitHub pull request. Your GitHub | ||
| username and the metadata recorded by the workflow constitute the record of | ||
| your signature and are stored in this repository. | ||
|
Comment on lines
+25
to
+36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- CLA.md ---'
cat -n CLA.md
printf '%s\n' '--- related workflow and repository references ---'
rg -n -i --glob '!node_modules' --glob '!dist' --glob '!build' \
'CLA|signature comment|signature metadata|reciprocal|Apache|sign(ing|ature)' .
printf '%s\n' '--- tracked workflow files ---'
git ls-files | rg '(^|/)\.github/workflows/|CLA\.md$'Repository: tower/tower-cli Length of output: 50372 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- tracked GitHub metadata ---'
git ls-files '.github/*' '.github/**/*' | sed -n '1,120p'
printf '%s\n' '--- CONTRIBUTING.md signing instructions ---'
cat -n CONTRIBUTING.md | sed -n '24,42p'
printf '%s\n' '--- CLA-specific files and workflow references ---'
find . -maxdepth 4 -type f \( -iname '*cla*' -o -path '*/.github/*' \) -print
rg -n -i 'I have read the CLA Document|cla bot|cla workflow|pull_request|issue_comment|signature' \
CONTRIBUTING.md CLA.md .github 2>/dev/null || trueRepository: tower/tower-cli Length of output: 7145 🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- CLA workflow ---'
cat -n .github/workflows/cla.yml
printf '%s\n' '--- signature records ---'
git ls-files 'signatures/**' | sed -n '1,80p'
for f in $(git ls-files 'signatures/**' | sed -n '1,10p'); do
printf '\n--- %s ---\n' "$f"
cat -n "$f"
done
printf '%s\n' '--- Apache CLA source references in repository ---'
rg -n 'public benefit|nonprofit status|written signature|email|signature' LICENSE CLA.md CONTRIBUTING.md .github/workflows/cla.ymlRepository: tower/tower-cli Length of output: 4359 🌐 Web query:
💡 Result: The Apache Software Foundation (ASF) is a U.S.-based 501(c)(3) nonprofit public charity [1][2][3]. It is organized to provide software for the public good [1][4], and its mission is to support open-source software projects through a collaborative, meritocratic process [4][2]. Regarding the Individual Contributor License Agreement (ICLA) V2.2, it explicitly references the ASF's status as a nonprofit organization [5]. Specifically, the ICLA states: "In return, the Foundation shall not use Your Contributions in a way that is contrary to the public benefit or inconsistent with its nonprofit status and bylaws in effect at the time of the Contribution" [5]. By signing the ICLA, contributors grant the Foundation a license to their work while retaining ownership, and the Foundation commits to managing those contributions in alignment with its nonprofit, public-benefit mission [5][6]. As a 501(c)(3) organization, the ASF is distinct from trade organizations; it emphasizes grassroots community development and prohibits "pay-to-play" governance, meaning donors do not gain influence over the technical direction of its projects [7]. Citations:
Obtain counsel approval for the electronic execution and removed covenant before enabling CLA signatures. The workflow accepts the exact signature phrase in a pull-request comment and writes signature records to 🤖 Prompt for AI Agents |
||
|
|
||
| <!-- LEGAL REVIEW REQUIRED: removed covenant. The Apache text includes a | ||
| reciprocal commitment that the Foundation "shall not use Your | ||
| Contributions in a way that is contrary to the public benefit or | ||
| inconsistent with its nonprofit status and bylaws". Tower is not a | ||
| nonprofit, so the clause has been removed rather than adapted. Confirm | ||
| whether any reciprocal commitment should replace it. --> | ||
| You accept and agree to the following terms and conditions for Your | ||
| Contributions (present and future) that you submit to Tower. Except for the | ||
| license granted herein to Tower and recipients of software distributed by | ||
| Tower, You reserve all right, title, and interest in and to Your | ||
| Contributions. | ||
|
|
||
| 1. Definitions. | ||
|
|
||
| "You" (or "Your") shall mean the copyright owner or legal entity | ||
| authorized by the copyright owner that is making this Agreement with | ||
| Tower. For legal entities, the entity making a Contribution and all other | ||
| entities that control, are controlled by, or are under common control with | ||
| that entity are considered to be a single Contributor. For the purposes of | ||
| this definition, "control" means (i) the power, direct or indirect, to | ||
| cause the direction or management of such entity, whether by contract or | ||
| otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||
| outstanding shares, or (iii) beneficial ownership of such entity. | ||
|
|
||
| "Contribution" shall mean any original work of authorship, including any | ||
| modifications or additions to an existing work, that is intentionally | ||
| submitted by You to Tower for inclusion in, or documentation of, any of | ||
| the products owned or managed by Tower (the "Work"). For the purposes of | ||
| this definition, "submitted" means any form of electronic, verbal, or | ||
| written communication sent to Tower or its representatives, including but | ||
| not limited to communication on electronic mailing lists, source code | ||
| control systems, and issue tracking systems that are managed by, or on | ||
| behalf of, Tower for the purpose of discussing and improving the Work, but | ||
| excluding communication that is conspicuously marked or otherwise | ||
| designated in writing by You as "Not a Contribution." | ||
|
|
||
| 2. Grant of Copyright License. Subject to the terms and conditions of this | ||
| Agreement, You hereby grant to Tower and to recipients of software | ||
| distributed by Tower a perpetual, worldwide, non-exclusive, no-charge, | ||
| royalty-free, irrevocable copyright license to reproduce, prepare | ||
| derivative works of, publicly display, publicly perform, sublicense, and | ||
| distribute Your Contributions and such derivative works. | ||
|
|
||
| 3. Grant of Patent License. Subject to the terms and conditions of this | ||
| Agreement, You hereby grant to Tower and to recipients of software | ||
| distributed by Tower a perpetual, worldwide, non-exclusive, no-charge, | ||
| royalty-free, irrevocable (except as stated in this section) patent | ||
| license to make, have made, use, offer to sell, sell, import, and | ||
| otherwise transfer the Work, where such license applies only to those | ||
| patent claims licensable by You that are necessarily infringed by Your | ||
| Contribution(s) alone or by combination of Your Contribution(s) with the | ||
| Work to which such Contribution(s) was submitted. If any entity institutes | ||
| patent litigation against You or any other entity (including a cross-claim | ||
| or counterclaim in a lawsuit) alleging that your Contribution, or the Work | ||
| to which you have contributed, constitutes direct or contributory patent | ||
| infringement, then any patent licenses granted to that entity under this | ||
| Agreement for that Contribution or Work shall terminate as of the date | ||
| such litigation is filed. | ||
|
|
||
| 4. You represent that you are legally entitled to grant the above license. | ||
| If your employer(s) has rights to intellectual property that you create | ||
| that includes your Contributions, you represent that you have received | ||
| permission to make Contributions on behalf of that employer, that your | ||
| employer has waived such rights for your Contributions to Tower, or that | ||
| your employer has executed a separate Corporate CLA with Tower. | ||
|
|
||
| 5. You represent that each of Your Contributions is Your original creation | ||
| (see section 7 for submissions on behalf of others). You represent that | ||
| Your Contribution submissions include complete details of any third-party | ||
| license or other restriction (including, but not limited to, related | ||
| patents and trademarks) of which you are personally aware and which are | ||
| associated with any part of Your Contributions. | ||
|
|
||
| 6. You are not expected to provide support for Your Contributions, except to | ||
| the extent You desire to provide support. You may provide support for | ||
| free, for a fee, or not at all. Unless required by applicable law or | ||
| agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, | ||
| including, without limitation, any warranties or conditions of TITLE, | ||
| NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. | ||
|
|
||
| 7. Should You wish to submit work that is not Your original creation, You | ||
| may submit it to Tower separately from any Contribution, identifying the | ||
| complete details of its source and of any license or other restriction | ||
| (including, but not limited to, related patents, trademarks, and license | ||
| agreements) of which you are personally aware, and conspicuously marking | ||
| the work as "Submitted on behalf of a third-party: [named here]". | ||
|
|
||
| 8. You agree to notify Tower of any facts or circumstances of which you | ||
| become aware that would make these representations inaccurate in any | ||
| respect. | ||
|
|
||
| <!-- LEGAL REVIEW REQUIRED: retroactivity. Section 9 is an addition to the | ||
| Apache text. It extends the Agreement to Contributions submitted before | ||
| signature, which the prospectively-worded Apache form does not | ||
| explicitly cover. Confirm the wording achieves the intended coverage of | ||
| prior Contributions. --> | ||
| 9. Prior Contributions. This Agreement applies to all Contributions You | ||
| submitted to Tower before the date You sign this Agreement, as well as to | ||
| all Contributions You submit on or after that date. The licenses granted | ||
| in sections 2 and 3, and the representations made in sections 4, 5, 7, | ||
| and 8, apply equally to such prior Contributions. | ||
|
|
||
| <!-- LEGAL REVIEW REQUIRED: governing law + venue. The Apache form contains | ||
| no governing law or venue clause. This section is an addition, and the | ||
| jurisdiction and venue have deliberately not been selected. Counsel must | ||
| choose them (and should confirm they match the entity chosen above). --> | ||
| 10. Governing Law. This Agreement shall be governed by and construed in | ||
| accordance with the laws of [GOVERNING LAW — TO BE DETERMINED BY | ||
| COUNSEL], without regard to its conflict of laws principles. Any dispute | ||
| arising out of or relating to this Agreement shall be subject to the | ||
| exclusive jurisdiction of the courts of [VENUE — TO BE DETERMINED BY | ||
| COUNSEL]. | ||
|
Comment on lines
+141
to
+150
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- CLA.md excerpt ---'
sed -n '110,165p' CLA.md
printf '%s\n' '--- entity references ---'
rg -n -i 'Tower|entity|governing law|venue|counsel|signature' CLA.md README.md .github 2>/dev/null | head -200
printf '%s\n' '--- tracked files with legal or entity configuration ---'
git ls-files | rg -i '(^|/)(cla|legal|entity|terms|contribut|license)|tower|company|organization' | head -200Repository: tower/tower-cli Length of output: 26365 🏁 Script executed: #!/bin/bash
set -eu
python3 - <<'PY'
from pathlib import Path
import re
p = Path("CLA.md")
lines = p.read_text().splitlines()
patterns = {
"legal placeholders": re.compile(r"\[[^\]]*(?:TO BE DETERMINED|confirm|TBD)[^\]]*\]", re.I),
"review markers": re.compile(r"LEGAL REVIEW REQUIRED|ENTITY:", re.I),
}
for label, pattern in patterns.items():
print(f"--- {label} ---")
for n, line in enumerate(lines, 1):
if pattern.search(line):
print(f"{n}: {line}")
print("--- governing-law section ---")
for n in range(141, 151):
print(f"{n}: {lines[n-1]}")
PY
printf '%s\n' '--- CLA opening and entity wording ---'
sed -n '1,65p' CLA.md
printf '%s\n' '--- CLA workflow and signature storage ---'
sed -n '1,75p' .github/workflows/cla.yml
printf '%s\n' '--- repository metadata that may identify the legal entity ---'
rg -n -i 'inc\.|llc|ltd\.|gmbh|corp\.|corporation|company|legal entity|registered|delaware|california|new york|united states' --glob '!*.lock' --glob '!crates/tower-api/**' . | head -200Repository: tower/tower-cli Length of output: 11024 Replace the governing-law and venue placeholders. The agreement also leaves the contracting entity unresolved ( 🤖 Prompt for AI Agents |
||
|
|
||
| <!-- LEGAL REVIEW REQUIRED: privacy notice. The Apache form points signers to | ||
| Apache's CLA privacy policy. That pointer has been removed. Signature | ||
| records stored in this repository contain personal data (GitHub | ||
| username, name, signature timestamp); confirm whether Tower needs its | ||
| own privacy notice covering these records. --> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -27,6 +27,14 @@ If you still need help: | |
|
|
||
| > **Legal Notice:** When contributing, you must agree that you have authored 100% of the content, have the necessary rights, and that it may be provided under the project license. | ||
|
|
||
| ### Contributor License Agreement | ||
|
|
||
| A signed [Contributor License Agreement](CLA.md) is required before any pull request can be merged. | ||
|
|
||
| Signing happens on the pull request itself: when you open a PR, a bot comments with a link to the CLA and a required status check fails. Reply to the bot's comment with the exact phrase it asks for (`I have read the CLA Document and I hereby sign the CLA`) and the check clears. You only need to do this once; it covers your future pull requests too. | ||
|
Comment on lines
+32
to
+34
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- candidate files ---'
git ls-files | rg '(^|/)(CONTRIBUTING\.md|README.*|.*(cla|CLA|branch|protect|workflow|action).*)$' || true
printf '%s\n' '--- CONTRIBUTING.md ---'
if [ -f CONTRIBUTING.md ]; then
cat -n CONTRIBUTING.md | sed -n '1,90p'
fi
printf '%s\n' '--- CLA and status-check references ---'
rg -n -i -C 3 'CLA|Contributor License|status check|branch protection|required check|main' . \
--glob '!node_modules/**' \
--glob '!dist/**' \
--glob '!build/**' \
| sed -n '1,240p'Repository: tower/tower-cli Length of output: 20242 🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- CLA workflow ---'
cat -n .github/workflows/cla.yml
printf '%s\n' '--- exact CLA action/check references ---'
rg -n -i -C 4 'cla|status|check|branch protection|required|main|merge' \
.github CLA.md CONTRIBUTING.md \
--glob '*.yml' --glob '*.yaml' --glob '*.md' \
| sed -n '1,260p'
printf '%s\n' '--- repository metadata/configuration files ---'
git ls-files '.github/**' | sortRepository: tower/tower-cli Length of output: 20043 🌐 Web query:
💡 Result: For the contributor-assistant/github-action (v2.6.1), the status check context name used for branch protection is "CLA Assistant" [1]. When configuring a required status check in GitHub branch protection rules, you should use "CLA Assistant" as the exact check name [1][2][3]. Key implementation details for branch protection: - Ensure the job name or the step name responsible for the check results in the status "CLA Assistant" [1]. - If you encounter issues where the action fails to write to a protected branch (e.g., when storing signatures on the default branch), it is common practice to either store signatures on a separate, unprotected branch or use a personal access token (PAT) with appropriate write permissions [4][2][3]. - The action reports a failure status if a contributor has not signed the CLA, effectively blocking the pull request if that status check is marked as required [1]. Once the CLA is signed, the status updates to success [1]. Citations:
🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- GitHub CLI availability ---'
if command -v gh >/dev/null 2>&1; then
gh --version | head -n 1
printf '%s\n' '--- public branch protection metadata ---'
gh api repos/tower/tower-cli/branches/main/protection \
--jq '{required_status_checks: .required_status_checks, enforce_admins: .enforce_admins, required_pull_request_reviews: .required_pull_request_reviews}' \
2>&1 || true
else
printf '%s\n' 'gh is unavailable'
fi
printf '%s\n' '--- public repository metadata ---'
if command -v curl >/dev/null 2>&1; then
curl -LfsS --max-time 15 https://api.github.com/repos/tower/tower-cli \
| jq '{default_branch, archived, visibility}' 2>&1 || true
fiRepository: tower/tower-cli Length of output: 563 Configure branch protection before publishing this guidance. The 🤖 Prompt for AI AgentsThere was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win Scope the one-time signing claim to a CLA version. The workflow requires a new signature path when 🤖 Prompt for AI Agents |
||
|
|
||
| If you can't sign on your own behalf — for example, because your employer holds rights in your work — please say so before submitting a pull request. | ||
|
Comment on lines
+30
to
+36
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win Align the contribution guidance with The existing legal notice says contributors must have authored 100% of the content. 🤖 Prompt for AI AgentsThere was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -e
printf '%s\n' '--- candidate files ---'
fd -t f -i '^(contributing|cla)(\.md)?$' .
printf '%s\n' '--- CONTRIBUTING.md context ---'
contrib=$(fd -t f -i '^contributing\.md$' . | head -n 1)
if [ -n "$contrib" ]; then
nl -ba "$contrib" | sed -n '1,90p'
fi
printf '%s\n' '--- CLA.md context ---'
cla=$(fd -t f -i '^cla\.md$' . | head -n 1)
if [ -n "$cla" ]; then
nl -ba "$cla" | sed -n '1,140p'
fi
printf '%s\n' '--- related signing/employer references ---'
rg -n -i 'sign|employer|corporate cla|waiver|rights in your work|on your own behalf' --glob '*.md' .Repository: tower/tower-cli Length of output: 2992 🏁 Script executed: #!/bin/bash
set -e
contrib=$(fd -t f -i '^contributing\.md$' . | head -n 1)
cla=$(fd -t f -i '^cla\.md$' . | head -n 1)
printf '%s\n' '--- CONTRIBUTING.md lines 28-40 ---'
sed -n '28,40p' "$contrib" | awk '{printf "%4d %s\n", NR+27, $0}'
printf '%s\n' '--- CLA.md lines 88-108 ---'
sed -n '88,108p' "$cla" | awk '{printf "%4d %s\n", NR+87, $0}'
printf '%s\n' '--- all CONTRIBUTING.md ---'
cat "$contrib"Repository: tower/tower-cli Length of output: 5975 🏁 Script executed: #!/bin/bash
set -e
python3 - <<'PY'
from pathlib import Path
import re
contributing = Path("CONTRIBUTING.md").read_text()
cla = Path("CLA.md").read_text()
section4 = re.search(
r"4\.\s+You represent that you are legally entitled to grant the above license\.(.*?)(?=\n\s*\n\s*5\.)",
cla,
re.S,
)
assert section4, "CLA.md section 4 was not found"
section4_text = " ".join(section4.group(0).split())
paths = [
"permission to make Contributions on behalf of that employer",
"employer has waived such rights for your Contributions to Tower",
"employer has executed a separate Corporate CLA with Tower",
]
assert all(path in section4.group(0) for path in paths), section4_text
sentence = (
"If you can't sign on your own behalf — for example, because your employer "
"holds rights in your work — please say so before submitting a pull request."
)
assert sentence in contributing
assert "A signed [Contributor License Agreement](CLA.md) is required before any pull request can be merged." in contributing
assert not re.search(r"must not|do not|cannot .*submit|prohibit.*pull request", section4.group(0), re.I)
print("CLA.md section 4 requires employer permission, an employer waiver, or a Corporate CLA.")
print("CONTRIBUTING.md gates merge on a signed CLA and asks contributors to disclose unresolved signing authority before submitting.")
print("No prohibition on opening a pull request appears in CLA.md section 4.")
PYRepository: tower/tower-cli Length of output: 436 Do not sign the CLA until employer rights are resolved. If an employer holds rights in a contribution, the contributor must first obtain employer permission, an employer waiver, or a Corporate CLA. Replace “please say so” with this explicit signing requirement. Clarify how contributors should proceed before opening a pull request; section 4 does not prohibit submission. 🤖 Prompt for AI Agents |
||
|
|
||
| ### Reporting Bugs | ||
|
|
||
| #### Before Submitting | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: tower/tower-cli
Length of output: 6536
🏁 Script executed:
Repository: tower/tower-cli
Length of output: 50372
🌐 Web query:
GitHub Actions official documentation concurrency at most one running one pending queue max valid key💡 Result:
In GitHub Actions, concurrency allows you to limit the number of jobs or workflows that run simultaneously within a specific group [1][2]. The default behavior ensures that at most one job or workflow in a concurrency group is running at any time [1][3]. Regarding the handling of pending jobs, GitHub Actions uses a queue property within the concurrency configuration [1][4]: 1. single (default): At most one job or workflow run can be pending in the concurrency group [1][5]. If a new job is queued while another is already pending, the existing pending job is canceled and replaced by the new one [1][4]. 2. max: Up to 100 jobs or workflow runs can be pending in the concurrency group [1][6]. Once the queue reaches this limit of 100, any additional incoming jobs are canceled [1][3]. The concurrency group itself is defined by a string or expression (the key), and scoping this key properly (e.g., using context variables like github.ref) is recommended to prevent unintended collisions between unrelated runs [1][2][7]. For jobs that must not be interrupted, you can set cancel-in-progress: false to prevent the currently running job from being aborted when a new job joins the group [8][7].
Citations:
🏁 Script executed:
Repository: tower/tower-cli
Length of output: 50372
🏁 Script executed:
Repository: tower/tower-cli
Length of output: 6036
Serialize CLA signature writes with a bounded queue.
The action performs one
createOrUpdateFileContentscall with the SHA it read. Concurrent runs can use the same stale SHA, causing a conflict and losing a valid signature.Add a workflow-level concurrency group with
cancel-in-progress: falseandqueue: max. This retains up to 100 pending runs. Add conflict retries if updates must not be dropped during larger bursts.🧰 Tools
🪛 zizmor (1.29.0)
[error] 17-21: use of fundamentally insecure workflow trigger (dangerous-triggers): pull_request_target is almost always used insecurely
(dangerous-triggers)
🤖 Prompt for AI Agents
Source: MCP tools