Skip to content

[CI] End-to-End Badge Assignment Automation #116

Open

Description

@PARTH-TUSSLE

Current Behavior

Currently, only a few badges (like Design Pioneer / first-design) are programmatically assigned in Layer5 Cloud when a user performs a first-time action, while others rely on manual trigger scripts or Slack commands (badge-award.yml). Most badges on badges.layer5.io require manual tracking.

Desired Behavior

Automate badge assignments programmatically across ~30 eligible badges on badges.layer5.io using quantifiable criteria, categorized into 4 core execution tracks:

  1. In-App Cloud Events: Backend triggers when users perform first-time in-app actions.
  2. Project Contribution PR Merges: Reusable GitHub Action running on merged PRs to grant project badges.
  3. Monthly Contributor Crons: Scheduled GitHub Action calculating multi-month / cumulative milestones.
  4. Org & Role Webhooks: Automated badge sync for GitHub Org & Slack role grants.

Implementation

  • Track 1: In-App Cloud Events (Layer5 Cloud Backend)
    • first-application (Application Pioneer): Intercept POST /api/application.
    • first-share (Sharing is Caring): Intercept catalog publish / visibility change in PUT /api/pattern.
    • bring-a-buddy (Bring a Buddy): Award upon invitation acceptance.
    • gitops-connected (GitOps Connected): Trigger on GitHub App installation webhook.
    • first-deployment (Shipped): Telemetry event on successful deployment.
    • need-for-speed (Need for Speed): Intercept POST /api/perf/profile/result.
    • first-interactive-terminal-session (Hip Hacker): Pod exec websocket open telemetry.
    • first-log-streaming-session (Log Streamer): Pod log stream websocket open telemetry.
  • Track 2: Project Contribution PR Merges (GitHub Actions)
    • Reusable PR merge workflow mapping merged PR paths to contributor badges (sistent-contributor, meshery, meshery-operator, meshsync, meshery-docs, meshery-catalog, landscape, ui-ux).
  • Track 3: Monthly Contributor Milestone Crons (GitHub Actions)
    • Scheduled monthly workflow (1st of every month) querying GitHub GraphQL API for continuous-contributor, longevity-legend, review-rockstar, code-cleanup-crew, security-sentinel.
  • Track 4: Org & Role Webhooks
    • Webhook integration for employee and meshmate badges.

Acceptance Tests

  • Merging a PR in project repositories automatically triggers badge award API calls for authors.
  • End-of-month scheduled workflows calculate contributor thresholds and issue badges accurately.
  • In-app actions trigger badge assignment and notifications seamlessly.

Contributor Guides and Resources

Pinned by PARTH-TUSSLE

Activity

  1. changed the title [-][CI][/-] [+][CI] End-to-End Badge Assignment Automation[/+] on Sep 11, 2026
  2. k-anushka14 commented on Sep 12, 2026

    @k-anushka14

    Hi @PARTH-TUSSLE ! I’d like to work on this issue, particularly Track 2: Project Contribution PR Merges — implementing the reusable GitHub Action to automatically assign contributor badges when PRs are merged.
    Could you please assign this track to me, or let me know if there’s any existing design/API implementation I should follow before starting?

  3. PARTH-TUSSLE commented on Sep 13, 2026

    @PARTH-TUSSLE
    ContributorAuthor

    Hey @k-anushka14 , thanks for showing interest however this issue isn't for assigning to anyone at the moment.

  4. Maanvi212006 commented on Oct 4, 2026

    @Maanvi212006
    Contributor

    Regarding Track 2:

    What I found

    • Awarding in Cloud is POST /identity/users/badges. It needs the recipient's Layer5 user UUID (userId), and the caller can't be the recipient.
    • The Action can authenticate with a bot account's long-lived API token sent as a Bearer header, so no new auth code is needed.
    • feat(badges): implement Track 2 PR merge contributor badge automation #122 identifies the PR author by commit email (Signed-off-by) and outputs a /award-badge <email> <slug> Slack command, which matches the current manual flow.
    • A PR only gives us the author's GitHub identity. Cloud has no GitHub-to-user lookup today, only email. Kratos does store the numeric GitHub ID for users who signed in with GitHub.

    Two approaches

    1. Email (feat(badges): implement Track 2 PR merge contributor badge automation #122): needs no Cloud changes and works for anyone whose commit email matches their Layer5 email. But commit emails often differ or are GitHub noreply addresses, and they can be spoofed, which is why feat(badges): implement Track 2 PR merge contributor badge automation #122 needs the DCO/identity code.
    2. GitHub ID via Kratos: hard to spoof and simpler in the Action, but it only covers users who signed in with GitHub, and it needs a new lookup in Cloud.

    A layered mix is also possible: GitHub ID, then email, then manual award.

    Questions

    1. Is feat(badges): implement Track 2 PR merge contributor badge automation #122's email approach the agreed direction, or is a GitHub ID lookup worth exploring?
    2. What role and organization should the bot account have so it can award badges to any contributor?
    3. Could someone with Kratos DB access share aggregate counts (no user data)? It shows how many users have a linked social login.
  5. PARTH-TUSSLE commented on Oct 6, 2026

    @PARTH-TUSSLE
    ContributorAuthor

    Regarding Track 2:

    What I found

    • Awarding in Cloud is POST /identity/users/badges. It needs the recipient's Layer5 user UUID (userId), and the caller can't be the recipient.
    • The Action can authenticate with a bot account's long-lived API token sent as a Bearer header, so no new auth code is needed.
    • feat(badges): implement Track 2 PR merge contributor badge automation #122 identifies the PR author by commit email (Signed-off-by) and outputs a /award-badge <email> <slug> Slack command, which matches the current manual flow.
    • A PR only gives us the author's GitHub identity. Cloud has no GitHub-to-user lookup today, only email. Kratos does store the numeric GitHub ID for users who signed in with GitHub.

    Two approaches

    1. Email (feat(badges): implement Track 2 PR merge contributor badge automation #122): needs no Cloud changes and works for anyone whose commit email matches their Layer5 email. But commit emails often differ or are GitHub noreply addresses, and they can be spoofed, which is why feat(badges): implement Track 2 PR merge contributor badge automation #122 needs the DCO/identity code.
    2. GitHub ID via Kratos: hard to spoof and simpler in the Action, but it only covers users who signed in with GitHub, and it needs a new lookup in Cloud.

    A layered mix is also possible: GitHub ID, then email, then manual award.

    Questions

    1. Is feat(badges): implement Track 2 PR merge contributor badge automation #122's email approach the agreed direction, or is a GitHub ID lookup worth exploring?
    2. What role and organization should the bot account have so it can award badges to any contributor?
    3. Could someone with Kratos DB access share aggregate counts (no user data)? It shows how many users have a linked social login.

    Thanks for digging into the Cloud and Kratos side @Maanvi212006!

    Thoughts on Direction:

    1. Email approach vs GitHub ID lookup:

    The Email approach in #122 can be shipped without any Cloud-side changes and matches the existing manual award flow. It leverages the exact Slack bot workflow already used manually, and PR #122 already has robust fail-closed handling (DCO verification, terminal trailer parsing, and noreply safety).
    A GitHub ID lookup via Kratos is a great Phase 2 evolution, but it depends on Cloud team bandwidth to build/expose a lookup endpoint and only covers contributors who signed up via GitHub OAuth.
    Recommendation: Proceed with the layered roadmap:
    Phase 1 (Immediate): Merge and ship #122 (Email / Slack dispatch) to get immediate PR-merge automation working.
    Phase 2 (Future): Once Cloud implements a GitHub ID lookup endpoint, add GitHub ID resolution as the primary tier before falling back to email.

    1. Bot Account Role & Org (for direct Cloud API):

    For direct Cloud calls (POST /identity/users/badges), the bot account would need global admin permissions (or a dedicated service role like BadgeAutomationService) capable of granting badges across all organizations/users, rather than being bound to a single user's org.

    1. Kratos Stats:

    Having Lee or someone with Kratos DB access share the percentage of users with linked GitHub accounts would definitely help scope the coverage for Phase 2!

  6. PARTH-TUSSLE commented on Oct 6, 2026

    @PARTH-TUSSLE
    ContributorAuthor

    Quantification of Badge Assignments & Automation Architecture

    This proposal incorporates feedback from the community recognition discussion, including the Track 5 peer-recognition proposal, poll outcomes, and pending maintainer decisions.

    Items marked Proposed are suggestions, not approved implementation scope. Open decisions are explicitly documented in Section 10.


    1. Overview & Evaluation Strategies

    This proposal defines quantifiable eligibility criteria, data sources, and automation boundaries across eligible Layer5 and Meshery badges.

    Badges are organized into five operational tracks based on their data sources and evaluation mechanisms.

    This revision also proposes two poll-driven badges:

    • first-contribution — Universal First-Timer (Poll 1 winner: "both"). Placed in Track 2.
    • catalog-designer — Consistent Catalog Designer (Poll 3 winner: "both"). Placed in Track 1.

    Both remain proposals pending the decisions documented below.

    Operational Tracks

    • Track 1 — Product / Event-Driven: Real-time product events in Layer5 Cloud, Meshery Server, or webhooks. Includes the proposed Consistent Catalog Designer.
    • Track 2 — GitHub Repository Activity: Deterministic PR merges evaluated in CI across allowlisted repositories. Includes the proposed Universal First-Timer and a badge gated by a maintainer-applied architectural-impact label.
    • Track 3 — Derived GitHub Activity: Periodic or release-triggered metrics calculated over multiple events or calendar windows. Includes Writers Program, Review Rockstar, Continuous Contributor, First Release, Meshery Explorer, and Bug Hunter.
    • Track 4 — Manual Recognition: Human nominations, leadership appointments, advocacy submissions, and external credential audits.
    • Track 5 — Peer Recognition: Kudos given by contributors through PR comments and Slack, counted monthly. Supports Community Guide and Mentor of the Month.

    Evaluation Strategies

    • Strategy A — Product / External Event Evaluator: Inline checks in Cloud handlers, Meshery Server telemetry calls, or GitHub webhooks invoking Cloud's assignBadge(). No asynchronous event bus is introduced.
    • Strategy B — GitHub CI Automation: Reusable workflow triggered when a PR is merged using pull_request_target: closed. Applies badge-awarded:<slug> labels for PR-level duplicate protection.
    • Strategy C — Periodic Reconciliation: Scheduled cron querying the GitHub GraphQL API over defined calendar windows. Also runs on release: published for the First Release badge.
    • Strategy D — Manual Recognition: Issue nomination and submission templates in layer5io/recognition, together with the existing manual award flow. The location and implementation of the Slack /award-badge command remain open questions.
    • Strategy E — Peer Recognition Evaluator: /kudos command intake from GitHub PR comments and Slack, stored as events in Cloud and evaluated by a monthly cron. Includes Mentor of the Month voting and maintainer verification.

    Global Invariants

    Identity

    Cloud awards require the Layer5 userId, but a merged PR or GitHub event provides a GitHub identity such as login, numeric id, and commit emails.

    The method for resolving a contributor to a Layer5 user remains an open decision (Section 10, Decision 1).

    PR #122 currently resolves identity through commit email. A GitHub ID lookup through Kratos is an alternative under consideration.

    Track 5 also requires a mapping between Slack users and Layer5 users (Section 10, Decision 14).

    Exclusions

    Automated evaluations skip bot accounts (type == "Bot" or login ending in [bot]) and the system user l5io.

    For Track 5, bots and l5io cannot give or receive kudos.

    Idempotency

    Cloud's assignBadge skips users who already hold a badge. A repeat award must not create a second award event or send another notification email.

    This behavior is verified in assignBadgeWithNotification in badge_helpers.go.

    Non-Exclusivity

    Track 2 evaluations are non-exclusive. A PR satisfying multiple badge rules receives all matching badges.

    Kudos Are Events, Not Badges

    A kudos is a thank-you that is counted toward recognition. A single kudos does not itself award a badge.

    Allowlisted Repositories

    For Tracks 2 and 3, the allowlist below is the proposed baseline. It matches SUPPORTED_REPOSITORIES in PR #122 (utils/badge-evaluator.js), which currently covers Track 2 only.

    Whether Track 3 uses the same list must be confirmed by maintainers (Section 10, Decision 13).

    The proposed Track 2 first-contribution badge also uses this allowlist. The First Release badge uses stable releases from these repositories.

    • layer5io/layer5
    • layer5io/sistent
    • layer5io/docs
    • meshery/meshery
    • meshery/meshery-operator
    • meshery/meshsync
    • meshery/meshery.io

    2. Badge Decision Matrix

    Track Badge Slug Official Title Status Exact Trigger / Rule Data Source Strategy Dependencies / Open Decisions
    1 first-design Design Pioneer Already implemented First design save, clone, or import Layer5 Cloud design events and handlers Strategy A Update slug from design-pioneer; remove duplicate award block in save handler
    1 first-application Application Pioneer Blocked First application definition created Cloud application event; feature status unconfirmed Blocked Determine whether the Applications feature is deprecated
    1 first-share Sharing is Caring Existing handler Explicit design share or access grant Cloud share and access-grant handlers Strategy A None
    1 first-deployment Shipped Cross-repo dependency First successful, non-dry-run deployment Meshery Server deployment telemetry to Cloud Strategy A Meshery Server-to-Cloud telemetry contract
    1 first-interactive-terminal-session Hip Hacker Cross-repo dependency First pod interactive terminal opened Meshery Server terminal-session telemetry to Cloud Strategy A Meshery Server-to-Cloud telemetry contract
    1 first-log-streaming-session Log Streamer Cross-repo dependency First pod log stream opened Meshery Server log-stream telemetry to Cloud Strategy A Meshery Server-to-Cloud telemetry contract
    1 need-for-speed Need for Speed Existing handler First SMP test result published to Cloud Cloud SMP result handler Strategy A Hook StoreResults
    1 first-collaborator GitOps with Friends Existing handler Non-owner edits and saves an existing design Cloud design-save events Strategy A Award the design owner
    1 bring-a-buddy Bring a Buddy Existing handler Invited user accepts invitation Cloud invitation-acceptance event Strategy A Hook AcceptInvitation
    1 gitops-connected GitOps Connected Blocked Meshery GitHub App installed on a repository GitHub App installation webhook Strategy A GitHub account-to-Layer5-user identity mapping
    1 kanvas-snapshot Kanvas Snapshot Existing handler PR visual topology snapshot generated Cloud artifact-upload handler Strategy A Retire meshmap-snapshot in favor of kanvas-snapshot
    1 catalog-designer (slug proposed) Consistent Catalog Designer Proposed (Poll 3 winner: "both") On a verified catalog publish, the user also published in each of the two previous UTC calendar months (three consecutive months) Layer5 Cloud catalog publish events Strategy A (check on publish) Define verified design; confirm Cloud records publish events with timestamps; create slug if absent
    2 sistent-contributor Sistent Contributor CI automation At least one qualifying merged PR in Sistent source GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping
    2 meshery Meshery CI automation At least one qualifying merged PR in Meshery core source GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping
    2 meshery-operator Meshery Operator CI automation At least one qualifying merged PR in Operator source GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping
    2 meshsync MeshSync CI automation At least one qualifying merged PR in MeshSync source GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping
    2 meshery-docs Meshery Docs Rule refinement At least one merged PR in verified documentation trees GitHub merged-PR metadata, changed paths, and labels Strategy B Standardize meshery-docs versus docs; create slug in Cloud; identity mapping
    2 meshery-catalog Meshery Catalog CI automation At least one merged PR in catalog items or models GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping
    2 landscape Landscape CI automation At least one qualifying merged PR in the landscape collection GitHub merged-PR metadata, changed paths, and labels Strategy B Create slug in Cloud; identity mapping
    2 ui-ux UI/UX CI automation Qualifying changes to designated UI components or paths GitHub merged-PR metadata, changed paths, and labels Strategy B Identity mapping; manual design work remains in Track 4
    2 first-contribution (slug proposed) Universal First-Timer Proposed (Poll 1 winner: "both") First qualifying merged PR by a human in any allowlisted repository; awarded once per person; complements the repo badges GitHub merged-PR metadata Strategy B Identity mapping; one-time backfill and whether it sends emails; create slug
    2 architectural-impact (slug proposed) Code Craftsman (name proposed) New, proposed Merged PR carrying the maintainer-applied label impact/architectural GitHub merged-PR metadata and labels Strategy B Create label and slug; finalize name, rubric, and authorized label appliers; identity mapping
    3 writers-program Writers Program Periodic evaluator At least two qualifying published articles merged GitHub GraphQL/API Strategy C Create slug in Cloud; decide whether meshery.io posts count; identity mapping
    3 review-rockstar Review Rockstar Periodic evaluator At least 25 qualifying distinct PR reviews GitHub GraphQL/API Strategy C Define minimum review content; identity mapping
    3 code-cleanup-crew Code Cleanup Crew Periodic evaluator At least five qualifying cleanup PRs merged GitHub GraphQL/API Strategy C Decide qualifying cleanup label; identity mapping
    3 security-sentinel Security Sentinel Periodic evaluator At least one merged PR carrying the security label GitHub GraphQL/API Strategy C Decide treatment of event/security-slam*; create missing security labels; identity mapping
    3 continuous-contributor Continuous Contributor Periodic evaluator At least one qualifying merged PR per month for three consecutive UTC calendar months GitHub GraphQL/API Strategy C Identity mapping; Slack-help routing remains pending maintainer sign-off
    3 longevity-legend Longevity Legend Periodic evaluator First and latest qualifying PR are at least 24 months apart GitHub GraphQL/API Strategy C Identity mapping
    3 hacktoberfest-contributor (yearly slug, e.g. hacktoberfest26) Hacktoberfest Contributor Seasonal, provisional Provisional: at least one merged PR during October GitHub GraphQL/API Strategy C Create yearly slug; confirm campaign criteria; identity mapping
    3 first-release (slug proposed) First Release New, proposed First qualifying merged PR shipped in a stable release GitHub GraphQL/API and release metadata Strategy C, release-triggered Create slug; define PR-to-release mapping and qualifying releases; identity mapping
    3 meshery-explorer (slug proposed) Meshery Explorer New, proposed Qualifying merged PRs in at least three different allowlisted repositories GitHub GraphQL/API Strategy C Create slug; confirm threshold; identity mapping
    3 bug-hunter (slug proposed) Bug Hunter New, proposed At least N quality issues reported within a defined period GitHub GraphQL/API Strategy C Create slug; define threshold, time window, and quality signal; identity mapping
    4 community Community Manual-only Community Manager nomination Maintainer nominations or verified external-credential evidence Strategy D None
    4 meshmate MeshMate Manual-only Official mentorship appointment Maintainer nominations or verified external-credential evidence Strategy D Define authoritative roster
    4 cncf-ambassador CNCF Ambassador Manual-only Verified CNCF Ambassador credential Maintainer nominations or verified external-credential evidence Strategy D External CNCF directory audit
    4 docker-captain Docker Captain Manual-only Verified Docker Captain credential Maintainer nominations or verified external-credential evidence Strategy D External Docker directory audit
    4 ui-ux (design work only) UI/UX Manual-only Maintainer-recognized flyer, promotion, or graphic design work without a qualifying PR Maintainer nominations or verified external-credential evidence Strategy D None
    4 advocate (slug proposed) Advocate New, proposed Verified advocacy outside the repository, submitted with a link Maintainer nominations or verified external-credential evidence Strategy D Create slug and submission template; define evidence rules
    5 community-guide (slug proposed) Community Guide New, proposed At least N unique kudos givers in one UTC calendar month, confirmed by a maintainer GitHub/Slack kudos events stored in Cloud Strategy E Create slug; define N; Slack identity mapping and kudos storage
    5 mentor-of-the-month (slug proposed) Mentor of the Month New, proposed Top five by unique kudos givers in a month become nominees; contributors vote; maintainers perform a final check GitHub/Slack kudos events stored in Cloud Strategy E Create slug; define voter rules and tie handling; Slack identity mapping and kudos storage

    3. Track 1 — Product / Event-Driven Badges

    Track 1 uses Strategy A.

    first-design — Design Pioneer

    Already implemented in Cloud (meshery_patterns.go) across saves, clones, and imports, while skipping anonymous users.

    • Exclude this badge from new automation.
    • Update the slug from design-pioneer to first-design.
    • Remove the duplicate award block in the main save handler, reported around lines 475 and 509. Idempotency makes the duplicate harmless, but the redundant code should be removed.

    first-application — Application Pioneer

    Status: Blocked.

    No verified Applications persistence or event model was identified in Cloud handlers.

    Implementation is paused pending clarification on whether the Applications feature is deprecated or whether an alternative product construct applies.

    first-share — Sharing is Caring

    Trigger on explicit sharing (users.go) or access grants (resources.go:209).

    • Award the design owner.
    • Saving a design that defaults to public does not qualify.

    first-deployment — Shipped

    Status: Cross-repository dependency.

    Kubernetes deployments execute inside Meshery Server, and Cloud currently receives no deployment event.

    Meshery Server (deployment success)
              |
              v
         Telemetry API
              |
              v
         Layer5 Cloud
              |
              v
          assignBadge()
    

    Award on the first successful deployment where dryRun == false and undeploy == false.

    Validation runs do not qualify.

    Terminal and Log Streaming Badges

    first-interactive-terminal-session and first-log-streaming-session require cross-repository telemetry.

    • Meshery Server emits terminal_session_opened when an interactive terminal session is established.
    • Meshery Server emits log_stream_opened when a log stream is established.
    • Cloud awards the badge to the initiating user after receiving a qualifying event.

    need-for-speed — Need for Speed

    Trigger on successful AddMesheryResult within StoreResults.

    Award the user on their first SMP result published to Cloud.

    Exclude background polling through UpdateResultsWithMetrics.

    first-collaborator — GitOps with Friends

    Trigger on a design save.

    Award the design owner when an authenticated non-owner edits and saves an existing design.

    Exclude presence pings and administrative edits.

    bring-a-buddy — Bring a Buddy

    Hook the appended branch in AcceptInvitation.

    Award the inviter (invitation.Owner) when an invited user accepts.

    Exclude self-invites and open-organization links.

    gitops-connected — GitOps Connected

    Status: Blocked on identity mapping.

    GitHub App installation webhook
              |
              v
     Identify installation
              |
              v
     Map GitHub identity to Layer5 user
              |
              v
          assignBadge()
    

    GitHub App installation webhooks carry GitHub account or organization IDs, not Layer5 user UUIDs.

    Ignore deleted and suspend events.

    kanvas-snapshot — Kanvas Snapshot

    Trigger on the success branch of PostGithubArtifact.

    Award the initiating user.

    Standardize on kanvas-snapshot and retire meshmap-snapshot.

    catalog-designer — Consistent Catalog Designer

    Status: Proposed; Poll 3 winner: "both".

    Recognizes contributors who regularly publish designs to the Meshery Catalog.

    Rule: When a user publishes a verified design to the catalog, Cloud checks whether the same user also published in each of the two previous UTC calendar months. If yes, the badge is awarded. In effect, it is awarded on the publish that completes three consecutive months.

    • Data source: Catalog publish events already known to Cloud, which also knows the Layer5 user. No GitHub identity mapping is needed.
    • No cron: The check runs inline when a publish happens.
    • Define what counts as a verified catalog design.
    • Confirm that Cloud records catalog publish events with a timestamp.
    • Month boundaries use UTC.
    • Create the badge slug if it does not exist.

    See Section 10, Decision 28.


    4. Track 2 — GitHub Repository Activity

    Track 2 is evaluated in CI when a PR is merged using Strategy B.

    All Track 2 awards depend on the identity-mapping decision in Section 10, Decision 1.

    Universal Exclusions

    Exclude:

    • Tests: **/*.test.*, **/*_test.go, **/__tests__/**
    • Lockfiles: package-lock.json, yarn.lock, go.sum
    • Repository governance: .github/**, LICENSE, README.md, CONTRIBUTING*.md

    Minimum threshold: At least one qualifying merged PR authored by a human.

    Repository Rules

    sistent-contributor — Sistent Contributor

    Repository: layer5io/sistent

    • Qualifying paths: src/**, examples/**
    • Exclusions: system/** (documentation), src/assets/**, package.json, tsconfig.json, Makefile
    • Non-existent packages/** is excluded.

    meshery — Meshery

    Repository: meshery/meshery

    • Qualifying paths: server/**, mesheryctl/**, ui/**, provider-ui/**
    • Exclusions: Generated models/**, install/** (Helm/YAML), root main.go, go.mod, ui/docs/**, ui/public/**, ui/scripts/**

    meshery-operator — Meshery Operator

    Repository: meshery/meshery-operator

    • Qualifying paths: controllers/**, api/**, pkg/**, cmd/**
    • Exclusions: Generated zz_generated*, bundle/**, config/**, go.mod, go.sum

    meshsync — MeshSync

    Repository: meshery/meshsync

    • Qualifying paths: internal/**, pkg/**, meshsync/**
    • Exclusions: integration-tests/**, go.mod, go.sum
    • Non-existent plugins/** and cache/** are excluded.

    meshery-docs — Meshery Docs

    Repositories: meshery/meshery, layer5io/docs

    • Qualifying paths: .md and .mdx files under docs/content/** in meshery and content/** in layer5io/docs.
    • Exclusions: Non-existent pages/**, theme layouts, site assets, catalog/**, integrations/**, data/**, meetings/**, static/**, archive/**, proposals/**.
    • Slug: Must exist in Cloud before awards can run. The canonical slug (meshery-docs versus docs) must be confirmed.

    meshery-catalog — Meshery Catalog

    Repositories: meshery/meshery.io, meshery/meshery

    • Qualifying paths: catalog/** and collections/_catalog/** in meshery.io; models/** in meshery.
    • Generated models/** in meshery qualifies strictly for meshery-catalog and must not qualify for the general meshery badge.

    landscape — Landscape

    Repository: layer5io/layer5

    • Qualifying path: src/collections/landscape/**
    • Slug: Must be created in Cloud before awards can run.

    ui-ux — UI/UX

    Repositories: meshery/meshery, layer5io/sistent, layer5io/layer5

    • meshery/meshery: PR must carry component/ui and modify ui/** or provider-ui/**. The labels area/ui and area/ux do not exist.
    • layer5io/sistent: Modifies src/** or system/**; no label required.
    • layer5io/layer5: Modifies src/components/**, src/sections/**, src/reusecore/**, theme/**, templates/**, or pages/**; no label required.
    • Exclusions: src/collections/** (blog/news) and src/assets/**.

    Offline flyers and graphic design work remain eligible for manual recognition through Track 4.

    New Badge: Universal First-Timer

    Proposed slug: first-contribution
    Status: Proposed; Poll 1 winner: "both".

    Recognizes a contributor's first merged PR anywhere in the ecosystem. It complements the repo badges and does not replace them.

    Rule: The first qualifying merged PR by a human in any allowlisted repository.

    • Uses the same Strategy B workflow and the same Track 2 universal exclusions.
    • Awarded once per person. Cloud already skips repeat awards, so no cross-repo bookkeeping is needed.
    • A first PR in, for example, sistent earns both first-contribution and sistent-contributor.
    • Backfill: Run a one-time job so existing contributors receive the badge. Whether the backfill sends notification emails is open.
    • Requires identity mapping and a Cloud slug.

    See Section 10, Decision 27.

    New Label-Gated Badge: Architectural Impact

    Proposed slug: architectural-impact
    Proposed title: Code Craftsman

    The evaluator cannot reliably determine architectural significance from changed files alone. A maintainer-applied label is therefore the qualifying signal.

    Rule: A merged PR authored by a human qualifies when it carries the label impact/architectural at merge time.

    • Applies across all seven allowlisted repositories.
    • Path rules do not apply; the maintainer-applied label is the signal.
    • The universal bot exclusion still applies.
    • The label is assumed not to exist yet and must be verified and created in all seven repositories before rollout.
    • Only authorized maintainers may apply the label.
    • A short written rubric must define qualifying work, such as a major architecture change, a complex bug fix, a substantial refactor, or significant test coverage improvements.
    • The badge is awarded to the PR author, not the maintainer who applied the label.
    • A label added after merge is not picked up automatically. Maintainers must apply it before merging.
    • The final badge name remains open.
    • The same PR may also earn repository-specific badges.
    • This badge is a candidate for tiered recognition.

    See Section 10, Decision 18.


    5. Track 3 — Derived GitHub Activity

    Track 3 uses Strategy C: scheduled jobs querying the GitHub GraphQL API over defined calendar windows.

    First Release also runs on release: published.

    All Track 3 badges depend on the identity-mapping decision in Section 10, Decision 1.

    writers-program — Writers Program

    Proposed rule:

    • At least two distinct merged PRs adding new .md or .mdx publications under layer5io/layer5:src/collections/blog/**.
    • Whether meshery/meshery.io:collections/_posts/** should also count remains open.
    • Edits to existing posts do not qualify.
    • The slug must be created in Cloud.

    review-rockstar — Review Rockstar

    Proposed rule:

    • At least 25 distinct qualifying PR reviews (APPROVED or CHANGES_REQUESTED) across allowlisted repositories.
    • The reviewer must be human and must not be the PR author.
    • The reviewed PR must also be authored by a human. Reviews of bot-authored PRs, such as Dependabot PRs, do not count.
    • Count at most one qualifying review per PR per reviewer.
    • Whether reviews require a comment or minimum body remains an open decision.

    Review quality cannot be fully measured by a script. Helping first-timers and identifying meaningful issues can also be recognized through Track 5 kudos and the Track 2 architectural-impact label.

    code-cleanup-crew — Code Cleanup Crew

    Proposed rule: At least five merged PRs authored by a human and carrying the agreed cleanup label.

    The current repository-label assessment indicates:

    • kind/cleanup does not exist in the allowlisted repositories.
    • area/refactor does not exist in the allowlisted repositories.
    • kind/chore exists in all seven repositories but may include trivial changes.

    Maintainers must choose the qualifying label before this badge can run.

    security-sentinel — Security Sentinel

    Proposed rule: At least one merged PR authored by a human and carrying the security label.

    The label is the machine-detectable qualification signal.

    Open decisions:

    • Should event/security-slam* PRs also count? They mark a security event and may not all represent actual fixes.
    • Should the security label be created in sistent and layer5io/docs, where it is currently missing?

    The label exists in layer5, meshery, meshery-operator, meshsync, and meshery.io.

    continuous-contributor — Continuous Contributor

    Proposed rule:

    • At least one qualifying merged PR per month for three consecutive UTC calendar months.
    • Evaluate on the first day of each month for the preceding three completed calendar months.
    • Count merged PRs across the allowlisted repositories.

    The current draft counts merged PRs only.

    Slack-help routing remains unresolved. The forum poll was 6–5 in favor of folding qualifying Slack help into continuous-contributor rather than creating a dedicated badge. The current draft provisionally keeps Slack help in Track 5 pending maintainer sign-off.

    See Section 10, Decision 24.

    longevity-legend — Longevity Legend

    Proposed rule:

    • The contributor's first and latest qualifying merged PRs are at least 24 calendar months apart.
    • The latest qualifying PR must have been merged within the last six calendar months.
    • Evaluate across allowlisted repositories.

    hacktoberfest-contributor — Hacktoberfest Contributor

    Status: Seasonal and provisional.

    • Evaluate through a cron on November 1.
    • Use a current-year slug, such as hacktoberfest26.
    • Provisional threshold: at least one qualifying merged PR by a human during October (UTC) in an allowlisted repository.
    • The 2026 slug must be created in Cloud before the job can award it.
    • Final campaign criteria require maintainer confirmation.

    New Track 3 Badges

    first-release — First Release

    Status: New, proposed.

    Recognizes a contributor whose qualifying change reaches users in a stable release.

    Trigger: release: published in an allowlisted repository.

    Rules:

    • Only stable releases count. Draft releases and pre-releases do not qualify.
    • The job identifies merged PRs included in the release, using changes since the previous stable release.
    • Each human author with a qualifying PR shipped in that release receives the badge if they do not already hold it.
    • Track 2 exclusions determine which PRs qualify, subject to the final rule approved by maintainers.
    • Repositories that never publish stable releases cannot trigger this badge. Maintainers must decide whether this limitation is acceptable.

    Higher recognition for shipping in several releases is a tier candidate.

    See Section 10, Decision 20.

    meshery-explorer — Meshery Explorer

    Status: New, proposed.

    Recognizes contributors who work across different parts of the ecosystem.

    Proposed rule:

    • Count the allowlisted repositories where the contributor has at least one qualifying merged PR.
    • Award at three or more distinct repositories.
    • Evaluate monthly.
    • The proposed threshold is three repositories, subject to maintainer confirmation.
    • The proposed counting period is all time, subject to maintainer confirmation.

    Potential tiers could recognize activity across three, five, or seven repositories. These thresholds are placeholders.

    See Section 10, Decision 21.

    bug-hunter — Bug Hunter

    Status: New, proposed.

    Recognizes consistent, high-quality issue reporting. Unlike code-cleanup-crew, which rewards merged PRs, this badge rewards issues opened by contributors.

    Proposed rule:

    • At least N quality issues authored by a human in allowlisted repositories within a defined time window.
    • The community discussion suggested more than ten issues over a set period as an example, not an approved threshold.
    • A maintainer must confirm which issues count, for example through a qualifying label or closure as completed.
    • This quality check is intended to prevent spam issue reporting.

    The threshold, time window, and quality signal require maintainer approval.

    See Section 10, Decision 22.


    6. Track 4 — Manual Recognition

    Track 4 uses Strategy D when reliable machine-readable triggers are unavailable.

    community — Community

    • Community Manager nomination through an issue template in layer5io/recognition.
    • The template still needs to be created.
    • A maintainer awards the badge through the manual award flow.

    meshmate — MeshMate

    • Awarded upon official mentorship-program onboarding.
    • Automation requires one authoritative roster, such as a GitHub team or maintained file.
    • The authoritative source remains an open decision.

    cncf-ambassador and docker-captain

    • Maintainers manually verify credentials against external directories.
    • Awards are then dispatched through the manual award flow.

    ui-ux — UI/UX (Design Work Only)

    • Covers flyers, promotions, and other graphic design work that cannot be detected through a qualifying PR.
    • Contributors submit nominations through an issue template in layer5io/recognition.
    • Maintainers verify the evidence and award the badge manually.

    advocate — Advocate

    Status: New, proposed.

    Recognizes verified advocacy outside the repository, including talks, videos, tutorials, technical blogs, and social posts about Meshery.

    • Contributors submit evidence links through an issue template in layer5io/recognition.
    • A maintainer checks the evidence and awards the badge through the manual award flow.
    • Automated scraping is not proposed for the initial implementation because social platforms are difficult to track reliably.
    • Future keyword searches for Meshery mentions could help identify candidates, but a maintainer must still verify the evidence.
    • A tier based on the number of verified items is a candidate.

    The slug, submission template, evidence rules, and any future partial automation require decisions.

    See Section 10, Decision 23.

    Ad-Hoc Recognition

    Maintainers, Community Managers, and MeshMates may use the manual award flow to recognize exceptional work that no script can measure.

    Who may award badges depends on the decision about the existing manual award flow.


    7. Track 5 — Peer Recognition

    Track 5 is new and uses Strategy E.

    It recognizes contributions that may not show up in merged PRs, such as:

    • Unblocking another contributor.
    • Helping newcomers.
    • Providing useful technical guidance.
    • Supporting users and contributors in Slack.

    It requires Slack-to-Layer5 identity mapping, a Cloud location to store kudos, and a defined location for the Slack command.

    See Section 10, Decisions 12, 14, and 15.

    7.1 Kudos: Events, Not Badges

    A kudos is a thank-you from one person to another. Each kudos is stored as an event in Cloud and counted for the recipient.

    Intake in GitHub

    • A contributor comments /kudos @user reason on a PR.
    • After a PR merges, the bot may prompt the author to recognize someone who helped.
    • The command records the kudos event.

    Intake in Slack

    • A contributor uses /kudos @user reason.
    • The command posts to #recognition and records the event in Cloud.

    The command's implementation location and authorization mechanism must be defined before rollout.

    Limits and Validation

    • Weekly cap: Each person can give at most 3 kudos per UTC week. The forum proposal was 2–3. Maintainers confirm the final number.
    • Reason: A reason is required.
    • Link: A link to the PR or Slack thread must be included.
    • PR participation: A kudos on a PR counts only if the recipient participated in that PR by commenting, reviewing, or committing.
    • Slack verification: Slack kudos cannot currently be checked automatically. Maintainers audit a sample each month.
    • Self-kudos: Not permitted.
    • Bots and system users: Bots and l5io cannot give or receive kudos.
    • Mutual kudos: Repeated reciprocal kudos between two people are flagged for maintainer review.
    • Excluded signals: Co-authored-by trailers and emoji reactions are not used because they are noisy or easy to game.

    7.2 Community Guide

    Proposed slug: community-guide

    Proposed rule:

    • On the first day of each month, count the unique kudos givers who recognized each recipient during the preceding UTC calendar month.
    • A recipient becomes a candidate after reaching N distinct givers.
    • Multiple kudos from the same giver count once toward this badge for that month.
    • Underlying kudos events remain available for auditing.
    • A maintainer confirms the award.
    • The badge is awarded once per person. Repeat awards are skipped.

    Counting unique givers reduces the impact of repeated kudos from the same small group. Weekly limits, required reasons, mutual-kudos flags, and maintainer confirmation provide additional safeguards.

    The unique-giver threshold N remains open.

    See Section 10, Decision 16.

    7.3 Mentor of the Month

    Proposed slug: mentor-of-the-month

    This badge is separate from Community Guide. Both use the same kudos data and the same counting method (unique givers), but each is awarded independently.

    Proposed process:

    1. On the first day of each month, identify the top five recipients by unique kudos givers during the previous month.
    2. Contributors vote for one nominee during a defined voting window.
    3. Each person gets one vote and cannot vote for themselves.
    4. During the initial rounds, regular contributors participate in voting.
    5. Maintainers perform a final check for spam, reciprocal favoritism, and vote trading.
    6. The winner receives the badge.

    Open details include:

    • Who qualifies as a regular contributor.
    • Whether voting occurs through a Slack poll or forum poll.
    • How ties are handled.
    • Whether each month receives its own badge slug or one slug with a counter.

    See Section 10, Decision 17.


    8. Tiered Recognition

    The community discussion supported graduated recognition, including a path from an initial contribution to sustained contribution, reviewing, and mentoring.

    All tier structures in this section are Proposed and need maintainer confirmation.

    Proposed Recognition Path

    The path below is a progression map, not a mandatory gating system. Contributors may earn individual badges independently unless maintainers explicitly approve prerequisites.

    Level Recognition Proposed Evidence / Milestone
    Contributor first-contribution — Universal First-Timer First qualifying merged PR across any allowlisted repository
    Consistent Contributor continuous-contributor — Continuous Contributor At least one qualifying merged PR in each of three consecutive UTC calendar months
    Reviewer review-rockstar — Review Rockstar At least 25 distinct qualifying PR reviews, subject to the Track 3 review rules
    Mentor / Champion mentor-of-the-month, community-guide, or manual community recognition Sustained support for other contributors, supported by unique-giver recognition and/or a maintainer-reviewed nomination

    The ladder must not imply automatic promotion or mandatory prerequisites unless maintainers explicitly choose a gated model.

    Graduated Repository Badges

    Poll 1 chose "both": a universal first-timer badge plus graduated repo badges.

    • The existing repo badges (sistent-contributor, meshery, meshery-operator, meshsync, meshery-docs, meshery-catalog, landscape, ui-ux) stay as the first level, earned at the first qualifying merged PR.
    • Higher levels could use the number of qualifying merged PRs in that repo. Thresholds are for maintainers to set.
    • PR count alone does not show quality. Maintainers may also count PRs carrying impact/architectural toward higher levels.

    Other Tier Candidates

    • architectural-impact
    • community-guide
    • meshery-explorer
    • bug-hunter
    • first-release, for shipping in multiple releases
    • advocate, based on the number of verified advocacy items

    Default approach: Track 1 firsts and Track 4 credentials remain single badges unless maintainers decide otherwise.

    Cloud implementation question: Tiers could use a separate slug per tier or a tier field on the badge. Maintainers must decide how to represent tiers in Cloud, how tiers are named (numbers, metals, or role titles), and whether the progression is display-only or gated.

    See Section 10, Decision 19.


    9. Suggestions Considered and Not Adopted

    Cross-Repository Review Activity as a Separate Badge

    review-rockstar already measures reviews across allowlisted repositories.

    Review quality cannot be fully measured by a script. Kudos and the architectural-impact label provide additional ways to recognize high-quality contributions.

    Automatic Awards from Co-authored-by Trailers

    Not adopted because AI tools can add these trailers and the signal is easy to game.

    Verified kudos on a PR are proposed instead.

    Emoji Reactions as Awards

    Not adopted because reactions are noisy and easy to manipulate.

    Scraping Social Platforms

    Not proposed for initial implementation because scraping is fragile and unreliable.

    The proposed Advocate badge uses submitted evidence links and maintainer verification.

    Slack Help Routing: Poll 2

    The poll was 6–5 in favor of including qualifying Slack help in continuous-contributor, rather than creating a dedicated badge.

    The current draft provisionally keeps Slack help in Track 5 pending maintainer sign-off. This does not yet implement the narrow poll plurality.

    Maintainers must decide whether to adopt the poll outcome or retain the current routing.

    See Section 10, Decision 24.


    10. Open Decisions Before Implementation

    The following decisions must be resolved before implementing the affected automation.

    Decision 1 — Identity Mapping

    Affects: Tracks 2, 3, and 5, and gitops-connected in Track 1.

    Which method should resolve a GitHub identity to a Layer5 user?

    Options include:

    Additional questions:

    • Is a Cloud lookup endpoint needed, and who will build it?
    • What role and organization should the bot account have to award badges to any contributor?
    • What proportion of users have a linked GitHub login? Can aggregate counts be obtained from Kratos?

    This blocks gitops-connected, all Track 2 badges (including first-contribution), and GitHub-derived Track 3 badges.

    catalog-designer does not need this mapping because Cloud already knows the publishing user.

    Decision 2 — Applications Product Status

    Affects: first-application.

    Should first-application be permanently archived, or is a replacement product concept planned?

    Decision 3 — Deployment and Session Telemetry

    Affects: first-deployment, first-interactive-terminal-session, and first-log-streaming-session.

    What HTTP endpoint or telemetry contract should Meshery Server call in Layer5 Cloud to report successful deployments and opened terminal/log sessions?

    Decision 4 — Meshery Docs Slug

    Affects: meshery-docs.

    Should the canonical badge slug in Cloud and badgesInfo.json be meshery-docs or docs?

    Decision 5 — Missing and Proposed Slugs

    Affects: Existing badges with missing slugs and new proposed badges.

    The following existing slugs must be created if they are still missing:

    • landscape
    • writers-program
    • hacktoberfest26

    The meshery-docs slug is covered by Decision 4.

    The following proposed slugs must also be checked and created if absent:

    • architectural-impact
    • first-contribution
    • catalog-designer
    • first-release
    • meshery-explorer
    • bug-hunter
    • advocate
    • community-guide
    • mentor-of-the-month

    Decision 6 — Writers Program Scope

    Affects: writers-program.

    Should publications in meshery/meshery.io (collections/_posts/**) count alongside layer5io/layer5:src/collections/blog/**?

    Decision 7 — Review Quality Threshold

    Affects: review-rockstar.

    Should a review require a comment or minimum body length so empty approvals are excluded?

    Decision 8 — Cleanup Labels

    Affects: code-cleanup-crew.

    kind/cleanup and area/refactor do not currently exist in the allowlisted repositories.

    Should maintainers create one of these labels, or should the badge use kind/chore, which exists everywhere but is broader and may include trivial changes?

    Decision 9 — Security Label Scope

    Affects: security-sentinel.

    Should event/security-slam* PRs count toward this badge?

    Should the security label be created in sistent and layer5io/docs, where it is currently missing?

    Decision 10 — Hacktoberfest Criteria

    Affects: hacktoberfest-contributor.

    Should Layer5 retain the historical threshold of at least one merged PR, or adopt external campaign criteria, such as Hacktoberfest's own PR-count requirements?

    Decision 11 — MeshMate Source of Truth

    Affects: meshmate.

    What authoritative roster should determine MeshMate appointments: a GitHub team or a maintained file?

    Decision 12 — Manual Award Flow and Slack Commands

    Affects: Track 4 badges and Track 5 kudos intake.

    Where does the Slack /award-badge command live, and how does it authenticate? It is not present in layer5io/recognition.

    The same questions apply to the proposed Slack /kudos command.

    Decision 13 — Track 3 Allowlist

    Affects: Track 3 badges.

    Should Track 3 evaluators use the same seven repositories as Track 2, or a different list?

    For example, should layer5io/recognition be included?

    Decision 14 — Slack Identity Mapping

    Affects: Track 5.

    How should a Slack user map to a Layer5 user and, where necessary, a GitHub login for PR kudos?

    Who will implement this mapping?

    Decision 15 — Kudos Storage

    Affects: community-guide and mentor-of-the-month.

    Where should Cloud store kudos events, and who will build the endpoint called by the GitHub bot and Slack command?

    Decision 16 — Community Guide Threshold

    Affects: community-guide.

    What is the minimum number N of distinct kudos givers required during a UTC calendar month?

    What should the maintainer-confirmation process look like?

    The proposed model counts unique givers rather than total kudos to address the anti-gaming concern raised in the forum. The same counting is used for Mentor of the Month nominees.

    Decision 17 — Mentor of the Month Voting

    Affects: mentor-of-the-month.

    • Who qualifies as a regular contributor?
    • Where will voting occur: a Slack poll or a forum poll?
    • How will ties be handled?
    • Does each month get its own slug or use one slug with a counter?

    Decision 18 — Architectural Impact Label and Rubric

    Affects: architectural-impact.

    • What is the final badge name? The forum suggested "Code Craftsman".
    • Who may apply impact/architectural?
    • What should the written rubric say?
    • Who will create the label across all seven repositories?

    Decision 19 — Tiers and Graduated Recognition

    Affects: Candidate tiered badges, graduated repo badges, and the proposed Contributor → Consistent Contributor → Reviewer → Mentor / Champion path.

    • Should the path be display-only or require previous badges?
    • Which badges should have tiers?
    • What should the tier names and thresholds be?
    • For repo badges, do higher levels use PR count, impact/architectural PRs, or both?
    • Should Cloud use one slug per tier or a tier field?

    Decision 20 — First Release Rules

    Affects: first-release.

    • Does any qualifying merged PR count, or only Track 2 qualifying PRs?
    • How should merged PRs be mapped to a release?
    • What happens for repositories that do not publish stable releases?

    Decision 21 — Meshery Explorer Threshold

    Affects: meshery-explorer.

    Is the threshold three different repositories? Should the count cover all-time qualifying contributions or a defined window?

    Decision 22 — Bug Hunter Threshold and Quality Signal

    Affects: bug-hunter.

    • What is the minimum issue count N?
    • What time window applies?
    • What qualifies as a quality issue: closure as completed, a maintainer-applied label, or another signal?

    Decision 23 — Advocate Evidence

    Affects: advocate.

    What evidence qualifies for advocacy recognition, and is any partial automation worth exploring later?

    Decision 24 — Slack Help Routing

    Affects: continuous-contributor and Track 5.

    The Poll 2 result was 6–5 in favor of including qualifying Slack help in continuous-contributor.

    Should the poll outcome be adopted, or should Slack help remain in Track 5?

    The qualifying Slack-help event and its verification method must be defined before implementation.

    Decision 25 — Weekly Kudos Cap

    Affects: Track 5 kudos intake.

    Should the limit be two or three kudos per giver per UTC week? The forum proposed 2–3. This draft uses 3.

    Decision 26 — Recognition Profile Synchronization

    Affects: Layer5 Cloud and the Discussion Forum.

    Should recognitions be displayed across both Layer5 Cloud and the Discussion Forum?

    Maintainers must decide:

    • Which system is the source of truth for awards?
    • How will Cloud and forum identities be mapped?
    • Will synchronization be display-only or bidirectional?

    Decision 27 — First Contribution Backfill

    Affects: first-contribution.

    The badge uses the Track 2 CI workflow. The open questions are:

    • Should a one-time backfill award the badge to existing contributors?
    • Should the backfill send notification emails, or award silently?
    • How far back does the history go?

    Decision 28 — Catalog Designer Qualification

    Affects: catalog-designer.

    Define:

    1. What constitutes a verified catalog design

    A verified catalog design is a design whose catalog request has status approved.

    The request statuses are pending, approved, and denied. A request reaches approved in two ways:

    1. Curator approval. A user publishes and the request is saved as pending. A curator then approves it in changeCatalogRequestStatus. This requires the CatalogManagementApproveCatalogRequest permission and non-empty catalog data. The design becomes Published.
    2. Auto-approval. An admin or curator publishes in PublishCatalogPattern. The request is saved as approved immediately.

    The badge check must run in both places. Checking only the curator path would miss auto-approved publishes.

    Only pending requests can be approved or denied. Approval is therefore final.

    The design owner is available in both paths, so no GitHub identity mapping is needed. In the approval path the owner comes from the design record (dbPattern.UserID).

    Duplicate-request behavior. Before creating a request, PublishCatalogPattern looks up any existing request for the design and refuses to create another one, whatever its status. A design therefore has at most one catalog request in its lifetime. Re-publishing the same design cannot count twice. To count in a later month, the user must publish a different design.

    Open point (needs maintainer decision). Unpublishing makes the design private but leaves its approved request row unchanged. The design creator or a curator can unpublish. Maintainers should decide whether an unpublished design still counts toward the streak. To exclude unpublished designs, the check must also require the design's current visibility to be Published.

    2. Whether Cloud records catalog publish events with a usable timestamp

    Partly.

    • The catalog_requests table has created_at and updated_at. It has no approved_at column.
    • The row is saved when the request is created and saved again on curator approval. Unpublish does not save the row. For an approved request, updated_at is therefore a usable approval time.
    • Auto-approved requests are saved once, so created_at and updated_at are the same.
    • Approval also records an event (category catalog_request, action approve). That event is owned by the approving curator, not the design owner. It is not suitable as the primary source for the owner's streak.
    • The table has no user ID column. The owner is found by joining content_id to the design's user_id.

    Recommended data source: catalog_requests.updated_at where status = 'approved', joined to the design owner through content_id.

    Verified: UnPublishCatalogPattern sets the design's visibility to Private, saves the design, records an unpublish event, and dispatches a catalog-delete workflow. It does not save or delete the catalog_requests row, and no server code deletes from catalog_requests. The request row, including its updated_at approval time, therefore survives unpublish.

    3. UTC month-boundary behavior

    • created_at and updated_at are timestamp without time zone. The database stores no zone label.
    • The Cloud code sets no timezone. The Dockerfiles and database.yml set no TZ value.
    • The pop library (v4.13.1) stamps these columns with time.Now() in the server's local zone, and no .UTC() conversion is applied.
    • The stored time is therefore UTC only if the server clock runs in UTC.

    Proposed rule: Count calendar months in UTC. The check must explicitly interpret stored values as UTC, for example with .UTC() in Go, and must use UTC month boundaries (first day 00:00:00 UTC to last day 23:59:59 UTC).

    Needs maintainer confirmation: run date inside a production Cloud pod and confirm it reports UTC. If the production clock is not UTC, historical rows need conversion before this rule is applied.

    Remaining dependencies

    • The catalog-designer slug must be created in the Meshery org by a maintainer.
      • The badge image must be created in layer5io/recognition under static/assets/badges/catalog-designer/. It does not exist yet.

    Decision Impact Matrix

    Open Decision Affects Blocks Implementation?
    Identity mapping gitops-connected, all Track 2 badges (including first-contribution), GitHub-derived Track 3 badges Yes
    first-contribution backfill Universal First-Timer No for live awards; yes for the one-time backfill
    catalog-designer qualification and Cloud publish event Consistent Catalog Designer Yes
    Applications product status first-application Yes
    Cloud deployment/session contract first-deployment, terminal-session and log-streaming badges Yes
    meshery-docs slug meshery-docs Yes
    Missing or proposed slugs landscape, writers-program, hacktoberfest26, and proposed badges Yes, for each affected badge until its slug exists
    Publications in meshery.io writers-program No; implementation can initially use Layer5 blog posts
    Review minimum content review-rockstar No; implementation can initially use the current review rule
    Cleanup labels code-cleanup-crew Yes
    Security label scope and event/security-slam* security-sentinel No; it can initially use the existing security labels and count only qualifying labeled PRs
    Hacktoberfest criteria hacktoberfest-contributor Yes, for final seasonal cron configuration
    MeshMate roster meshmate No; manual awards can continue
    Manual award flow and Slack command location Track 4 badges and /kudos No for Track 4; yes for kudos automation
    Track 3 allowlist Track 3 badges No; it can initially use the Track 2 allowlist
    Slack identity mapping and kudos storage community-guide, mentor-of-the-month Yes
    Community Guide unique-giver threshold community-guide Yes
    Weekly kudos cap Track 5 kudos intake No; it can start with 3 per week
    Slack-help routing continuous-contributor and Track 5 Yes for the final routing decision; the current draft remains provisional
    Mentor of the Month voting details mentor-of-the-month No; initial rounds can be handled manually
    Architectural-impact label, name, and rubric architectural-impact Yes
    Tiers and graduated recognition path Candidate tiered badges, graduated repo badges, and the proposed progression path No for independent badge awards; yes if gated progression is selected
    Recognition profile synchronization Cloud and Discussion Forum recognition display No for badge-award automation; yes for cross-platform synchronization
    First Release rules first-release Yes
    Meshery Explorer threshold meshery-explorer No; three repositories can be used as a provisional threshold
    Bug Hunter threshold and quality signal bug-hunter Yes
    Advocate evidence rules advocate No; manual verification can be used initially

    Implementation Principles

    To keep implementation maintainable and avoid premature scope expansion:

    1. Resolve identity mapping before enabling automatic awards that require a Layer5 user ID.
    2. Verify badge slugs in Cloud before triggering awards for them.
    3. Keep automated rules deterministic. Use explicit paths, labels, event types, and calendar windows rather than subjective code heuristics.
    4. Preserve idempotency. Replayed events must not generate duplicate awards or notifications.
    5. Use maintainer verification where automated quality judgments are unreliable.
    6. Treat poll outcomes as community input, not automatically approved implementation requirements. Document maintainer decisions when they differ from poll outcomes.
    7. Establish historical baselines before first-time or consecutive-period awards begin.
    8. Keep proposed badges and unresolved thresholds clearly marked until maintainers approve them.
    9. Avoid introducing additional infrastructure unless an approved requirement needs it.
    10. Keep the recognition progression non-gated by default. Any mandatory tier prerequisites require an explicit maintainer decision.

    Summary

    This proposal defines a structured recognition system spanning product events, repository activity, derived contribution metrics, manual recognition, and peer recognition.

    The two new poll-driven proposals are:

    • first-contribution — Universal First-Timer (Track 2), recognizing a contributor's first qualifying merged PR across the allowlisted ecosystem.
    • catalog-designer — Consistent Catalog Designer (Track 1), recognizing verified catalog publishing in three consecutive UTC calendar months.

    The proposal also introduces a concrete graduated recognition path:

    Contributor → Consistent Contributor → Reviewer → Mentor / Champion

    The path is a proposed progression map, not an automatic promotion system.

    Before implementation, maintainers should resolve the blocking identity, event, slug, qualification, and integration decisions documented above. Remaining thresholds and policy choices should be explicitly approved or retained as provisional rather than silently treated as settled.

  7. Maanvi212006 commented on Oct 6, 2026

    @Maanvi212006
    Contributor

    Reviewed the proposal and these are few things and open questions that need to be resolved before moving forward.

    Track 1:

    • Cloud awards inline in handlers, so the proposal's "asynchronous event listener" isn't needed.
    • Awards are idempotent: assignBadge skips a badge the user already holds.
    • Track 1 status: 1 badge done, 1 to archive, 9 to build.
    Badge Issues Suggestions Open Questions
    design-pioneer The slug is wrong, and this badge is already implemented. Cloud awards first-design on a new design, a clone and an import (meshery_patterns.go), and skips anonymous users. The main save handler has the same award block twice (lines ~475 and ~509). Change the slug to first-design and mark the badge as already implemented. Remove the duplicate block (harmless, since awards are idempotent). NA
    first-application Cloud has no applications feature: no model, table or DAO found. The "Cloud Applications DB" source doesn't exist. Archive the badge or redefine it. Are applications deprecated?
    first-share No award code exists. There are two share paths: the public toggle (users.go share handler) and the access grant (resources.go:209). New designs are Public by default, so visibility alone must not trigger it. Award the owner after either share action, for designs only. Count public toggle and grants to a user, team or org. NA
    first-deployment No deploy endpoint or event in Cloud, and Meshery has no badge-related code. Deploys run in Meshery Server. Meshery Server reports a successful, real deploy to Cloud (not dry-run, validate or undeploy), and Cloud awards on receipt. This is cross-repo work. Agree on a new Cloud endpoint for Meshery to call?
    first-interactive-terminal-session, first-log-streaming-session No endpoint or model in Cloud, and Meshery sends nothing for either. The title for the second is "Log Streamer". Same mechanism as first-deployment. Define the trigger as "session opened". Cross-repo work. NA
    need-for-speed No award code exists. StoreResults stores a result without checking whether the run passed. The source is results, not profiles. Award after AddMesheryResult succeeds in StoreResults. Define the trigger as "first result published to Cloud". Ignore UpdateResultsWithMetrics. NA
    first-collaborator No award code exists. The websocket hub tracks presence only, not saves. An admin edit would also look like a collaborator edit. In the save handler, when an existing design is updated by someone other than the owner, award the owner. Exclude admin edits. NA
    bring-a-buddy No award code exists. The site says "invite", the proposal says "accepts". Open-org links would reward the inviter for every stranger who joins. Hook the appended branch in AcceptInvitation. Award invitation.Owner. Exclude open-org invites and self-invites. NA
    gitops-connected The GitHub webhook is a scaffold with no installation logic. The event carries a GitHub account, not a Layer5 user. Add an installation branch for action created. Ignore deleted and suspend. Reuse the shared GitHub-to-Layer5 user mapping. How should a GitHub account be mapped to a Layer5 user?
    meshmap-snapshot Both meshmap-snapshot (created 2023) and kanvas-snapshot (created 2025) exist in the live API with identical descriptions. The upload endpoint doesn't check for a PR. Use kanvas-snapshot (the one the badge site lists) and retire the other. Award in the success branch of PostGithubArtifact, which already knows the Layer5 user. Accept any successful snapshot upload. NA

    Track 2:

    • All badges: skip authors of type Bot and the user l5io. Match the author by GitHub login or ID, not commit email.
    Badge Issues Suggestions Open Questions
    sistent-contributor packages/** doesn't exist. system/** is docs only. Tests, src/assets/** and lockfile/config files (package.json, tsconfig.json, Makefile) would qualify bot and bump PRs. Count only src/** and examples/**. Exclude tests, src/assets/**, system/**. Drop config and lockfiles. NA
    meshery Root main.go doesn't exist. models/** is about 26,000 generated JSON files and is also under meshery-catalog. install/** is Helm/YAML. ui/** includes docs, tests and scripts. go.mod is touched by Dependabot. Count only server/**, mesheryctl/**, ui/**, provider-ui/**. Exclude tests, ui/docs, ui/public, ui/scripts. Remove models/**, install/**, main.go, go.mod. NA
    meshery-operator Root main.go doesn't exist (it is cmd/main.go). bundle/**, config/** and zz_generated.* are generated. go.mod and go.sum are mostly Dependabot. Count only controllers/**, api/**, pkg/**, cmd/**. Exclude generated files, bundle/**, config/** and tests. Drop go.mod, go.sum. NA
    meshsync plugins/** and cache/** don't exist. The meshsync/ folder is missing from the rule. go.mod and go.sum are mostly Dependabot. Count only internal/**, pkg/**, meshsync/**. Exclude tests and integration-tests/**. Drop go.mod, go.sum. NA
    meshery-docs Slug doesn't exist in Cloud (site: meshery-docs, handbook: docs). pages/** doesn't exist. meshery/docs is a whole Hugo site, and much of it is synced by l5io or is theme, data or meeting notes. Create the slug. Count only .md under docs/content/** (meshery) and content/** (layer5io/docs). Exclude catalog, integrations, data, meetings, static, layouts, assets, archive, proposals. Use meshery-docs or docs?
    meshery-catalog collections/catalog/** doesn't exist (real: collections/_catalog/). catalog/** and _catalog are mostly bot-synced by l5io. models/** is also under meshery. 21 files under models/ have a bad extension that *.json misses. Use catalog/** and collections/_catalog/** in meshery.io, plus any file under models/ in meshery. Keep models/** only here. NA
    landscape Slug doesn't exist in Cloud. Path src/collections/landscape/** is correct (8 files) but narrow; the badge description says "layer5.io website". Create the slug. Keep the narrow path and fix the description. NA
    ui-ux Labels area/ui and area/ux don't exist in meshery. Since 2026-07-01 only component/ui is used (168 of 549 PRs in meshery; 0 in sistent and layer5). layer5 src/** includes blog content. Flyer and design work can't be detected from a PR. meshery: label component/ui + ui/** or provider-ui/**. sistent: src/**, system/**, no label. layer5: src/components, src/sections, src/reusecore, theme, templates, pages, no label. Exclude tests, lockfiles, src/collections, src/assets. Flyers: manual award. NA

    Track 3:

    Badge Issues Suggestions Open Questions
    writers-program Slug missing in Cloud. "Published project docs" is vague, and edits to old posts would count like new posts. Create the slug. Count only PRs that add a new .md/.mdx post under src/collections/blog/**. Award at 2 by human authors (no bots, no l5io). Drop "project docs" until it has a path list. Should meshery.io posts (collections/_posts) count?
    review-rockstar "Substantive" is not measured: an empty approval counts like a detailed review. Repo scope, repeat reviews and self-reviews are undefined. Count one review per PR, on PRs by other humans, at 25 across allowlisted Layer5 repos. Exclude self-reviews and bot PRs. NA
    code-cleanup-crew Labels are not checked to exist in every repo. chore is broad, so 5 PRs may be too easy. Count 5 merged PRs by human authors with any agreed label that exists in the repo, across allowlisted repos. Should kind/chore count?
    security-sentinel The security label exists only in meshery and layer5 (62 merged PRs, all in meshery). Advisories can't be checked automatically (needs admin rights). One mislabelled PR earns the badge. Award at 1 merged security PR by a human author. Drop "resolving advisories". Should event/security-slam* PRs count? Add the label to sistent and meshsync?
    continuous-contributor Unit, month type, repo scope and recency are undefined, so an old streak counts forever. In meshery/meshery, 7 of about 150 active people hit Jul, Aug and Sep 2026, so the rule is realistic. Merged PRs only, by humans. At least 1 per month for 3 consecutive UTC months, the latest being the month just ended. Count across Layer5 orgs. Skip users who already have the badge. Is any merged PR enough, or should there be a minimum size?
    longevity-legend "Active" is undefined. "2 calendar years" is too loose: in the meshery clone, 61 of 396 recent authors qualify, but only 16 have a 24+ month span. Active means at least 1 merged PR. Award when the first and latest PRs are at least 24 months apart and the latest is within 6 months. Count across Layer5 orgs. Skip users who already have the badge. NA

    Track 4:

    Badge Issues Suggestions Open Questions
    community "Community Manager nomination" is a manual decision with no trigger, and no nomination form, label or template exists in recognition. "Welcoming, encouraging, supporting" is not measurable. Mark as manual-only and out of automation. Add a nomination issue template in recognition, and a maintainer awards it with the existing flow. NA
    meshmate "Formal induction" has no recorded roster. The #116 plan says an org/role webhook awards it, but this proposal says leadership induction, so they conflict. Mark as manual-only. For automation, first define one roster (GitHub team or file) as the trigger. Is there a MeshMate roster or GitHub team, and which is the source of truth?
    cncf-ambassador "Community verification" is not a trigger. The CNCF list is external, and it has no Layer5 user IDs. Manual-only. A maintainer checks the public CNCF list and awards with the existing flow. NA
    docker-captain Same as cncf-ambassador, and the Docker page has no handles, so it can't be matched automatically. Manual-only, same as cncf-ambassador. NA
    hacktoberfest-contributor This is the 2023 slug, which the site lists as archived. Each year has its own slug (hacktoberfest-24-contributor, hacktoberfest25), and none exists for 2026. "Participation" is undefined, and nothing in recognition automates it. Create a yearly slug (e.g. hacktoberfest26). Award at 1 merged PR by a human author in allowlisted Layer5 repos during Oct 1-31 UTC, run by the monthly cron at month end. Skip users who already have the badge. Is 1 merged PR enough, or should Hacktoberfest's own 6-PR rule apply?
  8. PARTH-TUSSLE commented on Oct 6, 2026

    @PARTH-TUSSLE
    ContributorAuthor

    Reviewed the proposal and these are few things and open questions that need to be resolved before moving forward.

    Track 1:

    • Cloud awards inline in handlers, so the proposal's "asynchronous event listener" isn't needed.
    • Awards are idempotent: assignBadge skips a badge the user already holds.
    • Track 1 status: 1 badge done, 1 to archive, 9 to build.

    Badge Issues Suggestions Open Questions
    design-pioneer The slug is wrong, and this badge is already implemented. Cloud awards first-design on a new design, a clone and an import (meshery_patterns.go), and skips anonymous users. The main save handler has the same award block twice (lines ~475 and ~509). Change the slug to first-design and mark the badge as already implemented. Remove the duplicate block (harmless, since awards are idempotent). NA
    first-application Cloud has no applications feature: no model, table or DAO found. The "Cloud Applications DB" source doesn't exist. Archive the badge or redefine it. Are applications deprecated?
    first-share No award code exists. There are two share paths: the public toggle (users.go share handler) and the access grant (resources.go:209). New designs are Public by default, so visibility alone must not trigger it. Award the owner after either share action, for designs only. Count public toggle and grants to a user, team or org. NA
    first-deployment No deploy endpoint or event in Cloud, and Meshery has no badge-related code. Deploys run in Meshery Server. Meshery Server reports a successful, real deploy to Cloud (not dry-run, validate or undeploy), and Cloud awards on receipt. This is cross-repo work. Agree on a new Cloud endpoint for Meshery to call?
    first-interactive-terminal-session, first-log-streaming-session No endpoint or model in Cloud, and Meshery sends nothing for either. The title for the second is "Log Streamer". Same mechanism as first-deployment. Define the trigger as "session opened". Cross-repo work. NA
    need-for-speed No award code exists. StoreResults stores a result without checking whether the run passed. The source is results, not profiles. Award after AddMesheryResult succeeds in StoreResults. Define the trigger as "first result published to Cloud". Ignore UpdateResultsWithMetrics. NA
    first-collaborator No award code exists. The websocket hub tracks presence only, not saves. An admin edit would also look like a collaborator edit. In the save handler, when an existing design is updated by someone other than the owner, award the owner. Exclude admin edits. NA
    bring-a-buddy No award code exists. The site says "invite", the proposal says "accepts". Open-org links would reward the inviter for every stranger who joins. Hook the appended branch in AcceptInvitation. Award invitation.Owner. Exclude open-org invites and self-invites. NA
    gitops-connected The GitHub webhook is a scaffold with no installation logic. The event carries a GitHub account, not a Layer5 user. Add an installation branch for action created. Ignore deleted and suspend. Reuse the shared GitHub-to-Layer5 user mapping. How should a GitHub account be mapped to a Layer5 user?
    meshmap-snapshot Both meshmap-snapshot (created 2023) and kanvas-snapshot (created 2025) exist in the live API with identical descriptions. The upload endpoint doesn't check for a PR. Use kanvas-snapshot (the one the badge site lists) and retire the other. Award in the success branch of PostGithubArtifact, which already knows the Layer5 user. Accept any successful snapshot upload. NA
    Track 2:

    • All badges: skip authors of type Bot and the user l5io. Match the author by GitHub login or ID, not commit email.

    Badge Issues Suggestions Open Questions
    sistent-contributor packages/** doesn't exist. system/** is docs only. Tests, src/assets/** and lockfile/config files (package.json, tsconfig.json, Makefile) would qualify bot and bump PRs. Count only src/** and examples/**. Exclude tests, src/assets/**, system/**. Drop config and lockfiles. NA
    meshery Root main.go doesn't exist. models/** is about 26,000 generated JSON files and is also under meshery-catalog. install/** is Helm/YAML. ui/** includes docs, tests and scripts. go.mod is touched by Dependabot. Count only server/**, mesheryctl/**, ui/**, provider-ui/**. Exclude tests, ui/docs, ui/public, ui/scripts. Remove models/**, install/**, main.go, go.mod. NA
    meshery-operator Root main.go doesn't exist (it is cmd/main.go). bundle/**, config/** and zz_generated.* are generated. go.mod and go.sum are mostly Dependabot. Count only controllers/**, api/**, pkg/**, cmd/**. Exclude generated files, bundle/**, config/** and tests. Drop go.mod, go.sum. NA
    meshsync plugins/** and cache/** don't exist. The meshsync/ folder is missing from the rule. go.mod and go.sum are mostly Dependabot. Count only internal/**, pkg/**, meshsync/**. Exclude tests and integration-tests/**. Drop go.mod, go.sum. NA
    meshery-docs Slug doesn't exist in Cloud (site: meshery-docs, handbook: docs). pages/** doesn't exist. meshery/docs is a whole Hugo site, and much of it is synced by l5io or is theme, data or meeting notes. Create the slug. Count only .md under docs/content/** (meshery) and content/** (layer5io/docs). Exclude catalog, integrations, data, meetings, static, layouts, assets, archive, proposals. Use meshery-docs or docs?
    meshery-catalog collections/catalog/** doesn't exist (real: collections/_catalog/). catalog/** and _catalog are mostly bot-synced by l5io. models/** is also under meshery. 21 files under models/ have a bad extension that *.json misses. Use catalog/** and collections/_catalog/** in meshery.io, plus any file under models/ in meshery. Keep models/** only here. NA
    landscape Slug doesn't exist in Cloud. Path src/collections/landscape/** is correct (8 files) but narrow; the badge description says "layer5.io website". Create the slug. Keep the narrow path and fix the description. NA
    ui-ux Labels area/ui and area/ux don't exist in meshery. Since 2026-07-01 only component/ui is used (168 of 549 PRs in meshery; 0 in sistent and layer5). layer5 src/** includes blog content. Flyer and design work can't be detected from a PR. meshery: label component/ui + ui/** or provider-ui/**. sistent: src/**, system/**, no label. layer5: src/components, src/sections, src/reusecore, theme, templates, pages, no label. Exclude tests, lockfiles, src/collections, src/assets. Flyers: manual award. NA
    Track 3:

    Badge Issues Suggestions Open Questions
    writers-program Slug missing in Cloud. "Published project docs" is vague, and edits to old posts would count like new posts. Create the slug. Count only PRs that add a new .md/.mdx post under src/collections/blog/**. Award at 2 by human authors (no bots, no l5io). Drop "project docs" until it has a path list. Should meshery.io posts (collections/_posts) count?
    review-rockstar "Substantive" is not measured: an empty approval counts like a detailed review. Repo scope, repeat reviews and self-reviews are undefined. Count one review per PR, on PRs by other humans, at 25 across allowlisted Layer5 repos. Exclude self-reviews and bot PRs. NA
    code-cleanup-crew Labels are not checked to exist in every repo. chore is broad, so 5 PRs may be too easy. Count 5 merged PRs by human authors with any agreed label that exists in the repo, across allowlisted repos. Should kind/chore count?
    security-sentinel The security label exists only in meshery and layer5 (62 merged PRs, all in meshery). Advisories can't be checked automatically (needs admin rights). One mislabelled PR earns the badge. Award at 1 merged security PR by a human author. Drop "resolving advisories". Should event/security-slam* PRs count? Add the label to sistent and meshsync?
    continuous-contributor Unit, month type, repo scope and recency are undefined, so an old streak counts forever. In meshery/meshery, 7 of about 150 active people hit Jul, Aug and Sep 2026, so the rule is realistic. Merged PRs only, by humans. At least 1 per month for 3 consecutive UTC months, the latest being the month just ended. Count across Layer5 orgs. Skip users who already have the badge. Is any merged PR enough, or should there be a minimum size?
    longevity-legend "Active" is undefined. "2 calendar years" is too loose: in the meshery clone, 61 of 396 recent authors qualify, but only 16 have a 24+ month span. Active means at least 1 merged PR. Award when the first and latest PRs are at least 24 months apart and the latest is within 6 months. Count across Layer5 orgs. Skip users who already have the badge. NA
    Track 4:

    Badge Issues Suggestions Open Questions
    community "Community Manager nomination" is a manual decision with no trigger, and no nomination form, label or template exists in recognition. "Welcoming, encouraging, supporting" is not measurable. Mark as manual-only and out of automation. Add a nomination issue template in recognition, and a maintainer awards it with the existing flow. NA
    meshmate "Formal induction" has no recorded roster. The #116 plan says an org/role webhook awards it, but this proposal says leadership induction, so they conflict. Mark as manual-only. For automation, first define one roster (GitHub team or file) as the trigger. Is there a MeshMate roster or GitHub team, and which is the source of truth?
    cncf-ambassador "Community verification" is not a trigger. The CNCF list is external, and it has no Layer5 user IDs. Manual-only. A maintainer checks the public CNCF list and awards with the existing flow. NA
    docker-captain Same as cncf-ambassador, and the Docker page has no handles, so it can't be matched automatically. Manual-only, same as cncf-ambassador. NA
    hacktoberfest-contributor This is the 2023 slug, which the site lists as archived. Each year has its own slug (hacktoberfest-24-contributor, hacktoberfest25), and none exists for 2026. "Participation" is undefined, and nothing in recognition automates it. Create a yearly slug (e.g. hacktoberfest26). Award at 1 merged PR by a human author in allowlisted Layer5 repos during Oct 1-31 UTC, run by the monthly cron at month end. Skip users who already have the badge. Is 1 merged PR enough, or should Hacktoberfest's own 6-PR rule apply?

    Thanks Maanvi, this review is really helpful. I agree that the proposal needs to distinguish between existing Cloud award paths, GitHub-derived automation, cross-repo dependencies, and manual-only badges rather than treating all badges as the same automation problem. I'll revise the proposal into a badge-by-badge decision matrix, incorporate the concrete repository/path/threshold definitions you've suggested, and separate the remaining open questions that need community/product decisions before implementation.

  9. PARTH-TUSSLE commented on Oct 6, 2026

    @PARTH-TUSSLE
    ContributorAuthor

    @Maanvi212006 , I've update the proposal aligning with your review kindly take a look

  10. Maanvi212006 commented on Oct 6, 2026

    @Maanvi212006
    Contributor

    yes, just few more points:

    Area Issue Suggestion Open Questions
    Identity (Tracks 2, 3, hacktoberfest) The proposal says CI identifies contributors by GitHub login and numeric id, and that commit emails are never used. But Cloud needs the Layer5 userId, and nothing defines how one maps to the other. The above thread has not settled this: PR #122 uses commit email, and a GitHub ID lookup is only a proposed alternative. The mapping is listed as an open decision only for gitops-connected, but it blocks every CI badge. Add "GitHub id to Layer5 user mapping" to the open decisions as blocking Tracks 2 and 3. Remove the "commit emails are never used" invariant until the direction is decided, and state the chosen method once maintainers confirm it. Which identity method will be used: commit email (#122), GitHub ID via Kratos, or a layered mix? If a lookup is needed, who builds the Cloud endpoint? What role should the bot account have? What share of users have a linked GitHub login (Kratos counts)?
    review-rockstar Empty approvals count, and bot-authored PRs are not excluded. Exclude bot-authored PRs. Should a review need a comment or a minimum body to count?
    security-sentinel event/security-slam* now counts without discussion. Count only the security label, or restore this as an open question. Should event/security-slam* PRs count?
    Allowlist "Allowlisted repos" is used in Tracks 2 and 3 but the list is never given. List the repos in the proposal. NA
    ui-ux Flyer and design work is "recognized via Track 4", but Track 4 has no entry for it. Add a manual ui-ux entry to Track 4. NA
    meshmate, hacktoberfest-contributor The roster decision is in the matrix but missing from section 7. Hacktoberfest sits in Track 4 (manual) but uses Strategy C. Add the roster decision to section 7. Move Hacktoberfest to Track 3 or mark it as the exception. NA
  11. Maanvi212006 commented on Oct 6, 2026

    @Maanvi212006
    Contributor

    Updated the proposal!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area/ciContinuous integration | Build and release

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions