diff --git a/.github/ISSUE_TEMPLATE/1_out_of_band_nomination.yml b/.github/ISSUE_TEMPLATE/1_out_of_band_nomination.yml new file mode 100644 index 0000000..ee182b0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_out_of_band_nomination.yml @@ -0,0 +1,69 @@ +name: Out-of-Band Ladder Nomination +description: For existing organization members to nominate a new hire, partner engineer, or propose an off-cycle promotion. +title: "[Nomination]: @username for " +labels: ["nomination", "out-of-band"] +body: + - type: markdown + attributes: + value: | + ### Out-of-Band Ladder Nomination + > [!NOTE] + > Standard promotions and new joiner invitations occur automatically during our data-driven **Quarterly Reviews**. + > Creating new issues and pull requests in `flutter/contributors` is restricted to organization members (`collaborators`); use this form as a sponsor for out-of-band additions (e.g. new Google/Partner hires) or expedited off-cycle role adjustments. + + - type: input + id: candidate + attributes: + label: Candidate GitHub Handle + description: The GitHub username of the person being nominated. + placeholder: "@octocat" + validations: + required: true + + - type: input + id: discord + attributes: + label: Candidate Discord Username + description: The candidate's Discord username so we can grant them the team member role and channel access on the Flutter Discord server. + placeholder: "octocat" + validations: + required: true + + - type: dropdown + id: proposed_role + attributes: + label: Proposed Role + options: + - Maintainer (Flutter / Partners Team) + - Committer (Expedited Promotion) + - Reviewer (New Org Contributor) + validations: + required: true + + - type: dropdown + id: affiliation + attributes: + label: Candidate Team / Domain + options: + - Flutter Team + - Partners Team (@flutter/partners) + - Community Contributor + validations: + required: true + + - type: textarea + id: justification + attributes: + label: Contribution Summary & Justification + description: Provide background on the candidate's responsibilities, relevant merged PRs, reviews, or team role verification. + placeholder: "Candidate is joining the Flutter team as an engine maintainer..." + validations: + required: true + + - type: checkboxes + id: sponsor_confirm + attributes: + label: Sponsor Confirmation + options: + - label: I am an active Flutter organization member nominating this candidate. + required: true diff --git a/.github/ISSUE_TEMPLATE/2_emeritus_reinstatement.yml b/.github/ISSUE_TEMPLATE/2_emeritus_reinstatement.yml new file mode 100644 index 0000000..37c3b52 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_emeritus_reinstatement.yml @@ -0,0 +1,57 @@ +name: Dasher Emeritus Reinstatement Request +description: For active organization members to sponsor a returning Dasher Emeritus rejoining the active contributor ladder off-cycle. +title: "[Reinstatement]: @username returning to active status" +labels: ["emeritus-reinstatement"] +body: + - type: markdown + attributes: + value: | + ### Dasher Emeritus Reinstatement + > [!NOTE] + > Returning Dasher Emeriti who reach $\ge 10$ contributions are **automatically identified** during our data-driven **Quarterly Reviews**. + > Because creating new issues and pull requests in `flutter/contributors` is restricted to organization members (`collaborators`), off-cycle reinstatement requests must be opened by an active Flutter organization member acting as a sponsor (returning Emeriti can request a sponsor in `#hidden-chat` on Discord). + + - type: input + id: username + attributes: + label: Emeritus GitHub Handle + description: The GitHub username of the returning Dasher Emeritus being sponsored for reinstatement. + placeholder: "@octocat" + validations: + required: true + + - type: input + id: discord + attributes: + label: Emeritus Discord Username (if updated) + description: Dasher Emeriti retain Discord and Google Group access. Please provide their Discord username in case it has changed or needs to be updated in our records. + placeholder: "octocat" + validations: + required: false + + - type: dropdown + id: requested_role + attributes: + label: Requested Ladder Role + options: + - Reviewer (@flutter/reviewers) + - Committer (@flutter/committers) + validations: + required: true + + - type: textarea + id: recent_activity + attributes: + label: Recent Contributions + description: List recent pull requests, reviews, or triage activity since the Dasher Emeritus resumed contributing. + placeholder: "Links to recent PRs, issues, or reviews..." + validations: + required: true + + - type: checkboxes + id: sponsor_confirm + attributes: + label: Sponsor Confirmation + options: + - label: I am an active Flutter organization member sponsoring this Dasher Emeritus for reinstatement. + required: true diff --git a/.github/ISSUE_TEMPLATE/3_quarterly_review_tracking.md b/.github/ISSUE_TEMPLATE/3_quarterly_review_tracking.md new file mode 100644 index 0000000..df36244 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_quarterly_review_tracking.md @@ -0,0 +1,31 @@ +--- +name: Quarterly Community Review Tracking +about: Template for automated quarterly community ladder review issues. +title: "Quarterly Contributor Ladder Review - Q[X] [YYYY]" +labels: ["quarterly-review", "community-ladder"] +--- + +# Quarterly Community Contributor Ladder Review + +This is the public tracking issue for the quarterly Flutter Contributor Ladder review. +Review criteria are defined in [LADDER.md](../../docs/LADDER.md). + +## 1. 🎉 Recommended Promotions & New Community Joiners + +*(Generated automatically by `dart run tool/quarterly_audit.dart --community`)* + +> [!NOTE] +> If you are invited to join the ladder or promoted to a new tier above, please reply in this thread to accept and share your **Discord username** (if you do not already have the Discord team member role) so we can grant you team member channel access. + +## 2. ✅ Active Role Retention + +*(Generated automatically by `dart run tool/quarterly_audit.dart --community`)* + +## 3. ⏳ 30-Day Grace Period (Proposed Demotions / Dasher Emeritus) + +*(Generated automatically by `dart run tool/quarterly_audit.dart --community`)* + +## 4. 📋 Callout for Unscripted & Qualitative Contributions + +> [!IMPORTANT] +> If you have contributions that automated tracking does not index (issue triage, repro verification, [RFCs](https://github.com/flutter/rfc), design docs, mentoring), please reply in this thread with details before the 30-day grace period concludes. diff --git a/.github/ISSUE_TEMPLATE/4_partner_verification.md b/.github/ISSUE_TEMPLATE/4_partner_verification.md new file mode 100644 index 0000000..a6265fb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4_partner_verification.md @@ -0,0 +1,19 @@ +--- +name: Quarterly Partner Verification Tracking +about: Template for automated quarterly partner team verification issues. +title: "Quarterly Partner Team Verification - Q[X] [YYYY]" +labels: ["quarterly-review", "partner-verification"] +--- + +# Quarterly Partner Team Verification Review + +Dedicated quarterly verification tracking issue for **@flutter/partners**. +The audit facilitator reaches out to each partner organization to confirm active status for their members below. + +## 1. Active Partner Roster Verification + +*(Generated automatically by `dart run tool/quarterly_audit.dart --partners`)* + +## 2. Departures & Offboarding Sign-Off + +- [ ] All partner memberships confirmed with partner organizations. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..192dcf9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Flutter Contributor Ladder Guide + url: https://github.com/flutter/contributors/blob/main/docs/LADDER.md + about: Read about contributor tiers, criteria, responsibilities, and advancement pathways. + - name: Quarterly Review Process & Appeals + url: https://github.com/flutter/contributors/blob/main/docs/QUARTERLY_REVIEW.md + about: Learn how quarterly contributor reviews are conducted and how appeals are processed. + - name: Governance & Communication Channels + url: https://github.com/flutter/contributors/blob/main/docs/GOVERNANCE.md + about: Learn about GitHub teams, Discord channels, and onboarding to the announcement-only contributor Google Group. diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 97c12ff..e01b250 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -7,8 +7,7 @@ on: branches: [main] workflow_dispatch: -permissions: - contents: read +permissions: {} concurrency: group: validate-${{ github.ref }} @@ -18,10 +17,15 @@ jobs: validate: name: Validate Data Pipeline & Tests runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + persist-credentials: false - name: Set up Dart SDK uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c # v1.7.1 @@ -37,3 +41,44 @@ jobs: - name: Run unit test suite run: dart test + + - name: Get Changed Markdown Files + id: changed-markdown + if: github.event_name == 'pull_request' + run: | + TARGET_REF="${BASE_REF:-main}" + TARGET_REF="${TARGET_REF#origin/}" + if git rev-parse --verify "origin/$TARGET_REF" >/dev/null 2>&1; then + BASE_TARGET="origin/$TARGET_REF" + elif git rev-parse --verify "$TARGET_REF" >/dev/null 2>&1; then + BASE_TARGET="$TARGET_REF" + else + echo "::error::Cannot resolve base branch ref 'origin/$TARGET_REF' or '$TARGET_REF'." + exit 1 + fi + FILES=$(git diff --name-only --diff-filter=ACMR "$BASE_TARGET"...HEAD -- '*.md') + if [ -n "$FILES" ]; then + EOF_MARKER="EOF_$(openssl rand -hex 16)" + echo "has_changes=true" >> "$GITHUB_OUTPUT" + { + echo "files<<$EOF_MARKER" + echo "$FILES" + echo "$EOF_MARKER" + } >> "$GITHUB_OUTPUT" + else + echo "has_changes=false" >> "$GITHUB_OUTPUT" + fi + env: + BASE_REF: ${{ github.base_ref }} + + - name: Markdown Lint (PR Mode) + if: github.event_name == 'pull_request' && steps.changed-markdown.outputs.has_changes == 'true' + uses: davidanson/markdownlint-cli2-action@05f32210e84442804257b2a6f20b273450ec8265 # v19 + with: + globs: ${{ steps.changed-markdown.outputs.files }} + + - name: Markdown Lint (Full Repository) + if: github.event_name != 'pull_request' + uses: davidanson/markdownlint-cli2-action@05f32210e84442804257b2a6f20b273450ec8265 # v19 + with: + globs: '**/*.md' diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..64a2afb --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,6 @@ +default: true # Enable all standard markdownlint rules by default +MD013: false # Do not enforce line lengths (diff churning, table lengths, diagrams etc) +MD025: + front_matter_title: "" # Do not treat frontmatter title as H1 heading +MD033: false # Allow inline HTML (badges, centered logos/images, details/summary folds) +MD041: true # Enforce top-level heading after frontmatter diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 302f178..ebf62ee 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,5 @@ + Contributing to Flutter ======================= @@ -132,7 +133,7 @@ presented. 5. [Flutter design doc template](https://flutter.dev/go/template), which should be used when proposing a new technical design. This is a good practice to do before coding more intricate changes. - See also our [guidance for writing design docs](https://github.com/flutter/flutter/blob/main/docs/contributing/Design-Documents.md). + See also [`flutter/rfc`](https://github.com/flutter/rfc) for project-wide RFC proposals and our [guidance for writing design docs](https://github.com/flutter/flutter/blob/main/docs/contributing/Design-Documents.md). [![How to contribute to Flutter](https://img.youtube.com/vi/4yBgOBAOx_A/0.jpg)](https://www.youtube.com/watch?v=4yBgOBAOx_A) @@ -241,4 +242,4 @@ Social events in the contributor community Finally, one area where you could have a lot of impact is in contributing to social interactions among the Flutter contributor community itself. This could take the form of organizing weekly video chats on our Discord, or planning tech talks from contributors, for example. If this is an area that is of interest to you, please join our [Discord](https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md) and ping Hixie on the #hackers -channel! \ No newline at end of file +channel! diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 0000000..f24a047 --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,7 @@ +# Flutter Project Contributors + +The Flutter project recognizes all contributors through the **Flutter Contributor Ladder**. + +- For the active contributor directory and roster, see [ROSTER.md](ROSTER.md). +- For ladder tiers, criteria, and governance details, see [docs/LADDER.md](docs/LADDER.md). +- For historical AUTHORS archives, see [legacy_authors/](legacy_authors/). diff --git a/README.md b/README.md index 0fa9c4f..8e6284a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +

@@ -6,26 +7,64 @@

+ # Flutter contributors -This repository tracks contributor ladder roles, project governance, and the contributor roster for the Flutter project. +This repository tracks contributor ladder roles, permissions, code review policies, and quarterly audits for the Flutter project. -## Current state +## Quick links -The automated pipeline in this repository collects a rolling 12-month record of contributions across all public repositories in the `flutter` GitHub organization. +- [Contributor roster](ROSTER.md) — active Maintainers, Committers, and Reviewers. +- [Dasher Emeritus directory](EMERITUS.md) — honored alumni who previously served on the contributor ladder. +- [Contributor ladder guide](docs/LADDER.md) — tier criteria, responsibilities, and permissions. +- [Code review workflow](docs/CODE_REVIEW_WORKFLOW.md) — approval requirements and PR landing rules. +- [Quarterly reviews](docs/QUARTERLY_REVIEW.md) — audit schedule, 30-day grace period, and appeals. +- [Data pipeline](docs/DATA_PIPELINE.md) — continuous 12-month activity collection and rolling 52-week storage. +- [Project governance](docs/GOVERNANCE.md) — team hierarchy, moderation scope, and communication channels. +- [Transition guide](docs/TRANSITION.md) — legacy member placement and historical AUTHORS archive. -- Merged pull requests, code reviews on merged PRs, and opened issues are tracked daily. -- Weekly snapshots are stored in `data/activity/`, with rolling 12-month totals aggregated in `data/activity_summary.json`. -- A scheduled workflow (`.github/workflows/sync_activity.yml`) runs daily at 02:17 UTC to sync activity and prune snapshots older than 52 weeks. -- See [docs/DATA_PIPELINE.md](docs/DATA_PIPELINE.md) for details on query design, rate limits, and bot filtering. +## Contributor ladder -## What is coming +```mermaid +graph TD + Contributor["1. Contributor
(Read access • External)"] -->|"≥ 10 contributions"| Reviewer["2. Reviewer
(Triage role • Org member)"] + Reviewer -->|"≥ 30 contributions (≥ 10 merged PRs)"| Committer["3. Committer
(Write role • Org member)"] + Committer -.->|"Googler or Partner affiliation"| Maintainer["4. Maintainer
(Write + moderation)"] -The repository will expand to host the complete contributor governance model and roster upon launch: + Reviewer -.->|"Inactivity (12m + 30d grace)"| Emeritus["Dasher Emeritus
(Read access • External alumni)"] + Committer -.->|"Inactivity (12m + 30d grace)"| Emeritus + Maintainer -.->|"Departure / offboarding"| Emeritus + Emeritus -.->|"Resumed activity"| Reviewer +``` -- Contributor ladder tiers (Contributor, Reviewer, Committer, Maintainer, and Dasher Emeritus). -- Public contributor roster and GitHub team synchronization. -- Code review workflows, landing requirements, and test exemption policies. -- Quarterly review audits, 30-day grace period tracking, and nomination workflows. -- Archival of repository `AUTHORS` files and contributor migration guides. \ No newline at end of file +### Tiers + +| Tier | GitHub role & team | 12-month rolling criteria | Permissions & responsibilities | +| :--- | :--- | :--- | :--- | +| **Contributor** | `Read` (External) | Any contribution (code, docs, issue triage, reproductions). | Open to anyone engaging with Flutter. | +| **Reviewer** | `Triage` (`@flutter/reviewers`) | $\ge 10$ contributions over 12 months. | First-pass PR reviews, issue triage and labeling, non-blocking approvals. | +| **Committer** | `Write` (`@flutter/committers`) | $\ge 30$ contributions with $\ge 10$ merged PRs over 12 months. | Repository write access, binding review approvals, and merge queue authority. | +| **Maintainer** | `Write` + Org Mod (`@flutter/googlers`, `@flutter/partners`, `@flutter/maintainers`) | All members of `@flutter/googlers` and `@flutter/partners`. | Domain stewardship and GitHub moderation permissions. | +| **Dasher Emeritus** | `Read` (External alumni) | Former ladder members with $< 10$ contributions over 12 months. | Removed from the GitHub org and listed in [EMERITUS.md](EMERITUS.md); retains Discord and Google Group access (limited to ladder members and Emeriti) to stay in touch and easily ramp back up if they return. | + +Every active member on the ladder (`Reviewer`, `Committer`, `Maintainer`) is part of `@flutter/flutter-hackers` (parent team to `@flutter/reviewers`, `@flutter/committers`, and `@flutter/maintainers`). All Maintainers are either a Googler (`@flutter/googlers`) or a Partner (`@flutter/partners`, which has child teams per partner affiliation and remains top-level due to GitHub team nesting depth limits). Organization members outside of Google also belong to `@flutter/collaborators`. + +## Tooling + +| Tool | Command | Description | +| :--- | :--- | :--- | +| Activity sync | `dart run tool/sync_activity.dart` | Incremental daily sync of merged PRs, reviews, and issues. | +| Generate roster | `dart run tool/generate_roster.dart` | Compiles [ROSTER.md](ROSTER.md) and [EMERITUS.md](EMERITUS.md) from `data/contributors.yaml`. | +| Validate roster | `dart run tool/validate_roster.dart` | Validates YAML syntax, schema rules, and unique handles. | +| Prepare quarterly audit | `dart run tool/quarterly_audit.dart --prepare` | Vets nominated candidates, generates quarterly reports, and updates the roster for the quarterly PR. | +| Draft / open review issues | `dart run tool/quarterly_audit.dart --draft-issues` | Drafts (or opens with `--open-issues`) the public quarterly review issues from the generated reports. | +| Finalize quarterly PR | `dart run tool/quarterly_audit.dart --finalize` | Updates the quarterly PR after the 30-day review window with `--retain`, `--exclude`, and `--discord` adjustments. | +| Grace period check | `dart run tool/check_grace_period.dart` | Weekly check on open quarterly review issues: posts weekly countdown updates during the 30-day window and pings the assignee once 30 days have elapsed. | +| Check user | `dart run tool/check_user.dart ` | Evaluates 12-month metrics and eligibility for a contributor. | + +## Communication channels + +The broadcast-only `flutter-contributors` Google Group (no member posting, to avoid duplicating discussion spaces) is used to deliver announcements and send calendar invites—including our recurring Flutter Contributor Roundtable and the Dash Forum, where contributors can present and get feedback on their proposals ([`flutter/rfc`](https://github.com/flutter/rfc))—to ladder members and Dasher Emeriti. Onboarding is managed via a Google Form pinned in the `#hidden-chat` channel on Discord. + +Real-time technical discussion and contributor ladder channels take place on the [Flutter Discord](https://discord.gg/flutter). diff --git a/docs/CODE_REVIEW_WORKFLOW.md b/docs/CODE_REVIEW_WORKFLOW.md new file mode 100644 index 0000000..81fc54d --- /dev/null +++ b/docs/CODE_REVIEW_WORKFLOW.md @@ -0,0 +1,43 @@ +# Code Review Workflow + +This document describes code review policies, approval requirements, and pull request landing procedures for Flutter repositories. For detailed guidance on preparing pull requests and conducting code reviews, see [Tree hygiene (Getting a code review)](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#getting-a-code-review) and the [Flutter style guide](https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md) in `flutter/flutter`. + +## Approval requirements + +The number and tier of approvals required for a pull request depend on the author's ladder role: + +| Author role | Approvals required | Approval eligibility | Notes | +| :--- | :--- | :--- | :--- | +| **Contributor** | 2 approvals | At least 1 approval from a Committer (or Maintainer); 2nd approval may be from a Reviewer (or higher). | Reviewers provide first-pass review. A Committer provides the second approval and initiates the merge. | +| **Reviewer** | 2 approvals | At least 1 approval from a Committer (or Maintainer); 2nd approval may be from a Reviewer (or higher). | Encourages peer review between Reviewers while ensuring Committer review. | +| **Dasher Emeritus** | 2 approvals | At least 1 approval from a Committer (or Maintainer); 2nd approval may be from a Reviewer (or higher). | Follows standard community review requirements. | +| **Committer** | 1 approval | 1 approval from a Reviewer (or higher). | Committers may land PRs with one approval. | +| **Maintainer** | 1 approval | 1 approval from a Reviewer (or higher). | Maintainers may land PRs with one approval. | + +## Review stages + +### First-pass review (Reviewers) + +When a pull request is submitted by a Contributor or Reviewer, a Reviewer conducts the initial review to check code style and Flutter conventions (`analysis_options.yaml`, naming, formatting), public API documentation coverage, test coverage for new functionality or bug fixes, and reproduction checks when applicable. Once satisfied, the Reviewer approves the PR on GitHub to signal that it is ready for Committer review. + +### Final sign-off and landing (Committers and Maintainers) + +A Committer or Maintainer then reviews the change for architecture, performance, platform fidelity, backward compatibility, breaking change policies, and automated test coverage (or adherence to the [Test Exemption Process RFC](https://github.com/flutter/rfc/blob/main/rfc/010.0001-test-exemption-process.md)). When ready, the Committer approves the PR and adds it to the merge queue (or applies the `autosubmit` label). + +## Early feedback on large changes + +For large, architectural, or multi-package changes, open a draft PR or submit a proposal in [`flutter/rfc`](https://github.com/flutter/rfc) before writing extensive code. Tag relevant Maintainers or Committers in the description (or discuss the proposal in the appropriate Discord channel) and add the `status: conceptual review` label if available. + +## Review checklist + +Before approving or requesting final sign-off, verify the [Tree hygiene review checklist](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#how-to-review-code): + +- [ ] Every bug fix has a regression test, and every new feature has automated tests (see the [Test Exemption Process RFC](https://github.com/flutter/rfc/blob/main/rfc/010.0001-test-exemption-process.md) when an exemption is needed). +- [ ] Public members, parameters, and return types have complete doc comments. +- [ ] All CI checks pass cleanly. +- [ ] Any breaking change has completed the [Flutter breaking change process](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes). +- [ ] Changes to cross-platform widgets or components follow target platform conventions. + +## Merging + +Only members with GitHub Write access (Committers and Maintainers) have permissions to merge pull requests or submit them to the merge queue. Once all required approvals and CI checks pass, a Committer or Maintainer lands the change. diff --git a/docs/DATA_PIPELINE.md b/docs/DATA_PIPELINE.md index 406b356..4c6b6a6 100644 --- a/docs/DATA_PIPELINE.md +++ b/docs/DATA_PIPELINE.md @@ -9,6 +9,7 @@ The pipeline collects activity across all public repositories in the `flutter` G ## Metrics collected The pipeline records 3 qualifying contribution types: + 1. Merged pull requests, attributed to the PR author. 2. Code reviews on merged pull requests, attributed to non-author reviewers. 3. Issues opened across tracked repositories, attributed to the author. @@ -21,7 +22,7 @@ Accounts in the `@flutter/robots` and `@flutter/bots` GitHub teams and known aut Data is stored as a 52-week sliding ring buffer in `data/`: -``` +```text data/ ├── activity/ │ ├── 2025-W31.json diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md new file mode 100644 index 0000000..4b7bf00 --- /dev/null +++ b/docs/GOVERNANCE.md @@ -0,0 +1,64 @@ +# Governance + +This document describes the organization structure, team hierarchy, moderation roles, and communication channels for the Flutter project. + +## Team hierarchy + +```mermaid +graph TD + subgraph Ladder Teams + Hackers["Parent: @flutter/flutter-hackers
(All active ladder members)"] + Reviewers["Child: @flutter/reviewers
(Triage role)"] + Committers["Child: @flutter/committers
(Write role)"] + MaintainersTeam["Child: @flutter/maintainers
(Write + Moderation)"] + + Hackers --> Reviewers + Hackers --> Committers + Hackers --> MaintainersTeam + end + + subgraph Top-Level Organization Teams + Googlers["@flutter/googlers
(Google IdP-managed)"] + Collaborators["@flutter/collaborators
(Auto-managed by internal tooling:
non-Googler org members)"] + Partners["@flutter/partners
(Parent to partner affiliation child teams)"] + PartnerChildren["Affiliation child teams
(@flutter/canonical, @flutter/tcs, @flutter/codemate, etc.)"] + Partners --> PartnerChildren + end + + Googlers -.->|"Member of"| MaintainersTeam + Partners -.->|"Member of"| MaintainersTeam +``` + +### Team definitions + +`@flutter/flutter-hackers` is the parent team for the contributor ladder role teams, and every active member on the ladder belongs to it. Its three child teams map to the active ladder tiers across Flutter repositories: `@flutter/reviewers` grants the GitHub Triage role (first-pass code reviews, issue triage, labeling, and non-blocking approvals), `@flutter/committers` grants the GitHub Write role (authoring code, binding review approvals, and landing pull requests), and `@flutter/maintainers` grants the GitHub Write role plus organization moderation privileges. + +Alongside `@flutter/flutter-hackers`, three top-level teams manage organization membership. `@flutter/googlers` contains Flutter team engineers at Google and is managed through automated IdP/SSO provisioning, so it remains a separate top-level team. `@flutter/partners` contains partner team members organized into child teams for each partner affiliation (`@flutter/canonical`, `@flutter/tcs`, `@flutter/codemate`, `@flutter/flutter_gpu`, `@flutter/techm`, `@flutter/virtusa`, `@flutter/cloudsufi`); because GitHub enforces team nesting depth limits and `@flutter/partners` has child teams for each affiliation, it cannot be nested under `@flutter/maintainers`. Instead, all Maintainers (Googlers and Partners) are members of `@flutter/maintainers` (child team of `@flutter/flutter-hackers`). `@flutter/collaborators` is automatically managed by internal tooling to track organization members outside of Google, and is not modified manually by the ladder process. + +> [!IMPORTANT] +> All Maintainers are either a Googler or a Partner (`@flutter/partners`), and all belong to `@flutter/maintainers` (child of `@flutter/flutter-hackers`). +> Dasher Emeriti do not remain in the GitHub organization; they are recognized in [EMERITUS.md](../EMERITUS.md) instead. + +## Moderation and Code of Conduct + +The Flutter project follows the [Flutter Code of Conduct](https://flutter.dev/to/code-of-conduct). + +GitHub organization moderation permissions (blocking accounts, locking conversations, hiding comments) are held by the Maintainer tier (`@flutter/googlers`, `@flutter/partners`, `@flutter/maintainers`). To report code of conduct violations, contact `conduct@flutter.dev` or an active Maintainer. + +### Ladder eligibility and ban history + +Ladder membership (`Reviewer`, `Committer`, `Maintainer`) grants GitHub organization membership and elevated repository permissions, and therefore requires good Code of Conduct standing. Contributors who have previously been banned for violating the Code of Conduct remain welcome to contribute to Flutter as external Contributors after a temporary ban expires, but are not eligible for invitation or promotion onto the contributor ladder. + +During each quarterly review, when running `tool/quarterly_audit.dart` locally, the person running the audit checks the nominated usernames against the internal moderation and ban history list and excludes any ineligible candidates before generating the report and PR so no one is singled out. + +## Communication channels + +| Channel | Purpose | Access & Onboarding | +| :--- | :--- | :--- | +| **`flutter-contributors` Google Group** | Broadcast-only mailing list used to deliver official announcements, governance notices, and calendar invitations—including our recurring Flutter Contributor Roundtable and the Dash Forum, where contributors can present and get feedback on their proposals ([`flutter/rfc`](https://github.com/flutter/rfc)). Members cannot post to the group, avoiding duplicate discussion spaces alongside GitHub and Discord. | Limited to active contributor ladder members (`Reviewer`, `Committer`, `Maintainer`) and Dasher Emeriti. Because access is managed privately, the group URL is not published publicly. Members join via the Google Form pinned in the `#hidden-chat` channel on Discord. | +| **Flutter Discord** | Real-time technical discussion, debugging, design chats, and pair programming. | Public channels for all contributors; private member channels (such as `#hidden-chat`) for ladder members and Emeriti via the standard Discord team member role. When added to the ladder, contributors provide their Discord username (recorded in `data/contributors.yaml`) to be granted the team member role. | +| **GitHub issues and PRs** | Technical proposals ([`flutter/rfc`](https://github.com/flutter/rfc)), bug reports, and quarterly audit reviews. | Creating new issues and pull requests in `flutter/contributors` is restricted to organization members (`collaborators`), with any out-of-band changes or off-cycle Emeritus reinstatements sponsored by an active org member. Commenting on existing issues (such as quarterly review tracking issues) remains open to all GitHub users so invited external contributors and returning Emeriti can reply. | + +### Onboarding to communication channels + +When a contributor joins the ladder (via quarterly review or out-of-band nomination), they share their Discord username on the review or nomination issue so organization admins can grant their GitHub team role (`@flutter/reviewers`, `@flutter/committers`, or `@flutter/maintainers`) and the Discord team member role. Once granted the Discord role, the contributor gains access to the member-only `#hidden-chat` channel on the Flutter Discord server, where a pinned message links to the Google Form for adding their email address to the announcement-only `flutter-contributors` Google Group. diff --git a/docs/LADDER.md b/docs/LADDER.md new file mode 100644 index 0000000..39fca53 --- /dev/null +++ b/docs/LADDER.md @@ -0,0 +1,67 @@ +# Flutter Contributor Ladder + +The Flutter contributor ladder defines contributor roles, permissions, code review responsibilities, and advancement criteria. + +## Overview + +The ladder consists of four active contributor tiers and an emeritus status: + +```mermaid +graph TD + Contributor["1. Contributor
(Read access • External)"] -->|"≥ 10 contributions"| Reviewer["2. Reviewer
(Triage role • Org member)"] + Reviewer -->|"≥ 30 contributions (≥ 10 merged PRs)"| Committer["3. Committer
(Write role • Org member)"] + Committer -.->|"Googler or Partner affiliation"| Maintainer["4. Maintainer
(Write + moderation)"] + + Reviewer -.->|"Inactivity (12m + 30d grace)"| Emeritus["Dasher Emeritus
(Read access • External alumni)"] + Committer -.->|"Inactivity (12m + 30d grace)"| Emeritus + Maintainer -.->|"Departure / offboarding"| Emeritus + Emeritus -.->|"Resumed activity"| Reviewer +``` + +### Team structure + +`@flutter/flutter-hackers` is the parent team to `@flutter/reviewers`, `@flutter/committers`, and `@flutter/maintainers`; every active member on the ladder belongs to this parent team on GitHub. Organization members outside of Google are automatically tracked in `@flutter/collaborators` by internal tooling. + +All Maintainers are either Flutter team engineers at Google or partner team members (`@flutter/partners`, which has child teams for each partner affiliation and therefore cannot be nested under `@flutter/maintainers` due to GitHub team depth limits), and all belong to `@flutter/maintainers` (child team of `@flutter/flutter-hackers`). There are no Maintainers outside of Googlers and Partners. + +Contributors and Dasher Emeriti do not hold GitHub organization membership. Former ladder members who transition to Dasher Emeritus are removed from the GitHub organization, listed in [EMERITUS.md](../EMERITUS.md), and continue participating in community forums and discussions. + +## Tiers and criteria + +| Tier | GitHub role & team | 12-month rolling criteria | Key responsibilities & privileges | +| :--- | :--- | :--- | :--- | +| **Contributor** | `Read` (External) | Any contribution (code, docs, issue triage, bug reproduction). | Entry point for community contributors. | +| **Reviewer** | `Triage` (`@flutter/reviewers`) | $\ge 10$ qualifying contributions over 12 months (merged PRs, valid issues, reviews on merged PRs, issue triage). | Primary/first-pass review on community pull requests, issue triage, labeling, and non-blocking approvals. | +| **Committer** | `Write` (`@flutter/committers`) | $\ge 30$ qualifying contributions over 12 months, including $\ge 10$ merged PRs. | Full repository write access, binding review approvals, merge rights, and mentorship. | +| **Maintainer** | `Write` + Org Mod (`@flutter/googlers`, `@flutter/partners`, `@flutter/maintainers`) | All members of `@flutter/googlers` and `@flutter/partners`. | Domain stewardship, GitHub organization moderation, and policy reviews. | +| **Dasher Emeritus** | `Read` (External alumni) | Former Reviewer, Committer, or Maintainer with $< 10$ contributions over 12 months after the 30-day grace period. | Removed from the GitHub org and listed in [EMERITUS.md](../EMERITUS.md); retains Discord and Google Group access (limited to ladder members and Emeriti) to stay in touch and easily ramp back up if they return. | + +## Tier details + +### Contributor + +Anyone who contributes to Flutter repositories, including bug reports, documentation edits, code contributions, samples, and reproductions. Contributors have public read access and use the fork-and-pull-request workflow. + +Contributors who reach 10 or more qualifying contributions in 12 months are identified during quarterly reviews. After nominated usernames are checked against the internal Code of Conduct / ban history list (contributors with prior Code of Conduct bans remain welcome to contribute as external Contributors once a temporary ban expires, but are not eligible for the elevated permissions of ladder membership), qualifying contributors are invited to join as Reviewers. Upon accepting, new joiners provide their Discord username so they can be granted the Discord team member role and channel access alongside their GitHub role. Once in the member-only `#hidden-chat` channel on Discord, they can use the pinned Google Form to submit their email address for the announcement-only `flutter-contributors` Google Group, which delivers announcements and calendar invites for the recurring Flutter Contributor Roundtable and the Dash Forum (where contributors can present and get feedback on their [RFCs](https://github.com/flutter/rfc)). + +### Reviewer + +Established community contributors active in code review and issue triage. Reviewers belong to `@flutter/flutter-hackers` and `@flutter/reviewers`, holding the Triage role on Flutter repositories (labeling, closing duplicate or resolved issues, and requesting reviews). They conduct first-pass code reviews on community PRs to help authors follow style guides and verify test coverage, and triage incoming issues by confirming reproductions and adding labels. On PRs from Contributors or Reviewers, a Reviewer's non-blocking approval counts as one of the two required approvals (with the second from a Committer or Maintainer). + +### Committer + +Experienced contributors who provide binding code reviews, mentor Contributors and Reviewers, and land changes. Committers belong to `@flutter/flutter-hackers` and `@flutter/committers`, holding the Write role on Flutter repositories with merge queue access. They conduct authoritative code reviews evaluating correctness, performance, and backward compatibility; Committer PRs require one approval from a Reviewer or higher to land, and a Committer approval provides the binding approval on Contributor and Reviewer PRs. + +### Maintainer + +Domain stewards for subsystems, engines, platforms, or developer tools. All Maintainers are either Flutter team engineers at Google or partner team members (`@flutter/partners`, with child teams per partner affiliation), and all belong to `@flutter/maintainers` (child team of `@flutter/flutter-hackers`). Maintainers hold Write access across repositories and GitHub organization moderation permissions to enforce the Code of Conduct, leading architectural stewardship, breaking change decisions, and technical escalations. + +### Dasher Emeritus + +Former Reviewers, Committers, Maintainers, and historical organization members who have stepped back from active contribution ($< 10$ contributions in the preceding 12 months). Emeriti are removed from the `flutter` GitHub organization (without retaining organization membership or repository triage/write permissions) and honored in [EMERITUS.md](../EMERITUS.md), while retaining access to Flutter Discord contributor channels and the `flutter-contributors` Google Group (limited to ladder members and Emeriti) so they can stay in touch and more easily ramp back up onto the project if and when they choose to return. + +Returning Emeriti who resume contributing and reach $\ge 10$ contributions are automatically identified during quarterly reviews, where they can reply directly on the public tracking issue. For off-cycle reinstatement, because creating new issues and pull requests in `flutter/contributors` is restricted to organization members (`collaborators`), returning Emeriti can reach out in `#hidden-chat` on Discord (or to an active organization member) to have an active org member sponsor and open an [Emeritus reinstatement issue](../.github/ISSUE_TEMPLATE/2_emeritus_reinstatement.yml) on their behalf (and provide an updated Discord username if theirs has changed). + +## References + +See [Code review workflow](CODE_REVIEW_WORKFLOW.md), [Quarterly reviews](QUARTERLY_REVIEW.md), [Governance](GOVERNANCE.md), [Transition guide](TRANSITION.md), [Contributor roster](../ROSTER.md), and [Dasher Emeritus](../EMERITUS.md). diff --git a/docs/QUARTERLY_REVIEW.md b/docs/QUARTERLY_REVIEW.md new file mode 100644 index 0000000..0d7ae5c --- /dev/null +++ b/docs/QUARTERLY_REVIEW.md @@ -0,0 +1,96 @@ +# Quarterly Reviews + +The Flutter project conducts quarterly reviews at the start of each calendar quarter (January, April, July, October) to evaluate contributor activity, process promotions, and maintain repository permissions. + +## Overview + +The review process is driven by an automated quarterly checklist issue, a single quarterly review PR held open during the 30-day community review window, and local facilitator tooling: + +```mermaid +graph TD + subgraph Automated Kickoff + DailyData["Daily activity sync (sync_activity.yml)
Rolling 52-week data/activity/ & activity_summary.json"] + QuarterlyCron["Quarterly workflow (quarterly_review.yml)
Files Checklist Issue assigned to @Piinks"] + end + + subgraph Local Preparation & 1 PR + QuarterlyCron --> LocalPrepare["Run locally: tool/quarterly_audit.dart --prepare
• Lists nominated candidates for manual ban-list check
• Excludes ineligible users so no one is singled out
• Generates vetted reports & updates roster"] + DailyData --> LocalPrepare + LocalPrepare --> SinglePR["Open 1 PR (held open for 30 days)
Adds reports/YYYY-QX-*.md + updates contributors.yaml, ROSTER.md & EMERITUS.md"] + LocalPrepare --> OpenIssues["Run: tool/quarterly_audit.dart --open-issues
Opens public Community Audit & Partner Verification issues"] + end + + subgraph 30-Day Review Window + OpenIssues --> Appeals["Community response period (30 days)
Accept invites, share Discord handles & share unscripted contributions"] + OpenIssues --> PartnerSignoff["Facilitator reaches out to partner teams
to confirm active @flutter/partners members"] + OpenIssues --> WeeklyCheck["Weekly workflow (check_grace_period.yml)
Posts weekly issue update & pings assignee at Day 30"] + end + + subgraph Finalization + Appeals --> UpdatePR["Update open PR (--finalize)
Applies 30-day --retain, --exclude & --discord adjustments"] + PartnerSignoff --> UpdatePR + WeeklyCheck --> UpdatePR + SinglePR --> UpdatePR + UpdatePR --> LandAndSync["Land PR, sync GitHub teams, grant Discord team member role & remove Emeriti from org"] + end +``` + +## Step-by-step workflow + +### 1. Automated checklist issue (Day 1) + +At the start of each quarter, `.github/workflows/quarterly_review.yml` automatically files a Quarterly Review Checklist Issue assigned to `@Piinks` containing the tasks and commands for the quarter. Reports are not generated or committed by CI so that prospective candidates can be vetted locally first. + +### 2. Local report generation, ban-history check & single PR (Day 1) + +After the checklist issue is filed, the audit runner pulls the latest `main` branch and runs the preparation tool locally on a new branch: + +```bash +git checkout -b YYYY-QX-quarterly-review +dart run tool/quarterly_audit.dart --prepare +``` + +The tool prints the usernames qualifying for promotion, reinstatement, or invitation and prompts for any usernames to exclude (or accepts `--exclude user1,user2`) after checking the internal Code of Conduct / ban history list. Contributors who were previously banned for Code of Conduct violations remain welcome to contribute as external Contributors after a temporary ban expires, but are not eligible for ladder membership; excluding them here ensures they are omitted before any files are written and no one is singled out. + +In the same run, the tool writes `reports/YYYY-QX-community-ladder-audit.md` and `reports/YYYY-QX-partner-verification-audit.md` and updates `data/contributors.yaml`, [ROSTER.md](../ROSTER.md), and [EMERITUS.md](../EMERITUS.md). The runner opens a single PR containing both the quarterly reports and the proposed roster updates, which stays open until the 30-day review period concludes. + +### 3. Opening the public review issues (Day 1) + +The tool drafts or directly opens the two public review issues from the vetted reports to start the 30-day review window: + +```bash +# Preview the drafted issues and gh commands: +dart run tool/quarterly_audit.dart --draft-issues --pr + +# Open both public issues on GitHub via gh CLI: +dart run tool/quarterly_audit.dart --open-issues --pr +``` + +## Community ladder audit (`--community`) + +### Tracking issue sections + +The public Community Contributor Ladder Audit issue contains four sections: + +1. **Recommended promotions and new joiners** lists Reviewers qualifying for Committer ($\ge 30$ contributions, $\ge 10$ merged PRs) alongside returning Dasher Emeriti and unenrolled contributors qualifying for Reviewer ($\ge 10$ contributions) or Committer; listed contributors reply in the thread to accept and share their Discord username for team member role provisioning. +2. **Active role retention** lists current Reviewers and Committers who met their 12-month activity thresholds. +3. **30-day grace period** tags current Reviewers or Committers with $< 10$ contributions in the preceding 12 months so they are notified of their proposed transition to Dasher Emeritus. +4. **Qualitative contributions** invites contributors to share work not captured by automated PR and issue counts, such as issue triage, bug reproduction, duplicate reduction, participation in [RFCs (`flutter/rfc`)](https://github.com/flutter/rfc) and design docs, or mentoring in Discord. + +### 30-day review period + +Creating new issues and pull requests in `flutter/contributors` is restricted to organization members (`collaborators`), while commenting on the quarterly review tracking issue remains open to all GitHub users. Over the 30-day review window, invited and promoted contributors reply on the tracking issue to accept and share their Discord username (or updated Discord username), and contributors in the grace period can share links to contributions that cannot be quantified automatically (issue triage comments, reproduction cases, [RFCs](https://github.com/flutter/rfc), design docs, architectural feedback, or mentoring). Throughout this 30-day window, `.github/workflows/check_grace_period.yml` runs once a week (`tool/check_grace_period.dart`) to post a weekly countdown update on the open review issues so tagged contributors are reminded before the window closes. + +### Finalization (Day 30+) + +Once 30 days have elapsed, the weekly workflow (`.github/workflows/check_grace_period.yml`) comments on the open review issues, pings the assignee, and adds the `grace-period-concluded` label. On the open quarterly review PR branch, the audit runner runs `dart run tool/quarterly_audit.dart --finalize` (passing `--retain`, `--exclude`, and `--discord user=discord_handle` for adjustments collected during the 30-day window) to update `data/contributors.yaml`, [ROSTER.md](../ROSTER.md), and [EMERITUS.md](../EMERITUS.md), then lands the PR. + +Once merged, GitHub teams (`@flutter/reviewers`, `@flutter/committers`, and `@flutter/maintainers` as child teams of `@flutter/flutter-hackers`, along with `@flutter/partners` child teams) are updated to match the roster, newly added ladder members are granted the Discord team member role, and members transitioning to Dasher Emeritus are removed from the GitHub organization (`@flutter/collaborators` is automatically managed by internal tooling and is not modified manually). Newly onboarded ladder members can then access the member-only `#hidden-chat` channel on Discord, where a pinned message links to the Google Form for adding their email address to the announcement-only `flutter-contributors` Google Group (used to deliver announcements and send calendar invites to the recurring Flutter Contributor Roundtable and the Dash Forum, where contributors can present and get feedback on their [RFCs](https://github.com/flutter/rfc)). + +## Partner verification audit (`--partners`) + +Partner team members participate through `@flutter/partners` and child teams (such as `@flutter/canonical`, `@flutter/tcs`, and `@flutter/codemate`), and also belong to `@flutter/maintainers` and `@flutter/collaborators`. The partner verification issue lists all members of `@flutter/partners` grouped by child team alongside their 12-month activity snapshot, and the audit facilitator reaches out to each partner organization to confirm active participation for their members. If an engineer concludes their engagement with a partner team, their write access via `@flutter/partners` and `@flutter/maintainers` is revoked; if they remain an active contributor, they are placed in the appropriate community tier (`Committer` or `Reviewer`) based on their contribution record. + +## Data pipeline and rate limits + +To keep quarterly reviews fast and within GitHub API limits, a scheduled GitHub Action (`.github/workflows/sync_activity.yml`) runs daily to sync the current ISO week into `data/activity/` (maintaining a 52-week rolling window) and recompute `data/activity_summary.json` across all non-bot contributors and organization members. During each quarterly review, `tool/quarterly_audit.dart` also queries live `flutter` GitHub organization and team membership so every current organization member is evaluated. diff --git a/docs/TRANSITION.md b/docs/TRANSITION.md new file mode 100644 index 0000000..74d19cb --- /dev/null +++ b/docs/TRANSITION.md @@ -0,0 +1,38 @@ +# Transition Plan + +This document describes the transition from Flutter's historical membership system (`flutter-hackers` with blanket write access and static `AUTHORS` files) to the tiered contributor ladder. + +## Initial placement + +Existing members are placed according to 12-month activity records: + +```mermaid +graph TD + LegacyHackers["Existing flutter-hackers & org members"] --> Analysis["12-month activity analysis"] + + Analysis -->|"Googlers & Partners"| Maintainers["Maintainer Tier
(@flutter/googlers, @flutter/partners)"] + Analysis -->|"≥ 30 contributions (≥ 10 PRs)"| Committers["Committer Tier
(@flutter/committers)"] + Analysis -->|"≥ 10 contributions"| Reviewers["Reviewer Tier
(@flutter/reviewers)"] + Analysis -->|"Joined < 12 months ago"| GraceReviewers["Reviewer Tier
(12-month transition grace period)"] + Analysis -->|"< 10 contributions (Inactive)"| Emeriti["Dasher Emeritus
(Alumni status)"] +``` + +### Placement categories + +Members of `@flutter/googlers` (Flutter team engineers) and `@flutter/partners` (Canonical engineers and partner team members) are placed in the Maintainer tier. Active community members are placed according to their 12-month contribution history: those meeting the Committer threshold ($\ge 30$ contributions and $\ge 10$ merged PRs) enter the Committer tier, and those meeting the Reviewer threshold ($\ge 10$ contributions) enter the Reviewer tier. External community contributors who met Reviewer or Committer criteria over the past 12 months are invited to join the ladder during the quarterly review. + +As a one-time initial transition policy for the first year after the ladder lands, members who joined `flutter-hackers` within the 12 months preceding ladder adoption and do not yet meet the 10-contribution threshold retain the `Reviewer` role for a 12-month transition period (`grace_until` in `data/contributors.yaml`). Once this initial 12-month window concludes, standard rolling 12-month criteria apply to all members. + +Inactive historical `flutter-hackers` ($< 10$ contributions in the preceding 12 months) transition to Dasher Emeritus and are removed from the GitHub organization. Emeriti are honored in [EMERITUS.md](../EMERITUS.md) and retain access to Discord member channels and the `flutter-contributors` Google Group so they can stay in touch and more easily ramp back up onto the project if and when they choose to return. + +## Organization audit + +To ensure all existing GitHub organization members are categorized, the initial bootstrap tool (`tool/seed_initial_data.dart`) reviews all members of the `flutter` GitHub organization (`gh api orgs/flutter/members`) and cross-references each account against `@flutter/googlers`, `@flutter/partners`, `@flutter/flutter-hackers`, and 12-month activity data. Untracked active contributors are placed into their qualifying tier (`Committer` or `Reviewer`), while inactive organization members and former `flutter-hackers` ($< 10$ contributions in the preceding 12 months) transition to Dasher Emeritus, are removed from the GitHub organization, and are listed in [EMERITUS.md](../EMERITUS.md). + +## Retirement of static AUTHORS files + +Historically, repository-level `AUTHORS` files (`flutter/flutter/AUTHORS`, `flutter/packages/AUTHORS`, etc.) tracked individual contributors. Over time, these files became static and difficult to maintain. `flutter/contributors` now serves as the single source of truth for contributor roles and permissions, while historical `AUTHORS` files are preserved under `legacy_authors/`. The active ladder roster is published in [ROSTER.md](../ROSTER.md) and Dasher Emeriti are listed in [EMERITUS.md](../EMERITUS.md), both generated from `data/contributors.yaml`. + +## Data seeding + +`tool/seed_initial_data.dart` creates `data/activity_summary.json` seeded with the baseline Year 0 analysis, and daily syncs update the current ISO week activity in `data/activity/YYYY-Wxx.json`. Over the first 12 months, the rolling 52-week dataset becomes self-sustaining. diff --git a/legacy_authors/README.md b/legacy_authors/README.md new file mode 100644 index 0000000..6abf71a --- /dev/null +++ b/legacy_authors/README.md @@ -0,0 +1,12 @@ +# Legacy AUTHORS Archive + +Historically, Flutter repositories maintained static `AUTHORS` files listing individual contributors for copyright and recognition purposes. Over time, maintaining separate text files across dozens of repositories proved difficult to keep up-to-date and provided no visibility into active permissions or governance roles. + +With the adoption of the [Flutter Contributor Ladder](../docs/LADDER.md), the `flutter/contributors` repository is now the authoritative source of truth for all Flutter contributor roles and permissions, published dynamically in [ROSTER.md](../ROSTER.md). + +This directory archives historical `AUTHORS` files to honor every contributor who helped build Flutter: + +- `flutter.AUTHORS`: Historical AUTHORS list from `flutter/flutter`. +- `packages.AUTHORS`: Historical AUTHORS list from `flutter/packages`. +- `website.AUTHORS`: Historical AUTHORS list from `flutter/website`. +- `devtools.AUTHORS`: Historical AUTHORS list from `flutter/devtools`. diff --git a/legacy_authors/devtools.AUTHORS b/legacy_authors/devtools.AUTHORS new file mode 100644 index 0000000..aa37742 --- /dev/null +++ b/legacy_authors/devtools.AUTHORS @@ -0,0 +1,6 @@ +# Below is the historical list of people who have contributed to the flutter/devtools repository. +# +# For the active contributor ladder roster and governance, see: +# https://github.com/flutter/contributors + +# TODO(Piinks): move over from flutter/devtools diff --git a/legacy_authors/flutter.AUTHORS b/legacy_authors/flutter.AUTHORS new file mode 100644 index 0000000..ca5b538 --- /dev/null +++ b/legacy_authors/flutter.AUTHORS @@ -0,0 +1,28 @@ +# Below is the historical list of people who have contributed to the Flutter repository. +# +# For the active contributor ladder roster and governance, see: +# https://github.com/flutter/contributors + +Google Inc. +The Chromium Authors +The Flutter Authors +AbdeMohlbi +AlexV525 +DanTup +Jhon-Aires +Kate Lovett +Robert Odrowaz +Valentin Vignal +bleroux +csells +davidhicks980 +huycozy +knopp +ksokolovskyi +mattkae +navaronbracke +parlough +rkishan516 +robert-ancell +schultek +vickyduran diff --git a/legacy_authors/packages.AUTHORS b/legacy_authors/packages.AUTHORS new file mode 100644 index 0000000..593495c --- /dev/null +++ b/legacy_authors/packages.AUTHORS @@ -0,0 +1,8 @@ +# Below is the historical list of people who have contributed to the flutter/packages repository. +# +# For the active contributor ladder roster and governance, see: +# https://github.com/flutter/contributors + +Google Inc. +The Chromium Authors +The Flutter Authors diff --git a/legacy_authors/website.AUTHORS b/legacy_authors/website.AUTHORS new file mode 100644 index 0000000..e005cc3 --- /dev/null +++ b/legacy_authors/website.AUTHORS @@ -0,0 +1,8 @@ +# Below is the historical list of people who have contributed to the flutter/website repository. +# +# For the active contributor ladder roster and governance, see: +# https://github.com/flutter/contributors + +Google Inc. +The Chromium Authors +The Flutter Authors diff --git a/reports/README.md b/reports/README.md new file mode 100644 index 0000000..c2b33c4 --- /dev/null +++ b/reports/README.md @@ -0,0 +1,15 @@ +# Quarterly Audit Reports Archive + +This directory stores the permanent, version-controlled record of all quarterly contributor audits conducted for the Flutter Contributor Ladder. + +## Structure & File Naming + +For each calendar quarter, two official audit reports (`YYYY-QX-community-ladder-audit.md` for the community ladder review and `YYYY-QX-partner-verification-audit.md` for verifying active `@flutter/partners` members) are generated locally via `tool/quarterly_audit.dart --prepare`, checked in alongside the proposed roster updates in a single PR, and published as tracking issues. + +## Generating Reports + +To prepare and save the current quarter's reports (and update the roster for the quarterly review PR): + +```bash +dart run tool/quarterly_audit.dart --prepare +```