% This work is licensed under a Creative Commons Attribution 3.0 Unported License.
% SPDX-License-Identifier: CC-BY-3.0

# Response Guide

This is a {doc}`Code of Conduct<CodeOfConduct>` (CoC) incident response guide
used by the Code of Conduct Committee and LLVM event organizers.

## Code of Conduct Committee

All responses to Code of Conduct reports will be managed by a Code of Conduct
Committee.

## Additional Code of Conduct Response Teams

In-person events will have an additional response team to immediately respond
to an incident. For example:

- Each LLVM Developers' Meeting has a Code of Conduct response team.
- For LLVM meetups, the local organizers will be the first point of contact.
- Any other event funded by the LLVM Foundation or listed on the LLVM website,
  will have a code of conduct response team or point of contact for CoC
  reports.

These teams should determine if an {ref}`immediate response <immediate-response-checklist>`
is needed before sending the report to the Code of Conduct
committee.

(receiving-a-report)=

## Receiving a Report

Reports are typically received by email ([conduct@llvm.org](mailto:conduct@llvm.org)) or in person from
the reporter or event CoC response team.

When receiving a report by email, the CoC Committee should acknowledge receipt
within 24 hours. The acknowledgment should be understanding and compassionate
but no commitment should be made on whether this is a violation or which action
will be taken. Specific guidance is in the checklist below.

For in-person events that have a violation reported, the report should be sent
to the Code of Conduct committee within 24 hours by the on-site CoC response
team.

(immediate-response-checklist)=

## Immediate Response Checklist

The CoC committee generally works, decides, and communicates together. If the
report indicates that an immediate response is required and other committee
members are not available, any committee member may take the immediate action
they think is necessary. In-person Code of Conduct response teams should use
this checklist to determine if an immediate response is needed.

- If the incident involves physical danger, contact the appropriate law
  enforcement or event security immediately. Ensure the reporter feels safe and
  stay with them if possible until help arrives.
- If the act is ongoing and involves harassment or threats against someone in
  any space (online or physical), any appropriate response (e.g., ban, physical
  removal, or moderation) may be used to immediately stop it.
- For events that include talks, organizers should end talks early if the
  violations include harassment or violent threats. There may be talks where
  other types of code of conduct violations occur and organizers should do
  their best to determine if a talk should be ended early or not.

When undertaking an immediate response, document the action and notify the
committee within 24 hours.

## Response Procedure

The following is a summary of the steps the committee takes when responding to
a reported incident.

1. Determine if there is a need for an {ref}`immediate response <immediate-response-checklist>`.
2. {ref}`Acknowledge the report <receiving-a-report>` within 24 hours.
3. {ref}`Discuss the incident report <incident-response-assessment>`, gather
   more information, and determine a {ref}`resolution <resolutions>`.
4. During this process, the {ref}`reporter will be informed of the
   resolution <following-up-with-the-reportee>` and feedback is requested. This
   feedback may or may not be used to re-evaluate the resolution.
5. Inform the reportee of the resolution. The reportee is provided options to
   {ref}`appeal <appeal-process>`.
6. The {ref}`resolution <resolutions>` is implemented.
7. All reports, data, notes, and resolutions are logged in a private location
   (e.g., Google Drive or other database).

The committee will never make public statements about a resolution and will
only publish {ref}`transparency reports <transparency-reports>`. If a public
statement is necessary and requested by the committee, it will be given by the
LLVM Foundation Board of Directors.

## Report Acknowledgement

When a report is received, the committee will reply to the reporter to confirm
receipt within 24 hours of the incident being reported.

This acknowledgement will contain:

- Acknowledgement of the incident report
- Next steps of the committee for responding to the incident
- Reminder of confidentiality policy regarding the report and parties involved

All incident reports should be assessed if they require immediate response and
acted on accordingly.

(incident-response-assessment)=

## Incident Response Assessment

The committee will assess the incident and determine an appropriate response.
The assessment will be documented and retained in records. Here are some
guidelines for the process:

- Review report documentation to determine the content and context of the
  incident.

  - Request additional information if needed from the reporter.

- Determine if it occurred within the scope of the CoC.

- Determine if it violated the CoC and specifically which part.

- Consult documentation of past incidents for patterns of behavior (if
  available and applicable).

- Follow up with the reportee to get their view or any other additional
  information.

- Determine appropriate resolutions to the incident when all information has
  been gathered.

- Notify the reporter of the resolution and request feedback. This may or may
  not be used to reevaluate the resolution.

The committee will aim to have a resolution agreed upon within two weeks of
receipt of the incident report. In the event that a resolution cannot be
determined within that time, the CoC committee will respond to the reporter(s)
with an updated and projected timeline for resolution.

(following-up-with-the-reportee)=

## Following Up With the Reportee

When following up with the reportee, the committee will:

- Explain that an incident was reported that involves the reportee.
- In this explanation, the focus will be on the impact of their behavior, not
  their intent.
- Reiterate the Code of Conduct and that their behavior may be deemed
  inappropriate.
- Give them the opportunity to state their view of the incident.
- Explain the possible resolutions that may be enforced should the CoC
  committee determine there is a breach.

The reportee will be given a week to respond with the option to request
additional time if needed and subject to approval of the CoC Committee.

(resolutions)=

## Resolutions

The committee should agree unanimously on a resolution. In the event that the
committee cannot reach a unanimous resolution, the LLVM Foundation Board of
Directors will help resolve the situation and determine if the resolution can
proceed without a unanimous vote.

When deciding on a resolution, the goal is to address the report in an
appropriate way, while also looking to prevent or reduce the risk of continuing
harm in the future. Any action deemed necessary by the committee will be
taken, but below is a list of possible resolutions:

- Taking no further action as the incident was determined not to be a
  violation.
- A private verbal warning and/or reprimand from the committee to the
  individual(s) involved and request to stop this behavior. This conversation
  may happen in person, email, by phone, video chat, or Discord.
- Request that the reportee avoid any interaction with, and physical proximity
  to, another person for the remainder of the event.
- Refusal of alcoholic beverage purchases by the reportee at LLVM events.
- Ending a talk/tutorial/etc at an LLVM event early. See
  [immediate response checklist](#immediate-response-checklist) for further
  clarification.
- Not publishing the video or slides of a talk.
- Not allowing a speaker to give (further) talks at LLVM events for a specified
  amount of time or ever.
- Requiring that the reportee immediately leave an event and not return.
- Immediately ending any volunteer responsibilities and privileges the reportee
  holds.
- An imposed suspension (e.g., asking someone to "take a week off" from mailing
  lists, bug tracker, Discord, repositories, or other communication forms).
- A permanent or temporary ban from some or all LLVM Project spaces (online or
  in person).

Once a resolution is agreed upon, but before it is enacted, the committee will
contact the reporter and any other affected parties to explain the proposed
resolution. They will ask if this resolution is acceptable and must note
feedback for the record. However, the committee is not required to act on this
feedback.

(appeal-process)=

## Appeal Process

Any individual(s) determined to have violated the CoC have the right to appeal
a resolution decision. An appeal can be made directly to the committee by sending an
email to [conduct@llvm.org](mailto:conduct@llvm.org) with subject line Code of Conduct Incident Appeal.

This process is intended to consider new or different evidence from the
initial incident investigation. The email should include documentation related
to the incident to support the appeal. The said documentation may include,
but does not have to be limited to:

- Information from the reportee justifying reasoning for the appeal.
- Statements from other individuals involved in the incident to support the
  appeal.

Appeals can be requested up to 30 days after a resolution has been communicated
to the individual(s). The committee will aim to evaluate appeals within two weeks of receipt. In the event that appeal can not be evaluated within that time, the CoC committee will respond with an updated and projected timeline.

## Conflicts of Interest

Committee members should declare any conflicts of interest as soon as possible
and before any official committee meetings. This can mean being friends with
one of the involved parties, or anything else that may make it harder to remain
neutral.

A conflict of interest does not inherently mean the committee member can no
longer participate in the process, as that would make it very hard for the team
to act on reports involving well-known people in the community. However, if a
report concerns a team member or someone they work directly with, they probably
should not take part in the process. The team will decide together on where to
draw this line in individual cases. Where possible, any conversations with
offenders should not be done by people who know them, as it can be very
unpleasant for everyone involved.

If a report is received concerning a committee member, that member must not be
involved in the response process. The rest of the committee will meet and
decide on the report without the reported committee member being present, and
will not share more information than they would have with a non-member. If a
member of the committee is found to have violated the CoC, they may no longer
be able to keep serving on the committee.

## Confidentiality

All reports will be kept confidential with details shared only with the Code of
Conduct committee members. However, the Code of Conduct Committee will always
comply with law enforcement when directed. In the case that a CoC committee
member is involved in a report, the member will be asked to recuse themselves
from ongoing conversations, and they will not have access to reports after the
enforcement decision has been made.

In the event of a temporary suspension or ban, the appropriate people must be
notified of the ban in order to restrict access to infrastructure or events.
These individuals will only be notified of the person's name and the
restrictions imposed. They will be under a confidentiality clause and not
allowed to respond to questions regarding the ban and should direct all
questions to the CoC committee.

(transparency-reports)=

## Transparency Reports

Lack of transparency in the outcomes of our Code of Conduct incidents leaves
our community without an understanding of how or if the organizers worked to
resolve incidents. The CoC committee should aim to publish transparency
reports, if reports are received, at least 2 times in a calendar year.

A transparency report consists of 2 parts:

- An overview of the reports received, and resolutions.
- A more detailed summary of each reported incident and the resolution while
  maintaining confidentiality.

These reports will be published on the LLVM website.

## Thanks!

This guide was created and inspired by the following: the [Django Project][django project],
[Carpentries Response Guide][carpentries response guide], and the [Write The Docs Response Guide][write the docs response guide].

## License

All content on this page is licensed under a [Creative Commons Attribution 3.0
Unported License][creative commons attribution 3.0 unported license].

[carpentries response guide]: https://docs.carpentries.org/topic_folders/policies/enforcement-guidelines.html
[creative commons attribution 3.0 unported license]: http://creativecommons.org/licenses/by/3.0/
[django project]: https://www.djangoproject.com/conduct/
[write the docs response guide]: https://www.writethedocs.org/code-of-conduct/#guidelines-for-reporting-incidents
