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:
HomerandClaude Fable 5.1 committed 2026-10-18 04:02:12 +02:00
1 parent 6e70ff46d0
commit 837f38c744
96 files changed
+3259 -527

No files matched your search

+4 -7
View File
@@ -1,6 +1,6 @@
{
"name": "plan_submit",
"scope": "cli",
"scope": "shared",
"risk": "interact",
"exclusive": true,
"block": "tool",
@@ -11,17 +11,14 @@
],
"llembas": []
},
"description": "Present your finished plan for approval — only in plan mode, and only once the plan file is written.\n\n- `path`: the plan file you wrote under the plans directory.\n- The user approves it (and you continue, now allowed to make the changes), asks for a revision (change the file, then call plan_submit again), or asks you a question (answer it, then call plan_submit again).",
"description": "Present the plan written with plan_write for approval — only in plan mode, and only once the plan is written.\n\n- The user approves it (and you continue, now allowed to make the changes), asks for a revision (change the plan with plan_write or plan_update, then call plan_submit again), or asks you a question (answer it, then call plan_submit again).",
"parameters": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "The plan file"
"description": "Ignored: the plan is the one written with plan_write. Kept for callers that still send it."
}
},
"required": [
"path"
]
}
}
}
+131
View File
@@ -0,0 +1,131 @@
{
"name": "plan_update",
"scope": "shared",
"risk": "interact",
"exclusive": false,
"block": "plan",
"purpose": false,
"aliases": {
"cli": [],
"llembas": []
},
"description": "Change the plan as the work goes: mark a task doing when you start it and done once you have checked it works, drop one that turned out unnecessary (say why in its note), add work the plan did not anticipate, record a new finding. Several changes go in one call. Quote the ids the plan shows (p1, t3, o2); an unknown id is an error naming the known ones. Updating is bookkeeping, not a milestone: carry straight on afterwards.",
"parameters": {
"type": "object",
"properties": {
"tasks": {
"type": "array",
"description": "Tasks to change, by id",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"todo",
"doing",
"done",
"dropped"
]
},
"note": {
"type": "string",
"maxLength": 300
}
},
"required": [
"id"
]
}
},
"objectives": {
"type": "array",
"description": "Objectives to change, by id",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"open",
"done",
"dropped"
]
}
},
"required": [
"id",
"status"
]
}
},
"phases": {
"type": "array",
"description": "Phases to change, by id",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"pending",
"active",
"done"
]
}
},
"required": [
"id",
"status"
]
}
},
"add_tasks": {
"type": "array",
"description": "New tasks, each in a phase; after an existing task's id, or at the end of the phase",
"items": {
"type": "object",
"properties": {
"phase": {
"type": "string",
"minLength": 1
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"after": {
"type": "string"
}
},
"required": [
"phase",
"text"
]
}
},
"add_findings": {
"type": "array",
"description": "New findings",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 300
}
}
}
}
}
+131
View File
@@ -0,0 +1,131 @@
{
"name": "plan_write",
"scope": "shared",
"risk": "interact",
"exclusive": false,
"block": "plan",
"purpose": false,
"aliases": {
"cli": [
"todo"
],
"llembas": [
"todo"
]
},
"description": "Write the plan for this work, or replace it: what you found, what it is for, and the work as phases of tasks. The whole plan each time — it replaces the previous one. Use it for anything with three or more steps, from the start, and in plan mode before plan_submit.\n\n- findings: what you learned that shapes the plan, with file:line references where there are any.\n- objectives: what will be true when it is done.\n- phases: the work in order, each a short title and its tasks. One phase is fine for a short job.\n- Ids are given to you in the result (p1, t3, o2…) and are what plan_update takes; never make them up.\n- Keep it short: a task is one sentence. What does not fit is not a task.",
"parameters": {
"type": "object",
"properties": {
"title": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "What the plan is for, in a few words"
},
"summary": {
"type": "string",
"maxLength": 300,
"description": "One or two sentences on the approach"
},
"findings": {
"type": "array",
"maxItems": 20,
"description": "What was found that shapes the plan",
"items": {
"type": "string",
"maxLength": 300
}
},
"objectives": {
"type": "array",
"maxItems": 8,
"description": "What will be true when the work is done",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"status": {
"type": "string",
"enum": [
"open",
"done",
"dropped"
],
"default": "open"
}
},
"required": [
"text"
]
}
},
"phases": {
"type": "array",
"maxItems": 8,
"description": "The work, in order",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 120
},
"status": {
"type": "string",
"enum": [
"pending",
"active",
"done"
],
"default": "pending"
},
"tasks": {
"type": "array",
"maxItems": 12,
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"status": {
"type": "string",
"enum": [
"todo",
"doing",
"done",
"dropped"
],
"default": "todo"
},
"note": {
"type": "string",
"maxLength": 300,
"description": "Why it was dropped, or what came of it"
}
},
"required": [
"text"
]
}
}
},
"required": [
"tasks"
]
}
}
},
"required": [
"title",
"phases"
]
}
}
-47
View File
@@ -1,47 +0,0 @@
{
"name": "todo",
"scope": "cli",
"risk": "interact",
"exclusive": false,
"block": "hidden",
"purpose": false,
"aliases": {
"cli": [],
"llembas": []
},
"description": "Keep a todo list for work with three or more steps, so you and the user can see where you are.\n\n- Send the WHOLE list every time; it replaces the previous one.\n- Exactly one item in_progress while you work; mark it completed as soon as it is done, not in a batch at the end.\n- Use cancelled for an item that turned out unnecessary, and say why in your reply.\n- Skip the list for a one- or two-step task.",
"parameters": {
"type": "object",
"properties": {
"todos": {
"maxItems": 30,
"type": "array",
"items": {
"type": "object",
"properties": {
"content": {
"type": "string",
"minLength": 1
},
"status": {
"default": "pending",
"type": "string",
"enum": [
"pending",
"in_progress",
"completed",
"cancelled"
]
}
},
"required": [
"content"
]
}
}
},
"required": [
"todos"
]
}
}