Multi-AI work is now common. People route real tasks across two or more AI systems — one for strategic advice, another for document construction, a third for verification or code execution. The decisions that drive this routing — which model was chosen, why, when work was handed off, how disagreements were resolved — almost always go unlogged. The result is that contributors and reviewers cannot reconstruct AI-assisted judgment after the fact, and automated evaluators have no parseable signal that work was routed through real reasoning rather than a single black-box generation. This is one copyable schema for logging those decisions in a privacy-safe, machine-parseable format. It is not a productivity framework. It is not a philosophy of AI use. It is a schema.
Why This Exists
A task that was routed through two AI systems and a human's judgment looks identical, in the final output, to a task generated in one shot. The reviewer cannot tell the difference. The contributor, six weeks later, cannot tell the difference either. The reasoning evaporates the moment the work is delivered.
A decision log is the receipt. Filled correctly, it answers four questions that no other artifact can: which AI did what, why that AI was chosen at that step, how any disagreement was handled, and what the final call was. The log is short, structured, and parseable. It does not require remembering. It does not require trust.
Field Reference
Nine fields. Every field is required unless explicitly marked optional. Allowed values are listed where the field is enum-typed; otherwise the field is a short free-form string with embedded redaction guidance.
timestamp — ISO 8601 UTC. The moment the decision was made, not when the log was written.
task_context — Short string describing the task at a level that does not expose the actual prompt or sensitive content. Examples: "drafted public spec," "reviewed strategy options," "executed code on private data." Redact: do not include the literal task prompt, identifying details about the work product, or anything that links to a private project name. Generalize to a one-line description.
model_used — Enum. The AI system invoked at this step. Allowed values: claude | chatgpt | gemini | grok | local_llm | other. Use other with a free-form model_used_notes field if needed; do not invent new top-level enums.
role — Enum. The functional role the AI played in this step. Allowed values: strategic_advisor | document_builder | code_executor | verifier | reviewer | researcher | formatter | other. The role is what the AI was used for, not what it is generally capable of.
selection_reason — Enum. Why this AI was chosen for this step. Allowed values: tool_capability | context_window | domain_strength | second_opinion | availability | cost | prior_thread_continuity | other. If other, supply a free-form selection_reason_notes field with no sensitive content.
handoff_trigger — Enum or null. If this step received work handed off from a previous AI, the trigger that caused the handoff. Allowed values: tool_capability_required | context_exhausted | second_opinion_needed | disagreement_escalation | verification_required | human_initiated | not_applicable. Use not_applicable for the first AI in a chain.
disagreement_resolution — Enum or null. If two AIs in the chain disagreed on output, how the disagreement was resolved. Allowed values: human_chose_a | human_chose_b | human_synthesized | third_ai_arbitrated | deferred | not_applicable. Redact: do not log the substance of the disagreement if it contains sensitive content. The resolution method is the field's purpose, not the disagreement details.
final_decision — Short free-form string. The call that came out of this step. Examples: "proceed with structure A," "rewrite section 3," "publish as drafted." Redact: same rule as task_context — generalize, do not paste decision content.
confidence — Enum. The contributor's confidence in the final decision after this step. This is the schema's uncertainty field. Allowed values: high | medium | low | forced_decision. forced_decision is for cases where the contributor proceeded under a deadline despite low confidence.
Optional helper fields. model_used_notes and selection_reason_notes are optional free-form fields used only when the corresponding enum is set to other. They give contributors a place to specify a model or reason that isn't covered by the standard enum without expanding the top-level vocabulary.
The Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Multi-AI Decision Log Entry",
"type": "object",
"required": [
"timestamp",
"task_context",
"model_used",
"role",
"selection_reason",
"handoff_trigger",
"disagreement_resolution",
"final_decision",
"confidence"
],
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 UTC. Moment the decision was made."
},
"task_context": {
"type": "string",
"maxLength": 200,
"description": "Generalized one-line task description. No literal prompts, no project identifiers."
},
"model_used": {
"type": "string",
"enum": ["claude", "chatgpt", "gemini", "grok", "local_llm", "other"]
},
"model_used_notes": {
"type": "string",
"maxLength": 100,
"description": "Optional. Required if model_used is 'other'."
},
"role": {
"type": "string",
"enum": [
"strategic_advisor",
"document_builder",
"code_executor",
"verifier",
"reviewer",
"researcher",
"formatter",
"other"
]
},
"selection_reason": {
"type": "string",
"enum": [
"tool_capability",
"context_window",
"domain_strength",
"second_opinion",
"availability",
"cost",
"prior_thread_continuity",
"other"
]
},
"selection_reason_notes": {
"type": "string",
"maxLength": 100,
"description": "Optional. Required if selection_reason is 'other'. No sensitive content."
},
"handoff_trigger": {
"type": ["string", "null"],
"enum": [
"tool_capability_required",
"context_exhausted",
"second_opinion_needed",
"disagreement_escalation",
"verification_required",
"human_initiated",
"not_applicable",
null
]
},
"disagreement_resolution": {
"type": ["string", "null"],
"enum": [
"human_chose_a",
"human_chose_b",
"human_synthesized",
"third_ai_arbitrated",
"deferred",
"not_applicable",
null
]
},
"final_decision": {
"type": "string",
"maxLength": 200,
"description": "Generalized statement of the call made at this step. No decision content that exposes sensitive material."
},
"confidence": {
"type": "string",
"enum": ["high", "medium", "low", "forced_decision"]
}
}
}
Worked Example
One filled entry from a real multi-AI routing decision: choosing between two prompt versions when requesting a Task Node task.
{
"timestamp": "2026-05-08T18:45:00Z",
"task_context": "selected between two task-request prompt drafts for a Network task submission",
"model_used": "claude",
"role": "strategic_advisor",
"selection_reason": "second_opinion",
"handoff_trigger": "second_opinion_needed",
"disagreement_resolution": "human_chose_a",
"final_decision": "submitted detailed prompt version",
"confidence": "medium"
}
Two AIs reviewed the same pair of drafts. They disagreed on which to submit. The contributor logged the disagreement_resolution as human_chose_a — the human made the final call rather than averaging the two AI recommendations. Confidence was medium because the conservative call was defensible but not certain. No prompt content was logged. No project identifiers were logged. Anyone reading this entry six months later can reconstruct the shape of the decision without reading the actual prompts.
Privacy Boundary
The schema is built on the assumption that the log is publishable. Every field that could leak sensitive content has explicit redaction guidance: task_context is generalized, final_decision is generalized, disagreement_resolution records method not substance. A correctly-filled entry should be safe to publish in any context the contributor would publish a public decision summary. If a field cannot be filled without leaking — for example, the task itself is confidential — the entry should not be logged publicly at all. Partial logs that strip required fields defeat the schema's purpose.
Closing
The point is not the log. The point is that AI-assisted judgment becomes reviewable. A contributor running real work across multiple AI systems can ship a decision log alongside the work product, and any reviewer — human or automated — can confirm the routing happened, see the reasoning, and verify nothing critical was outsourced to a single black box without oversight. The schema is small. Filling one entry takes under a minute. The cost of logging is far below the cost of being unable to defend a decision later.