Files
DeepSeek-Reasonix/internal/runtimepolicy
esengine 9f5156a260 fix(runtimepolicy): stop turning user prose into a turn-wide write ban
Problem: a turn such as "按方案实现登录模块,数据库结构不要改。" had every
write_file/edit call refused with "blocked: the current constraints forbid
state mutation"; a follow-up "continue" turn then wrote fine.

Root cause: ParseConstraints set ForbidMutation from a phrase table over the
user's text (hasGlobalMutationBan) and inspected only the words after the
negated verb. Chinese places the object before the verb, so a scoped
protection ("X 不要改", "其他不要改", "The schema: do not modify") left an empty
tail and was read as a global read-only order for the whole turn.

Fix: retire the wording-based mutation ban. ForbidMutation is now set only
structurally, by plan mode or an inherited parent constraint; the user's
prose still reaches the model as an instruction. This matches the studio
line, where the prose parser has already been retired.

Test: internal/agent TestUserProseDoesNotBanWritesForTheTurn drives a real
Agent.Run whose model issues write_file. On the base it fails for every case,
e.g. "write_file executed 0 times, want 1; result="blocked: the current
constraints forbid state mutation"". With the fix it passes, and
TestPlanModeStillBlocksWrites confirms plan mode still refuses the write.
go test ./internal/runtimepolicy ./internal/agent ./internal/control pass.

Fixes #10482
2026-09-25 10:08:36 -07:00
..