Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Product-Team-Conversion #247

Open
wants to merge 24 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/styles/config/vocabularies/Mautic/accept.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ OAuth
Packagist
PATCH
patch
Payoneer
PHP
PHPUnit
Pipedrive
Expand Down
71 changes: 71 additions & 0 deletions docs/contributing/mautic_bounty_programme.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
Mautic bounty programme
##########################

What follows is the Mautic project's approach to operating a bounty program for contributions to Mautic Core and officially supported Plugins via relevant GitHub repositories.

If you have feedback on this policy, please join the next team meeting on Slack in #t-product. Get an invite at :xref:`Mautic Community Slack`.

About the program
*****************

The Mautic core team is very small and always looking for new contributors to the Open Source codebase. Mautic's bounty program is an opportunity to address neglected yet important issues and also allows Mautic members to bring attention to issues they care about by providing a financial incentive. Contributors who fix issues with an associated bounty receive financial compensation through invoices on Open Collective, provided that their contribution meets all requirements and a core team member merges their pull request.

No compromise on quality
========================

Mautic requires all contributions to meet high standards. Pull requests are only accepted if they're:

* Completed to a high standard
* Fully covered by automated tests
* Prepared in a reasonable time frame, including prompt responses to feedback
* Resolving the linked issue in its entirety
* For bug fixes, submit the pull request against the upcoming major release branch - for example, 6.x - with a companion PR against the current minor release branch - for example, 5.1. You must meet all quality criteria, and wait for a maintainer to merge the PRs, for payout eligibility.

Mautic seeks **quality contributions only**. For general pull request guidelines, see the :xref:`Mautic-pr-requirements`.

A contribution is only approved for payment after a maintainers has merged all related pull requests.

Developers should only request to work on tasks and projects that they're confident of completing in their entirety, seen through to completion, and which they're capable of working on at their current knowledge and skill level.

Mautic's Product Team is happy to answer questions and provide some limited support, but don't have the capacity to mentor junior developers working on bounty issues - it's expected developers work on the task **without requiring direct support from the team**.

Workflow for bounty program contributors
****************************************

1. Verify that you can receive payments from Open Collective and create an account on :xref:`Open Collective`.
2. Look for issues with attached bounties: browse :xref:`bounty issues`.
3. Express interest by commenting on the issue and asking the Core Team to assign it to you.
4. Open a Pull Request **within 7 days** of assignment and request feedback and review.
5. Address feedback from the Core Team, if applicable, **within 7 days** of receiving it.
6. Wait for the core team to review the PR, approve it, and merge it.
7. Submit an invoice on Open Collective with links to the issue and PRs.
8. The Mautic Legal & Finance team reviews and approves payment requests where appropriate.
9. Receive payment from Open Collective - processed twice a week on Tuesdays and Thursdays.

If you live in certain countries, you may need to use a workaround like Payoneer. Review :xref:`Open Collective Payout Method` for more information.

Important notes
***************
* Some regions may not be eligible for Open Collective payments due to payment provider restrictions or trade limitations. Review the :xref:`Mautic Financial Policy` for details.
* Contributors are responsible for any tax obligations from program earnings. Open Collective may require :xref:`relevant tax forms` for withdrawals exceeding $600 per year.
* Discuss your participation with your employer to ensure that it complies with your employment terms.

Workflow for bounty providers
*****************************

If you wish to sponsor a bounty for a specific issue, follow these steps.

.. note::

Providing a bounty doesn't guarantee issue resolution, Core Team acceptance, prioritization, or a specific release date.

The Core Team or any Mautic member may contribute funds to the :xref:`Bounties Project` on Open Collective for a specific issue. Here's how:

1. Log in on Open Collective.
2. Navigate to the :xref:`Bounties Project`, then scroll to the Donation button.
3. Enter your donation amount, and select the appropriate :xref:`Organization` on the next screen if you want an organization to pay and/or display as the funding source. Otherwise it's associated to your individual profile.
4. Provide the necessary payment details and complete payment.
5. Comment on the issue with a link to the transaction and the amount added. A Triage Team member can update the issue title with the bounty amount and add the Bounty label.
6. Wait for a developer to work on the issue, or search for one.
7. When a pull request is available, test it thoroughly and provide an approval review on GitHub; this is **mandatory** for the Core Team to consider it for merging.
8. After merging the pull request and any companion pull requests, the contributor submits an invoice on Open Collective. The Core Team's Legal & Finance representative will review and approve it for payment.
11 changes: 10 additions & 1 deletion docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,22 @@ The vision is that it grows over time as the teams and governance structure evol
:hidden:

teams/legal_and_finance_team
teams/product_team/product_team_overview

.. toctree::
:maxdepth: 2
:caption: Policies
:hidden:

policies/request_for_proposals_(RFP)_process

.. toctree::
:maxdepth: 2
:caption: Contributing
:hidden:

contributing/google_summer_of_code
contributing/mautic_bounty_programme

.. toctree::
:maxdepth: 2
Expand All @@ -57,4 +66,4 @@ The vision is that it grows over time as the teams and governance structure evol
community_leadership/community_leadership_overview
community_leadership/current_leadership_team
community_leadership/leadership_role_definitions
community_leadership/community_council
community_leadership/community_council
7 changes: 7 additions & 0 deletions docs/links/Mautic Pull Request Requirements.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Mautic-pr-requirements"
link_text = "Mautic-pr-requirements"
link_url = "https://docs.mautic.org/contributing-to-mautic/developer/code/pull-requests"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/bounty_issues.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "bounty issues"
link_text = "bounty issues"
link_url = "https://github.com/search?q=label%3Abounty+owner%3Amautic&type=issues&state=open"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/bounty_project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Bounties Project"
link_text = "Bounties Project"
link_url = "https://opencollective.com/mautic/projects/bounties"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/idea_forum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Ideas and Feature Requests"
link_text = "Ideas and Feature Requests"
link_url = "https://forum.mautic.org/ideas"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/mautic_community_partners.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Mautic Community Partners"
link_text = "Mautic Community Partners"
link_url = "https://mautic.org/mautic-community-partners"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/mautic_financial_policy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Mautic Financial Policy"
link_text = "Mautic Financial Policy"
link_url = "https://docs.mautic.org/policies/financial-policy#10-foreign-assets-control"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/mautic_mail.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Mautic Mail"
link_text = "Mautic Mail"
link_url = "[email protected]"
RitaOC marked this conversation as resolved.
Show resolved Hide resolved

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/obs_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "OBS open-source project’s model"
link_text = "OBS open-source project’s model"
link_url = "https://github.com/obsproject/obs-studio/wiki/OBS-Project-Bounty-Program"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/open_collective.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Open Collective"
link_text = "Open Collective"
link_url = "https://opencollective.com"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/open_collective_organization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Organization"
link_text = "Organization"
link_url = "https://docs.opencollective.com/help/financial-contributors/organizations"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/open_collective_payment_mtd.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "Open Collective Payout Method"
link_text = "Open Collective Payout Method"
link_url = "https://opencollective.com"

link.xref_links.update({link_name: (link_text, link_url)})
7 changes: 7 additions & 0 deletions docs/links/relevant tax forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import link

link_name = "relevant tax forms"
link_text = "relevant tax forms"
link_url = "https://docs.opencollective.com/help/expenses-and-getting-paid/tax-information"

link.xref_links.update({link_name: (link_text, link_url)})
112 changes: 112 additions & 0 deletions docs/policies/request_for_proposals_(RFP)_process.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
Request for Proposals (RFP) Process
####################################

Background
**********
In 2020, we launched several Strategic Initiatives announced at Mautic Conference Global. Over the past two years, we have also seen numerous community-generated ideas for new features. Some of these ideas require funding and are at various stages of development.

Through experience, we have learned the importance of a well-defined Request for Proposals (RFP) process to manage projects that introduce new features or address major bug fixes in Mautic. Our approach is inspired by the :xref:`OBS open-source project’s model`.

Why Do We Need an RFP Process?
******************************
This process aims to establish an open and transparent workflow for large community-driven projects, whether they focus on new features or significant issue resolutions in Mautic. It provides a clear lifecycle from the initial idea through to release, allowing users to see how features and larger projects are added, worked on, and completed.

Additionally, the RFP process helps us better manage compensation for contributors working on these larger projects and provides a means for the community to financially support projects they value.

Workflow
********
The following steps outline the RFP workflow for new projects in Mautic:

1. A project idea is shared in the Mautic Community Forums under the :xref:`Ideas and Feature Requests` section for community discussion.
2. The Product Team reviews requested features with the Project Lead quarterly and determines which are candidates for consideration on the roadmap. Note that bugs (such as an integration needing to be upgraded or something else requiring considerable work) as well as features can also be considered for an RFP.

Check failure on line 21 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Google.Spacing] 'p. N' should have one space. Raw Output: {"message": "[Google.Spacing] 'p. N' should have one space.", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 21, "column": 147}}}, "severity": "ERROR"}
3. The Product Team collaborates with the original proposer to prepare a detailed RFP, including budget estimates from the Product Team and any necessary community fundraising. The Project Lead reviews this.
4. If the proposal impacts any areas covered by Tiger Teams, the Tiger Teams will be key stakeholders throughout the process of the RFP and be the final sign off before release.
5. Where the RFP is accepted, the Product Team publishes a RFP on GitHub Discussions describing in detail the feature, key requirements and deliverables, timelines, and the project budget available.

Check failure on line 24 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Vale.Spelling] Did you really mean 'deliverables'? Raw Output: {"message": "[Vale.Spelling] Did you really mean 'deliverables'?", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 24, "column": 141}}}, "severity": "ERROR"}
6. If further funding is required above what the Product Team can provide, the Proposal Status will be set to Fundraising until such a time as the required budget has been raised.
7. When the funding target has been reached, the proposal Status is set to Accepting Proposals.
8. Developers write proposals for how they would implement the feature described in the RFP.
9. The Mautic Core Team works with developers within the GitHub Discussion thread to clarify and refine their proposals.
10. A proposal is accepted. The developer(s) responsible for the proposal work to implement the feature according to their proposal.

Check failure on line 29 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Google.OptionalPlurals] Don't use plurals in parentheses such as in 'developer(s)'. Raw Output: {"message": "[Google.OptionalPlurals] Don't use plurals in parentheses such as in 'developer(s)'.", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 29, "column": 33}}}, "severity": "ERROR"}
11. Proposal status changed to In Progress
12. Pull requests are submitted to implement the proposal by the developers.
13. Initiative status changed to Under Review
14. Pull requests are reviewed by the Core Team, and the pull request developers make any changes to the pull requests accordingly.
15. Pull requests are merged into the appropriate branch.
16. Developer(s) submit an invoice to the Mautic Project Open Collective project for the amount associated with the RFP, which will be reviewed and approved for payment by the Project Lead.

Check failure on line 35 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Google.OptionalPlurals] Don't use plurals in parentheses such as in 'Developer(s)'. Raw Output: {"message": "[Google.OptionalPlurals] Don't use plurals in parentheses such as in 'Developer(s)'.", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 35, "column": 5}}}, "severity": "ERROR"}
17. Initiative status changed to Completed
18. Payment disbursed to developer(s) by the Open Source Collective from Mautic Project collective funds.

Check failure on line 37 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Google.OptionalPlurals] Don't use plurals in parentheses such as in 'developer(s)'. Raw Output: {"message": "[Google.OptionalPlurals] Don't use plurals in parentheses such as in 'developer(s)'.", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 37, "column": 26}}}, "severity": "ERROR"}

.. note::
:xref:`Mautic Community Partners` may propose up to three features per calendar year to be considered for RFP without going through community voting. These features still require approval by the Product Team and Project Lead.

How to Claim a Project
***********************
To ensure multiple contributors are not competing on the same project, and to streamline the merging process, follow these steps:

1. Read the Request For Proposal document completely.
2. If you want to move forward, submit a proposal to the Product Team on your suggested implementation by replying to the RFP posting. Be sure to include as many details as requested by the spec, and be sure to address each of the completion criteria. For proposals that include UI changes, mockups are strongly encouraged (we use Miro but whatever tool you use, please ensure that it has the ability for us to collaborate and provide feedback).

Check failure on line 47 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Vale.Spelling] Did you really mean 'mockups'? Raw Output: {"message": "[Vale.Spelling] Did you really mean 'mockups'?", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 47, "column": 292}}}, "severity": "ERROR"}
3. Be sure to consult the `Tips for Writing a Good Proposal <#tips>`_ for advice on how to author a good proposal.
4. Work with the Product Team to finalize plans for the best implementation. Proposals will be judged on their maintainability, design quality, and adherence to spec. Note that other developers may submit competing proposals at this time as well.
5. If your proposal is accepted, you may begin code implementation that adheres to your proposal and following the Mautic contributing guidelines.
6. Submit code as a draft PR in the appropriate Mautic repositories so that the Core Team can track progress.
7. Once code is complete, remove draft status and notify the Core Team (use @mautic/core-team to ping them).

Check failure on line 52 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'Mautic' instead of 'mautic'. Raw Output: {"message": "[Vale.Terms] Use 'Mautic' instead of 'mautic'.", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 52, "column": 78}}}, "severity": "ERROR"}
8. Update code with feedback from the Core Team as needed.
9. Wait for your code to be merged into the appropriate branch.
10. Submit an expense to Open Collective for the amount of the project.

Collaboration with the Mautic Product Team
******************************************
Collaborating with the Product and Core Teams is essential for successful code integration into Mautic. During the proposal process, address any questions early on. During development, use the pull request comment feature for feedback. For additional communication, the #dev channel in :xref:`Mautic Community Slack` is available, though we encourage keeping discussions on the RFP and PRs for transparency.

Deadlines
*********
If no code commits or interactions are shown for two weeks in an accepted project, the RFP may be reassigned. If the task remains in the Accepting Proposals state, and the team can demonstrate work on the feature, they can reclaim the task. Notify the Product Team if you wish to withdraw from a granted project, allowing it to be reset to "Accepting Proposals."

Funding Evaluation
******************
The Mautic team uses a basic rubric to determine RFP pricing, Generally speaking, RFPs are evaluated based on two main criteria:

Check failure on line 67 in docs/policies/request_for_proposals_(RFP)_process.rst

View workflow job for this annotation

GitHub Actions / prose

[vale] reported by reviewdog 🐶 [Vale.Spelling] Did you really mean 'RFPs'? Raw Output: {"message": "[Vale.Spelling] Did you really mean 'RFPs'?", "location": {"path": "docs/policies/request_for_proposals_(RFP)_process.rst", "range": {"start": {"line": 67, "column": 83}}}, "severity": "ERROR"}

* How complex is the project?
* How long do we expect it may take to complete?
* How much specialized knowledge do we expect it will require to implement?
* How high a demand is there for this project?
* How many people do we expect this to impact?
* How frequently are we asked about this feature or bug?
* How urgently does this need to be implemented?

In general, issues that are higher in complexity and higher in demand are given greater value.

The Product Team has a fixed allocation each year to use for funding these projects, which is directly related to the amount of funds available in the budget. In the event that a project requires more funds than the Product Team has available, a project on Open Collective will be opened to raise the required amount.

What about Strategic Initiatives?
*********************************

Strategic Initiatives follow the same proposal process and are funded separately. Proposed by the Project Lead, they do not undergo community voting.

As Strategic Initiatives are larger projects, they may be divided into smaller projects. The RFP should clarify how each component fits into the larger initiative.

How Do We Budget for Funding RFPs?
**********************************

Starting in 2022, a portion of the budget (decided by the Community Council) is allocated to the Product Team to fund the RFP process. This is maintained in a separate project on Mautic Open Collective, allowing targeted donations.

If an RFP or Strategic Initiative requires additional funds, a dedicated fundraising project can be launched. Strategic Initiatives will continue to have a separate budget and may have their own Open Collective project.

Tips for Writing a Good Proposal
********************************

The Mautic Community is now soliciting proposals for a number of features and bugs that we want to direct community efforts toward. We are using a "Request For Proposals" system as detailed above, whereby each project acts as a specification, and requests that potential developers submit proposals for how they would approach the design and development of the specified feature or bug.

This document is intended to be a guide for would-be contributors to the project who wish to submit a proposal to ensure their proposal has sufficient detail in order to be considered for acceptance.

Tips
****
* Be sure your proposal addressed all requirements in the "Request For Proposal" section of the RFP.
* If your proposal includes changes to the UI, include mockups where possible. These do not need to be fancy, but should at least communicate the concept behind what you intend to change.
* If your proposal requires the use of a new library, please include a discussion of why you chose the given library, and why you did not go with alternatives.
* Implementation details should err on the side of specificity. Details on any new planned APIs, data structures, and architectural considerations are appreciated.
* Time estimates are not required by any means, and we know that commitment level can vary given open source work is largely done during people's free time. However, a very rough estimate would be appreciated, if reasonable for you to include.

Credits
*******
This process is heavily inspired by the :xref:`OBS open-source project’s model`, which uses a similar workflow for its bounty program.
Loading
Loading