diff --git a/.github/workflows/goreleaser-snapshot-fleet.yaml b/.github/workflows/goreleaser-snapshot-fleet.yaml index f3c6a9340c..38a1ebff52 100644 --- a/.github/workflows/goreleaser-snapshot-fleet.yaml +++ b/.github/workflows/goreleaser-snapshot-fleet.yaml @@ -4,8 +4,8 @@ on: push: branches: - "main" - - "minor-*" - - "patch-*" + - "rc-minor-*" + - "rc-patch-*" paths-ignore: - "handbook/**" - "website/**" diff --git a/articles/custom-os-settings.md b/articles/custom-os-settings.md index aadafc1f84..1e7dbdee69 100644 --- a/articles/custom-os-settings.md +++ b/articles/custom-os-settings.md @@ -1,6 +1,6 @@ # Custom OS settings -In Fleet you can enforce OS settings like security restrictions, screen lock, Wi-Fi etc., on your your macOS, iOS, iPadOS, and Windows hosts using configuration or device profiles. +In Fleet you can enforce OS settings like security restrictions, screen lock, Wi-Fi etc., on your your macOS, iOS, iPadOS, and Windows hosts using configuration profiles. ## Enforce OS settings diff --git a/articles/deploy-software-packages.md b/articles/deploy-software-packages.md index 41a26632f1..2601c54b66 100644 --- a/articles/deploy-software-packages.md +++ b/articles/deploy-software-packages.md @@ -48,7 +48,7 @@ To access and manage software in Fleet: * Choose a file to upload. `.pkg`, `.msi`, `.exe`, and `.deb` files are supported. -> Software installer uploads will fail if Fleet is unable to extract information from the installer package such bundle ID and version number. +> Software installer uploads will fail if Fleet is unable to extract information from the installer package such as bundle ID and version number. * To allow users to install the software from Fleet Desktop, check the โ€œSelf-serviceโ€ checkbox. diff --git a/changes/22829-nudge-500-fix b/changes/22829-nudge-500-fix new file mode 100644 index 0000000000..439923c534 --- /dev/null +++ b/changes/22829-nudge-500-fix @@ -0,0 +1 @@ +* Fixes Orbit configuration endpoint 500s for Macs running Rapid Security Response macOS releases that are enrolled in OS major version enforcement diff --git a/cmd/osquery-perf/agent.go b/cmd/osquery-perf/agent.go index 10e8ee21b0..50df1861bf 100644 --- a/cmd/osquery-perf/agent.go +++ b/cmd/osquery-perf/agent.go @@ -1983,18 +1983,14 @@ func (a *agent) batteries() []map[string]string { count := rand.Intn(3) // return between 0 and 2 batteries result := make([]map[string]string, count) for i := range result { - health := "Good" - cycleCount := rand.Intn(2000) - switch { - case cycleCount > 1500: - health = "Poor" - case cycleCount > 1000: - health = "Fair" - } + max_capacity := 700 + rand.Intn(300) // between 700 and 1000 to ensure most batteries are healthy + cycleCount := rand.Intn(1200) + result[i] = map[string]string{ - "serial_number": fmt.Sprintf("%04d", i), - "cycle_count": strconv.Itoa(cycleCount), - "health": health, + "serial_number": fmt.Sprintf("%04d", i), + "cycle_count": strconv.Itoa(cycleCount), + "max_capacity": strconv.Itoa(max_capacity), + "designed_capacity": "1000", } } return result diff --git a/frontend/components/icons/Install.tsx b/frontend/components/icons/Install.tsx index 778b4fdc60..d736372c74 100644 --- a/frontend/components/icons/Install.tsx +++ b/frontend/components/icons/Install.tsx @@ -16,21 +16,27 @@ const Install = ({ - - - + + + - - + + diff --git a/frontend/pages/SoftwarePage/SoftwareAddPage/SoftwareFleetMaintained/FleetMaintainedAppsTable/FleetMaintainedAppsTable.tsx b/frontend/pages/SoftwarePage/SoftwareAddPage/SoftwareFleetMaintained/FleetMaintainedAppsTable/FleetMaintainedAppsTable.tsx index adc460f687..7dd997a204 100644 --- a/frontend/pages/SoftwarePage/SoftwareAddPage/SoftwareFleetMaintained/FleetMaintainedAppsTable/FleetMaintainedAppsTable.tsx +++ b/frontend/pages/SoftwarePage/SoftwareAddPage/SoftwareFleetMaintained/FleetMaintainedAppsTable/FleetMaintainedAppsTable.tsx @@ -24,7 +24,7 @@ const EmptyFleetAppsTable = () => ( header={"No items match the current search criteria"} info={ <> - Can' find app?{" "} + Can't find app?{" "} ) => ( - - + + - - - + + + ) => ( - - + diff --git a/handbook/company/communications.md b/handbook/company/communications.md index 15affb27a4..17c8ef69a5 100644 --- a/handbook/company/communications.md +++ b/handbook/company/communications.md @@ -984,28 +984,21 @@ At the end of their first two weeks of onboarding at Fleet, every new team membe Fleet prioritizes a [bias for action](https://fleetdm.com/handbook/company#ownership). If possible, apply onboarding feedback to the handbook and issue templates in realtime, during this call. This avoids backlogging tasks that may just get out of date before we get around to them anyway. -## Performance feedback +## Feedback -At Fleet, performance feedback is a continuous process. We give feedback (particularly negative) as soon as possible. Managers at Fleet will provide performance feedback [during scheduled 1:1 meetings](https://fleetdm.com/handbook/company/leadership#performance-feedback), if not sooner. - -Feedback is how we improve. We encourage all Fleeties to share candid and helpful feedback with each other. We use the "4A" feedback pattern: +At Fleet, performance feedback is a continuous process. We give feedback (particularly negative) as soon as possible. Managers at Fleet will provide performance feedback [during scheduled 1:1 meetings](https://fleetdm.com/handbook/company/leadership#performance-feedback), if not sooner. When sharing feedback publicly, it's important to remember what feedback _is_: +- Feedback is something to share with the DRI, who has the context and mission to hear your feedback and decide what to do. +- Feedback is better shared in a way that doesn't ping the customer. Reading it doesn't help them. +- Feedback is ready to share. If it's just an opinion without a solution or an opinion about a customer's contribution without specifically saying why the contribution would make the product worse, it's not feedback that's ready to share. +- Feedback is how we improve. We encourage all Fleeties to share candid and helpful feedback with each other. We use the "4A" feedback pattern: When _giving_ feedback: - -1. Aim to assist - - Feedback must be given with positive intent. - - Feedback must be framed around how it can help the individual or the company. -2. Actionable - - Feedback must be actionable and focus on what the recipient can do differently. +1. **Aim to assist**: Feedback must be given with positive intent. Feedback must be framed around how it can help the individual or the company. +2. **Actionable**: Feedback must be actionable and focus on what the recipient can do differently. When _receiving_ feedback: - -3. Appreciate - - It is natural to feel defensive when hearing criticism. - - Rather than immediately reacting, listen carefully and be open-minded without becoming defensive or angry. -4. Accept or discard - - Listen and consider all feedback, then decide to accept or discard. - - The decision to react to the feedback is entirely up to the recipient. +3. **Appreciate**: It is natural to feel defensive when hearing criticism. Rather than immediately reacting, listen carefully and be open-minded without becoming defensive or angry. +4. **Accept or discard**: Listen and consider all feedback, then decide to accept or discard. The decision to react to the feedback is entirely up to the recipient. > When delivering feedback, you can also use the [other person's personality type](https://docs.google.com/spreadsheets/d/1OSLn-ZCbGSjPusHPiR5dwQhheH1K8-xqyZdsOe9y7qc/edit#gid=0&range=AA1) as [a guide](https://drive.google.com/file/d/1iWHYJzc6WKdR95GBFAvjumouh0ej2DQM/view). For example, when delivering feedback to a ["type 1" personality](https://www.enneagraminstitute.com/type-1/), it helps to focus on minimizing the extent to which the person spirals into self-blame. In contrast, when delivering feedback to a ["type 7" personality](https://www.enneagraminstitute.com/type-7/), it is better to focus on being sensitive to the person's tendency to avoid negative emotions and reframe things positively. @@ -1705,6 +1698,9 @@ This glossary provides definitions to commonly used terms within our space. The following stubs are included only to make links backward compatible. +##### Performance feedback +Please see ๐Ÿ“–[handbook/company/communications#feedback](https://fleetdm.com/handbook/company/communications#feedback). + ##### Website Please see ๐Ÿ“–[handbook/company/communications#fleetdm-com](https://fleetdm.com/handbook/company/communications#fleetdm-com). diff --git a/handbook/company/leadership.md b/handbook/company/leadership.md index 6dea6ca80a..18348d4020 100644 --- a/handbook/company/leadership.md +++ b/handbook/company/leadership.md @@ -7,6 +7,7 @@ This page covers the things managers and other leaders at Fleet need to know abo ## CEO flaws + [Openness](https://fleetdm.com/handbook/company#values) is important, and so I want to live that by sharing the flaws I know I have. Iโ€™m fully responsible for improving the things below, listing them is no excuse. These flaws are listed here publicly for two reasons. The first is so that people know it is _not just them_, but actually _my fault_. The second is so I can improve and be held accountable. @@ -34,11 +35,14 @@ These flaws are listed here publicly for two reasons. The first is so that peopl > If you notice one of these flaws, and especially if you deliver feedback about it and don't feel heard, or you feel hurt, or you feel like I didn't "get it", please send me a link to this section of the handbook, or just interrupt me and give me [feedback in the moment](https://fleetdm.com/handbook/company/communications#performance-feedback). I will be extremely grateful, and value your bravery in pursuit of what's in the best interest of the company. (And if I don't, keep trying. I'll come crawling back. Promise.) + ## Contact the CEO + **Still want to contact the CEO?** You can send `@mikermcneil` a DM in Fleet Slack, at-mention our CEO in the [#help-leadership channel](https://fleetdm.slack.com/archives/C02HWSTJ17Z), or [schedule time with the CEO](https://fleetdm.com/handbook/company/communications#schedule-time-with-the-ceo). ## CEO responsibilities + Ultimately, the CEO is responsible for the success or failure of the company. The CEO is the [directly responsible individual (DRI)](https://fleetdm.com/handbook/company/why-this-way#why-direct-responsibility) for pricing, tiers, the business model, human resources, legal counsel, signatures on all documents, and brand & product marketing (brandfronts, pitchfronts, featurefronts, ICPs, personas, and targeting). > **Note:** When the CEO is out of office, CEO responsibilities are either paused, delegated, or coordinated through the [Apprentice to the CEO](https://fleetdm.com/handbook/digital-experience#team) so they can be handled promptly. (It depends on the responsibility and the situation.) @@ -96,6 +100,7 @@ Departmental page structure: ## Key reviews + Every release cycle, each department leader discusses their [key performance indicators (KPIs)](https://docs.google.com/spreadsheets/d/1Hso0LxqwrRVINCyW_n436bNHmoqhoLhC8bcbvLPOs9A/edit#gid=0) (confidential) with the CEO. KPIs are numbers measuring results and everyday excellence, usually accompanied by time-bound goals. In this meeting, the department leader discusses actual week-over-week progress toward the goals for a particular quarter with the CEO. @@ -111,8 +116,10 @@ At Fleet, we collaborate with [core team members](#creating-a-new-position), [co > Are you a new fleetie joining the Digital Experience team? For Loom recordings demonstrating how to make offers, hire, onboard, and more please see [this classified Google Doc](https://docs.google.com/document/d/1fimxQguPOtK-2YLAVjWRNCYqs5TszAHJslhtT_23Ly0/edit). + ### Consultants + #### Hiring a consultant In addition to [core team members](#hiring-a-new-team-member), from time to time Fleet hires consultants who may work for only a handful of hours on short projects. @@ -133,6 +140,7 @@ Consultants [track time using the company's tools](#tracking-hours) and sign [Fl To hire a consultant, [submit a new consultant onboarding request](https://github.com/fleetdm/confidential/issues/new?assignees=&labels=%23g-digital-experience&projects=&template=new-consultant-onboarding.md&title=New+US%2Finternational+consultant) to the Digital Experience team. + #### Who ISN'T a consultant? If a consultant plans to work _more_ than 10 hours per week, or for _longer_ than 6 weeks, they should instead be hired as a [core team member](#hiring-a-new-team-member). @@ -149,6 +157,7 @@ Core team members: Consultants aren't required to do any of those things. + #### Sending a consulting agreement To send a consulting agreement, you will need to [submit a new consultant onboarding request](https://github.com/fleetdm/confidential/issues/new?assignees=&labels=%23g-digital-experience&projects=&template=new-consultant-onboarding.md&title=New+US%2Finternational+consultant) to the Digital Experience team. They will then peform the steps needed to bring aboard a new consultant. @@ -243,7 +252,9 @@ A completed open position entry should look something like this: - _**Why bother with approvals?** We avoid cancelling or significantly changing a role after opening it. It hurts candidates too much. Instead, get the position approved first, before you start recruiting and interviewing. This gives you a sounding board and avoids misunderstandings._ + ### Approving a new position + When review is requested on a proposal to open a new position, the Apprentice to the CEO will complete the following steps when reviewing the pull request: 1. **Consider role and reporting structure:** Confirm the new row in "Fleeties" has a manager, job title, and department, that it doesn't have any corrupted spreadsheet formulas or formatting, and that the start date is set to the first Monday of the next month. @@ -265,30 +276,39 @@ When review is requested on a proposal to open a new position, the Apprentice to > _**Note:** Most columns of the "Equity plan" are updated automatically when "Fleeties" is, based on the unique identifier of each row, like `๐Ÿง‘โ€๐Ÿš€890`. (Advisors have their own flavor of unique IDs, such as `๐Ÿฆ‰755`, which are defined in ["Advisors and investors"](https://docs.google.com/spreadsheets/d/15knBE2-PrQ1Ad-QcIk0mxCN-xFsATKK9hcifqrm0qFQ/edit).)_ -### Recruiting -Fleet accepts job applications, but the company does not list positions on general purpose job boards. This prevents us being overwhelmed with candidates so we can fulfill our goal of responding promptly to every applicant. -This means that outbound recruiting, 3rd party recruiters, and references from team members are important aspect of the company's hiring strategy. Fleet's CEO is happy to assist with outreach, intros, and recruiting strategy for candidates. +### Recruiting + +Fleet accepts job applications, but the company does not list positions on general purpose job boards. This prevents us being overwhelmed with candidates so we can fulfill our goal of responding promptly to every applicant. This means that outbound recruiting, 3rd party recruiters, and references from team members are important aspect of the company's hiring strategy. Fleet's CEO is happy to assist with outreach, intros, and recruiting strategy for candidates. image #### Receiving job applications + Every job description page ends with a "call to action", including a link to the hiring manager's LinkedIn to apply for the job directly with the hiring manager. Fleet replies to all candidates within **1 business day** and always provides either a **rejection** or **decisive next steps**; even if the next step is just a promise. Hiring managers are encouraged to use [email/message templates](https://fleetdm.com/handbook/company/leadership#candidate-correspondence-email-templates) for consistency and efficiency. + #### Candidate correspondence email templates + Fleet uses [certain email templates](https://docs.google.com/document/d/1VAMWIH8o7_vH7lV9nM1wQCM4Vc3GxBRBDPK-mKO9HNk/edit?usp=sharing) when responding to candidates. This helps us live our value of [๐Ÿ”ด empathy](https://fleetdm.com/handbook/company#empathy) and helps the company meet the aspiration of replying to all applications within one business day. + ### Hiring restrictions + #### Incompatible former employers + Fleet maintains a list of companies with whom Fleet has do-not-solicit terms that prevents us from making offers to employees of these companies. The list is in the Do Not Solicit tab of the [Digital Experience spreadsheet](https://docs.google.com/spreadsheets/d/1lp3OugxfPfMjAgQWRi_rbyL_3opILq-duHmlng_pwyo/edit#gid=0). + #### Incompatible locations + Fleet is unable to hire team members in some countries. See [this internal document](https://docs.google.com/document/d/1jHHJqShIyvlVwzx1C-FB9GC74Di_Rfdgmhpai1SPC0g/edit) for the list. ### Interviewing + > TODO: Rewrite this section for the hiring manager as our audience. We're glad you're interested in joining the team! @@ -301,7 +321,9 @@ If you've been invited to "book with us," you'll have a Zoom meeting with the hi Department specific interviewing instructions: - [Engineering](https://fleetdm.com/handbook/engineering#interview-a-developer-candidate) + #### Hiring a new team member + This section is about the hiring process a new core team member, or fleetie. > **_Note:_** _Employment classification isn't what makes someone a fleetie. Some Fleet team members are contractors and others are employees. The distinction between "contractor" and "employee" varies in different geographies, and the appropriate employment classification and agreement for any given team member and the place where they work is determined by Head of Digital Experience during the process of making an offer._ @@ -339,6 +361,7 @@ Here are the steps hiring managers follow to get an offer out to a candidate: ### Making an offer + After receiving the interview packet, the Head of Digital Experience uses the following steps to make an offer: @@ -362,6 +385,7 @@ After receiving the interview packet, the Head of Digital Experience uses the fo - _Send_ the email. 5. **Process the offer response** The Head of Digital Experience will process the offer response by either creating a new ["Teammate pre-onboarding" issue](https://github.com/fleetdm/confidential/issues/new?assignees=&labels=%23g-digital-experience&projects=&template=pre-onboarding.md&title=Pre-onboarding%3A+______________________) and following the steps if the offer is accepted or notifying the stakeholders that the offer was not accepted and we should continue the search. + #### After an offer is accepted The Head of Digital Experience will then follow the steps in the ["Teammate pre-onboarding"](https://github.com/fleetdm/confidential/issues/new?assignees=&labels=%23g-digital-experience&projects=&template=pre-onboarding.md&title=Pre-onboarding%3A+______________________) issue, which includes reaching out to the new team member within 1 business day from a separate email thread to get additional information as needed, prepare their agreement, add them to the company's payroll system, and get their new laptop and hardware security keys ordered so that everything is ready for them to start on their first day. @@ -399,25 +423,24 @@ CEO shadows join all meetings on the [CEO's calendar](https://calendar.google.co ## Tracking hours -Fleet asks US-based hourly contributors to track hours in Gusto, and contributors outside the US to track hours via Pilot.co. -This applies to anyone who gets paid by the hour, including consultants and hourly core team members of any employment classification, inside or outside of the US. +Fleet asks US-based hourly contributors to track hours in Gusto, and contributors outside the US to track hours via Pilot.co. This applies to anyone who gets paid by the hour, including consultants and hourly core team members of any employment classification, inside or outside of the US. > _**Note:** If a contributor uses their own time-tracking process or tools, then it is OK to track the extra time spent tracking! Contributors at Fleet are evaluated based on their results, not the number of hours they work._ ## Communicating departures + Although it's sad to see someone go, Fleet understands that not everything is meant to be forever [like open-source is](https://fleetdm.com/handbook/company/why-this-way#why-open-source). There are a few steps that the company needs to take to facilitate a departure. -1. **Departing team member's manager:** Inform the Head of Digital Experience about the departure via email and cc your manager. The Head of Digital Experience will coordinate the team member's last day, offboarding, and exit meeting. -3. **Digital Experience**: Will then create and begin completing [offboarding issue](https://github.com/fleetdm/classified/blob/main/.github/ISSUE_TEMPLATE/%F0%9F%9A%AA-offboarding-____________.md), to include coordinating team member's last day, offboarding, and exit meeting. - > After finding out about the departure, the Head of Digital Experience will post in #g-e to inform the E-group of the team member's departure, asking E-group members to inform any other managers on their teams. +1. **Departing team member's manager:** Create a private "#YYYY-offboarding-xxxxxx" Slack channel (replace "xxxxxx" with the Fleetie's name and YYYY with current year) for discussion and invite the CEO and Head of Digital Experience. Document any context about the departure via "FYI:" in the ["ยถ ๐Ÿ—ฃ E-Group weekly" (confidential Google Doc)](https://docs.google.com/document/d/13fjq3T0bZGOUah9cqHVxngckv0EB2R24A3gfl5cH7eo/edit). +3. **Digital Experience**: The Head of Digital Experience will coordinate the team member's last day, offboarding, and exit meeting, then create and begin completing [offboarding issue](https://github.com/fleetdm/classified/blob/main/.github/ISSUE_TEMPLATE/%F0%9F%9A%AA-offboarding-____________.md), to include coordinating team member's last day, offboarding, and exit meeting. At the appropriate time, The Head of Digital Experience will post in #g-e to inform the E-group of the team member's departure, asking E-group members to inform any other managers on their teams. 4. **CEO**: The CEO will make an announcement during the "๐ŸŒˆ Weekly Update" post on Friday in the `#general` channel on Slack. ## Request a role change for a Fleetie From time to time, someone's job title changes. The hiring manager can use the following steps to change someone's position: -1. Create Slack channel: Create a private "#YYYY-change-title-for-xxxxxx" Slack channel (where "xxxxxx" is the Fleetie's name and YYYY is the current year) for discussion and invite the CEO and Head of Digital Experience. +1. Create Slack channel: Create a private "#YYYY-change-title-for-xxxxxx" Slack channel (replace "xxxxxx" with the Fleetie's name and YYYY with current year) for discussion and invite the CEO and Head of Digital Experience. 2. At-mention the Head of Digital Experience in the new channel with any context regarding the title change. Share any related documents with the Head of Digital Experience and the CEO. 3. After getting approval from the [Head of People](https://fleetdm.com/handbook/digital-experience#team), the Digital Experience team will take the necessary steps to [change the fleetie's job title](https://fleetdm.com/handbook/digital-experience#change-a-fleeties-job-title). @@ -433,10 +456,7 @@ When it comes to performance feedback, [speak freely](https://fleetdm.com/handbo 3. When you meet with your manager for your 1:1, periodically provide an update on how each of your direct reports is doing at the top of your own "Performance management" section in your 1:1 agenda doc. -#### Stubs -##### Performance feedback -Please see ๐Ÿ“–[handbook/company/leadership#delivering-performance-feedback](https://fleetdm.com/handbook/company/leadership#delivering-performance-feedback). diff --git a/handbook/finance/README.md b/handbook/finance/README.md index 77d9bc9b67..b42f1b0ab2 100644 --- a/handbook/finance/README.md +++ b/handbook/finance/README.md @@ -111,9 +111,54 @@ For Fleet's US contractors, running payroll is a manual process: 3. Adjust time frame to match current payroll period (the 27th through 26th of the month) 4. Sync hours and run contractor payroll. + +### Update Finance department KPIs + +Use the following steps to update the [๐Ÿ’ธFinance department KPIs](https://docs.google.com/spreadsheets/d/1Hso0LxqwrRVINCyW_n436bNHmoqhoLhC8bcbvLPOs9A/edit?gid=0#gid=0&range=BS:BS) by 5pm US central time every Friday. + +**Runway**: +- Add sum of Brex cash account + SVB accounts. All Finance teammates should have personalized logins for each bank to view amounts. +- Send the CEO a Slack DM with the balance of each of Fleet's two bank accounts. + +**Days to invoice customer**: +- Check the [invoice sent and payment received report]((https://fleetdm.lightning.force.com/lightning/r/Report/00O4x000007chpzEAA/view?queryScope=userFolders)) in Salesforce. +- Sort by close date, then check invoice dates for any recently closed deals and enter them in the finance spreadsheet and create new rows at the top of the 'time-to-invoice' tab in the spreadsheet for each new entry. If a company has not been invoiced yet (invoice date is blank) do not enter yet, but verify if an invoice is scheduled to be sent using the [Invoice status and upcoming bill dates](https://fleetdm.lightning.force.com/lightning/r/Report/00OUG0000010r8b2AA/view) report. If it doesn't appear here, create an issue on the finance board to investigate. +- Open the ["Time-to-invoice" tab](https://docs.google.com/spreadsheets/d/1lp3OugxfPfMjAgQWRi_rbyL_3opILq-duHmlng_pwyo/edit#gid=1835263594) in the [๐Ÿ’ธ Finance metrics spreadsheet](https://docs.google.com/spreadsheets/d/1lp3OugxfPfMjAgQWRi_rbyL_3opILq-duHmlng_pwyo/edit#gid=0). Enter the year and month + customer name in column A, then the # of days between the close date and the invoice date in column B. After entering new entries you will probably have to adjust the formula in column D to include the new cells in the average and make sure the formula includes no further back than the last three months of invoices. + +**Overdue delinquent invoices**: +- Using the [Invoice status and upcoming bill dates](https://fleetdm.lightning.force.com/lightning/r/Report/00OUG0000010r8b2AA/view) report, check the invoice date of any entries without a payment received date against the payment terms. + - If the elapsed time exceeds the payment terms the invoice is overdue. If so, click on the link in the "Billing cycle name," and in the billing cycle object, update the billing status to "Overdue." + - Enter the number of invoices overdue in the KPI spreadsheet, and leave a comment on that cell with the names of the companies of overdue customers, if any. + - If any new customers are overdue, notify the CRO by posting a Slack message in the #g-sales channel and @ mention him. + +**Commission payroll**: +- Make sure commission payroll was run on time by logging into [Gusto](https://www.gusto.com) and [Plane](https://plane.com/) to check for off-cycle payrolls in line with expected commission calculated in the [Commission calculator spreadsheet](https://docs.google.com/spreadsheets/d/1PuqUbfPGos87TfcHWgUd05TRJgQLlBmhyz1euj79m2A/edit?usp=sharing). +- Log the date the commission was paid out in the "Commission payroll" column of the KPI spreadsheet. + +**Monthly accounting**: +- This will be the date that the monthly accounting issue for the prior month closes. If it has not yet closed, enter N/A. + +**Days to pay**: +- Login to [Bill](https://www.bill.com). + - Under the "bills" tab on the menu bar on the left side, select "all bills". + - Sort by "created date." + - Compare the week's entries to the ["Time to pay"](https://docs.google.com/spreadsheets/d/1lp3OugxfPfMjAgQWRi_rbyL_3opILq-duHmlng_pwyo/edit#gid=1704186727) tab in the finance metrics spreadsheet. Insert new rows at the top for any bills that are not accounted for and enter the vendor name and the # of days between the invoice date and the created date in bill.com. + - Adjust the formula in column E as necessary to calculate the last 30 day average time to pay and enter the result in the KPI spreadsheet. + - If we have any invoices that have not yet been paid that are overdue, make an entry in the overdue vendor payments section and leave a comment in the cell identifying the vendor's name. + +**Non-personnel monthly burn**: +- Copy the amount from the [numbers spreadsheet](https://docs.google.com/spreadsheets/d/1X-brkmUK7_Rgp7aq42drNcUg8ZipzEiS153uKZSabWc/edit#gid=1308221870&range=B3) and input in the cell for this week. + +**SaaS metrics**: +- For "CAC", "CAC payback", "LTV" and "LTV:CAC" columns, drag the existing formula to this week's row. +> Note: the formula relies on inputs in other fields, so if those fields haven't received input yet, it will look odd. If formulas are still broken after inputs in the other columns are added, [create an issue on the Finance board](https://github.com/fleetdm/confidential/issues/new?assignees=&labels=%23g-finance&projects=&template=custom-request.md) noting which columns are affected. Once created, @ mention Head of Finance in the issue to bring awareness. + +- For "Average customer age", pull the age in days from the [Salesforce "Account age" report](https://fleetdm.lightning.force.com/lightning/r/Report/00OUG0000012jwX2AQ/view), then convert to months by dividing the age in days by 30.417. Put the calculated number into the cell. This metric changes gradually up each week when no new deals close and no customer churns. Because we calculate the age of the customer based on the average lifetime deal length, expected behavior is that it will decrease when a new deal closes, but not drastically (as even a 1-year deal will still add 12 months to the average age). + + ### Create an invoice To create a new invoice for a Fleet customer, follow these steps: -1. Go to the [invoice folder in google drive](https://drive.google.com/drive/folders/11limC_KQYNYQPApPoXN0CplHo_5Qgi2b?usp=drive_link). +1. Go to the [invoice folder in Google Drive](https://drive.google.com/drive/folders/11limC_KQYNYQPApPoXN0CplHo_5Qgi2b?usp=drive_link). 2. Create a copy of the invoice template, and title the copy `[invoice number] Fleet invoice - [customer name]`. - The invoice number follows the format of `YYMMDD[daily issued invoice number]`, where the daily issued invoice number should equal `01` if it's the first invoice issued that day, `02` if it's the second, etc. 3. Edit the new invoice to reflect details from the signed subscription agreement (and PO if required). @@ -283,10 +328,6 @@ Fleet pays its vendors in less than 15 business days in most cases. All invoices - Once cancelled, update the recurring expenses section of [The Numbers](https://docs.google.com/spreadsheets/d/1X-brkmUK7_Rgp7aq42drNcUg8ZipzEiS153uKZSabWc/edit#gid=2112277278) to reflect the cancellation by changing the projected monthly burn in column G to $0 and adding "CANCELLED" in front of the vendor's name in column C. -### Update weekly KPIs -- Create the weekly update issue from the template in ZenHub every Friday and update the [KPIs for finance](https://docs.google.com/spreadsheets/d/1Hso0LxqwrRVINCyW_n436bNHmoqhoLhC8bcbvLPOs9A/edit#gid=0) by 5pm US central time. - - ## Rituals The following table lists this department's rituals, frequency, and Directly Responsible Individual (DRI). diff --git a/server/docs/patterns.md b/server/docs/patterns.md index 2249b447dd..abe86ca95b 100644 --- a/server/docs/patterns.md +++ b/server/docs/patterns.md @@ -5,6 +5,22 @@ The backend software patterns that we follow in Fleet. > NOTE: There are always exceptions to the rules, but we try to follow these patterns as much as possible unless a specific use case calls > for something else. These should be discussed within the team and documented before merging. +Table of Contents +- [API Inputs](#api-inputs) +- [MySQL](#mysql) + +## API Inputs + +### Input preprocessing and validation + +Validate API inputs and return a 4XX status code if invalid. If you did not do authorization checking before failing validation, skip the authorization check with `svc.authz.SkipAuthorization(ctx)`. + +Inputs corresponding to sortable or indexed DB fields should be preprocessed (trim spaces, normalize Unicode, etc.). Use utility method `fleet.Preprocess(input string) string`. [Backend sync where discussed](https://us-65885.app.gong.io/call?id=4055688254267958899). + +### JSON unmarshaling + +`PATCH` API calls often need to distinguish between a field being set to `null` and a field not being present in the JSON. Use the structs from `optjson` package to handle this. [Backend sync where discussed](https://us-65885.app.gong.io/call?id=4055688254267958899). [JSON unmarshaling article and example](https://victoronsoftware.com/posts/go-json-unmarshal/). + ## MySQL Use high precision for all time fields. Precise timestamps make sure that we can accurately track when records were created and updated, diff --git a/server/fleet/operating_systems.go b/server/fleet/operating_systems.go index dda49c63f2..04189730cf 100644 --- a/server/fleet/operating_systems.go +++ b/server/fleet/operating_systems.go @@ -2,6 +2,7 @@ package fleet import ( "fmt" + "regexp" "strings" "github.com/Masterminds/semver" @@ -34,6 +35,7 @@ func (os OperatingSystem) IsWindows() bool { } var macOSNudgeLastVersion = semver.MustParse("14") +var macOSRapidSecurityResponseVersionSuffix = regexp.MustCompile(` \([a-z]\)`) // RequiresNudge returns whether the target platform is darwin and // below version 14. Starting at macOS 14 nudge is no longer required, @@ -43,7 +45,8 @@ func (os *OperatingSystem) RequiresNudge() (bool, error) { return false, nil } - version, err := semver.NewVersion(os.Version) + // strip Rapid Security Response suffix (e.g. version 13.3.7 (a)) if any + version, err := semver.NewVersion(macOSRapidSecurityResponseVersionSuffix.ReplaceAllString(os.Version, ``)) if err != nil { return false, fmt.Errorf("parsing macos version \"%s\": %w", os.Version, err) } diff --git a/server/fleet/operating_systems_test.go b/server/fleet/operating_systems_test.go index 9fc35e686c..1099d23913 100644 --- a/server/fleet/operating_systems_test.go +++ b/server/fleet/operating_systems_test.go @@ -35,8 +35,12 @@ func TestOperatingSystemRequiresNudge(t *testing.T) { {platform: "darwin", parseError: true}, {platform: "darwin", version: "12.0.9", requiresNudge: true}, {platform: "darwin", version: "11", requiresNudge: true}, + {platform: "darwin", version: "13.3.1 (a)", requiresNudge: true}, + {platform: "darwin", version: "13.4.1 (c)", requiresNudge: true}, {platform: "darwin", version: "14.0"}, {platform: "darwin", version: "14.3.2"}, + {platform: "darwin", version: "15.0.1"}, + {platform: "darwin", version: "15.0.1 (a)"}, {platform: "windows"}, {platform: "windows", version: "12.2"}, {platform: "windows", version: "15.4"}, diff --git a/tools/release/README.md b/tools/release/README.md index 4812e9ff71..7612df55ef 100644 --- a/tools/release/README.md +++ b/tools/release/README.md @@ -17,7 +17,7 @@ This requires: The script will check that each of these are installed and available before running -## Before running the script +## Before publishing the release Make sure all tickets are tagged with the correct milestone. @@ -30,13 +30,14 @@ For example no tickets still in Ready / In Progress should be in the milestone w Example: ``` # Build release candidate and changelogs and QA ticket +# git pull main locally ./tools/release/publish_release.sh -m # Do QA until ready to release # - QA is passed on all teams and ready for release -# - Merge changelog and versions update PR into main -# - git pull main locally with the changelog as the latest commit +# - Merge changelog and versions update PR into RC branch and main +# - git pull RC branch locally with the changelog as the latest commit # Tag minor ./tools/release/publish_release.sh -mg diff --git a/tools/release/publish_release.sh b/tools/release/publish_release.sh index 6dab83d978..cea7e6fccb 100755 --- a/tools/release/publish_release.sh +++ b/tools/release/publish_release.sh @@ -661,9 +661,9 @@ target_milestone="${next_ver:1}" # 79 target_milestone_number=$(gh api repos/:owner/:repo/milestones | jq -r ".[] | select(.title==\"$target_milestone\") | .number") # patch-fleet-v4.48.0 -target_branch="patch-fleet-$next_ver" +target_branch="rc-patch-fleet-$next_ver" if [[ "$minor" == "true" ]]; then - target_branch="minor-fleet-$next_ver" + target_branch="rc-minor-fleet-$next_ver" fi # fleet-v4.48.0 diff --git a/website/assets/images/logo-pinterest-98x32@2x.png b/website/assets/images/logo-pinterest-98x32@2x.png deleted file mode 100644 index 2feffb6ee5..0000000000 Binary files a/website/assets/images/logo-pinterest-98x32@2x.png and /dev/null differ diff --git a/website/assets/js/components/logo-carousel.component.js b/website/assets/js/components/logo-carousel.component.js index 26c7db4dc6..6d806297a6 100644 --- a/website/assets/js/components/logo-carousel.component.js +++ b/website/assets/js/components/logo-carousel.component.js @@ -32,7 +32,6 @@ parasails.registerComponent('logoCarousel', {
Notion logo - Pinterest logo Gusto logo Epic Games logo Rivian logo @@ -49,7 +48,6 @@ parasails.registerComponent('logoCarousel', {
Notion logo - Pinterest logo Gusto logo Epic Games logo Rivian logo diff --git a/website/views/pages/contact.ejs b/website/views/pages/contact.ejs index d9045a69e4..c75f967dab 100644 --- a/website/views/pages/contact.ejs +++ b/website/views/pages/contact.ejs @@ -177,8 +177,7 @@
Notion logo - Pinterest logo - Gusto logo + Atlassian logo Epic Games logo
@@ -188,7 +187,7 @@
Uber logo - Atlassian logo + Gusto logo Reddit logo
diff --git a/website/views/pages/device-management.ejs b/website/views/pages/device-management.ejs index 0c077596e5..f17ab39955 100644 --- a/website/views/pages/device-management.ejs +++ b/website/views/pages/device-management.ejs @@ -168,7 +168,7 @@
- coming soon + checkmark
checkmark @@ -179,7 +179,7 @@

Automated device compliance

- coming soon + checkmark
checkmark @@ -242,7 +242,7 @@
Fleet
- coming soon + checkmark
@@ -351,7 +351,7 @@
Fleet
- coming soon + checkmark