From 699e42bb44e2795c6377f9f49dd6a6179c132c7f Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Thu, 8 Aug 2024 13:27:13 -0400 Subject: [PATCH 01/21] Add commit signing --- .github/workflows/megalinter.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/megalinter.yml b/.github/workflows/megalinter.yml index 479f0349..b442ec45 100644 --- a/.github/workflows/megalinter.yml +++ b/.github/workflows/megalinter.yml @@ -36,6 +36,15 @@ jobs: token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} fetch-depth: 0 + - name: "Import GPG key" + id: import-gpg + uses: crazy-max/ghaction-import-gpg@v6 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PRIVATE_KEY_PASSPHRASE }} + git_user_signingkey: true + git_commit_gpgsign: true + # MegaLinter - name: MegaLinter id: ml @@ -74,14 +83,16 @@ jobs: - name: Prepare commit if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) run: sudo chown -Rc $UID .git/ + - name: Commit and push applied linter fixes if: steps.ml.outputs.has_updated_sources == 1 && (env.APPLY_FIXES_EVENT == 'all' || env.APPLY_FIXES_EVENT == github.event_name) && env.APPLY_FIXES_MODE == 'commit' && github.ref != 'refs/heads/main' && (github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository) uses: stefanzweifel/git-auto-commit-action@8621497c8c39c72f3e2a999a26b4ca1b5058a842 # pin@v5 with: branch: ${{ github.event.pull_request.head.ref || github.head_ref || github.ref }} commit_message: "[MegaLinter] Apply linters fixes" - commit_user_name: megalinter-bot - commit_user_email: nicolas.vuillamy@ox.security + commit_author: "${{ steps.import-gpg.outputs.name }} <${{ steps.import-gpg.outputs.email }}>" + commit_user_name: ${{ steps.import-gpg.outputs.name }} + commit_user_email: ${{ steps.import-gpg.outputs.email }} - name: Check to see if the SARIF a was generated id: sarif_file_exists From 87bd87df866876b81310b2d5575d3fa1d05e38d6 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Thu, 22 Aug 2024 13:27:02 -0400 Subject: [PATCH 02/21] Initial import of script --- bin/has_newer_commits.bash | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 bin/has_newer_commits.bash diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash new file mode 100755 index 00000000..1a86b15d --- /dev/null +++ b/bin/has_newer_commits.bash @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +set -euo pipefail + +fetch_data() { + + url="${1?Error: no URL provided}" + + curl \ + -s \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + -H "Authorization: Bearer ${PAT}" \ + "$url" + +} + +compare_dates() { + { + fetch_data "$(build_url "$a")" + fetch_data "$(build_url "$b")" + } | jq \ + --raw-output \ + --slurp \ + 'if .[0].commit.commit.author.date < .[1].commit.commit.author.date then true else false end' +} + +build_url() { + item="${1?Error: no owner/repo@branch passed}" + + repo="${item%%@*}" + branch="${item##*@}" + + if [ "$branch" == "$repo" ] ; then + repo="$item" + branch="main" + fi + + echo "https://api.github.com/repos/${repo}/branches/${branch}" +} + +a="${1?Error: two owner/repo@branch values must be provided (0 were)}" +b="${2?Error: two owner/repo@branch values must be provided (1 was)}" + +if [ "$(compare_dates "$a" "$b")" == "true" ] ; then + exit 0 +else + exit 1 +fi From dbd3d2b4ea4991899f496737eac93ce3d415f347 Mon Sep 17 00:00:00 2001 From: wesley-dean-gsa Date: Thu, 22 Aug 2024 17:35:41 +0000 Subject: [PATCH 03/21] [MegaLinter] Apply linters fixes --- bin/has_newer_commits.bash | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index 1a86b15d..5613de31 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -20,9 +20,9 @@ compare_dates() { fetch_data "$(build_url "$a")" fetch_data "$(build_url "$b")" } | jq \ - --raw-output \ - --slurp \ - 'if .[0].commit.commit.author.date < .[1].commit.commit.author.date then true else false end' + --raw-output \ + --slurp \ + 'if .[0].commit.commit.author.date < .[1].commit.commit.author.date then true else false end' } build_url() { @@ -31,7 +31,7 @@ build_url() { repo="${item%%@*}" branch="${item##*@}" - if [ "$branch" == "$repo" ] ; then + if [ "$branch" == "$repo" ]; then repo="$item" branch="main" fi @@ -42,7 +42,7 @@ build_url() { a="${1?Error: two owner/repo@branch values must be provided (0 were)}" b="${2?Error: two owner/repo@branch values must be provided (1 was)}" -if [ "$(compare_dates "$a" "$b")" == "true" ] ; then +if [ "$(compare_dates "$a" "$b")" == "true" ]; then exit 0 else exit 1 From 0be7e6c7b3fb3ea148d7188cd03b8c5281bffc70 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Thu, 22 Aug 2024 13:42:02 -0400 Subject: [PATCH 04/21] Filter incoming strings --- bin/has_newer_commits.bash | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index 1a86b15d..8afc6c33 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -39,11 +39,16 @@ build_url() { echo "https://api.github.com/repos/${repo}/branches/${branch}" } -a="${1?Error: two owner/repo@branch values must be provided (0 were)}" -b="${2?Error: two owner/repo@branch values must be provided (1 was)}" - -if [ "$(compare_dates "$a" "$b")" == "true" ] ; then - exit 0 -else - exit 1 -fi +filter_branch_string() { + string="${1:-}" + + echo "$string" | tr -cd '[:alnum:]\/\-\_\.\@' +} + +raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" +raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" + +a="$(filter_branch_string "$raw_a")" +b="$(filter_branch_string "$raw_b")" + +[ "$(compare_dates "$a" "$b")" == "true" ] From 24b1392213dc4576e8be8e3d8a65a6b0e52c03f8 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Thu, 22 Aug 2024 15:02:44 -0400 Subject: [PATCH 05/21] Update documentation --- bin/has_newer_commits.bash | 133 ++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 3 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index a587e2f7..37bd93b3 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -1,7 +1,82 @@ #!/usr/bin/env bash +## @file has_newer_commits.bash +## @author TTS Website team +## @brief given two branches, compare the most recent commits' dates +## @details +## This is a compromise. It accepts two branches and, if the second +## branch is newer than the first, it returns 0 (True); if the first +## is newer than the second, it returns 2 (False). +## +## The context for this script is we wanted to know if another +## repository was updated more recently than ours; if so, we would +## run (continue) a workflow; otherwise, we would leave well +## enough alone. The workflow would make some changes to our +## repo and eventually push a commit to our branch which would +## make our repo (branch) newer than the other one. +## +## The "age" of branch is determined by looking at the most +## recent commit on a given branch and returning the date. By +## "looking," we mean querying the GitHub API endpoint that +## would return a JSON object describing the repository. +## +## A branch is specified with the following form: +## +## owner/repository@branch +## +## For example, for this repository (tts-website in GSA-TTS), +## the main branch would be referred to as +## +## GSA-TTS/tts-website@main +## +## We filter the incoming strings so that only characters that are +## valid for a GitHub repository name are used, plus the '@' +## separator between the repo and the branch. +## +## Two branches are supported; if 3 or more are provided, the +## extra repos are ignored; if 0 or 1 are provided, it'll error +## out. +## +## The script uses the environment variable `PAT` to pass +## a GitHub Personal Access Token (PAT). The PAT is used +## when querying the API; this allows us to query the API +## more often than an anonymous call plus it ensures that +## we're able to query repos with our credentials. As our +## repos are all public, this is less of an issue -- it +## really is just for the API request quota. +## +## The script, right now, has a few limitations: +## +## 1. only one PAT is used, so that PAT must have access to both repos +## 2. only GitHub.com is supposed, so GHE won't work +## +## When the program ends, it returns a value via result code: +## +## 0. True: the second branch is newer than the first +## 1. Error: something went wrong +## 2. False: the first branch is newer than the second +## +## @par Examples +## @code +## has_newer_commits.bash "GSA-TTS/tts-website@main" "18F/join.tts.gsa.gov@main" +## @endcode + set -euo pipefail +## @fn fetch_data() +## @brief given a GitHub URL, query it and return the result +## @details +## This is a wrapper around curl; it provides extra headers +## (e.g., the expected result format and the PAT) used to +## make the call. The results are passed via STDOUT. +## @param url the URL to query +## @retval 0 (True) if the request was successful +## @retval 1 (False) if something went wrong +## @returns JSON object via STDOUT +## @par Examples +## @code +## json_data="$(fetch_data "$url")" +## @endcode fetch_data() { url="${1?Error: no URL provided}" @@ -15,7 +90,31 @@ fetch_data() { } +## @fn compare_dates() +## @brief given 2 branches, determine if the first is newer than the second +## @details +## This will accept two branches (e.g., 'owner/repo@branch' strings) and +## use `jq` to extract the most recent commit dates and return the +## string "true" if the second branch is newer than the first or the string +## "false" if the first branch is newer than the second. The strings are +## returned via STDOUT. +## @param a the first branch to consider +## @param b the second branch to consider +## @retval 0 (True) if everything went successfully +## @retval 1 (False) if something went wrong +## @returns "true" or "false" via STDOUT +## @par Examples +## @code +## if [ "$(compare_dates "$branch1" "$branch2")" == "true" ] ; then +## echo "There's new stuff" +## else +## echo "Same old same old..." +## fi +## @endcode compare_dates() { + local a="${1?Error: two branches must be passed}" + local b="${2?Error: two branches must be passed}" + { fetch_data "$(build_url "$a")" fetch_data "$(build_url "$b")" @@ -25,9 +124,33 @@ compare_dates() { 'if .[0].commit.commit.author.date < .[1].commit.commit.author.date then true else false end' } + +## @fn build_url() +## @brief given the name of a repo, construct a GitHub API URL +## @details +## This accepts one "branch" string of the format +## 'owner/repo@branch' +## +## An environment variabled `GITHUB_API_BASE` may be used to +## set the base URL for interating with GitHub (or GHE). The +## result is a URL passed via STDOUT. +## +## Note: there's no assurance that the URL provided is valid +## or points to anything meaningful -- it's just some string +## munging in a conveninently-named helper function. +## @param branch string representing owner/repo@branch +## @retval 0 (True) if a URL was constructed +## @retval 1 (False) if something went wrong +## @returns URL to GitHub API via STDOUT +## @par Examples +## @code +## url="$(build_url "GSA-TTS/tts.gsa.gov@main")" +## @endcode build_url() { item="${1?Error: no owner/repo@branch passed}" + local GITHUB_API_BASE="${GITHUB_API_BASE:-https://api.github.com/}" + repo="${item%%@*}" branch="${item##*@}" @@ -36,20 +159,24 @@ build_url() { branch="main" fi - echo "https://api.github.com/repos/${repo}/branches/${branch}" + echo "${GITHUB_API_BASE}/repos/${repo}/branches/${branch}" } filter_branch_string() { string="${1:-}" -<<<<<<< HEAD echo "$string" | tr -cd '[:alnum:]\/\-\_\.\@' } raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" +if [ -z "$PAT" ] ; then + echo "Error: no Personal Access Token passed via PAT}" + exit 1 +fi + a="$(filter_branch_string "$raw_a")" b="$(filter_branch_string "$raw_b")" -[ "$(compare_dates "$a" "$b")" == "true" ] +[ "$(compare_dates "$a" "$b")" == "true" ] || exit 2 From 7ec33f9b1bcf2536dc28dc5ca86a0bbc4940df17 Mon Sep 17 00:00:00 2001 From: wesley-dean-gsa Date: Thu, 22 Aug 2024 19:04:25 +0000 Subject: [PATCH 06/21] [MegaLinter] Apply linters fixes --- bin/has_newer_commits.bash | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index 37bd93b3..8944bb83 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -124,7 +124,6 @@ compare_dates() { 'if .[0].commit.commit.author.date < .[1].commit.commit.author.date then true else false end' } - ## @fn build_url() ## @brief given the name of a repo, construct a GitHub API URL ## @details @@ -171,7 +170,7 @@ filter_branch_string() { raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" -if [ -z "$PAT" ] ; then +if [ -z "$PAT" ]; then echo "Error: no Personal Access Token passed via PAT}" exit 1 fi From fe79893fdce3838e176e163cf32b4699d79f5266 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Thu, 22 Aug 2024 15:19:53 -0400 Subject: [PATCH 07/21] Add more documentation, main() wrapper --- bin/has_newer_commits.bash | 84 +++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index 37bd93b3..fff2a512 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -63,6 +63,34 @@ set -euo pipefail +## @fn die +## @brief receive a trapped error and display helpful debugging details +## @details +## When called -- presumably by a trap -- die() will provide details +## about what happened, including the filename, the line in the source +## where it happened, and a stack dump showing how we got there. It +## will then exit with a result code of 1 (failure) +## @retval 1 always returns failure +## @par Example +## @code +## trap die ERR +## @endcode +die() { + printf "ERROR %s in %s AT LINE %s\n" "$?" "${BASH_SOURCE[0]}" "${BASH_LINENO[0]}" 1>&2 + + local i=0 + local FRAMES=${#BASH_LINENO[@]} + + # FRAMES-2 skips main, the last one in arrays + for ((i = FRAMES - 2; i >= 0; i--)); do + printf " File \"%s\", line %s, in %s\n" "${BASH_SOURCE[i + 1]}" "${BASH_LINENO[i]}" "${FUNCNAME[i + 1]}" + # Grab the source code of the line + sed -n "${BASH_LINENO[i]}{s/^/ /;p}" "${BASH_SOURCE[i + 1]}" + done + exit 1 +} + + ## @fn fetch_data() ## @brief given a GitHub URL, query it and return the result ## @details @@ -87,9 +115,9 @@ fetch_data() { -H "X-GitHub-Api-Version: 2022-11-28" \ -H "Authorization: Bearer ${PAT}" \ "$url" - } + ## @fn compare_dates() ## @brief given 2 branches, determine if the first is newer than the second ## @details @@ -149,7 +177,7 @@ compare_dates() { build_url() { item="${1?Error: no owner/repo@branch passed}" - local GITHUB_API_BASE="${GITHUB_API_BASE:-https://api.github.com/}" + local GITHUB_API_BASE="${GITHUB_API_BASE:-https://api.github.com}" repo="${item%%@*}" branch="${item##*@}" @@ -162,21 +190,55 @@ build_url() { echo "${GITHUB_API_BASE}/repos/${repo}/branches/${branch}" } + +## @fn filter_branch_string() +## @brief remove potentially unsafe or invalid characters from branch names +## @details +## The names of the branches we're comparing come from outside, +## including potentially via workflow, so we want to be very safe and +## remove anything that could possibly lead to problematic strings +## being passed to `curl` or other CLI tools. This uses `tr` to +## remove anything that's not alphanumeric, dash, underscore, slash, +## period, or at symbol. The at symbol is used to separate the +## owner/repo from the branch name -- it's not actually a valid character +## for use in representing a git repository. Characters that are filtered +## out are deleted, thereby reducing the length of the resulting +## string. They are not replaced with another character (i.e., they're +## not "slugified"). The resulting string is returned via STDOUT. +## @param string the string to filter +## @retval 0 (True) if the filter was successful +## @retval 1 (False) if the filter failed for any reason +## @returns the filtered string via STDOUT +## @par Examples +## @code +## string="$(filter_branch_string "${1:-}")" +## @endcide filter_branch_string() { string="${1:-}" echo "$string" | tr -cd '[:alnum:]\/\-\_\.\@' } -raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" -raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" -if [ -z "$PAT" ] ; then - echo "Error: no Personal Access Token passed via PAT}" - exit 1 -fi +## @fn main() +## @brief the main function +main() { + + trap die ERR -a="$(filter_branch_string "$raw_a")" -b="$(filter_branch_string "$raw_b")" + local raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" + local raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" + + if [ -z "$PAT" ] ; then + echo "Error: no Personal Access Token passed via PAT}" + exit 1 + fi + + a="$(filter_branch_string "$raw_a")" + b="$(filter_branch_string "$raw_b")" + + [ "$(compare_dates "$a" "$b")" == "true" ] || return 2 +} -[ "$(compare_dates "$a" "$b")" == "true" ] || exit 2 +# if we're not being sourced and there's a function named `main`, run it +[[ "$0" == "${BASH_SOURCE[0]}" ]] && [ "$(type -t "main")" == "function" ] && main "$@" From decd9209d86fa19621a2731abc3c5d2ce4e67108 Mon Sep 17 00:00:00 2001 From: wesley-dean-gsa Date: Thu, 22 Aug 2024 19:22:17 +0000 Subject: [PATCH 08/21] [MegaLinter] Apply linters fixes --- bin/has_newer_commits.bash | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/bin/has_newer_commits.bash b/bin/has_newer_commits.bash index 6905bb14..5f3f1e5b 100755 --- a/bin/has_newer_commits.bash +++ b/bin/has_newer_commits.bash @@ -90,7 +90,6 @@ die() { exit 1 } - ## @fn fetch_data() ## @brief given a GitHub URL, query it and return the result ## @details @@ -117,7 +116,6 @@ fetch_data() { "$url" } - ## @fn compare_dates() ## @brief given 2 branches, determine if the first is newer than the second ## @details @@ -189,7 +187,6 @@ build_url() { echo "${GITHUB_API_BASE}/repos/${repo}/branches/${branch}" } - ## @fn filter_branch_string() ## @brief remove potentially unsafe or invalid characters from branch names ## @details @@ -218,21 +215,20 @@ filter_branch_string() { echo "$string" | tr -cd '[:alnum:]\/\-\_\.\@' } - ## @fn main() ## @brief the main function main() { -if [ -z "$PAT" ]; then - echo "Error: no Personal Access Token passed via PAT}" - exit 1 -fi + if [ -z "$PAT" ]; then + echo "Error: no Personal Access Token passed via PAT}" + exit 1 + fi trap die ERR local raw_a="${1?Error: two owner/repo@branch values must be provided (0 were)}" local raw_b="${2?Error: two owner/repo@branch values must be provided (1 was)}" - if [ -z "$PAT" ] ; then + if [ -z "$PAT" ]; then echo "Error: no Personal Access Token passed via PAT}" exit 1 fi From ac6540d4bb484b27528fb40a2bf9fd12c82956b1 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Mon, 26 Aug 2024 11:35:30 -0400 Subject: [PATCH 09/21] Tidy search form, language switcher --- _data/site.yaml | 2 +- _includes/header.html | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/_data/site.yaml b/_data/site.yaml index eddf3928..1bb9475c 100644 --- a/_data/site.yaml +++ b/_data/site.yaml @@ -100,7 +100,7 @@ primary_navigation: # 1. Create an account with Search.gov https://search.usa.gov/signup # 2. Add a new site. # 3. Add your site/affiliate name here. -searchgov: "foobar" +# searchgov: "foobar" # Only change this if you're using a CNAME. Learn more here: https://search.gov/manual/cname.html # endpoint: https://search.usa.gov diff --git a/_includes/header.html b/_includes/header.html index 9a20bf01..152b3d71 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -35,7 +35,6 @@ Here's how you know - {% include "language-switcher.html" %}
From f063f5f3a4727b9addbf1e044ea91d03b8cfe994 Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:38:12 -0400 Subject: [PATCH 10/21] Update home.html Update careers at GSA link --- _includes/layouts/jointts/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/layouts/jointts/home.html b/_includes/layouts/jointts/home.html index 2f5b7750..d23ef978 100644 --- a/_includes/layouts/jointts/home.html +++ b/_includes/layouts/jointts/home.html @@ -65,7 +65,7 @@

Upcoming positions

{% endfor %}

Other GSA Opportunities

-

Check out careers at GSA and more Information Technology opportunities.

+

Check out careers at GSA and more Information Technology opportunities.

Application process

From 809c5c2b8742fd1d6459ca5daedc37dec7b6d2af Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:42:40 -0400 Subject: [PATCH 11/21] Update hiring-process.md Removed breaks --- pages/jointts/hiring-process.md | 147 +++++++------------------------- 1 file changed, 29 insertions(+), 118 deletions(-) diff --git a/pages/jointts/hiring-process.md b/pages/jointts/hiring-process.md index 273bf110..14bca2d0 100644 --- a/pages/jointts/hiring-process.md +++ b/pages/jointts/hiring-process.md @@ -28,11 +28,7 @@ subnav: href: "#security-and-onboarding" --- -Don’t let the federal hiring process seem daunting. We demystify -it below, so you know what to expect. Here's a look at the average time of each -stage from application to your first day at TTS. Please note that these are only -averages, and length of process stages can vary based on a number of factors -such as the number of applications received. +Don’t let the federal hiring process seem daunting. We demystify it below, so you know what to expect. Here's a look at the average time of each stage from application to your first day at TTS. Please note that these are only averages, and length of process stages can vary based on a number of factors such as the number of applications received. | Process Stage | Average Duration/Days | |:-----------------------------------------------|:---------------------:| @@ -44,91 +40,37 @@ such as the number of applications received. ## Info Sessions -Before you apply for a position, we would strongly encourage you to attend an -info session. TTS hosts monthly general hiring info sessions as well as -role-specific info sessions for upcoming or newly-opened roles. At our general -info sessions, candidates can learn about working at TTS, what kinds of roles we -hire for, and what our application process is like. At role-specific info -sessions, candidates will hear some of the same information but will also have a -chance to hear directly from the hiring team about what their vision for the -role is and what a day-in-the-life might actually look like. Candidates can also -ask us questions about the application process, the work, and the team culture. -In order to ensure equity in our hiring processes, TTS Talent will not conduct -one-on-one conversations with candidates about roles, but instead will welcome -folks to attend one of our info sessions. - -Registration information about info sessions can be found on the [JoinTTS -homepage]({{ site.baseurl }}). +Before you apply for a position, we would strongly encourage you to attend an info session. TTS hosts monthly general hiring info sessions as well as role-specific info sessions for upcoming or newly-opened roles. At our general info sessions, candidates can learn about working at TTS, what kinds of roles we hire for, and what our application process is like. At role-specific info sessions, candidates will hear some of the same information but will also have a chance to hear directly from the hiring team about what their vision for the role is and what a day-in-the-life might actually look like. Candidates can also ask us questions about the application process, the work, and the team culture. In order to ensure equity in our hiring processes, TTS Talent will not conduct one-on-one conversations with candidates about roles, but instead will welcome folks to attend one of our info sessions. + +Registration information about info sessions can be found on the [JoinTTS homepage]({{ site.baseurl }}). ## Application -When you apply for a role at TTS, you’ll need to submit a -[government-style resume](https://join.tts.gsa.gov/resume/). We collect -applications during the period specified in the -[Basic Information section](https://join.tts.gsa.gov/federal-job-posting/#basic-information/) -of the job posting, generally 10 business days. After the period has closed, we -review and evaluate all applications at the same time. - -TTS usually posts roles using a Direct Hire Authority, which does not apply -[Veterans’ Preference](https://www.fedshirevets.gov/job-seekers/veterans-preference/). -In some instances, we may post roles using other hiring authorities that do -apply this preference. In those cases Veterans’ Preference is applied for -candidates who have claimed their veteran status. - -TTS does not use automated screening tools, and your application will be -evaluated by people who have varying levels of familiarity with your -professional experience. It’s better to be explicit in your resume and not -assume the reader has expert domain knowledge or context. Because applications -are reviewed by real people, the application review process typically takes a -couple of weeks and the length of time varies by the number of applications -received. +When you apply for a role at TTS, you’ll need to submit a [government-style resume](https://join.tts.gsa.gov/resume/). We collect applications during the period specified in the [Basic Information section](https://join.tts.gsa.gov/federal-job-posting/#basic-information/) of the job posting, generally 10 business days. After the period has closed, we review and evaluate all applications at the same time. + +TTS usually posts roles using a Direct Hire Authority, which does not apply [Veterans’ Preference](https://www.fedshirevets.gov/job-seekers/veterans-preference/). In some instances, we may post roles using other hiring authorities that do apply this preference. In those cases Veterans’ Preference is applied for candidates who have claimed their veteran status. + +TTS does not use automated screening tools, and your application will be evaluated by people who have varying levels of familiarity with your professional experience. It’s better to be explicit in your resume and not assume the reader has expert domain knowledge or context. Because applications are reviewed by real people, the application review process typically takes a couple of weeks and the length of time varies by the number of applications received. ## Interviews -The interview process with TTS typically takes 3-4 weeks total, and we typically -interview in 2-3 rounds total. The first round is a 30-60 minute preliminary -screen by phone or video. During this call, plan to talk briefly about your -skills, experience, and professional passion. We’ll share more about the role, -the teams, and the work we do on a daily basis. - -If we both think, based on the initial call, that you’re still interested in the -opportunity and that you could be a good fit for the role, we’ll invite you to a -series of formal video interviews with different TTS team members. It’s during -these longer conversations that we’ll discuss your past work experience in -addition to the skills and knowledge that you bring with you to TTS. Some -positions will have a technical interview (such as a coding exercise interview) -as a second round before moving candidates forward to the final round of -interviews. Our final round of interviews will always include a TTS Core Values -interview, and if you are interviewing for a supervisory position, you will also be invited to -a TTS Supervisor interview. - -We share copies of all of our interview guides with candidates in advance of -your interviews. Sharing questions in advance helps our team provide you a -better and more informed interview experience. As a candidate, you can better -understand what we’re looking for. By sharing the same prep information with -every candidate, you get a taste of our values in action and we ensure a fair, -equitable hiring process. Everyone comes to the table better prepared. Federal -hiring can be very different from industry or private-sector hiring, and we want -to make this experience as transparent - and enjoyable - as possible! +The interview process with TTS typically takes 3-4 weeks total, and we typically interview in 2-3 rounds total. The first round is a 30-60 minute preliminary screen by phone or video. During this call, plan to talk briefly about your skills, experience, and professional passion. We’ll share more about the role, the teams, and the work we do on a daily basis. + +If we both think, based on the initial call, that you’re still interested in the opportunity and that you could be a good fit for the role, we’ll invite you to a series of formal video interviews with different TTS team members. It’s during these longer conversations that we’ll discuss your past work experience in addition to the skills and knowledge that you bring with you to TTS. Some positions will have a technical interview (such as a coding exercise interview) as a second round before moving candidates forward to the final round of interviews. Our final round of interviews will always include a TTS Core Values interview, and if you are interviewing for a supervisory position, you will also be invited to a TTS Supervisor interview. + +We share copies of all of our interview guides with candidates in advance of your interviews. Sharing questions in advance helps our team provide you a better and more informed interview experience. As a candidate, you can better understand what we’re looking for. By sharing the same prep information with every candidate, you get a taste of our values in action and we ensure a fair, equitable hiring process. Everyone comes to the table better prepared. Federal hiring can be very different from industry or private-sector hiring, and we want to make this experience as transparent - and enjoyable - as possible! ### Interview Format -We typically use Google Meet for all of our screens - if you are not comfortable -or familiar with using Google Meet let your recruiter know and they will be -happy to set up a test chat with you prior to your interviews! You can also test your sound and video prior to your interview using [these instructions](https://support.google.com/meet/answer/10409699?hl=en). +We typically use Google Meet for all of our screens - if you are not comfortable or familiar with using Google Meet let your recruiter know and they will be happy to set up a test chat with you prior to your interviews! You can also test your sound and video prior to your interview using [these instructions](https://support.google.com/meet/answer/10409699?hl=en). -In case there are technical issues with a video call, you will also be provided -with a dial-in number you can call by phone. +In case there are technical issues with a video call, you will also be provided with a dial-in number you can call by phone. -We realize video chats aren’t an option for everyone, so we are also happy to -work with a candidate’s individual needs to ensure they have a good interviewing -experience and can use their preferred method of communication. +We realize video chats aren’t an option for everyone, so we are also happy to work with a candidate’s individual needs to ensure they have a good interviewing experience and can use their preferred method of communication. ### Accommodations -We want to interview you at your best, and we’re more than happy to provide -reasonable accommodations to support that! Let us know if there are -accommodations that we can provide that will help you show your best self. +We want to interview you at your best, and we’re more than happy to provide reasonable accommodations to support that! Let us know if there are accommodations that we can provide that will help you show your best self. Some examples: @@ -140,11 +82,7 @@ Some examples: ## Security and Onboarding -If TTS identifies you as a strong candidate after we complete the interviews, a -TTS recruiter will reach out to you with next steps. The hiring process -continues in partnership with GSA’s (our parent agency) Human Resources team. -They’re responsible for extending tentative and official final offers. The -process is as follows: +If TTS identifies you as a strong candidate after we complete the interviews, a TTS recruiter will reach out to you with next steps. The hiring process continues in partnership with GSA’s (our parent agency) Human Resources team. They’re responsible for extending tentative and official final offers. The process is as follows: - A GSA HR specialist will call you with a tentative offer. “Tentative” means the offer is contingent on a security clearance. This offer will include @@ -165,51 +103,24 @@ process is as follows: ### Security Clearance Documents -All government positions require some level of background check. Most roles at -TTS require a public trust position clearance, which is more thorough than most -private-sector background checks but not as intensive as a higher government -security clearance. The clearance process adds some time and forms to the hiring -process, but the GSA Human Resources team will guide you through it. +All government positions require some level of background check. Most roles at TTS require a public trust position clearance, which is more thorough than most private-sector background checks but not as intensive as a higher government security clearance. The clearance process adds some time and forms to the hiring process, but the GSA Human Resources team will guide you through it. ## More about how we hire ### TTS is an Equal Opportunity Employer -We’re building a team that reflects our country. We don’t discriminate based on -race, color, culture, religion, sex, gender identity or expression, national -origin, political affiliation, sexual orientation, marital status, disability, -neurodiversity, genetic information, age, socio-economics, membership in an -employee organization, retaliation, parental status, military service, or other -non-merit factors. +We’re building a team that reflects our country. We don’t discriminate based on race, color, culture, religion, sex, gender identity or expression, national origin, political affiliation, sexual orientation, marital status, disability, neurodiversity, genetic information, age, socio-economics, membership in an employee organization, retaliation, parental status, military service, or other non-merit factors. ### Hiring Authorities -There are three primary types of -[hiring authorities](https://www.usajobs.gov/Help/working-in-government/service/) -used by TTS: Direct Hire Authority, Competitive Service, and Excepted Service. -The application and hiring process will vary slightly based on the type of role -for which you are applying. - -**Direct Hire Authority:** DHA is a special appointing authority and we use this -authority to fill the majority of roles at TTS. Applications for these roles are -completed on [USAJOBS.gov](https://usajobs.gov). DHA positions can be either -term-limited or full-time career positions. See [About the Direct Hire -Authority]({{ site.baseurl }}/about-the-dha/) for more details. - -**Competitive Service:** Applicants for all competitive service roles must -complete the application process at USAJOBS.gov. Individuals go through a -competitive hiring process before being selected and appointed. This hiring -process may consist of a written test, an evaluation of the individual’s -education and experience, or an evaluation of other attributes necessary for -successful performance in the position to be filled. Competitive Service roles -can be either term-limited or full-time career opportunities. - -**Excepted Service:** These roles are “not to exceed” (NTE) positions, which -means they are two-year terms and can be extended once for a total of four years -of service. These roles are not always posted on USAJOBS.gov. Instead, -candidates can apply via our online application. +There are three primary types of [hiring authorities](https://www.usajobs.gov/Help/working-in-government/service/) used by TTS: Direct Hire Authority, Competitive Service, and Excepted Service. The application and hiring process will vary slightly based on the type of role for which you are applying. + +**Direct Hire Authority:** DHA is a special appointing authority and we use this authority to fill the majority of roles at TTS. Applications for these roles are completed on [USAJOBS.gov](https://usajobs.gov). DHA positions can be either term-limited or full-time career positions. See [About the Direct Hire Authority]({{ site.baseurl }}/about-the-dha/) for more details. + +**Competitive Service:** Applicants for all competitive service roles must complete the application process at USAJOBS.gov. Individuals go through a competitive hiring process before being selected and appointed. This hiring process may consist of a written test, an evaluation of the individual’s education and experience, or an evaluation of other attributes necessary for successful performance in the position to be filled. Competitive Service roles can be either term-limited or full-time career opportunities. + +**Excepted Service:** These roles are “not to exceed” (NTE) positions, which means they are two-year terms and can be extended once for a total of four years of service. These roles are not always posted on USAJOBS.gov. Instead, candidates can apply via our online application. ### Eligibility -All United States citizens and nationals (residents of American Samoa and Swains -Islands) are eligible to apply. +All United States citizens and nationals (residents of American Samoa and Swains Islands) are eligible to apply. From 638f0589bd927bfbe2f79ea0f7f80a5dc8565327 Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:45:43 -0400 Subject: [PATCH 12/21] Update compensation-and-benefits.md Removed breaks Updated calculator from 2022 to 2024 --- pages/jointts/compensation-and-benefits.md | 68 ++++------------------ 1 file changed, 12 insertions(+), 56 deletions(-) diff --git a/pages/jointts/compensation-and-benefits.md b/pages/jointts/compensation-and-benefits.md index df32cc3d..bc8930ca 100644 --- a/pages/jointts/compensation-and-benefits.md +++ b/pages/jointts/compensation-and-benefits.md @@ -32,73 +32,29 @@ subnav: ## Government Pay Grades -TTS team members are hired for specific position descriptions at a -specific grade level from the federal General Schedule (GS) (excluding -[Senior Executive Service](https://www.opm.gov/policy-data-oversight/senior-executive-service/) positions). The GS system is a pay system for civilian employees in -the federal government; evaluation and compensation varies by grade -level. The qualification requirements for each position at a specific GS -level are based on education, background, accomplishments, and -experience. The specific requirements will always be listed in the job -posting. Salaries of federal employees are public information, and your -salary may become publicly available on sites such as - -[FederalPay.org](https://www.federalpay.org/employees). Find - -out more about the GS system from the [Office of Personnel -Management](https://www.opm.gov/policy-data-oversight/pay-leave/pay-systems/general-schedule/). +TTS team members are hired for specific position descriptions at a specific grade level from the federal General Schedule (GS) (excluding [Senior Executive Service](https://www.opm.gov/policy-data-oversight/senior-executive-service/) positions). The GS system is a pay system for civilian employees in the federal government; evaluation and compensation varies by grade level. The qualification requirements for each position at a specific GS level are based on education, background, accomplishments, and experience. The specific requirements will always be listed in the job posting. Salaries of federal employees are public information, and your salary may become publicly available on sites such as [FederalPay.org](https://www.federalpay.org/employees). Find out more about the GS system from the [Office of Personnel Management](https://www.opm.gov/policy-data-oversight/pay-leave/pay-systems/general-schedule/). ## Understanding Grade Levels -Federal employees on the general schedule range from GS-1 to GS-15. GS grade levels specify a fixed compensation range for a particular -position, in particular geographic localities, within the federal -government. Understanding the relationship between GS grade level, -location, and compensation is important to understanding how salaries -work at TTS. - -Each GS grade level contains a series of 10 steps. New employees are -usually hired at Step 1 of a GS grade. However, in special -circumstances, agencies may authorize a higher step rate for a -newly-appointed federal employee based on a [special need of the agency -or superior qualifications of the prospective -employee](https://www.opm.gov/policy-data-oversight/pay-leave/pay-administration/fact-sheets/superior-qualifications-and-special-needs-pay-setting-authority/). - -Use this [OPM General Schedule (GS) Salary -Calculator](https://www.opm.gov/policy-data-oversight/pay-leave/salaries-wages/2022/general-schedule-gs-salary-calculator/) -to help you understand how GS level, step and locality affect -compensation. The 2022 salary cap for all GS employees is $176,300 per year. You -cannot be offered more than this under any circumstance. +Federal employees on the general schedule range from GS-1 to GS-15. GS grade levels specify a fixed compensation range for a particular position, in particular geographic localities, within the federal government. Understanding the relationship between GS grade level, location, and compensation is important to understanding how salaries work at TTS. + +Each GS grade level contains a series of 10 steps. New employees are usually hired at Step 1 of a GS grade. However, in special circumstances, agencies may authorize a higher step rate for a newly-appointed federal employee based on a [special need of the agency or superior qualifications of the prospective employee](https://www.opm.gov/policy-data-oversight/pay-leave/pay-administration/fact-sheets/superior-qualifications-and-special-needs-pay-setting-authority/). + +Use this [OPM General Schedule (GS) Salary Calculator](https://www.opm.gov/policy-data-oversight/pay-leave/salaries-wages/2024/general-schedule-gs-salary-calculator/) to help you understand how GS level, step and locality affect compensation. The 2024 salary cap for all GS employees is $191,900 per year. You cannot be offered more than this under any circumstance. ## Raises and Bonuses -A step increase is the most common kind of raise for GS employees, and -the amount of time between step increases is dependent on the step. As a -GS employee, you have to wait one year to increase to a step 2, 3, or 4. -You must wait two years before increasing to step 5, 6, or 7. Lastly, -you must wait three years before increasing to step 8, 9, or 10. This -means that if you join TTS at step 1, you’ll proceed to step 2 the -following year. If you join TTS at step 6, it will take two years to -progress to step 7. - -Bonuses are generally assessed after the year-end review process in late -September and are awarded based on your performance review results. You -must be a TTS employee for at least three months to get a performance -review. Bonuses are awarded as either a small percentage of your annual -salary or through allotment of additional paid leave. +A step increase is the most common kind of raise for GS employees, and the amount of time between step increases is dependent on the step. As a GS employee, you have to wait one year to increase to a step 2, 3, or 4. You must wait two years before increasing to step 5, 6, or 7. Lastly, you must wait three years before increasing to step 8, 9, or 10. This means that if you join TTS at step 1, you’ll proceed to step 2 the following year. If you join TTS at step 6, it will take two years to progress to step 7. + +Bonuses are generally assessed after the year-end review process in late September and are awarded based on your performance review results. You must be a TTS employee for at least three months to get a performance review. Bonuses are awarded as either a small percentage of your annual salary or through allotment of additional paid leave. ## Benefits and Leave -The benefits package for federal employees includes medical, vision, and -dental insurance, FSA accounts, life insurance, paid leave, and the -Thrift Savings Plan (the government version of a 401K) with up to five -percent matching. Our telework policy affords increased flexibility, and -employees who use public transit to commute may claim commuter benefits. +The benefits package for federal employees includes medical, vision, and dental insurance, FSA accounts, life insurance, paid leave, and the Thrift Savings Plan (the government version of a 401K) with up to five percent matching. Our telework policy affords increased flexibility, and employees who use public transit to commute may claim commuter benefits. -TTS also supports employees’ ongoing professional development by -providing training opportunities and encouraging employees to -participate in conferences, consortia, and other industry events. +TTS also supports employees’ ongoing professional development by providing training opportunities and encouraging employees to participate in conferences, consortia, and other industry events. -The [TTS Handbook](https://handbook.18f.gov/) has more information -about working at TTS, including: +The [TTS Handbook](https://handbook.18f.gov/) has more information about working at TTS, including: - [Benefits](https://handbook.18f.gov/benefits/) - [Leave](https://handbook.18f.gov/benefits/#leave) From e5c69896b47f6535c42fc65c2c711ba85277adec Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Mon, 26 Aug 2024 11:46:03 -0400 Subject: [PATCH 13/21] Remove small search box --- _data/assetPaths.json | 14 +++++++------- _includes/menu.html | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/_data/assetPaths.json b/_data/assetPaths.json index 78fe7682..bdb1c3cf 100644 --- a/_data/assetPaths.json +++ b/_data/assetPaths.json @@ -1,9 +1,9 @@ { - "admin.js": "/assets/js/admin-FRDUYGSL.js", - "admin.map": "/assets/js/admin-FRDUYGSL.js.map", - "app.js": "/assets/js/app-SDZ4ULFW.js", - "app.map": "/assets/js/app-SDZ4ULFW.js.map", + "admin.js": "/assets/js/admin-RJYP54EU.js", + "admin.map": "/assets/js/admin-RJYP54EU.js.map", + "app.js": "/assets/js/app-XFKDNIAK.js", + "app.map": "/assets/js/app-XFKDNIAK.js.map", "uswds.js": "/assets/js/uswds-init.js", - "styles.css": "/assets/styles/styles-J5DQM6RN.css", - "styles.map": "/assets/styles/styles-J5DQM6RN.css.map" -} + "styles.css": "/assets/styles/styles-ZVXT7TJI.css", + "styles.map": "/assets/styles/styles-ZVXT7TJI.css.map" +} \ No newline at end of file diff --git a/_includes/menu.html b/_includes/menu.html index f22dcd0a..dfafe4c2 100644 --- a/_includes/menu.html +++ b/_includes/menu.html @@ -61,7 +61,6 @@ {% endfor %} --> - {% comment %} This will redirect the results to /search template which will handle the js loading @@ -87,6 +86,7 @@ {% endif %} +{% comment %}

- + {% endcomment %} {% include "searchgov/form.html" searchgov: site.searchgov %}
From c8355e234d092931322e523d997f4ba21f53e565 Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:47:02 -0400 Subject: [PATCH 14/21] Update resume.md Removed breaks --- pages/jointts/resume.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pages/jointts/resume.md b/pages/jointts/resume.md index 78a29f1c..518ae58f 100644 --- a/pages/jointts/resume.md +++ b/pages/jointts/resume.md @@ -31,13 +31,9 @@ subnav: --- -Your resume may need revision to ensure you’re positioning yourself to -make it through the initial steps of the government hiring process. +Your resume may need revision to ensure you’re positioning yourself to make it through the initial steps of the government hiring process. -There is no such thing as too much information when preparing your -resume, which may be several pages long and should include detailed -information about the jobs you’ve held, your responsibilities, and what -you accomplished. +There is no such thing as too much information when preparing your resume, which may be several pages long and should include detailed information about the jobs you’ve held, your responsibilities, and what you accomplished. This is an [example](https://handbook.18f.gov/resume/) of what your resume might look like for a position with TTS. From 39d3ee2c9dffe390366cf4731cbae6003d064302 Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:51:17 -0400 Subject: [PATCH 15/21] Update rolling-hiring.md Remove breaks Update calc from 2022 to 2024 --- pages/jointts/rolling-hiring.md | 133 ++++++++------------------------ 1 file changed, 33 insertions(+), 100 deletions(-) diff --git a/pages/jointts/rolling-hiring.md b/pages/jointts/rolling-hiring.md index 90d365f5..6084f711 100644 --- a/pages/jointts/rolling-hiring.md +++ b/pages/jointts/rolling-hiring.md @@ -34,121 +34,61 @@ subnav: href: "#more-about-working-at-tts" --- -We’re excited to be moving forward with your interviews! Below is more -information to help you understand the interview and hiring process, along -with additional resources covering our benefits and organization. +We’re excited to be moving forward with your interviews! Below is more information to help you understand the interview and hiring process, along with additional resources covering our benefits and organization. ## What to expect after submitting your resume -- Applications are being reviewed on an ongoing basis. If the team finds - that there is a position match for your skills and experience, we will - reach out. Due to a high volume of applications received, we are unable - to contact each applicant regarding the status of their application. -- For those who are reviewed and there appears to be a potential match, - we’ll move on to the “Interview process and timeline” section below +- Applications are being reviewed on an ongoing basis. If the team finds that there is a position match for your skills and experience, we will reach out. Due to a high volume of applications received, we are unable to contact each applicant regarding the status of their application. +- For those who are reviewed and there appears to be a potential match, we’ll move on to the “Interview process and timeline” section below ## Interview process and timeline -The interview process is up to 3 rounds and is as follows. The total -process will be up to 3 hours in duration (spread across multiple dates). -This process can take place over several weeks. - -1. *Phone Screen Interview (60 minutes)* — Phone Interview with a member - of the interviewing team to discuss your background - *Note: For Bilingual roles there will be a language proficiency assessment* -2. *Technical Interview (60 minutes)* - This is a behavioral style - interview which will deeper dive into your technical expertise -3. *Core Values Interview (60 minutes)* - This is a behavioral style interview - to evaluate alignment with - [TTS core values](https://handbook.tts.gsa.gov/about-us/tts-history/) - of inclusion, integrity, and impact -4. A final call with the proposed destination team and candidate may occur - at the end of the interview process. It is an open ended conversation - and a chance for the candidate and proposed destination team to get to - know each other to see if there is mutual interest and skillset fit - -We typically use Google Meet for our video interviews — if you are -not comfortable or familiar with using Google Meet let your recruiter -know and they will be happy to set up a test chat with you prior to -your interviews! If you have specific scheduling accommodation needs -(such as closed captioning requirements, time of day availability, etc.) -please let us know. - -In case there are technical issues with a video call, you will also be -provided with a dial-in number you can call by phone. -We realize video chats aren’t an option for everyone, so we are also happy -to work with a candidate’s individual needs to ensure they have a good -interviewing experience and can use their preferred method of communication. - -Interviews can take up to several weeks as we try to work with everyone’s -schedule. We encourage our hiring teams to make selections as quickly as -possible, but it can sometimes take a week or two before we are able to -share the team’s decision after your final interview. - -We want you to be able to present your best self! To help, we will provide -Interview questions ahead of the interviews via email. - -Please note, we will request references if you are selected to move forward -in the process. +The interview process is up to 3 rounds and is as follows. The total process will be up to 3 hours in duration (spread across multiple dates). This process can take place over several weeks. + +1. *Phone Screen Interview (60 minutes)* — Phone Interview with a member of the interviewing team to discuss your background *Note: For Bilingual roles there will be a language proficiency assessment* +2. *Technical Interview (60 minutes)* - This is a behavioral style interview which will deeper dive into your technical expertise +3. *Core Values Interview (60 minutes)* - This is a behavioral style interview to evaluate alignment with [TTS core values](https://handbook.tts.gsa.gov/about-us/tts-history/) of inclusion, integrity, and impact +4. A final call with the proposed destination team and candidate may occur at the end of the interview process. It is an open ended conversation and a chance for the candidate and proposed destination team to get to know each other to see if there is mutual interest and skillset fit + +We typically use Google Meet for our video interviews — if you are not comfortable or familiar with using Google Meet let your recruiter know and they will be happy to set up a test chat with you prior to your interviews! If you have specific scheduling accommodation needs (such as closed captioning requirements, time of day availability, etc.) please let us know. + +In case there are technical issues with a video call, you will also be provided with a dial-in number you can call by phone. We realize video chats aren’t an option for everyone, so we are also happy to work with a candidate’s individual needs to ensure they have a good interviewing experience and can use their preferred method of communication. + +Interviews can take up to several weeks as we try to work with everyone’s schedule. We encourage our hiring teams to make selections as quickly as possible, but it can sometimes take a week or two before we are able to share the team’s decision after your final interview. + +We want you to be able to present your best self! To help, we will provide interview questions ahead of the interviews via email. + +Please note, we will request references if you are selected to move forward in the process. ## Time to hire -It’s important to note that once we have made a hiring decision, it can often -take 2 - 2.5 months to move through the onboarding process and confirm your -final start date. This part of the process includes some background checks -for security clearance needs, sorting out IT gear,badging, direct deposit, -and negotiating your start date. We have a member of the Talent Team fully -dedicated to ensuring that this part of the process moves as smoothly as -possible. +It’s important to note that once we have made a hiring decision, it can often take 2 - 2.5 months to move through the onboarding process and confirm your final start date. This part of the process includes some background checks for security clearance needs, sorting out IT gear,badging, direct deposit, and negotiating your start date. We have a member of the Talent Team fully dedicated to ensuring that this part of the process moves as smoothly as possible. -Please let your recruiter know if this estimate conflicts with your -required timeline for securing a new role. +Please let your recruiter know if this estimate conflicts with your required timeline for securing a new role. ## Length of role -Government hiring is different from industry hiring. This role is a -DHA (Direct Hire Authority) term appointment in the 2210 technical job series, -with an initial term of 3 years which can be extended up to 8 years in -duration based on solid performance in the role and organizational need. +Government hiring is different from industry hiring. This role is a DHA (Direct Hire Authority) term appointment in the 2210 technical job series, with an initial term of 3 years which can be extended up to 8 years in duration based on solid performance in the role and organizational need. ## Grade levels and calculating pay -This position is subject to the GS pay scale so if you haven't already, -please be sure to check out the pay for your locality using -[OPM’s pay calculator](https://www.opm.gov/policy-data-oversight/pay-leave/salaries-wages/2022/general-schedule-gs-salary-calculator/). -GSA’s max salary has increased to $176,300. You cannot be offered more than -this under any circumstance. +This position is subject to the GS pay scale so if you haven't already, please be sure to check out the pay for your locality using [OPM’s pay calculator](https://www.opm.gov/policy-data-oversight/pay-leave/salaries-wages/2024/general-schedule-gs-salary-calculator/). GSA’s max salary has increased to $191,900. You cannot be offered more than this under any circumstance. -Understanding the relationship between GS grade level, location, and -compensation is important to understanding how salaries work at TTS. +Understanding the relationship between GS grade level, location, and compensation is important to understanding how salaries work at TTS. -Each GS grade level contains a series of 10 steps. New employees are -usually hired at Step 1 of a GS grade. However, in special circumstances, -agencies may authorize a higher step rate for a newly-appointed federal -employee based on a -[special need of the agency or superior qualifications of the prospective employee](https://www.opm.gov/policy-data-oversight/pay-leave/pay-administration/fact-sheets/superior-qualifications-and-special-needs-pay-setting-authority/). +Each GS grade level contains a series of 10 steps. New employees are usually hired at Step 1 of a GS grade. However, in special circumstances, agencies may authorize a higher step rate for a newly-appointed federal employee based on a [special need of the agency or superior qualifications of the prospective employee](https://www.opm.gov/policy-data-oversight/pay-leave/pay-administration/fact-sheets/superior-qualifications-and-special-needs-pay-setting-authority/). -This job posting includes roles at the GS13, GS14, and GS15 level. -Your approved GS level will depend on qualification from an HR specialist -if you are selected at the end of the interview process. +This job posting includes roles at the GS13, GS14, and GS15 level. Your approved GS level will depend on qualification from an HR specialist if you are selected at the end of the interview process. -If you have questions or concerns about the salary for this role, please -let your recruiter know so you can have a more in-depth conversation. +If you have questions or concerns about the salary for this role, please let your recruiter know so you can have a more in-depth conversation. ## Benefits -In addition to joining a passionate, nationwide team, there are many other -benefits and perks associated with joining TTS. +In addition to joining a passionate, nationwide team, there are many other benefits and perks associated with joining TTS. -The benefits package for federal employees includes medical, vision, -and dental insurance, FSA accounts, life insurance, paid leave, and the -Thrift Savings Plan (the government version of a 401K) with up to five -percent matching. Our telework policy affords increased flexibility, and -employees who use public transit to commute may access commuter benefits. +The benefits package for federal employees includes medical, vision, and dental insurance, FSA accounts, life insurance, paid leave, and the Thrift Savings Plan (the government version of a 401K) with up to five percent matching. Our telework policy affords increased flexibility, and employees who use public transit to commute may access commuter benefits. -TTS also supports employees’ ongoing professional development by providing -training opportunities and encouraging employees to participate in -conferences, training, and other industry events. +TTS also supports employees’ ongoing professional development by providing training opportunities and encouraging employees to participate in conferences, training, and other industry events. The [TTS Handbook](https://handbook.18f.gov/) includes: - [Benefits](https://handbook.18f.gov/benefits/) @@ -156,17 +96,11 @@ The [TTS Handbook](https://handbook.18f.gov/) includes: - [Professional development and training processes](https://handbook.18f.gov/attending-conferences/) -Note: If you are coming over from another agency where you received award -leave, unfortunately it will not carry over to GSA. Sick leave and annual -leave do transfer, however. +Note: If you are coming over from another agency where you received award leave, unfortunately it will not carry over to GSA. Sick leave and annual leave do transfer, however. ## More about working at TTS -The Technology Transformation Service (TTS) exists under the domain of the -General Services Administration (GSA). TTS is home to the following offices: -18F, Centers of Excellence, Office of Acquisition, Office of Solutions, and -Presidential Innovation Fellows. You can read more info about each office on -our [Join page](https://join.tts.gsa.gov/tts-offices/). +The Technology Transformation Service (TTS) exists under the domain of the General Services Administration (GSA). TTS is home to the following offices: 18F, Centers of Excellence, Office of Acquisition, Office of Solutions, and Presidential Innovation Fellows. You can read more info about each office on our [Join page](https://join.tts.gsa.gov/tts-offices/). You can also read more about each of these groups at their TTS Handbook Pages: [Acquisition](https://handbook.18f.gov/acqstack/) | @@ -177,5 +111,4 @@ You can also read more about each of these groups at their TTS Handbook Pages: [Product](https://handbook.18f.gov/product/) | -Thank you for taking the time to talk to our team -and for your interest in public service! +Thank you for taking the time to talk to our team and for your interest in public service! From 9f57d8b79ff7c0236264479d2adc40feee9fb8ee Mon Sep 17 00:00:00 2001 From: wesley-dean-gsa Date: Mon, 26 Aug 2024 15:51:32 +0000 Subject: [PATCH 16/21] [MegaLinter] Apply linters fixes --- _data/assetPaths.json | 2 +- _data/site.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/_data/assetPaths.json b/_data/assetPaths.json index bdb1c3cf..9fb6d1c4 100644 --- a/_data/assetPaths.json +++ b/_data/assetPaths.json @@ -6,4 +6,4 @@ "uswds.js": "/assets/js/uswds-init.js", "styles.css": "/assets/styles/styles-ZVXT7TJI.css", "styles.map": "/assets/styles/styles-ZVXT7TJI.css.map" -} \ No newline at end of file +} diff --git a/_data/site.yaml b/_data/site.yaml index 1bb9475c..319e2705 100644 --- a/_data/site.yaml +++ b/_data/site.yaml @@ -89,7 +89,6 @@ primary_navigation: url: "/services/platforms/" - name: People url: "/services/people/" - # secondary_navigation: # - name: Secondary link # url: "#main-content" From 68939a1d1575fc140d35a6308a996e464b18bdad Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:05:50 -0400 Subject: [PATCH 17/21] Update hiring-process.md Remove more breaks --- pages/jointts/hiring-process.md | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/pages/jointts/hiring-process.md b/pages/jointts/hiring-process.md index 14bca2d0..3e03de44 100644 --- a/pages/jointts/hiring-process.md +++ b/pages/jointts/hiring-process.md @@ -84,22 +84,12 @@ Some examples: If TTS identifies you as a strong candidate after we complete the interviews, a TTS recruiter will reach out to you with next steps. The hiring process continues in partnership with GSA’s (our parent agency) Human Resources team. They’re responsible for extending tentative and official final offers. The process is as follows: -- A GSA HR specialist will call you with a tentative offer. “Tentative” means - the offer is contingent on a security clearance. This offer will include - salary for your consideration. - - **Please note:** This is only a tentative offer. At this point you should - not give notice or resign from your current employer. You should delay these - steps until you receive the final offer with a confirmed start date from HR. -- Once you have accepted the tentative offer, you will receive an email from the - HR onboarding system. You will need to login and accept your tentative offer. -- Once you accept your tentative offer, you will complete a series of forms and - receive a USAccess email requesting you to schedule a time to provide your - fingerprints for your security clearance and complete an electronic - questionnaire for investigation processing (e-QIP). -- Once your e-QIP has been initially cleared, you will receive an interim - security clearance, and a GSA HR specialist will call you with a final offer. -- At this stage, GSA HR and the TTS Talent team will work with you to identify - and set a start date. +- A GSA HR specialist will call you with a tentative offer. “Tentative” means the offer is contingent on a security clearance. This offer will include salary for your consideration. + - **Please note:** This is only a tentative offer. At this point you should not give notice or resign from your current employer. You should delay these steps until you receive the final offer with a confirmed start date from HR. +- Once you have accepted the tentative offer, you will receive an email from the HR onboarding system. You will need to login and accept your tentative offer. +- Once you accept your tentative offer, you will complete a series of forms and receive a USAccess email requesting you to schedule a time to provide your fingerprints for your security clearance and complete an electronic questionnaire for investigation processing (e-QIP). +- Once your e-QIP has been initially cleared, you will receive an interim security clearance, and a GSA HR specialist will call you with a final offer. +- At this stage, GSA HR and the TTS Talent team will work with you to identify and set a start date. ### Security Clearance Documents From 333fd73eb73548e99f80c912c0d4db0c89300fc0 Mon Sep 17 00:00:00 2001 From: Deb Judy <63518697+debjudy@users.noreply.github.com> Date: Mon, 26 Aug 2024 12:07:45 -0400 Subject: [PATCH 18/21] Update rolling-hiring.md More formatting updates --- pages/jointts/rolling-hiring.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/pages/jointts/rolling-hiring.md b/pages/jointts/rolling-hiring.md index 6084f711..ecc7c1c3 100644 --- a/pages/jointts/rolling-hiring.md +++ b/pages/jointts/rolling-hiring.md @@ -93,8 +93,9 @@ TTS also supports employees’ ongoing professional development by providing tra The [TTS Handbook](https://handbook.18f.gov/) includes: - [Benefits](https://handbook.18f.gov/benefits/) - [Leave](https://handbook.18f.gov/benefits/#leave) - - [Professional development and training processes](https://handbook.18f.gov/attending-conferences/) + + Note: If you are coming over from another agency where you received award leave, unfortunately it will not carry over to GSA. Sick leave and annual leave do transfer, however. @@ -103,12 +104,12 @@ Note: If you are coming over from another agency where you received award leave, The Technology Transformation Service (TTS) exists under the domain of the General Services Administration (GSA). TTS is home to the following offices: 18F, Centers of Excellence, Office of Acquisition, Office of Solutions, and Presidential Innovation Fellows. You can read more info about each office on our [Join page](https://join.tts.gsa.gov/tts-offices/). You can also read more about each of these groups at their TTS Handbook Pages: - [Acquisition](https://handbook.18f.gov/acqstack/) | - [cloud.gov](https://cloud.gov/) | - [Design](https://handbook.18f.gov/design/) | - [Engineering](https://handbook.18f.gov/engineering/) | - [login.gov](https://login.gov/) | - [Product](https://handbook.18f.gov/product/) | + - [Acquisition](https://handbook.18f.gov/acqstack/) + - [cloud.gov](https://cloud.gov/) + - [Design](https://handbook.18f.gov/design/) + - [Engineering](https://handbook.18f.gov/engineering/) + - [login.gov](https://login.gov/) + - [Product](https://handbook.18f.gov/product/) -Thank you for taking the time to talk to our team and for your interest in public service! +Thank you for taking the time to talk to our team and for your interest in public service! \ No newline at end of file From d53be4a82cfb007167cd347878f311219d42bb1a Mon Sep 17 00:00:00 2001 From: debjudy Date: Mon, 26 Aug 2024 16:10:05 +0000 Subject: [PATCH 19/21] [MegaLinter] Apply linters fixes --- pages/jointts/rolling-hiring.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/jointts/rolling-hiring.md b/pages/jointts/rolling-hiring.md index ecc7c1c3..588453ab 100644 --- a/pages/jointts/rolling-hiring.md +++ b/pages/jointts/rolling-hiring.md @@ -104,12 +104,12 @@ Note: If you are coming over from another agency where you received award leave, The Technology Transformation Service (TTS) exists under the domain of the General Services Administration (GSA). TTS is home to the following offices: 18F, Centers of Excellence, Office of Acquisition, Office of Solutions, and Presidential Innovation Fellows. You can read more info about each office on our [Join page](https://join.tts.gsa.gov/tts-offices/). You can also read more about each of these groups at their TTS Handbook Pages: - - [Acquisition](https://handbook.18f.gov/acqstack/) - - [cloud.gov](https://cloud.gov/) - - [Design](https://handbook.18f.gov/design/) - - [Engineering](https://handbook.18f.gov/engineering/) - - [login.gov](https://login.gov/) - - [Product](https://handbook.18f.gov/product/) +- [Acquisition](https://handbook.18f.gov/acqstack/) +- [cloud.gov](https://cloud.gov/) +- [Design](https://handbook.18f.gov/design/) +- [Engineering](https://handbook.18f.gov/engineering/) +- [login.gov](https://login.gov/) +- [Product](https://handbook.18f.gov/product/) Thank you for taking the time to talk to our team and for your interest in public service! \ No newline at end of file From 75ca941bea0bc01d11d4c1325c36e25248ff34a1 Mon Sep 17 00:00:00 2001 From: Wes Dean Date: Mon, 26 Aug 2024 12:58:18 -0400 Subject: [PATCH 20/21] Replace the fancyness with HTML dumped right into the hero.html file --- _data/assetPaths.json | 14 +++++++------- _data/heroAlert.json | 2 +- _includes/hero.html | 12 +++++++++++- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/_data/assetPaths.json b/_data/assetPaths.json index 78fe7682..bdb1c3cf 100644 --- a/_data/assetPaths.json +++ b/_data/assetPaths.json @@ -1,9 +1,9 @@ { - "admin.js": "/assets/js/admin-FRDUYGSL.js", - "admin.map": "/assets/js/admin-FRDUYGSL.js.map", - "app.js": "/assets/js/app-SDZ4ULFW.js", - "app.map": "/assets/js/app-SDZ4ULFW.js.map", + "admin.js": "/assets/js/admin-RJYP54EU.js", + "admin.map": "/assets/js/admin-RJYP54EU.js.map", + "app.js": "/assets/js/app-XFKDNIAK.js", + "app.map": "/assets/js/app-XFKDNIAK.js.map", "uswds.js": "/assets/js/uswds-init.js", - "styles.css": "/assets/styles/styles-J5DQM6RN.css", - "styles.map": "/assets/styles/styles-J5DQM6RN.css.map" -} + "styles.css": "/assets/styles/styles-ZVXT7TJI.css", + "styles.map": "/assets/styles/styles-ZVXT7TJI.css.map" +} \ No newline at end of file diff --git a/_data/heroAlert.json b/_data/heroAlert.json index 913a93ce..e7a06bde 100644 --- a/_data/heroAlert.json +++ b/_data/heroAlert.json @@ -1,3 +1,3 @@ { - "message": "TTS is hiring, Join us!" + "message": "TTS is hiring, Join us!!" } diff --git a/_includes/hero.html b/_includes/hero.html index 34a33770..a1d95635 100644 --- a/_includes/hero.html +++ b/_includes/hero.html @@ -3,7 +3,17 @@ {% endcomment %} {% if site.show_site_alert %} - {% render "hero-alert.html", alert: heroAlert['message'] %} + +
+
+
+

+ TTS is hiring, Join us! +

+
+
+
+ {% endif %}
From ccb86f13f13dc9187587f29f89caa321161119d5 Mon Sep 17 00:00:00 2001 From: wesley-dean-gsa Date: Mon, 26 Aug 2024 17:06:06 +0000 Subject: [PATCH 21/21] [MegaLinter] Apply linters fixes --- _data/assetPaths.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/assetPaths.json b/_data/assetPaths.json index bdb1c3cf..9fb6d1c4 100644 --- a/_data/assetPaths.json +++ b/_data/assetPaths.json @@ -6,4 +6,4 @@ "uswds.js": "/assets/js/uswds-init.js", "styles.css": "/assets/styles/styles-ZVXT7TJI.css", "styles.map": "/assets/styles/styles-ZVXT7TJI.css.map" -} \ No newline at end of file +}