Skip to content

Commit d3cffe6

Browse files
committed
docs: record the context bounds and tag neutralisation
1 parent 90f372a commit d3cffe6

1 file changed

Lines changed: 16 additions & 1 deletion

File tree

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,25 @@ environment)" while CI had already run those tests. Runs with no denials average
2929
seconds against 37 turns and 270 seconds for runs with five or more.
3030

3131
Each block degrades to a sentence saying what is missing rather than to silence, because a reviewer
32-
handed an empty CI block will state that CI is clean. The step is `continue-on-error`: a failure
32+
handed an empty CI block will state that CI is clean. Two reads get a stronger treatment: a failed
33+
`/reviews` or `/pulls/{n}/comments` would otherwise render as `REVIEW CYCLE: 1` and "no prior review
34+
comments", which are claims rather than gaps, so those failures are disclosed to the reviewer in a
35+
`## Context warnings` block at the top of the context. The step is `continue-on-error`: a failure
3336
there once skipped the review step and the notify step with it, leaving the PR with no review and no
3437
explanation.
3538

39+
Both step outputs are byte-bounded (100 KB of comment threads, 200 KB of context), with per-block
40+
caps beneath that — 3,000 diff lines, 40 KB per CI log excerpt, 3,000 characters per comment. The
41+
caps are deliberately far below any plausible runner limit: 400 inline comments rendered 1.1 MB of
42+
threads before they existed, and the runner accounts for output size in UTF-16, so a byte count here
43+
is not the number it checks against. Blocks are ordered so that truncation sacrifices the PR
44+
conversation before the diff or the CI status.
45+
46+
Everything reaching the prompt is attacker-controlled — title, body, diff, CI logs, comments — so the
47+
block delimiters are neutralised by shape rather than by exact string: `</pr_context >`,
48+
`</PR_CONTEXT>` and `< / pr_context foo="1">` all read as the same delimiter to a model, and any of
49+
them would otherwise end the data block early and land the rest where it reads as instructions.
50+
3651
### Tool usage artifact
3752

3853
Each run attaches a `claude-tool-usage-pr-<number>` artifact (14-day retention): tool call counts,

0 commit comments

Comments
 (0)