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.
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
- Discover
Find the real files, their types and IDs before planning.
- Read the gaps
Look for blank cells, placeholders and stale formulas.
- Join evidence
Fill each gap only from Sam’s own sources.
- 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.
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.
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
0records. - 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.
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 aSUMformula inV3. - 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.
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.
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.
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.
| Cell | Before | Evidence source | After |
|---|---|---|---|
| Workbook A · Target list, rows 2–9 | Empty | Contacts export, filtered by Sam’s rules | 8 people, each with a source link |
Workbook A · Focus area (B15) | Blank | Resume and the published write-up | Platform reliability for growth-stage software teams |
Self-assessment · B1:B3 | Disagree | The finished pages in Workbook A | Agree |
Self-assessment · score (V3) | 11/48 | None needed: the formula recalculates | 24/48, read back |
| Workbook B · Roles table | Empty rows | Resume | 6 roles with dates |
Self-assessment · mentor (N17) | Blank | None found | UNKNOWN |
- 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.
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
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" }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." } }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_changednotice. 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" ] }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" ] }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.
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.
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_goalChatGPT 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." } }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_FAILEDChatGPT 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" }Step 3 READY
The kernel forces a fallback
ChatGPT
ChatGPT calls
creasura_resolve_contextonce.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_contextChatGPT 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" ] }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_planChatGPT 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" ] }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_decisionChatGPT 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." }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_executionChatGPT 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.
Further reading
- How a principal engineer works with Creasura Work: the same product from a day-to-day view.
- What happens when the agent is wrong?: a CTO’s walkthrough of refusals, conflicts and recovery.
- The CAOP v0.1 specification: the published protocol behind the lifecycle stages.
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 ›