Creasura Blog · For professionals

How Creasura steers ChatGPT through a complex task

ChatGPT picks each next tool from what the last step returned, and the Creasura kernel checks every step before anything changes.

By Creasura · November 3, 2026 · 7 min read

Sam is a senior engineering leader planning a career move. One evening Sam opens ChatGPT, with Creasura connected, and types: “Finish my market-research workbook, build a short target list from my contacts, fix my self-assessment score, and draft the outreach.”

That one sentence touches four files, two file formats, an empty address book and a blocked web page. This post walks through the thinking behind each step: how ChatGPT knew which tool to call, how it knew what to change, and how the Creasura kernel kept it honest.

ChatGPT picks the next step from evidence; the kernel checks every step.

ChatGPT picks the next step

  1. Discover

    Find the real files, their types and IDs before planning.

  2. Read the gaps

    Look for blank cells, placeholders and stale formulas.

  3. Join evidence

    Fill each gap only from Sam’s own sources.

  4. Write and verify

    Write after approval, then read the result back.

    Gate: approval, then read-back

Creasura kernel checks every step

Chapter 1

How ChatGPT knew which tools to call

ChatGPT did not load every tool up front and pick from a long menu. Each call was triggered by a concrete signal from the step before it: a file type, an empty result, an error. Five signals drove the whole task.

  1. Signal 1 · Open-ended goal

    No file names, so look first

    Sam named no files, so the first job was to find out what already exists.

    Behind the scenes · trigger → decision → next tool
    Trigger
    The request mentions “my workbook” and “my contacts” but gives no file IDs or links.
    Decision
    Discover what templates and personal sources exist before planning or writing anything.
    Next tool
    Drive metadata search → file reader
    Why not the obvious move
    Building a fresh tracker from scratch would ignore Workbook A and Sam’s own resume.
    Result
    Found Workbook A, the Self-assessment sheet, Workbook B (.xlsx), the resume and a published engineering write-up.
  2. Signal 2 · Empty result

    The address book is empty

    The contacts tool returned nothing, so ChatGPT looked where contacts actually were.

    Behind the scenes · trigger → decision → next tool
    Trigger
    The contacts tool returned 0 records.
    Decision
    An empty structured source is not an answer. Connection notices in email are ground truth for who Sam knows.
    Next tool
    Gmail search for connection notices → read the threads → web search for current roles
    Why not the obvious move
    Stopping at zero gives an empty list; a web search alone cannot prove Sam knows anyone.
    Result
    A contacts export of 30 people, each with a source thread and a checked current role.
  3. Signal 3 · Google Sheets file type

    A live sheet needs cell edits

    The self-assessment is a native Google Sheet with a live score formula, so it was edited cell by cell.

    Behind the scenes · trigger → decision → next tool
    Trigger
    Drive reports application/vnd.google-apps.spreadsheet, with a SUM formula in V3.
    Decision
    Use range updates that keep formulas, formatting and sharing intact.
    Next tool
    Google Sheets range update
    Why not the obvious move
    Re-uploading the sheet as a new file would break the formula and change the file ID.
    Result
    Cells updated in place; the score formula recalculated by itself.
  4. Signal 4 · Excel file type

    An .xlsx file needs a different tool

    Workbook B is an Excel file, which the Sheets tool cannot edit, so ChatGPT switched to Python.

    Behind the scenes · trigger → decision → next tool
    Trigger
    Drive reports application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.
    Decision
    Download the binary, edit it with a spreadsheet library, upload the result.
    Next tool
    Drive download → Python sandbox (openpyxl) → Drive upload
    Why not the obvious move
    Calling the Sheets tool on an .xlsx file ID fails with an unsupported-type error.
    Result
    Three empty tables filled, fonts and borders kept, file uploaded.
  5. Signal 5 · HTTP error

    A blocked page needs a browser

    A plain fetch of a target company’s careers page was refused, so ChatGPT tried a real browser once.

    Behind the scenes · trigger → decision → next tool
    Trigger
    The static fetch returned an access error.
    Decision
    After one failure, escalate to a browser that renders the page.
    Next tool
    Headless browser → page text
    Why not the obvious move
    Retrying the same fetch wastes tokens; guessing the page from memory is not grounded.
    Result
    The open roles were read from the rendered page and cited.

The pattern is the same each time: the result of one call decides the next. Nothing is chosen because it might be useful later.

Next: Chapter 2 · How it knew what content to update ›

Chapter 2

How it knew what content to update

Every edit came from a simple diff. On one side, the template: blank or outdated cells in Sam’s files. On the other, verified personal sources: the resume, the published write-up, the contacts export and Sam’s own answers. Where they meet, you get an exact update.

CellBeforeEvidence sourceAfter
Workbook A · Target list, rows 2–9EmptyContacts export, filtered by Sam’s rules8 people, each with a source link
Workbook A · Focus area (B15)BlankResume and the published write-upPlatform reliability for growth-stage software teams
Self-assessment · B1:B3DisagreeThe finished pages in Workbook AAgree
Self-assessment · score (V3)11/48None needed: the formula recalculates24/48, read back
Workbook B · Roles tableEmpty rowsResume6 roles with dates
Self-assessment · mentor (N17)BlankNone foundUNKNOWN
  • Every edit points to evidence. The evidence column is part of the record, not a footnote.
  • No evidence, no edit. The mentor cell stays UNKNOWN. ChatGPT asks Sam instead of inventing a name.
  • Never type over a formula. The score changed because its inputs changed, and the new value was read back.

This is what keeps a long task from drifting. A model that writes only what it can point to has very little room to make things up.

Next: Chapter 3 · How the Creasura kernel steers ChatGPT ›

Chapter 3

How the Creasura kernel steers ChatGPT

Inside ChatGPT, ChatGPT owns the generation loop. Instructions, including any system prompt, are advisory: the model usually follows them, but nothing forces it to. So the proposed kernel relies on checks it runs itself, at the moment a tool is called.

Mode A · MCP bridge

Creasura inside ChatGPT

ChatGPT owns the loop.

Sam uses the normal ChatGPT app with Creasura connected as an MCP server. The kernel cannot change how ChatGPT thinks; it controls what its tools accept and what they show.

Controls: 1 stage receipts, 2 next-step directives, 3 dynamic tool list, 4 gateway tools

Mode B · OpenAI API

Creasura runs the loop

Creasura owns the loop.

Creasura calls the OpenAI API itself, so it decides what the model sees on every turn. It can force the next tool, compact the history, and keep checking outcomes after the chat ends (proposed).

Controls: 1 stage receipts, 2 next-step directives, 3 dynamic tool list, 4 gateway tools, 5 forced tool choice

  1. Control 1 Mode AMode B

    Stage receipts

    Each write tool needs a receipt from the stage before it. No receipt, no write.

    Behind the scenes · how it works

    Understanding, committing and planning each return a receipt ID that the next tool requires. If ChatGPT skips ahead, the kernel refuses the call before anything changes and says which tool to call instead. The guarantee is the refusal, not the model’s obedience.

    {
      "error": {
        "code": "PRECONDITION_FAILED",
        "message": "Missing plan_receipt_id. Nothing was written.",
        "retryable": true,
        "details": {
          "must_call_next": "creasura_resolve_context"
        }
      },
      "trace_id": "trace_sam_002"
    }
  2. Control 2 Mode AMode B

    Next-step directives

    Every tool result ends with a short note saying which stage comes next.

    Behind the scenes · how it works

    The note sits at the end of the latest tool result, close to where the model is reading. That makes it more likely to be followed than an instruction from long ago, but it is still advice. Stage receipts are what enforce the order.

    {
      "status": "CONTEXT_RESOLVED",
      "context_snapshot_id": "ctx_sam_05",
      "_kernel_directive": {
        "current_stage": "UNDERSTAND",
        "next_stage": "COMMIT",
        "must_call_next": "creasura_commit_work",
        "instruction": "Do not reply to Sam yet. Register the commitment first."
      }
    }
  3. Control 3 Mode AMode B

    Dynamic tool list

    ChatGPT only sees the tools that make sense for the current stage.

    Behind the scenes · how it works

    The Creasura MCP server changes its tool list as the work moves on and sends the standard MCP notifications/tools/list_changed notice. A model cannot call a tool it was not offered. How quickly a host refreshes its list is up to the host, so receipts still back this up.

    {
      "method": "notifications/tools/list_changed",
      "state": "WAITING_APPROVAL -> RUNNING",
      "tools_now_visible": [
        "creasura_execute_step",
        "creasura_verify_execution"
      ]
    }
  4. Control 4 Mode AMode B

    Gateway tools

    ChatGPT makes one call per stage; the kernel runs the fiddly chain behind it.

    Behind the scenes · how it works

    Instead of exposing raw connectors, Creasura exposes a few lifecycle tools such as creasura_resolve_context. One call runs the whole fallback chain on the server (contacts, then email, then web) and returns a short summary, so pages of raw email never reach the chat.

    {
      "tool": "creasura_resolve_context",
      "arguments": {
        "goal_id": "goal_sam_01",
        "fallback_policy": "contacts_then_email_then_web"
      },
      "kernel_trace": [
        "contacts: 0 records",
        "email: 30 connection threads",
        "web: 30 current roles checked"
      ]
    }
  5. Control 5 Mode B

    Forced tool choice

    When Creasura calls the model itself, it can require the exact next tool.

    Behind the scenes · how it works

    This works only in Mode B, where Creasura calls the OpenAI API directly. The request names the one function the model must call, with tool_choice. Creasura can also rebuild the message history from a compact checkpoint when it grows too long. Neither is possible inside the ChatGPT app.

    {
      "model": "<model>",
      "tools": [
        {
          "type": "function",
          "name": "creasura_verify_execution"
        }
      ],
      "tool_choice": {
        "type": "function",
        "name": "creasura_verify_execution"
      }
    }

Mode A is the easy start: no new app to learn. Mode B is for long or background work, where the kernel needs a firmer hand on each step.

Next: Chapter 4 · Step through the protocol ›

Chapter 4

Step through the protocol

Here is the same task as six exchanges between ChatGPT and the kernel. Turn on “Behind the scenes” to see each call and reply.

  1. Step 1 CREATED → READY

    The goal is registered and writes are locked

    ChatGPT

    ChatGPT records Sam’s request as a goal with creasura_observe_goal.

    Kernel

    The kernel stores the goal and offers only the tool for gathering context. No write tool is visible yet.

    Behind the scenes · creasura_observe_goal

    ChatGPT calls

    {
      "tool": "creasura_observe_goal",
      "arguments": {
        "idempotency_key": "sam-goal-001",
        "intent": "Finish Workbook A, build a target list, fix the self-assessment score, draft outreach"
      }
    }

    The kernel replies

    {
      "status": "GOAL_OBSERVED",
      "goal_id": "goal_sam_01",
      "_kernel_directive": {
        "must_call_next": "creasura_resolve_context",
        "instruction": "Do not write anything yet."
      }
    }
  2. Step 2 READY (unchanged)

    A premature write is blocked

    ChatGPT

    ChatGPT jumps ahead and tries to add the target-list tab to Workbook A.

    Kernel

    No receipt, so the kernel refuses before touching Drive and names the tool to call first.

    Behind the scenes · creasura_execute_stepRefused · PRECONDITION_FAILED

    ChatGPT calls

    {
      "tool": "creasura_execute_step",
      "arguments": {
        "capability": "sheets.add_tab",
        "file": "workbook_a",
        "tab": "Target list"
      }
    }

    The kernel replies

    {
      "error": {
        "code": "PRECONDITION_FAILED",
        "message": "Understand and Commit receipts are missing.",
        "retryable": true,
        "details": {
          "must_call_next": "creasura_resolve_context"
        }
      },
      "trace_id": "trace_sam_002"
    }
  3. Step 3 READY

    The kernel forces a fallback

    ChatGPT

    ChatGPT calls creasura_resolve_context once.

    Kernel

    Contacts come back empty, so the kernel falls back to email, then the web. It returns the gaps it found and a context receipt.

    Behind the scenes · creasura_resolve_context

    ChatGPT calls

    {
      "tool": "creasura_resolve_context",
      "arguments": {
        "goal_id": "goal_sam_01",
        "fallback_policy": "contacts_then_email_then_web"
      }
    }

    The kernel replies

    {
      "status": "CONTEXT_RESOLVED",
      "context_snapshot_id": "ctx_sam_05",
      "fallback_trace": [
        "contacts: 0",
        "email: 30 threads",
        "web: 30 roles checked"
      ],
      "gaps": [
        "Workbook A: target list and B15 blank",
        "Self-assessment: V3 = 11/48",
        "Workbook B (.xlsx): 3 empty tables"
      ]
    }
  4. Step 4 READY → RUNNING

    Commit and plan, with receipts

    ChatGPT

    ChatGPT registers what “done” means, then asks for a plan.

    Kernel

    The kernel checks the file types, offers just the tools the plan needs, and issues a plan receipt.

    Behind the scenes · creasura_discover_and_plan

    ChatGPT calls

    {
      "tool": "creasura_discover_and_plan",
      "arguments": {
        "commitment_id": "com_sam_01",
        "done_when": [
          "V3 reads at least 20/48",
          "8 target rows with sources",
          "No invented values"
        ]
      }
    }

    The kernel replies

    {
      "status": "PLAN_READY",
      "plan_receipt_id": "plan_sam_07",
      "tools_offered": [
        "sheets_range_update",
        "python_xlsx_worker",
        "browser_read"
      ]
    }
  5. Step 5 RUNNING → WAITING_APPROVAL → RUNNING

    A pause for Sam, who changes the brief

    ChatGPT

    Before writing to a shared sheet, ChatGPT shows Sam the proposed list. Sam replies: “Leave out anyone at my previous employer, and put the outreach drafts in a separate tab.”

    Kernel

    The kernel treats this as a change, not a failure. It drops five people, re-plans with the new tab, and continues once Sam approves.

    Behind the scenes · creasura_submit_approval_decision

    ChatGPT calls

    {
      "tool": "creasura_submit_approval_decision",
      "arguments": {
        "approval_id": "appr_sam_03",
        "decision": "modify",
        "constraint_patch": {
          "exclude_employer": "previous employer",
          "new_tab": "Outreach drafts"
        }
      }
    }

    The kernel replies

    {
      "status": "REPLANNED_AND_APPROVED",
      "candidates_removed": 5,
      "note": "A 'modify' decision is proposed beyond CAOP v0.1."
    }
  6. Step 6 VERIFYING → COMPLETED

    The result is read back

    ChatGPT

    ChatGPT asks the kernel to verify before telling Sam it is done.

    Kernel

    The kernel re-reads the files: the score now reads 24/48, the list has 8 rows and nobody from the previous employer, and the mentor cell is reported as UNKNOWN.

    Behind the scenes · creasura_verify_execution

    ChatGPT calls

    {
      "tool": "creasura_verify_execution",
      "arguments": {
        "execution_id": "exec_sam_01",
        "plan_receipt_id": "plan_sam_07"
      }
    }

    The kernel replies

    {
      "status": "VERIFIED",
      "checks": {
        "self_assessment_V3": "PASSED (24/48, read back)",
        "target_list": "PASSED (8 rows, 0 at previous employer)",
        "outreach_tab": "PASSED (separate tab)",
        "mentor_N17": "UNKNOWN (asked Sam)"
      }
    }

ChatGPT did the thinking at every step. The kernel made sure the order held, the fallback happened, Sam stayed in charge, and “done” meant something that was checked.

Next: Further reading ›

Further reading

Creasura Work is coming soon.

Your Expertise. Amplified. Be the first to know when it’s ready.

Join the Interest List Learn about Creasura Work ›