You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/workflows/publish-contract.yml
+12Lines changed: 12 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -23,6 +23,18 @@ on:
23
23
description: "Internal: set by the release automation's dispatch so this run skips re-creating the GitHub release it already made."
24
24
type: boolean
25
25
default: false
26
+
dispatched_by_automation:
27
+
description: "Internal: set by the release automation's dispatch so a hand retry is not counted as an outage. Informational -- it feeds run-name below and nothing else."
28
+
type: boolean
29
+
default: false
30
+
31
+
# PROVENANCE STAMP (#10234). `run-name` is the ONLY dispatch-time signal the runs API gives back (as
32
+
# `display_title`): the reconcile path dispatches bare against main under a PAT, so `event`, `head_branch`
33
+
# and `triggering_actor` are identical to a human's `gh workflow run`, and run objects carry no `inputs`.
34
+
# scripts/escalate-workflow-outage.ts recovers "was this automated?" from the marker below -- see its
35
+
# header for the full story. The marker must stay in lockstep with that script's
36
+
# AUTOMATION_RUN_NAME_MARKER; scripts/check-dispatch-provenance-stamped.ts fails the build if they drift.
Copy file name to clipboardExpand all lines: .github/workflows/publish-engine.yml
+12Lines changed: 12 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -18,6 +18,18 @@ on:
18
18
description: "Internal: set by the release automation's dispatch so this run skips re-creating the GitHub release it already made."
19
19
type: boolean
20
20
default: false
21
+
dispatched_by_automation:
22
+
description: "Internal: set by the release automation's dispatch so a hand retry is not counted as an outage. Informational -- it feeds run-name below and nothing else."
23
+
type: boolean
24
+
default: false
25
+
26
+
# PROVENANCE STAMP (#10234). `run-name` is the ONLY dispatch-time signal the runs API gives back (as
27
+
# `display_title`): the reconcile path dispatches bare against main under a PAT, so `event`, `head_branch`
28
+
# and `triggering_actor` are identical to a human's `gh workflow run`, and run objects carry no `inputs`.
29
+
# scripts/escalate-workflow-outage.ts recovers "was this automated?" from the marker below -- see its
30
+
# header for the full story. The marker must stay in lockstep with that script's
31
+
# AUTOMATION_RUN_NAME_MARKER; scripts/check-dispatch-provenance-stamped.ts fails the build if they drift.
Copy file name to clipboardExpand all lines: .github/workflows/publish-mcp.yml
+12Lines changed: 12 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -12,6 +12,18 @@ on:
12
12
description: "Internal: set by the release automation's dispatch so this run skips re-creating the GitHub release it already made."
13
13
type: boolean
14
14
default: false
15
+
dispatched_by_automation:
16
+
description: "Internal: set by the release automation's dispatch so a hand retry is not counted as an outage. Informational -- it feeds run-name below and nothing else."
17
+
type: boolean
18
+
default: false
19
+
20
+
# PROVENANCE STAMP (#10234). `run-name` is the ONLY dispatch-time signal the runs API gives back (as
21
+
# `display_title`): the reconcile path dispatches bare against main under a PAT, so `event`, `head_branch`
22
+
# and `triggering_actor` are identical to a human's `gh workflow run`, and run objects carry no `inputs`.
23
+
# scripts/escalate-workflow-outage.ts recovers "was this automated?" from the marker below -- see its
24
+
# header for the full story. The marker must stay in lockstep with that script's
25
+
# AUTOMATION_RUN_NAME_MARKER; scripts/check-dispatch-provenance-stamped.ts fails the build if they drift.
Copy file name to clipboardExpand all lines: .github/workflows/publish-miner.yml
+12Lines changed: 12 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -18,6 +18,18 @@ on:
18
18
description: "Internal: set by the release automation's dispatch so this run skips re-creating the GitHub release it already made."
19
19
type: boolean
20
20
default: false
21
+
dispatched_by_automation:
22
+
description: "Internal: set by the release automation's dispatch so a hand retry is not counted as an outage. Informational -- it feeds run-name below and nothing else."
23
+
type: boolean
24
+
default: false
25
+
26
+
# PROVENANCE STAMP (#10234). `run-name` is the ONLY dispatch-time signal the runs API gives back (as
27
+
# `display_title`): the reconcile path dispatches bare against main under a PAT, so `event`, `head_branch`
28
+
# and `triggering_actor` are identical to a human's `gh workflow run`, and run objects carry no `inputs`.
29
+
# scripts/escalate-workflow-outage.ts recovers "was this automated?" from the marker below -- see its
30
+
# header for the full story. The marker must stay in lockstep with that script's
31
+
# AUTOMATION_RUN_NAME_MARKER; scripts/check-dispatch-provenance-stamped.ts fails the build if they drift.
Copy file name to clipboardExpand all lines: .github/workflows/publish-ui-kit.yml
+12Lines changed: 12 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -18,6 +18,18 @@ on:
18
18
description: "Internal: set by the release automation's dispatch so this run skips re-creating the GitHub release it already made."
19
19
type: boolean
20
20
default: false
21
+
dispatched_by_automation:
22
+
description: "Internal: set by the release automation's dispatch so a hand retry is not counted as an outage. Informational -- it feeds run-name below and nothing else."
23
+
type: boolean
24
+
default: false
25
+
26
+
# PROVENANCE STAMP (#10234). `run-name` is the ONLY dispatch-time signal the runs API gives back (as
27
+
# `display_title`): the reconcile path dispatches bare against main under a PAT, so `event`, `head_branch`
28
+
# and `triggering_actor` are identical to a human's `gh workflow run`, and run objects carry no `inputs`.
29
+
# scripts/escalate-workflow-outage.ts recovers "was this automated?" from the marker below -- see its
30
+
# header for the full story. The marker must stay in lockstep with that script's
31
+
# AUTOMATION_RUN_NAME_MARKER; scripts/check-dispatch-provenance-stamped.ts fails the build if they drift.
Copy file name to clipboardExpand all lines: apps/loopover-ui/content/docs/self-hosting-operations.mdx
+28-1Lines changed: 28 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -676,13 +676,18 @@ three standalone bindings (`AI_EMBED`, `AI_VISION`, `AI_ADVISORY`).
676
676
{
677
677
title: "Content policy",
678
678
description:
679
-
"Metadata only — never the prompt or completion text. $ai_generation's own optional content fields ($ai_input/$ai_output_choices) are never populated, the same redaction posture as every other capture path on this page.",
679
+
"Metadata only by default — no prompt or completion text leaves the box unless you explicitly opt in. $ai_generation's optional content fields ($ai_input/$ai_output_choices) stay unpopulated unless LOOPOVER_POSTHOG_AI_CONTENT is set, so upgrading never starts shipping content on its own.",
680
680
},
681
681
{
682
682
title: "Model labelling",
683
683
description:
684
684
"$ai_model is always the model the provider actually resolved — on the failure path too. The core passes a Workers-AI model id that every self-host provider discards, so it is resolved to the real one (or <provider>-default) before capture and never reported verbatim.",
685
685
},
686
+
{
687
+
title: "Trace naming",
688
+
description:
689
+
"$ai_trace names the whole review in PostHog's Traces view. Emitted once per trace, by the outermost pipeline span, and only when at least one AI call actually ran under it — a pipeline span with no generations is never given a trace row.",
690
+
},
686
691
{
687
692
title: "Degraded requests",
688
693
description:
@@ -691,6 +696,28 @@ three standalone bindings (`AI_EMBED`, `AI_VISION`, `AI_ADVISORY`).
691
696
]}
692
697
/>
693
698
699
+
### Capturing prompts and completions (`LOOPOVER_POSTHOG_AI_CONTENT`)
700
+
701
+
**Off by default, and deliberately so.** With it unset, no prompt, diff or model completion ever leaves the
702
+
box — only the metadata listed above. Set `LOOPOVER_POSTHOG_AI_CONTENT=1` to populate `$ai_input` and
703
+
`$ai_output_choices`, which is what unlocks PostHog's conversation view, sentiment, evaluations and
704
+
LLM-judge surfaces. Read this before turning it on:
705
+
706
+
-**Your PR diffs and review text go to PostHog.** The prompt for a review contains the diff and the
707
+
assembled repo context. On a private repository that is private source code leaving your infrastructure.
708
+
Only enable it on a project you are willing to have that content in.
709
+
-**The same redaction still applies.** Captured content passes through the identical `before_send` scrub
710
+
(`src/selfhost/redaction-scrub.ts`) as every other field — credential shapes, JWTs and query-string
711
+
secrets are redacted from it. That is a backstop, not a licence: it removes credential shapes, not the
712
+
source code itself.
713
+
-**Content is truncated.** Each message is capped at 10,000 characters
714
+
(`LOOPOVER_POSTHOG_AI_CONTENT_MAX_CHARS`) and marked `…[truncated]`. A review prompt can exceed 300,000
715
+
characters, so an uncapped capture would blow past PostHog's payload limits and be dropped entirely. A
716
+
non-numeric, zero or negative override falls back to the default rather than disabling the cap.
717
+
-**Images are never captured.** An image content block is dropped, not base64-encoded into the event.
718
+
-**On a failure, the prompt is captured but there is no completion** — a `claude_stalled_no_output` or a
719
+
context-length rejection is only diagnosable against the input that produced it.
720
+
694
721
A CLI-subscription provider declining an embedding request (`claude_code_no_embed` / `codex_no_embed`)
695
722
is routing working as designed — it is how an embed reaches an embed-capable provider — so it is exempt
696
723
from both captures. A chain with **no** embed-capable member at all is a real misconfiguration, but it
0 commit comments