We take security seriously and work to keep this project up to date. If you discover a security vulnerability, please report it privately so we can investigate and ship a fix before the issue becomes public.
Please use one of the following private channels — do not open a public issue, pull request, or discussion for security concerns:
- Preferred: open a private report via GitHub's Privately reporting a security vulnerability flow on this repository's Security tab.
- Email: send the details to hello@hyphen.ai. If the issue is urgent, include
[SECURITY]in the subject line and we will respond as soon as possible.
When reporting, please include as much of the following as you can:
- A description of the vulnerability and its impact.
- Steps to reproduce, or a proof-of-concept.
- The affected version(s) and platform.
- Any suggested remediation, if you have one.
We will acknowledge receipt, work with you on a coordinated disclosure timeline, and credit you in the advisory once a fix is published unless you ask to remain anonymous.
This repository follows the defense-in-depth hardening checklist; progress is tracked in DEFENSE_IN_DEPTH.md. Measures currently in place:
- All changes land through pull requests — direct pushes to
mainare blocked, and merging requires passing status checks. - Tags can only be created by repository admins; published GitHub Releases are immutable (assets and tags cannot be changed after publish).
- Workflow runs from outside collaborators always require maintainer approval, and only allowlisted GitHub Actions can run.
- Secret scanning and push protection are enabled; private vulnerability reporting is enabled.
- CI workflows default to read-only
contentspermissions; generated output is not committed back from CI; every action is pinned to a full commit SHA; Socket Firewall (sfw) wrapspnpm install; workflows are security-linted with zizmor on every PR. - Release jobs disable
setup-node's default package-manager cache. - The release workflow stages packages with
pnpm stage publish(pack then stage a tarball); it does not publish live. CI authenticates with stage-only OIDC trusted publishing; Drydock reviews the staged artifact; a maintainer promotes with 2FA. There are no npm tokens. - Aikido Security scans pull requests; the release stage job does not run unless an Aikido
scan-releasegate passes. - Workflows that run untrusted pull-request code do not use
pull_request_target. - The package manager is pinned in
package.json(packageManager). - There is no Dependabot config; dependency updates land through pull requests.
- Codespaces and Cursor Cloud Agents install through Aikido Safe Chain; package-manager shims must not be bypassed.
- The Codespaces Dev Container image is pinned by digest (
name:<tag>@sha256:<digest>), not a floating tag. - Dependencies install through pnpm with a 7-day cooldown on new versions, lifecycle scripts blocked by default, and
trustPolicy: no-downgrade.