docs: establish the OSS contribution front door - #31
Merged
Conversation
Berd is public, but its front door was still template text: CONTRIBUTING.md was a single link to Block's generic guidelines, and the README pointed at it. Nothing told an outside reader what we accept. We accept issues, not outside pull requests. This makes that explicit and raises the bar on what an issue has to contain. - CONTRIBUTING.md is now the source of truth for participating: the no-outside-PR policy and why, what a bug report and a feature request each require, how triage works. It doubles as the agent-followable spec — one file, browsable on github.com and fetchable raw, so a reporter's agent can read the same rules a human does. - Issue templates converted from markdown to YAML forms. Markdown headings are deletable suggestions; forms have genuinely required fields. Bug reports now require repro steps, expected vs. actual, frequency, version, platform, and log output. Feature requests require the problem, the current workaround, why it belongs in core rather than a skill or extension, and non-goals. - blank_issues_enabled: false, so the forms can't be bypassed. - Restore CODEOWNERS. main already requires code-owner review, so without this file that protection matched nobody and passed trivially. - Add close-external-prs workflow. Anyone can open a PR on a public repo, so outside PRs get a polite comment and an immediate close. Checks real collaborator permission rather than author_association, which reads as CONTRIBUTOR for maintainers with private org membership. - PR template leads with the policy so it's seen before submitting.
Warn after 23 inactive days and close after 30, but only for issues a maintainer has explicitly labeled needs-info. Any new activity cancels the close countdown. PRs and all other issue types are exempt.
Define eligible PR authors consistently as authorized write collaborators, pin github-script by SHA, apply the rule to bots as well as people, and describe issue forms as the supported UI path rather than an API-level enforcement mechanism. Clarify that needs-info remains maintainer-owned after a reply.
kalvinnchau
approved these changes
Aug 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Berd is public, but its front door was still template text.
CONTRIBUTING.mdwas a single link to Block's generic guidelines, the README pointed at it, and nothing told an outside reader what we accept.We accept issues, not outside pull requests. This makes that explicit and raises the bar on what an issue has to contain — the goal is that filing one requires actually thinking it through.
What changed
CONTRIBUTING.mdis now the source of truth for participating. The no-outside-PR policy and the reasoning behind it, what a bug report and a feature request each require, and how triage works. It deliberately doubles as the agent-followable spec: one file, browsable on github.com and fetchable as raw markdown, so a reporter's agent reads the same rules a human does. No wiki, no Discussions post, no separate docs site to drift.Issue templates converted from markdown to YAML forms. Markdown headings are deletable suggestions; forms have genuinely required fields.
blank_issues_enabled: falseso the forms can't be bypassed, with contact links routing questions and security reports elsewhere.Restore
CODEOWNERS. This is the load-bearing one:mainalready has branch protection requiring code-owner review, but the OSS port dropped the file — so that rule matched nobody and passed trivially. Set to@block/berd-oss-team.Add
close-external-prs.yml. GitHub gives no way to prevent PRs on a public repo, so outside PRs get a polite comment pointing atCONTRIBUTING.mdand an immediate close. It checks real collaborator permission via the API rather than trustingauthor_association, which reads asCONTRIBUTORfor maintainers whose org membership is private. Usespull_request_targetfor write access on fork PRs and never checks out or runs PR code.PR template leads with the policy so it's seen before submitting, not after.
Testing
validationson markdown blocks. Bug: 12 fields / 10 required. Feature: 10 fields / 7 required.CONTRIBUTING.mdTOC anchor resolves.src-taurirather than guessed — Tauri'sapp_log_dirputs macOS logs in~/Library/Logs/, not Application Support, which is what I'd assumed at first.Settings → Aboutconfirmed as the version location viaAboutSettings.tsx.justpre-push suite green:fmt-check,check,tauri-check,clippy,berdctl-contract-check.Notes for review
needs-infolabel on the repo, since the documented triage flow refers to it and it didn't exist.bugandenhancementalready did.CODEOWNERSis scoped wrong, so please sanity-check that@block/berd-oss-teamis the right owning team.Architecture review
Spar reviewed the actual branch, repo laws, current access model, and fresh reference implementations. Verdict: this makes sense to try after four corrections, now addressed:
pull_request_targetremains API-only and never executes PR code.needs-infoownership: any activity resets the countdown, but only a maintainer removesneeds-infoafter judging the answer sufficient.The PR now also includes the 30-day
needs-infolifecycle: warn after around 23 inactive days, close 7 days later, PRs and all other issues exempt, restricted toblock/berd, and manually dispatchable. The warning uses a distinctclosing-soonstate rather than overloadingneeds-info.Repository-setting changes made alongside this PR:
needs-infoandclosing-soonlabels.good first issueandhelp wantedlabels because both advertise a contribution path Berd explicitly does not offer. Neither had any issue attached.