* [c2d8f8fa] Write Port AI Builder competitive-positioning doc (#722) * [c2d8f8fa] docs(backend): add Port AI Builder competitive-positioning analysis * [c2d8f8fa] docs(backend): fix all wrong file:line citations in Port AI Builder positioning doc --------- Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> * [c232e514] Fix PR #755 review findings: wording accuracy + branch staleness (#784) * [4815da95] docs(analysis): fix pr_gate wording findings on CEO-check scope and conventions default (#776) Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> * [c0c2ac32] Resolve CI blocker F-397f9453 on PR #784 head (#791) * [c0c2ac32] fix(docs): reflow hard-wrapped prose in competitive-positioning doc to pass quality gate * [c0c2ac32] docs(qa): add CI fix note for reflow-check on competitive positioning doc --------- Co-authored-by: Backend Developer 2 <be-dev-2@roboco.tech> Co-authored-by: Backend Documenter <be-doc@roboco.tech> * [26e8731d] Sync branch and resolve pr_gate CI blocker 397f9453 on PR #784 head (#788) * [26e8731d] Document CI staleness pattern in lifecycle artifacts script docstring * [26e8731d] Remove false docstring claiming docs/ is outside CI paths filter The docstring at lines 13-15 claimed docs/ is outside the CI workflow's paths filter, making doc-only commits not trigger CI. This is false — ci.yml lists docs/** at line 44 (push) and line 83 (pull_request). The stale-CI diagnosis built on this false premise is incorrect. Removing the false note per finding F-000d3430. * [26e8731d] docs(contributing): list markdown reflow check in make quality gate description CONTRIBUTING.md's make quality comment listed only 4 checks (ruff format, ruff check, mypy, pytest) but the Makefile quality target runs 8+ including the markdown prose reflow check (scripts/reflow_md.py --check). That omission directly contributed to the CI blocker this task investigated — a contributor reading the old comment would not expect the reflow gate. Added the reflow check to the comment list and a note pointing to make reflow-docs as the auto-fix and docs/rag/standards/markdown-reflow-quality-gate.md for the standard. --------- Co-authored-by: Backend Developer 2 <be-dev-2@roboco.tech> Co-authored-by: Backend Documenter <be-doc@roboco.tech> --------- Co-authored-by: roboco-app[bot] <302741806+roboco-app[bot]@users.noreply.github.com> Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> Co-authored-by: Backend Developer 2 <be-dev-2@roboco.tech> Co-authored-by: Backend Documenter <be-doc@roboco.tech> * [f4529578] Reflow CONTRIBUTING.md blockquote to clear reflow-check CI failure on PR #755 (#800) * [f4529578] reflow(contributing): join 3-line blockquote and strip line 31 indent to clear reflow-check * [f4529578] docs(changelog): note CONTRIBUTING.md reflow fix that cleared reflow-check CI gate * [f4529578] docs(changelog): clarify reflow fix unblocks competitive-positioning PR #755 * [f4529578] docs(changelog): add reflow-passthrough detail to CONTRIBUTING.md fix note * [f4529578] docs(changelog): add task ID reference to CONTRIBUTING.md reflow fix entry * [f4529578] docs(changelog): add exact reflow-check exit output to CONTRIBUTING.md fix entry * [12b3bce9] fix(contributing): join blockquote and remove indent to clear reflow-check CI failure (#799) Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> --------- Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> Co-authored-by: Backend Documenter <be-doc@roboco.tech> Co-authored-by: roboco-app[bot] <302741806+roboco-app[bot]@users.noreply.github.com> --------- Co-authored-by: roboco-app[bot] <302741806+roboco-app[bot]@users.noreply.github.com> Co-authored-by: Backend Developer 1 <be-dev-1@roboco.tech> Co-authored-by: Backend Developer 2 <be-dev-2@roboco.tech> Co-authored-by: Backend Documenter <be-doc@roboco.tech>
3.8 KiB
Contributing to RoboCo
Thanks for your interest in contributing. This document explains the contribution workflow and the licensing terms your contributions are made under.
License of contributions
RoboCo is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). Your contributions are accepted into the project under that license.
Contributor License Agreement (CLA)
Before your first pull request can be merged, you must sign the project's Contributor License Agreement.
Why a CLA? The AGPL keeps the published project open. The CLA grants the maintainer the additional rights needed to keep the project's future flexible — for example, to offer a dual-licensed or commercial edition later, or to re-license the codebase if that ever becomes necessary. Without it, the project would be permanently locked to exactly one license, because each contributor would retain sole copyright over their contribution.
Signing the CLA does not transfer ownership of your work away from you — you keep your copyright. It grants the maintainer (and the maintainer's successors and assigns) a broad license to use, distribute, and re-license your contribution. See CLA.md for the exact terms.
How signing works
The first time you open a pull request, the CLA Assistant bot will comment with a link and ask you to confirm agreement by posting a one-line comment on the PR. This is a one-time action; subsequent PRs are recognized automatically.
Development workflow
-
Fork the repository and create a feature branch.
-
Make your change. Follow the existing code style.
-
Run the full quality gate before opening a PR:
make quality # ruff format, ruff check, markdown reflow, mypy, pytest --cov-fail-under=80, xenon, radon
The gate includes a markdown prose reflow check (scripts/reflow_md.py --check) that rejects hard-wrapped text in docs/ and README.md — prose must follow a one-sentence-per-line standard. If it fails, run make reflow-docs to auto-fix, then re-run make quality. See docs/rag/standards/markdown-reflow-quality-gate.md for details.
For the frontend (panel/):
pnpm format && pnpm lint && pnpm typecheck && pnpm test
- Sign your commits.
masterrequires verified signatures, so set up commit signing before you push — see Signing your commits. - Open a pull request with a clear description of the change and its motivation.
Commit messages
Keep commits focused and descriptive. Do not include AI-generated attribution footers or co-author trailers.
Signing your commits
master is protected by a rule that every commit must carry a verified signature. Set this up once and it's automatic from then on; otherwise a maintainer has to bypass the rule to merge your PR.
This is cryptographic signing (
git commit -S, shown as Verified on GitHub) — not the-sDeveloper Certificate of Origin sign-off trailer. The sign-off does not satisfy the signature rule.
The lowest-friction method reuses the SSH key you already use with GitHub:
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub # or id_rsa.pub
git config --global commit.gpgsign true
Then add that same public key to GitHub a second time as a signing key: Settings → SSH and GPG keys → New SSH key → Key type: Signing Key. (GPG signing also works if you prefer it.)
Your next commit will be signed; confirm with git log --show-signature -1. If you already pushed unsigned commits on your PR, re-sign the whole branch and force-push:
git rebase --exec "git commit --amend --no-edit -S" origin/master
git push --force-with-lease
Questions
Open a GitHub Discussion or issue if anything here is unclear.