·
Last changedVersion:
This version passed the hardening gate. Hardening applied 2 targeted changes and preserved all other text. Classified findings before hardening: 1. Classified findings closed: 0. Classified findings remaining: 1. Unclassified scanner findings remaining: 0. Review findings closed: 1. Review findings remaining: 8.
1
1
Expand | File | Group | Subtype | Severity | Status |
|---|---|---|---|---|---|
SKILL.md | Prompt Injection | Direct prompt injection | Medium | Open |
1 finding
This skill is the practical guide to endpoint versioning. It covers the today-workflow, which has some sharp edges worth being explicit about.
data_freshness_seconds on a specific version?"| Behaviour | Reality |
|---|---|
Query change | Auto-cuts a new version. Saving any edit to the query creates a new version and bumps the current version number |
Settings change (description, | Does not cut a new version. Updates the targeted version in place |
The "current" version | Always the highest version number — it's not a pointer you can move backwards |
Calling without | Runs the latest version. So unpinned callers always hit the newest |
Disabling the whole endpoint |
|
Disabling a single version |
|
The model is forward-only. There is no "make v3 the default again" operation today. Practically
this means "rollback" requires either creating a new top version that re-uses the old query, or
pinning callers to ?version=N.
| Tool | Purpose |
|---|---|
| List all versions for an endpoint, latest first |
| Full config; supports |
| The workhorse — supports |
| Execute a version directly via |
There is no "draft" concept in the model. Editing the query commits it as a new version immediately. To preview safely:
execute-sql tool (or the SQL editor) — not on the live endpointendpoint-run with ?version=N to confirm the new version returns what you expectIf the user needs a true staging endpoint, the only workaround today is a sibling endpoint
with a _v2 or _staging suffix. Document this honestly — there is no in-product staging path.
The forward-only model means "rollback" requires forking:
endpoint-versions to find the version with the good query (say v3)endpoint-get with ?version=3 to retrieve that version's query JSONendpoint-update with the v3 query as the new query — this creates a new version (e.g.
v6) with the same query as v3?version=N now hit v6 (== v3's query)The old version (v5, the broken one) still exists and is still callable via ?version=5 until
explicitly deactivated.
Faster mitigation if you can change every caller: have them pin to ?version=3 until a real
fix is ready. Lower-impact than cutting a new version.
endpoint-update accepts a version field in the body. When set, settings updates apply to
that version only — they do not cut a new version. Useful when:
data_freshness_seconds on an old version that some callers still pin toImportant: passing query together with version is rejected — query changes always cut a new
top version, never modify history. The version arg only affects settings.
To take v3 out of service while keeping v4 and v5 callable:
This sets is_active: false on v3 only. Callers pinned to ?version=3 start getting an error;
other callers are unaffected.
To re-enable: same call with is_active: true.
The whole-endpoint is_active field (without version) is a separate switch — it disables
every version at once. Use the version-scoped form for surgical takedowns.
Old versions accumulate over time. To find which are dead, call endpoint-versions and read each
version's last_executed_at: a version that's null or long stale hasn't been called recently.
Materialised dead versions are the costly ones — disable their materialisation with
endpoint-update + version + is_materialized: false, and deactivate with is_active: false
to signal they're retired.
Confirm with the user before retiring a version: last_executed_at counts only personal-API-key
calls and is recorded only for runs since that tracking was added (so a used version can still
read null), and a caller may be pinned to ?version=N. The full audit flow lives in
auditing-endpoints.
{endpoint_name}_v{version}. Disabling materialisation on one version doesn't affect others.?version=N are
insulated from query edits; unpinned callers always hit the latest and can be surprised by a new
version. Encourage consumers to pin, validate a new version, then bump the pin deliberately.posthog-cli exp endpoints {pull,push,diff} lets the user
keep endpoint definitions as YAML in version control and review changes before pushing — a
cleaner workflow than editing live when query changes need review.endpoint-update does it.Get started with chainctlchainctl skill install public/posthog/managing-endpoint-versions:latest
Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.
skills.cgr.dev/public/github.com/posthog/skills/omnibus/managing-endpoint-versions:latest
MIT
HARDENING.md
LICENSE
SKILL.md