r3_citation_strip
R3: prompt told to drop citation tags 'because the UI shows sources separately'
Guard successfull suite successchange categories: prompt7 checks run, impact analysis 0.2 s
Guard, live
Live runs are turned off on this public site. The results below are recorded; live runs happen on the owner's runner.
Checks: targeted selection vs full suite
Recorded in RQ3 (2026-10-06). Its perf-gate figures predate the gate's warmup fix; see the corrections; the re-measured numbers are in the repair timeline below.
| check | selected by Guard | result | s | detail |
|---|---|---|---|---|
| unit:tests/test_retriever.py | no: exercises nothing this change touches | pass | 1.4 | 2 passed in 0.43s |
| unit:tests/test_prompts.py | yes | pass | 1.5 | 2 passed in 0.48s |
| check:citation_required | yes | pass | 10.0 | citation contract met in 0/34 answers on the PR vs 0/34 on base (-0.0 pts; budget -5 pts; p=1.00); via full answer path (incl. post-processing) |
| judge:ungrounded_answer | yes | skip | 0.0 | no judge model key configured (BYOK); judge not run |
| check:prompt_prefix_stable | yes | pass | 3.6 | requests share 3875 leading characters (base 3954, need 3558) |
| check:context_budget | yes | pass | 7.6 | largest prompt 959 tokens (base 980) against a budget of 3840; median 943 vs 964 |
| security:approval_gate | yes | pass | 1.4 | 1 approval test(s) (generated from the base revision): 1 passed in 0.30s |
| bench:chat_perf_gate | yes | pass | 45.2 | median p95 TTFT 234.5 -> 232.6 ms (-0.8%, pass; 3 runs each, runs overlap); prefix-cache hit 98% -> 97% |
Check run as posted to GitHub (markdown)
# No regressions in 7 targeted checks conclusion: success **Ran 7 of 8 suite items** selected from the behavior-to-code graph. Change categories: prompt. ### Quality | check | result | detail | |---|---|---| | `check:citation_required` | **PASS** | citation contract met in 0/34 answers on the PR vs 0/34 on base (-0.0 pts; budget -5 pts; p=1.00); via full answer path (incl. post-processing) | | `judge:ungrounded_answer` | **SKIP** | no judge model key configured (BYOK); judge not run | ### Performance | check | result | detail | |---|---|---| | `check:prompt_prefix_stable` | **PASS** | requests share 3875 leading characters (base 3954, need 3558) | | `check:context_budget` | **PASS** | largest prompt 959 tokens (base 980) against a budget of 3840; median 943 vs 964 | | `bench:chat_perf_gate` | **PASS** | median p95 TTFT 234.5 -> 232.6 ms (-0.8%, pass; 3 runs each, runs overlap); prefix-cache hit 98% -> 97% | ### Security | check | result | detail | |---|---|---| | `security:approval_gate` | **PASS** | 1 approval test(s) (generated from the base revision): 1 passed in 0.30s | ### Tests | check | result | detail | |---|---|---| | `unit:tests/test_prompts.py` | **PASS** | 2 passed in 0.48s | <details><summary>Not run for this change</summary> - `unit:tests/test_retriever.py`: exercises nothing this change touches </details> ### What changed in the graph - `prompt:app/prompts.py::SYSTEM_PROMPT`: `static_chars` 3927 -> 3848; `approx_tokens` 982 -> 962 - `prompt:app/prompts.py::build_messages#system`: `static_chars` 3927 -> 3848; `static_prefix_chars` 3927 -> 3848