Harness spec 1.1.0: one plan, prototypes and the library shared; the CLI implements it
The spec: plan_write and plan_update (new, shared, offered in every mode) and plan_submit (now shared) keep one structured plan — findings, objectives, phases of tasks — in place of the todo list, which lives on as a former name of plan_write. The shared system text is one text for both projects, with variables for what differs; the mode texts, a prototypes block and a library block are shared. acp.md: the client hands the device what only it knows (context, library, prototypes), the plan travels as a structure (plan_state), library calls carry the chat's scope, and a client may rewind a session. loop.json says its numbers as numbers. Four conformance areas: plan, prototype, library_scope, toolcall_index. The CLI: the plan is kept per session in the store and drawn above the prompt and on the approval card; the prompt is assembled from the spec's texts with their variables filled; the link reads the instance's instructions, personalization, knowledge scope and prototype offer, sends the plan as a structure and answers rewind; library calls to the instance carry the session as scope; a prototype written in the terminal is saved as a file and named in the transcript; a tool-call fragment without an index continues the last call; the default theme is Moria; dead exports and Hermes leftovers removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
96 files changed
+3259
-527
No files matched your search
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"about": "knowledge_search's `base` against the knowledge bases a conversation may search (`bases`: id and name): which base ids are searched, or the error the tool answers with. No `base` searches them all; an id matches first, then a name regardless of case; an unknown one is an error naming what there is. LLeMbas: services/library/documents.py resolve_base; CLI: library/store.ts resolveBase.",
|
||||
"cases": [
|
||||
{ "bases": [{ "id": "kb1", "name": "Manuals" }, { "id": "kb2", "name": "Contracts" }], "base": null, "expect": { "ids": ["kb1", "kb2"] } },
|
||||
{ "bases": [{ "id": "kb1", "name": "Manuals" }, { "id": "kb2", "name": "Contracts" }], "base": "kb2", "expect": { "ids": ["kb2"] } },
|
||||
{ "bases": [{ "id": "kb1", "name": "Manuals" }, { "id": "kb2", "name": "Contracts" }], "base": "contracts", "expect": { "ids": ["kb2"] } },
|
||||
{ "bases": [{ "id": "kb1", "name": "Manuals" }, { "id": "kb2", "name": "Contracts" }], "base": " Manuals ", "expect": { "ids": ["kb1"] } },
|
||||
{ "bases": [{ "id": "kb1", "name": "Manuals" }, { "id": "kb2", "name": "Contracts" }], "base": "Invoices", "expect": { "error": "No knowledge base called \"Invoices\" here. Available: Manuals, Contracts." } },
|
||||
{ "bases": [], "base": null, "expect": { "ids": [] } },
|
||||
{ "bases": [], "base": "Manuals", "expect": { "error": "No knowledge base called \"Manuals\" here. Available: none." } },
|
||||
{ "bases": [{ "id": "kb1", "name": "kb2" }, { "id": "kb2", "name": "Other" }], "base": "kb2", "expect": { "ids": ["kb2"] } }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,779 @@
|
||||
{
|
||||
"about": "The plan as both projects keep it (plan_write / plan_update): `op` is `normalise` (what plan_write stores for what a model sent: ids generated in order, loose shapes accepted, unknown statuses defaulted, bounds applied, `steps` the tasks flattened), `update` (plan_update's changes applied to a stored plan; an unknown id is an error naming the known ones and changes nothing), or `todos` (the former todo tool's list as a plan). LLeMbas: services/plans.py; CLI: src/plan/plan.ts.",
|
||||
"cases": [
|
||||
{
|
||||
"op": "normalise",
|
||||
"plan": {
|
||||
"title": " Fix the login bug ",
|
||||
"summary": "Two changes.",
|
||||
"findings": [
|
||||
"Session cookie is not renewed",
|
||||
{
|
||||
"text": "Test missing"
|
||||
},
|
||||
""
|
||||
],
|
||||
"objectives": [
|
||||
"Login works",
|
||||
{
|
||||
"text": "Test covers it",
|
||||
"status": "bogus"
|
||||
}
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"title": "Code",
|
||||
"tasks": [
|
||||
"Renew the cookie",
|
||||
{
|
||||
"text": "Add the test",
|
||||
"status": "doing",
|
||||
"note": "started"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Verify",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"text": "Run the suite",
|
||||
"status": "todo"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"version": 2,
|
||||
"title": "Fix the login bug",
|
||||
"summary": "Two changes.",
|
||||
"findings": [
|
||||
{
|
||||
"id": "f1",
|
||||
"text": "Session cookie is not renewed"
|
||||
},
|
||||
{
|
||||
"id": "f2",
|
||||
"text": "Test missing"
|
||||
}
|
||||
],
|
||||
"objectives": [
|
||||
{
|
||||
"id": "o1",
|
||||
"text": "Login works",
|
||||
"status": "open"
|
||||
},
|
||||
{
|
||||
"id": "o2",
|
||||
"text": "Test covers it",
|
||||
"status": "open"
|
||||
}
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "Renew the cookie",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "Add the test",
|
||||
"status": "doing",
|
||||
"note": "started"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "p2",
|
||||
"title": "Verify",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t3",
|
||||
"text": "Run the suite",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"Renew the cookie",
|
||||
"Add the test",
|
||||
"Run the suite"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "normalise",
|
||||
"plan": {
|
||||
"title": "Steps only",
|
||||
"steps": [
|
||||
"One",
|
||||
"Two",
|
||||
""
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"version": 2,
|
||||
"title": "Steps only",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Plan",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "Two",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One",
|
||||
"Two"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "normalise",
|
||||
"plan": {
|
||||
"phases": "Just a string"
|
||||
},
|
||||
"expect": {
|
||||
"version": 2,
|
||||
"title": "A plan",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Just a string",
|
||||
"status": "pending",
|
||||
"tasks": []
|
||||
}
|
||||
],
|
||||
"steps": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "normalise",
|
||||
"plan": {},
|
||||
"expect": {}
|
||||
},
|
||||
{
|
||||
"op": "normalise",
|
||||
"plan": {
|
||||
"title": "Over the limits",
|
||||
"findings": [
|
||||
"f1",
|
||||
"f2",
|
||||
"f3",
|
||||
"f4",
|
||||
"f5",
|
||||
"f6",
|
||||
"f7",
|
||||
"f8",
|
||||
"f9",
|
||||
"f10",
|
||||
"f11",
|
||||
"f12",
|
||||
"f13",
|
||||
"f14",
|
||||
"f15",
|
||||
"f16",
|
||||
"f17",
|
||||
"f18",
|
||||
"f19",
|
||||
"f20",
|
||||
"f21"
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"title": "P",
|
||||
"tasks": [
|
||||
"t1",
|
||||
"t2",
|
||||
"t3",
|
||||
"t4",
|
||||
"t5",
|
||||
"t6",
|
||||
"t7",
|
||||
"t8",
|
||||
"t9",
|
||||
"t10",
|
||||
"t11",
|
||||
"t12",
|
||||
"t13"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"version": 2,
|
||||
"title": "Over the limits",
|
||||
"summary": "",
|
||||
"findings": [
|
||||
{
|
||||
"id": "f1",
|
||||
"text": "f1"
|
||||
},
|
||||
{
|
||||
"id": "f2",
|
||||
"text": "f2"
|
||||
},
|
||||
{
|
||||
"id": "f3",
|
||||
"text": "f3"
|
||||
},
|
||||
{
|
||||
"id": "f4",
|
||||
"text": "f4"
|
||||
},
|
||||
{
|
||||
"id": "f5",
|
||||
"text": "f5"
|
||||
},
|
||||
{
|
||||
"id": "f6",
|
||||
"text": "f6"
|
||||
},
|
||||
{
|
||||
"id": "f7",
|
||||
"text": "f7"
|
||||
},
|
||||
{
|
||||
"id": "f8",
|
||||
"text": "f8"
|
||||
},
|
||||
{
|
||||
"id": "f9",
|
||||
"text": "f9"
|
||||
},
|
||||
{
|
||||
"id": "f10",
|
||||
"text": "f10"
|
||||
},
|
||||
{
|
||||
"id": "f11",
|
||||
"text": "f11"
|
||||
},
|
||||
{
|
||||
"id": "f12",
|
||||
"text": "f12"
|
||||
},
|
||||
{
|
||||
"id": "f13",
|
||||
"text": "f13"
|
||||
},
|
||||
{
|
||||
"id": "f14",
|
||||
"text": "f14"
|
||||
},
|
||||
{
|
||||
"id": "f15",
|
||||
"text": "f15"
|
||||
},
|
||||
{
|
||||
"id": "f16",
|
||||
"text": "f16"
|
||||
},
|
||||
{
|
||||
"id": "f17",
|
||||
"text": "f17"
|
||||
},
|
||||
{
|
||||
"id": "f18",
|
||||
"text": "f18"
|
||||
},
|
||||
{
|
||||
"id": "f19",
|
||||
"text": "f19"
|
||||
},
|
||||
{
|
||||
"id": "f20",
|
||||
"text": "f20"
|
||||
}
|
||||
],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "P",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "t1",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "t2",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t3",
|
||||
"text": "t3",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t4",
|
||||
"text": "t4",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t5",
|
||||
"text": "t5",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t6",
|
||||
"text": "t6",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t7",
|
||||
"text": "t7",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t8",
|
||||
"text": "t8",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t9",
|
||||
"text": "t9",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t10",
|
||||
"text": "t10",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t11",
|
||||
"text": "t11",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t12",
|
||||
"text": "t12",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"t1",
|
||||
"t2",
|
||||
"t3",
|
||||
"t4",
|
||||
"t5",
|
||||
"t6",
|
||||
"t7",
|
||||
"t8",
|
||||
"t9",
|
||||
"t10",
|
||||
"t11",
|
||||
"t12"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "update",
|
||||
"plan": {
|
||||
"version": 2,
|
||||
"title": "T",
|
||||
"summary": "",
|
||||
"findings": [
|
||||
{
|
||||
"id": "f1",
|
||||
"text": "A"
|
||||
}
|
||||
],
|
||||
"objectives": [
|
||||
{
|
||||
"id": "o1",
|
||||
"text": "O",
|
||||
"status": "open"
|
||||
}
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "Two",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "p2",
|
||||
"title": "Verify",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t3",
|
||||
"text": "Three",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One",
|
||||
"Two",
|
||||
"Three"
|
||||
]
|
||||
},
|
||||
"changes": {
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"status": "done"
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"status": "dropped",
|
||||
"note": "not needed"
|
||||
}
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"status": "done"
|
||||
},
|
||||
{
|
||||
"id": "p2",
|
||||
"status": "active"
|
||||
}
|
||||
],
|
||||
"objectives": [
|
||||
{
|
||||
"id": "o1",
|
||||
"status": "done"
|
||||
}
|
||||
],
|
||||
"add_tasks": [
|
||||
{
|
||||
"phase": "p2",
|
||||
"text": "Four",
|
||||
"after": "t3"
|
||||
},
|
||||
{
|
||||
"phase": "p1",
|
||||
"text": "Zero",
|
||||
"after": ""
|
||||
}
|
||||
],
|
||||
"add_findings": [
|
||||
"B"
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"plan": {
|
||||
"version": 2,
|
||||
"title": "T",
|
||||
"summary": "",
|
||||
"findings": [
|
||||
{
|
||||
"id": "f1",
|
||||
"text": "A"
|
||||
},
|
||||
{
|
||||
"id": "f2",
|
||||
"text": "B"
|
||||
}
|
||||
],
|
||||
"objectives": [
|
||||
{
|
||||
"id": "o1",
|
||||
"text": "O",
|
||||
"status": "done"
|
||||
}
|
||||
],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "done",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "done",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "Two",
|
||||
"status": "dropped",
|
||||
"note": "not needed"
|
||||
},
|
||||
{
|
||||
"id": "t5",
|
||||
"text": "Zero",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "p2",
|
||||
"title": "Verify",
|
||||
"status": "active",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t3",
|
||||
"text": "Three",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t4",
|
||||
"text": "Four",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One",
|
||||
"Two",
|
||||
"Zero",
|
||||
"Three",
|
||||
"Four"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "update",
|
||||
"plan": {
|
||||
"version": 2,
|
||||
"title": "T",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One"
|
||||
]
|
||||
},
|
||||
"changes": {
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t9",
|
||||
"status": "done"
|
||||
}
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"error": "Unknown task id \"t9\". Known: t1."
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "update",
|
||||
"plan": {
|
||||
"version": 2,
|
||||
"title": "T",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One"
|
||||
]
|
||||
},
|
||||
"changes": {
|
||||
"add_tasks": [
|
||||
{
|
||||
"phase": "p7",
|
||||
"text": "Nowhere"
|
||||
}
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"error": "Unknown phase id \"p7\". Known: p1."
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "update",
|
||||
"plan": {
|
||||
"version": 2,
|
||||
"title": "T",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Code",
|
||||
"status": "pending",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "One",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"One"
|
||||
]
|
||||
},
|
||||
"changes": {
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"status": "flying"
|
||||
}
|
||||
]
|
||||
},
|
||||
"expect": {
|
||||
"error": "Unknown status \"flying\" for a task. One of: todo, doing, done, dropped."
|
||||
}
|
||||
},
|
||||
{
|
||||
"op": "todos",
|
||||
"todos": [
|
||||
{
|
||||
"content": "Read the code",
|
||||
"status": "completed"
|
||||
},
|
||||
{
|
||||
"content": "Fix it",
|
||||
"status": "in_progress"
|
||||
},
|
||||
"Test it",
|
||||
{
|
||||
"content": "Old idea",
|
||||
"status": "cancelled"
|
||||
}
|
||||
],
|
||||
"expect": {
|
||||
"version": 2,
|
||||
"title": "Work",
|
||||
"summary": "",
|
||||
"findings": [],
|
||||
"objectives": [],
|
||||
"phases": [
|
||||
{
|
||||
"id": "p1",
|
||||
"title": "Work",
|
||||
"status": "active",
|
||||
"tasks": [
|
||||
{
|
||||
"id": "t1",
|
||||
"text": "Read the code",
|
||||
"status": "done",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t2",
|
||||
"text": "Fix it",
|
||||
"status": "doing",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t3",
|
||||
"text": "Test it",
|
||||
"status": "todo",
|
||||
"note": ""
|
||||
},
|
||||
{
|
||||
"id": "t4",
|
||||
"text": "Old idea",
|
||||
"status": "dropped",
|
||||
"note": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
"Read the code",
|
||||
"Fix it",
|
||||
"Test it",
|
||||
"Old idea"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"about": "A fenced block's info string read as a prototype (prompts/blocks/prototypes.md): `prototype-chat` and `prototype-page` with an optional title on the same line, and bare `prototype` as the inline kind; anything else is the code block it is (`null`). The title is the fence's, else the page's own <title>, whitespace collapsed, at most 80 characters. LLeMbas: services/prototypes.py parse_info and title_for; CLI: src/prototype/fence.ts.",
|
||||
"cases": [
|
||||
{
|
||||
"info": "prototype-chat Monthly sales",
|
||||
"code": "<p>hi</p>",
|
||||
"expect": {
|
||||
"kind": "chat",
|
||||
"title": "Monthly sales"
|
||||
}
|
||||
},
|
||||
{
|
||||
"info": "prototype-page Bakery landing",
|
||||
"code": "<!doctype html><title>Ignored</title>",
|
||||
"expect": {
|
||||
"kind": "page",
|
||||
"title": "Bakery landing"
|
||||
}
|
||||
},
|
||||
{
|
||||
"info": "prototype",
|
||||
"code": "<p>x</p>",
|
||||
"expect": {
|
||||
"kind": "chat",
|
||||
"title": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"info": "PROTOTYPE-PAGE",
|
||||
"code": "<html><head><title> From the\n page </title></head></html>",
|
||||
"expect": {
|
||||
"kind": "page",
|
||||
"title": "From the page"
|
||||
}
|
||||
},
|
||||
{
|
||||
"info": "prototype-chat",
|
||||
"code": "<title><b>Bold</b> title</title>",
|
||||
"expect": {
|
||||
"kind": "chat",
|
||||
"title": "Bold title"
|
||||
}
|
||||
},
|
||||
{
|
||||
"info": "html",
|
||||
"code": "<p>x</p>",
|
||||
"expect": null
|
||||
},
|
||||
{
|
||||
"info": "",
|
||||
"code": "",
|
||||
"expect": null
|
||||
},
|
||||
{
|
||||
"info": "prototype-page A title that goes on and on and on and on and on and on and on and on and on and on and on",
|
||||
"code": "",
|
||||
"expect": {
|
||||
"kind": "page",
|
||||
"title": "A title that goes on and on and on and on and on and on and on and on and on and"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"about": "Streamed tool-call fragments reassembled into calls (quirks.json tool-call-without-index). Each delta may carry `index`, `id`, `name` and an `arguments` fragment; a delta without an index continues the last call started, and the first delta of a stream without one starts call 0. Arguments are concatenated as text, not parsed. LLeMbas: services/llm/openai_client.py; CLI: provider/openai-chat.ts ToolCallAccumulator.",
|
||||
"cases": [
|
||||
{ "deltas": [{ "index": 0, "id": "a", "name": "read", "arguments": "{\"pa" }, { "index": 0, "arguments": "th\":\"x\"}" }], "expect": [{ "id": "a", "name": "read", "arguments": "{\"path\":\"x\"}" }] },
|
||||
{ "deltas": [{ "id": "a", "name": "read", "arguments": "{\"pa" }, { "arguments": "th\":\"x\"}" }], "expect": [{ "id": "a", "name": "read", "arguments": "{\"path\":\"x\"}" }] },
|
||||
{ "deltas": [{ "index": 0, "id": "a", "name": "read", "arguments": "{}" }, { "index": 1, "id": "b", "name": "grep", "arguments": "{\"q\":" }, { "arguments": "\"x\"}" }], "expect": [{ "id": "a", "name": "read", "arguments": "{}" }, { "id": "b", "name": "grep", "arguments": "{\"q\":\"x\"}" }] },
|
||||
{ "deltas": [{ "index": 1, "id": "b", "name": "grep", "arguments": "{}" }, { "index": 0, "id": "a", "name": "read", "arguments": "{}" }], "expect": [{ "id": "a", "name": "read", "arguments": "{}" }, { "id": "b", "name": "grep", "arguments": "{}" }] },
|
||||
{ "deltas": [{ "index": 0, "id": "a", "name": "read" }, { "index": 0, "name": "" }, { "index": 0, "arguments": "" }], "expect": [{ "id": "a", "name": "read", "arguments": "" }] }
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user