Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
9c0102a
Add collectors exports approvals and packaging
hunterinvariants Jun 6, 2026
edf73e8
Add Postgres storage and RBAC
hunterinvariants Jun 6, 2026
aaa5b23
Add audit logging and Postgres integration setup
hunterinvariants Jun 6, 2026
e87fe2e
Run CI against Postgres
hunterinvariants Jun 6, 2026
643bb42
Add schema migrations and security automation
hunterinvariants Jun 6, 2026
be02588
Add dashboard session login
hunterinvariants Jun 6, 2026
09661b6
Add Postgres backup and readiness tooling
hunterinvariants Jun 6, 2026
0d46135
Add long-running collectors and response webhook execution
hunterinvariants Jun 6, 2026
b1e7085
Add response connectors and GitHub hardening
hunterinvariants Jun 6, 2026
bf5206b
Add native collectors and GitHub response integrations
hunterinvariants Jun 6, 2026
367fecf
Add Ubuntu deploy workflow
hunterinvariants Jun 6, 2026
8fd199c
Add self-hosted VM deploy workflow
hunterinvariants Jun 6, 2026
c20800f
Add runner bootstrap script
hunterinvariants Jun 6, 2026
84e10b4
Fix runner bootstrap temp permissions
hunterinvariants Jun 6, 2026
13c922f
Fix runner auth token flow
hunterinvariants Jun 6, 2026
670aa47
Fix runner service install cwd
hunterinvariants Jun 6, 2026
bc194ad
Skip runner config when already registered
hunterinvariants Jun 6, 2026
393260e
Fix runner service install privilege
hunterinvariants Jun 6, 2026
4c52f4f
Upgrade GitHub Actions to Node24
hunterinvariants Jun 6, 2026
6792aeb
Add deploy readiness retries
hunterinvariants Jun 6, 2026
d3e37bc
Add verbose deploy helper
hunterinvariants Jun 6, 2026
194d5b0
Harden startup, retention, and workflow pins
hunterinvariants Jun 6, 2026
86e6381
Retry collector failures with state rollback
hunterinvariants Jun 6, 2026
cf696fa
Deploy main pushes to the staging VM
hunterinvariants Jun 6, 2026
3463c7b
Fix defaults and add startup smoke test
hunterinvariants Jun 7, 2026
59fb04d
Require release signing and drop legacy deploy workflow
hunterinvariants Jun 7, 2026
32fc05e
Add inline tool-call gateway
hunterinvariants Jun 7, 2026
b6fb44d
Add wedge demo flow
hunterinvariants Jun 7, 2026
19622e6
Convert inline gateway to PEP
hunterinvariants Jun 7, 2026
6614c18
Harden gateway signal analysis
hunterinvariants Jun 7, 2026
828785e
Add taint-aware gateway analysis
hunterinvariants Jun 7, 2026
502c43e
Add gateway queue and approval polling
hunterinvariants Jun 7, 2026
eaaa428
Add gateway risk scoring and history
hunterinvariants Jun 7, 2026
1ec2edf
Add threat pack, audit chain, and gateway proxy
hunterinvariants Jun 7, 2026
663859c
Add transparent MCP proxy
hunterinvariants Jun 7, 2026
adf069e
Add tenant isolation and OIDC SSO
hunterinvariants Jun 7, 2026
9b0e1c0
Add SAML SSO and HA deployment metadata
hunterinvariants Jun 7, 2026
fea4485
Add HA instance support and tenant isolation docs
hunterinvariants Jun 7, 2026
afdfa28
Add physical tenant isolation and tenant admin UI
hunterinvariants Jun 7, 2026
345e476
Finish tenant admin and HA rollout helpers
hunterinvariants Jun 7, 2026
2d30a3c
Fix proxy, audit, and session security gaps
hunterinvariants Jun 7, 2026
003c500
Fix HA proxy, audit, and SSO residuals
hunterinvariants Jun 7, 2026
dd70be3
Anchor audit chain with HMAC
hunterinvariants Jun 7, 2026
71757e7
Update setup-go workflow pins
hunterinvariants Jun 7, 2026
01c1b27
Fix audit chain state insert columns
hunterinvariants Jun 7, 2026
caa8e05
chore: rerun ci after workflow pin update
hunterinvariants Jun 7, 2026
7beddd5
fix: make ci smoke test more robust
hunterinvariants Jun 7, 2026
a63a24a
Fix advisory-lock leak blocking audit-chain integration test + honest…
hunterinvariants Jun 7, 2026
be78f03
Bump actions/upload-artifact from 6.0.0 to 7.0.1
dependabot[bot] Jun 7, 2026
d715535
Bump actions/github-script from 8.0.0 to 9.0.0
dependabot[bot] Jun 7, 2026
9a5216e
Add replay retry/backoff with import report, threat model and hardeni…
hunterinvariants Jun 7, 2026
0720f25
Add HMAC-signed threat pack manifests
hunterinvariants Jun 7, 2026
5072795
Add hot policy reload without restart
hunterinvariants Jun 7, 2026
4758ebd
Add deception token registry
hunterinvariants Jun 7, 2026
ac9f3be
Add replayed-telemetry integration test
hunterinvariants Jun 7, 2026
68515e4
Add investigation timeline API
hunterinvariants Jun 7, 2026
1b006be
Add Jira and ServiceNow enterprise ticket connectors
hunterinvariants Jun 7, 2026
212a56f
Add Ed25519 commercial license workflow
hunterinvariants Jun 7, 2026
772a004
Add org-scoped policy sets with admin RBAC
hunterinvariants Jun 7, 2026
963c886
Make CI startup smoke test robust against a boot/poll race
hunterinvariants Jun 7, 2026
b77bd29
Update README for connectors, license tokens, and org-scoped policy
hunterinvariants Jun 7, 2026
031477f
Bump version to 0.2.0
hunterinvariants Jun 7, 2026
bb0c2a9
Enforce org-scoped policy on the MCP proxy path
hunterinvariants Jun 7, 2026
8b98d2a
Patch dependency vulnerabilities (goxmldsig SAML bypass, Go stdlib)
hunterinvariants Jun 7, 2026
f5d3a2b
Harden gateway proxy SSRF defenses
hunterinvariants Jun 7, 2026
3739e7b
Re-derive Postgres audit-chain validity and fix retention write ampli…
hunterinvariants Jun 8, 2026
cb5f63a
Harden systemd units: loopback bind and full sandbox
hunterinvariants Jun 8, 2026
1feea5d
Enforce HTTPS on OIDC issuer and discovery endpoints
hunterinvariants Jun 8, 2026
364fb53
Fix gateway connection-pool exhaustion deadlock
hunterinvariants Jun 8, 2026
0117746
Scope assets by tenant to prevent cross-tenant collisions
hunterinvariants Jun 8, 2026
02aec47
Harden SSO role mapping, OIDC azp, and audit-key separation
hunterinvariants Jun 8, 2026
395c32a
Scope tenant administration and gate proxy endpoints in open mode
hunterinvariants Jun 8, 2026
bb9c042
Redact internal errors, fail closed on threat-pack signing, decode mu…
hunterinvariants Jun 8, 2026
8b0859a
Add request body limits, cap correlator input, and fuzz the parsers
hunterinvariants Jun 8, 2026
155b624
Make logout revoke sessions server-side
hunterinvariants Jun 8, 2026
661a97a
Strengthen CSP and lock in the security-header backstop
hunterinvariants Jun 8, 2026
3f1aa1c
Harden CI/CD supply chain (action pinning, least privilege, provenance)
hunterinvariants Jun 8, 2026
fe09145
Bump actions/download-artifact from 8.0.0 to 8.0.1
dependabot[bot] Jun 8, 2026
379ad28
Allowlist the self-hosted deploy ref
hunterinvariants Jun 8, 2026
1c79dc0
Bump actions/checkout from 6.0.1 to 6.0.3
dependabot[bot] Jun 8, 2026
e051544
Sanitize user-influenced strings in server logs
hunterinvariants Jun 8, 2026
58111d9
Run the self-hosted runner as non-root behind a fixed deploy wrapper
hunterinvariants Jun 8, 2026
b5277e6
Update docs to reflect the current system and security posture
hunterinvariants Jun 8, 2026
7cf72dc
Expand SECURITY.md with disclosure policy and release verification
hunterinvariants Jun 8, 2026
6b8de49
Add promtactl validate for authorized detection validation
hunterinvariants Jun 8, 2026
31c1858
Extend validate with coverage maps, continuous mode, and a larger suite
hunterinvariants Jun 8, 2026
6bee8e0
Add validation regression alerting and a dashboard coverage panel
hunterinvariants Jun 8, 2026
f63fa75
Wait for server readiness before validating
hunterinvariants Jun 8, 2026
34f1a17
Add lateral-movement/impact detection, more emulations, and a coverag…
hunterinvariants Jun 8, 2026
7c4f431
Add agent tool-provenance verification to the gateway
hunterinvariants Jun 8, 2026
bef644b
Make policy.json approved tools and egress hosts authoritative
hunterinvariants Jun 8, 2026
dfb7c05
Add agent-identity verification to the gateway
hunterinvariants Jun 8, 2026
bf84797
Let the validation suite present an agent identity
hunterinvariants Jun 8, 2026
a72ca44
Make the MCP proxy surface-aware
hunterinvariants Jun 8, 2026
30c1e9f
Add real-agent MCP integration demo and inline-PEP benchmark
hunterinvariants Jun 8, 2026
be83874
Harden the foundation: bound gateway history, race CI, core coverage
hunterinvariants Jun 9, 2026
65f309e
Add a LangChain reference integration
hunterinvariants Jun 9, 2026
f417315
Strengthen auth and gateway concurrency coverage
hunterinvariants Jun 9, 2026
20b2c40
Harden the foundation: fuzzing, SSO, persistence, overload
hunterinvariants Jun 9, 2026
b212a81
Bump version to 0.3.0
hunterinvariants Jun 9, 2026
8e511d3
Update README.md
hunterinvariants Jun 15, 2026
45925b4
Update README.md
hunterinvariants Jun 15, 2026
c3a173c
Update README.md
hunterinvariants Jun 15, 2026
9971e1e
Fix Tenants panel layout: equal columns, consistent padding, tighter …
hunterinvariants Jul 19, 2026
93c6cc7
Harden quality gates and container delivery
hunterinvariants Jul 27, 2026
aebdb96
Release v0.4.0
hunterinvariants Jul 27, 2026
403d5a1
Pin quality badge to main
hunterinvariants Jul 27, 2026
22c5d84
Merge pull request #3 from hunterinvariants/dependabot/github_actions…
hunterinvariants Aug 6, 2026
aafaaf6
Merge pull request #5 from hunterinvariants/dependabot/github_actions…
hunterinvariants Aug 6, 2026
591be9a
Add a database-backed tenant directory for multi-customer operation
hunterinvariants Aug 6, 2026
85a47af
Add platform provisioning API for customer tenants
hunterinvariants Aug 6, 2026
0d577ad
Stop the CLA gate from failing bot pull requests, add security badges
hunterinvariants Aug 6, 2026
79323bf
Replace the dashboard with a React console embedded in the binary
hunterinvariants Aug 6, 2026
5813a33
Merge pull request #4 from hunterinvariants/dependabot/github_actions…
hunterinvariants Aug 6, 2026
de45a52
Upgrade CodeQL action to v4.37.6
hunterinvariants Aug 6, 2026
ba2ac15
Merge pull request #2 from hunterinvariants/dependabot/github_actions…
hunterinvariants Aug 6, 2026
5a38afa
Document publishing the console through a Cloudflare Tunnel
hunterinvariants Aug 6, 2026
b2904a9
Add SaaS metering and verifiable security claims
hunterinvariants Aug 6, 2026
5b9e969
Restrict metrics to the platform operator and prove usage metering is…
hunterinvariants Aug 6, 2026
b701042
Prove chain-aware risk escalates within a run and stays isolated acro…
hunterinvariants Aug 6, 2026
4647639
Keep enforcing when storage fails, and reconcile the record afterwards
hunterinvariants Aug 6, 2026
457ad05
Make the storage-failure injection portable
hunterinvariants Aug 6, 2026
6062b22
Carry tool provenance on every surface and keep known agents authenti…
hunterinvariants Aug 6, 2026
60ee1fb
Add correlation ids and optional structured request logs
hunterinvariants Aug 6, 2026
e74ce96
Bump version to 0.5.0
hunterinvariants Aug 6, 2026
088c8b8
Sign the policy file so a tampered one cannot take effect
hunterinvariants Aug 6, 2026
2cc61ab
Add an edge alert receiver for detection regressions
hunterinvariants Aug 6, 2026
c86142b
Version the API by mirroring, and ship an embedded OpenAPI document
hunterinvariants Aug 6, 2026
dc475d2
Keep local Wrangler state out of the repository
hunterinvariants Aug 6, 2026
2f6c842
Add OTLP distributed tracing without new dependencies
hunterinvariants Aug 6, 2026
5136872
Report the build revision behind --version
hunterinvariants Aug 6, 2026
417f1e2
Separate service accounts from human accounts
hunterinvariants Aug 6, 2026
25e444f
Require a second factor between credential and session
hunterinvariants Aug 6, 2026
d2b0927
Add SCIM 2.0 provisioning and deprovisioning
hunterinvariants Aug 6, 2026
39cc925
Seal secrets at rest with envelope encryption
hunterinvariants Aug 6, 2026
f299094
Derive test token hashes per run
hunterinvariants Aug 6, 2026
dba07c1
Cut the README down and write up the design decisions
hunterinvariants Aug 6, 2026
9eb60be
Add a release pruner that cannot delete the live release
hunterinvariants Aug 6, 2026
c154c1f
Rename tables carried over from the former project name
hunterinvariants Aug 6, 2026
dd02c57
Drop the legacy table-prefix migration
hunterinvariants Aug 6, 2026
1f99a49
Bump aquasecurity/trivy-action
dependabot[bot] Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
.git
.github
.cache
.gocache
.gomodcache
bin
dist
output
*.exe
*.out
*.log
27 changes: 27 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Bug report
description: Report a defect in defensive behavior, API, UI, or packaging.
title: "[bug] "
labels: ["bug"]
body:
- type: textarea
id: summary
attributes:
label: Summary
description: What went wrong?
validations:
required: true
- type: textarea
id: steps
attributes:
label: Reproduction Steps
description: Include commands, sample defensive telemetry, and expected vs actual behavior.
validations:
required: true
- type: textarea
id: safety
attributes:
label: Safety Check
description: Do not include exploit code, credentials, malware samples, or unauthorized target details.
validations:
required: true

27 changes: 27 additions & 0 deletions .github/ISSUE_TEMPLATE/collector_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: Collector request
description: Request or improve a defensive telemetry collector.
title: "[collector] "
labels: ["collector"]
body:
- type: input
id: source
attributes:
label: Telemetry Source
placeholder: Sysmon, auditd, Zeek, Suricata, proxy, EDR, SIEM
validations:
required: true
- type: textarea
id: sample
attributes:
label: Redacted Sample
description: Provide redacted defensive log samples only. Remove secrets, usernames if sensitive, public IPs if needed, and customer identifiers.
validations:
required: true
- type: textarea
id: mapping
attributes:
label: Desired Mapping
description: Which Promtact event fields should this populate?
validations:
required: false

30 changes: 30 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Feature request
description: Suggest defensive functionality or operational improvements.
title: "[feature] "
labels: ["enhancement"]
body:
- type: textarea
id: problem
attributes:
label: Problem
description: What defensive workflow or operational gap should this solve?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposal
description: What should Promtact do?
validations:
required: true
- type: dropdown
id: edition
attributes:
label: Likely Edition
options:
- Community core
- Commercial/enterprise
- Unsure
validations:
required: true

23 changes: 23 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: 2
updates:
- package-ecosystem: gomod
directory: /
schedule:
interval: weekly
day: monday
time: "04:00"
open-pull-requests-limit: 5
labels:
- dependencies
- go

- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
time: "04:30"
open-pull-requests-limit: 5
labels:
- dependencies
- github-actions
92 changes: 88 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,97 @@ on:
push:
branches: [main]

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

permissions:
contents: read

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_DB: promtact
POSTGRES_USER: promtact
POSTGRES_PASSWORD: promtact
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U promtact -d promtact"
--health-interval 5s
--health-timeout 3s
--health-retries 20
env:
PROMTACT_TEST_POSTGRES_DSN: postgres://promtact:promtact@localhost:5432/promtact?sslmode=disable
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
with:
go-version: "1.24.x"
- run: go test ./...
go-version: "1.25.12"
- run: go mod download
- run: go vet ./...
- name: Test with race detector
run: go test -race ./...
- name: Smoke test local startup
shell: bash
run: |
set -euo pipefail
log="$(mktemp)"
go build -o /tmp/promtact ./cmd/promtact
/tmp/promtact --demo --addr 127.0.0.1:0 --insecure >"$log" 2>&1 &
pid=$!
trap 'kill "$pid" 2>/dev/null || true; wait "$pid" 2>/dev/null || true' EXIT
addr=""
for _ in $(seq 1 60); do
if ! kill -0 "$pid" 2>/dev/null; then
echo "server process exited before it became ready" >&2
cat "$log"
exit 1
fi
addr="$(grep -Eo 'http://[^[:space:]]+' "$log" | tail -n 1 || true)"
if [ -n "$addr" ]; then
break
fi
sleep 1
done
if [ -z "$addr" ]; then
cat "$log"
exit 1
fi
if ! curl --fail --silent "$addr/healthz" >/dev/null; then
echo "healthz check failed for $addr" >&2
cat "$log"
exit 1
fi
kill "$pid"
wait "$pid" || true
trap - EXIT

build:
runs-on: ubuntu-latest
needs: test
strategy:
fail-fast: false
matrix:
goos: [linux, windows]
goarch: [amd64, arm64]
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
with:
go-version: "1.25.12"
- name: Build binaries
shell: bash
run: |
suffix=""
if [ "${{ matrix.goos }}" = "windows" ]; then suffix=".exe"; fi
mkdir -p dist
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -o "dist/promtact-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./cmd/promtact
GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -o "dist/promtactl-${{ matrix.goos }}-${{ matrix.goarch }}${suffix}" ./cmd/promtactl
51 changes: 51 additions & 0 deletions .github/workflows/cla.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: cla

on:
pull_request_target:
types:
- opened
- synchronize
- reopened
- edited
- labeled
- unlabeled

permissions:
contents: read
pull-requests: write

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3
with:
script: |
const approvedAssociations = new Set(['OWNER', 'MEMBER', 'COLLABORATOR']);
const association = context.payload.pull_request.author_association;
if (approvedAssociations.has(association)) {
core.info(`Skipping CLA check for internal contributor (${association}).`);
return;
}

// Bots cannot sign a CLA, and their changes carry no copyrightable
// contribution to license. Without this, every automated dependency
// update would stay permanently red and train us to ignore red PRs.
const login = (context.payload.pull_request.user && context.payload.pull_request.user.login) || '';
const isBot = context.payload.pull_request.user?.type === 'Bot' || login.endsWith('[bot]');
if (isBot) {
core.info(`Skipping CLA check for bot account (${login}).`);
return;
}

const body = context.payload.pull_request.body || '';
const bodyMatches = /-\s*\[x\]\s*I have signed the Promtact CLA/i.test(body);
const labels = new Set((context.payload.pull_request.labels || []).map((label) => label.name.toLowerCase()));
const labelMatches = labels.has('cla-signed');

if (bodyMatches || labelMatches) {
core.info('CLA check passed.');
return;
}

core.setFailed('External contributors must keep the CLA checkbox checked in the PR template or receive the cla-signed label.');
28 changes: 28 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: codeql

on:
pull_request:
push:
branches: [main]
schedule:
- cron: "24 3 * * 1"

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

permissions:
actions: read
contents: read
security-events: write

jobs:
analyze:
name: Analyze Go
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
with:
languages: go
- uses: github/codeql-action/autobuild@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
- uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
18 changes: 18 additions & 0 deletions .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: dependency-review

on:
pull_request:

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

permissions:
contents: read
pull-requests: read

jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
- uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294
Loading
Loading