changedInput schema / properties / accounting / anyOf
Previous value: -[
- {
- "additionalProperties": true,
- "description": "Per-unit cost. Written verbatim, beside ts/unit/role/status, as one line of <checkpoint>.log.jsonl - the ledger the N-sessions experiment reads. The keys named here have fixed meanings so a reader holding only the ledger knows what each number counts, in which unit, and which model produced it; any other key passes through unchanged, except the five the runtime writes itself — unit, role, status, ts, event — which are refused (result=error) before anything is written; a self-reported briefed is overwritten, not refused. Lines written before this schema existed may spell these differently; the schema governs new writes only.",
- "properties": {
- "cache_read_tokens": {
- "description": "Tokens the unit's requests served from prompt cache, kept OUT of `tokens` because they dominate a real session's traffic and would swamp the work signal. Optional: omit it when the harness reports no such figure - a written 0 means the unit read nothing from cache.",
- "minimum": 0,
- "type": "integer"
- },
- "duration_ms": {
- "description": "Wall-clock from spawning the subagent to its final message, in whole milliseconds. In a non-null line it is required, and it is the only duration key with a defined meaning: older lines carry `duration`, `duration_min` or `duration_s`, which this schema neither reads nor renames.",
- "minimum": 0,
- "type": "integer"
- },
- "model": {
- "description": "The exact identifier of the model the subagent actually ran on (e.g. `claude-sonnet-5`) and nothing else - a caveat about how it was chosen belongs in `note`. Not required here: when the checkpoint's job.roles names this unit's role, clock_out already requires it and refuses a value off that role's list, spelled exactly; a checkpoint with no job.roles leaves it optional. This schema does not change that gate.",
- "type": "string"
- },
- "note": {
- "description": "Free text for what the fields above cannot say: that `tokens` is an estimate, that this is a retry or a second scope under the same unit id, what a harness counter excludes. Anything that is not a model identifier goes here, not in `model`.",
- "type": "string"
- },
- "tokens": {
- "description": "Tokens the unit consumed as the harness's subagent counter reports them: every class it reports (input, output, cache creation) summed, EXCLUDING cache reads. In a non-null accounting line it is required — a line without it is refused before anything is written; only `accounting: null`, the default, is exempt, and that logs no cost at all. A rounded self-estimate is allowed only if `note` says it is one; a unit whose cost is unknown cannot be compared with any other.",
- "minimum": 0,
- "type": "integer"
- },
- "tool_uses": {
- "description": "Tool calls the subagent made, as the harness counts them. Optional; it is the denominator that makes `tokens` comparable across units of different size (per-unit cost is linear in tool calls, not in unit length).",
- "minimum": 0,
- "type": "integer"
- }
- },
- "required": [
- "tokens",
- "duration_ms"
- ],
- "type": "object"
- },
- {
- "type": "null"
- }
-]New value: +[
+ {
+ "additionalProperties": true,
+ "description": "Per-unit cost. Written verbatim, beside ts/unit/role/status, as one line of <checkpoint>.log.jsonl - the ledger the N-sessions experiment reads. The keys named here have fixed meanings so a reader holding only the ledger knows what each number counts, in which unit, and which model produced it; any other key passes through unchanged, except the six the runtime writes itself — unit, role, status, ts, event, agent_id — which are refused (result=error) before anything is written; a self-reported briefed is overwritten, not refused. Lines written before this schema existed may spell these differently; the schema governs new writes only.",
+ "properties": {
+ "cache_read_tokens": {
+ "description": "Tokens the unit's requests served from prompt cache, kept OUT of `tokens` because they dominate a real session's traffic and would swamp the work signal. Optional: omit it when the harness reports no such figure - a written 0 means the unit read nothing from cache.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "duration_ms": {
+ "description": "Wall-clock from spawning the subagent to its final message, in whole milliseconds. In a non-null line it is required, and it is the only duration key with a defined meaning: older lines carry `duration`, `duration_min` or `duration_s`, which this schema neither reads nor renames.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "estimate": {
+ "description": "true when `tokens` is a guess rather than the host's figure. With job.budget declared, a line reporting 0 tokens is refused unless it carries estimate: true.",
+ "type": "boolean"
+ },
+ "model": {
+ "description": "The exact identifier of the model the subagent actually ran on (e.g. `claude-sonnet-5`) and nothing else - a caveat about how it was chosen belongs in `note`. Not required here: when the checkpoint's job.roles names this unit's role, clock_out already requires it and refuses a value off that role's list, spelled exactly; a checkpoint with no job.roles leaves it optional. This schema does not change that gate.",
+ "type": "string"
+ },
+ "note": {
+ "description": "Free text for what the fields above cannot say: that `tokens` is an estimate, that this is a retry or a second scope under the same unit id, what a harness counter excludes. Anything that is not a model identifier goes here, not in `model`.",
+ "type": "string"
+ },
+ "tokens": {
+ "description": "Tokens the unit consumed as the harness's subagent counter reports them: every class it reports (input, output, cache creation) summed, EXCLUDING cache reads. In a non-null accounting line it is required — a line without it is refused before anything is written; only `accounting: null`, the default, is exempt, and that logs no cost at all. A rounded self-estimate is allowed only if `note` says it is one; a unit whose cost is unknown cannot be compared with any other.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "tool_uses": {
+ "description": "Tool calls the subagent made, as the harness counts them. Optional; it is the denominator that makes `tokens` comparable across units of different size (per-unit cost is linear in tool calls, not in unit length).",
+ "minimum": 0,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "tokens",
+ "duration_ms"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+]
addedInput schema / properties / agent_id
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The `agentId` the Agent tool's result returned for this unit's subagent (#266), copied verbatim: 1 to 64 letters, digits, - or _, or nothing is written. It goes on the accounting line, never into the checkpoint, and is how the skill miner attributes the skill uses the hook logged inside that subagent to this unit. Omit it for a unit run inline.",
+ "title": "Agent Id"
+}
addedInput schema / properties / agreements
Added value: +{
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "adopt": {
+ "description": "Agreements to add to job.agreements; text already listed is left as it is.",
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "retire": {
+ "description": "Agreements to remove, by exact text; one not on the list is refused.",
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "A lesson this unit wants every later brief to carry (#261): retire by exact text, then adopt. Refused, nothing written, for text not on the list or a result over 20; each applied change is recorded in retro[].",
+ "title": "Agreements"
+}
addedInput schema / properties / conclusion
Added value: +{
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "evidence": {
+ "description": "Refs to what was observed: run outputs, commits, files.",
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "outcome": {
+ "description": "`inconclusive` and `stopped` are never refused; `resolved` needs the evidence below.",
+ "enum": [
+ "resolved",
+ "inconclusive",
+ "stopped"
+ ],
+ "type": "string"
+ },
+ "supported": {
+ "description": "The hypothesis id the evidence supports; required for `resolved`.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "outcome",
+ "evidence"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "An investigation's answer (#264), written to job.conclusion. Only a unit with `concludes: true` may send it; `resolved` is refused unless `supported` has a done run, a done replay of that run in another role, and a done review of either. A run unit (`tests` or `replay_of`) clocked out done must report a `run-output` in history_entry.produced.",
+ "title": "Conclusion"
+}
addedInput schema / properties / follow_ups
Added value: +{
+ "anyOf": [
+ {
+ "items": {
+ "properties": {
+ "brief_path": {
+ "description": "Its brief, a file that must already exist, relative to the repo (the nearest ancestor of the checkpoint holding .git).",
+ "minLength": 1,
+ "type": "string"
+ },
+ "depends_on": {
+ "description": "Unit ids it waits for; absent means the unit being clocked out.",
+ "items": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "id": {
+ "description": "The new unit's id; must not be a unit already, nor repeat in this list.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "role": {
+ "description": "Who runs it; when job.roles is declared it must be one of its keys.",
+ "enum": [
+ "planner",
+ "implementer",
+ "reviewer"
+ ],
+ "type": "string"
+ },
+ "title": {
+ "description": "One line naming the work.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "touches": {
+ "description": "Repo-relative paths it will write (#257).",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "verify": {
+ "description": "Command proving it done; absent means the clocked-out unit's verify.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "title",
+ "role",
+ "brief_path"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Work this unit discovered (#260): each item becomes a todo unit appended to plan.units in the given order, on the same write. Refused whole, nothing written, on a duplicate id, a brief that is not a file, an unknown dependency or a cycle (the planner's sentence), or a role job.roles does not declare.",
+ "title": "Follow Ups"
+}
changedInput schema / properties / handoff_patch / properties / open_questions / description
Previous value: -"The autonomy switch: empty = driver keeps cycling, non-empty = STOP and ask."New value: +"The autonomy switch: empty = driver keeps cycling, non-empty = STOP and ask. A bare string is a decision; a `relay` question carries a `probe` that clock_in runs instead of escalating (#225)."
addedInput schema / properties / handoff_patch / properties / open_questions / items / anyOf
Added value: +[
+ {
+ "description": "A decision question: the user's to answer.",
+ "minLength": 1,
+ "type": "string"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "kind": {
+ "description": "`decision` needs the user; `relay` is answered by its probe.",
+ "enum": [
+ "relay",
+ "decision"
+ ],
+ "type": "string"
+ },
+ "probe": {
+ "description": "Shell command run from the repo root by clock_in; exit 0 answers the relay. Required on a relay, or nothing is written.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "q": {
+ "description": "The question.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "q",
+ "kind"
+ ],
+ "type": "object"
+ }
+]
removedInput schema / properties / handoff_patch / properties / open_questions / items / minLength
Removed value: -1
removedInput schema / properties / handoff_patch / properties / open_questions / items / type
Removed value: -"string"
changedInput schema / properties / history_entry / properties / notes / description
Previous value: -"Optional free text for the next session reading the ring."New value: +"Optional free text for the next session reading the ring, and recorded in the unit's attempt (#259): at most 2000 code points."
addedInput schema / properties / history_entry / properties / produced
Added value: +{
+ "description": "What the unit produced, [{kind, ref}] (a commit, a file, a run output). Recorded with the unit's attempt, and handed to every unit that depends on it as upstream[].last.",
+ "items": {
+ "properties": {
+ "kind": {
+ "description": "What sort of thing: commit, file, pr, run-output.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "ref": {
+ "description": "Where it is: a SHA, a path, a URL.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "kind",
+ "ref"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+}