Repository navigation
test(agent): rule-10 red-team pass on navigate-is-a-fetch (K3 arrival gate) - #1129
Conversation
…ents navigation only; the between-turns commit is KNOWN OPEN (#1130) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…ents navigation only (#1129) (#1131) A commit while no turn ran found no judge, was marked judged anyway, and the next turn re-adopted the run on a page a policy denies or asks about (reading its page info into the model). The tab is now watched between turns (watchBetweenTurns), holdStands and judgeTurnStart judge any page the run's judge has not spoken on, and lastJudged is written only when a judge ran. An allow row's arrival now consents its origin for navigation only (navOnlyOrigins), matching the FETCH_URL choke point: an uncredentialed read there goes to its card instead of being refused silently. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… gate) What a hostile page, a hostile policy shape or a model that navigates anywhere must NOT get from the arrival judgement, the origin grant and the named-navigate pass. Twelve properties, each a test; where the gate already held it is a pin of the As-built narrowing. The between-turn judge gap (settle() tears down unwatchArrivals; judgeArrival marks lastJudged with no judge; holdStands requires an existing hold) is a failing-first todo for the fix's owner. The central finding is a layering split, not an escape: consentedOrigins (the arrival's write) silences the agent-host PROMPT but does not reach the FETCH_URL choke point, which re-judges via originCovers (grantRunOrigin), so an allow/pass arrival's uncredentialed fetch of its own origin is REFUSED end-to-end. The As-built's "navigation and uncredentialed reads" is gate-level and does not survive the choke point. Pinned as the defended outcome with the exact refusal text so a reorder of fetchPolicy or a widening of caller.consented turns these red. Co-Authored-By: Claude Code <noreply@anthropic.com>
5dba084 to
67d14e4
Compare
|
Head moved to 67d14e4 after the rebase onto main (which brought #1131's fix). Amended: the ruling (b) pin now expects both fetches to card (
|
|
Reviewed. No finding. Every pinned property asserts the defended outcome with the exact refusal text, not a proxy. The todo fails for the claimed reason and nothing else. The tests that pin the refusal are sensitive to the code changes the body names. Four tests assert PROBED AND NOT GOTTEN tests are documentation (channels list + code facts). They stay green under any code change by design. The One note: the PR body says "Twelve properties, each a test" but the file has 12 top-level
|
|
Correction to my earlier review on this PR. That review was written against the pre-rebase file (the head before the rebase onto dc5a301); the current head 67d14e4 has no What I get against 67d14e4: no finding. The between-turn test is a plain The two claims in the PR body hold against this head: the gate/choke-point split is pinned by the e3 is clear to merge on this.
|
#1135) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
|
Approved by @parawanderer for merge.
|
Red-team pass on #1120 (landed as 9254b38): what a hostile page, a hostile policy shape or a model that navigates anywhere must NOT get from the arrival judgement, the origin grant and the named-navigate pass. Twelve properties, each a test; where the gate already held it is a pin of the As-built narrowing.
The central finding is a layering split, not an escape.
consentedOrigins(the arrival's allow/pass write) silences the agent-host PROMPT but does not reach the FETCH_URL choke point (sw-fetch-url.ts), which re-judges viacaller.consented=ctx.consented.has(u) || originCovers(ctx, u, …) || policyAllows(…).originCoversreadsctx.origins(grantRunOrigin), notconsentedOrigins. So an allow/pass arrival's uncredentialed fetch of its own origin is REFUSED end-to-end withhasn't been approved for fetching on this page. The As-built's "navigation and uncredentialed reads" is gate-level and does not survive the choke point. The tests pin the REFUSAL (the defended outcome) and name the split so a reorder offetchPolicyin agent-host.ts, or a widening ofcaller.consented, turns them red.A second gap is open as a failing-first todo: a commit BETWEEN turns finds no judge (
settle()tears downunwatchArrivals;judgeArrivalmarkslastJudgedwith no judge registered;holdStandsonly re-judges when a hold already exists). A hand-move or page redirect between turns to a page a policy would deny/ask is never judged for it. The fix is the security lane's.What is pinned: the start origin is consented never as-you (choke-point refusal); an arrival no policy decides passes and consents nothing (both fetches card); an ask asks on every arrival it covers; namedNav is single-use (a redirect on from the named page is judged); a hold outlives the turn; ruling (b) allow row consents the origin for navigation only; a page-built run keeps per-URL fetch approvals (
grantRunOriginisbyWorker && runsInWorker); the describe layer is conservative (the arrival check is the enforcement); an origin grant is exact.🤖 Generated with Claude Code