Respect explicit no-file constraints in completion validation

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-18 22:05:48 -05:00
1 parent 8fb291310d
commit 9f4133d4ed
2 files changed
+8

No files matched your search

@@ -11,6 +11,7 @@ describe("explicit file output requirements", () => {
"Do not use external services. Create a file with the results.",
"Make a file but do not send it to anyone else.",
"Export a summary of this PDF as CSV.",
"Create no temporary files; export the results as CSV.",
])("recognizes an explicit output request: %s", objective => {
expect(explicitlyRequestsFileOutput(objective)).toBe(true);
});
@@ -26,6 +27,10 @@ describe("explicit file output requirements", () => {
"Write a summary of this PDF in chat.",
"Create a review of README.md; reply inline.",
"Give me advice on file permissions.",
"Post exactly one durable progress comment whose entire body is TRACKED, then finish this child task. Create no files and do not delegate or create any further tasks.",
"Create no files.",
"Generate no attachments and answer in chat.",
"Write a reply without any files.",
])("does not require a file for a text or source-review request: %s", objective => {
expect(explicitlyRequestsFileOutput(objective)).toBe(false);
});
@@ -71,6 +71,9 @@ export function explicitlyRequestsFileOutput(objective: string): boolean {
const fileObject = [...output.matchAll(file)].some(match => {
const prefix = output.slice(0, match.index);
const suffix = output.slice(match.index + match[0].length);
// "Create no files" is a prohibition, even though it contains a creation
// verb. Negate this object only; another explicit output can still count.
if (/\b(?:no|zero|without(?:\s+any)?)\s+(?:(?:new|temporary|downloadable|attached|additional)\s+)*$/iu.test(prefix)) return false;
// "Write a summary of this PDF" names input, not a requested file.
// Explicit export destinations still count after such input references.
const destination = /\b(?:as|into|to)\s+(?:(?:a|an|the|new|separate|markdown|word|excel)\s+)*$/iu.test(prefix);