Keep a record of each run's tool calls so bots can't claim work they never did
The wrap-up turn now gets the run's actual tool calls, each bot message keeps them as bot_messages.tool_log, and history follows recorded bot messages with an [App record] line. The coordinator also gets update_bot in workspaces, so it can fill a bot's core prompt from there. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import stripAppRecords from "./strip-app-records";
|
||||
|
||||
describe("stripAppRecords", () => {
|
||||
test("leaves an answer without records as it is", () => {
|
||||
expect(stripAppRecords({ text: " Done. [Not a record] " })).toBe(" Done. [Not a record] ");
|
||||
});
|
||||
|
||||
test("drops record lines the bot copied, wherever they are", () => {
|
||||
expect(
|
||||
stripAppRecords({
|
||||
text: "Saved.\n\n[App record: this message's run called update_bot]\n\nAnything else?\n [App record: none]",
|
||||
}),
|
||||
).toBe("Saved.\n\nAnything else?");
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,24 @@
|
||||
type Params = {
|
||||
text: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* The opening of the line the app adds after a bot's past message, naming
|
||||
* the tools its run called (`botMessagesToHarness`).
|
||||
*/
|
||||
export const AppRecordPrefix = "[App record:";
|
||||
|
||||
/**
|
||||
* Drops every app record line a bot copied into its own answer: only the
|
||||
* app writes them, so a bot can't vouch for itself in the next turn.
|
||||
*/
|
||||
export default function stripAppRecords({ text }: Params) {
|
||||
if (!text.includes(AppRecordPrefix)) return text;
|
||||
|
||||
return text
|
||||
.split("\n")
|
||||
.filter((line) => !line.trim().startsWith(AppRecordPrefix))
|
||||
.join("\n")
|
||||
.replace(/\n{3,}/g, "\n\n")
|
||||
.trim();
|
||||
}
|
||||
Reference in New Issue
Block a user