soil_canon
ChatGPTREAD-ONLY query of a shared team project's CANON, its accumulated load-bearing truths (decisions, constraints, identity, architecture, workflow, vocabulary, rejected paths). Use it to expand a claim instead of asking the user to reload the project. Filter by ids (e.g. a c003 from a digest), kind, or q (case-insensitive search over statement + reason); returns matched claims grouped by kind, with masked attribution and lineage, paginated by limit + cursor. REQUIRES an explicit @project the user is a member of: pass the reference WITH the leading @ in project. A personal/bare context has no canon and returns a clean 'no project canon' note. Never changes the canon and costs nothing. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_canon
ChatGPTREAD-ONLY query of a shared team project's CANON, its accumulated load-bearing truths (decisions, constraints, identity, architecture, workflow, vocabulary, rejected paths). Use it to expand a claim instead of asking the user to reload the project. Filter by ids (e.g. a c003 from a digest), kind, or q (case-insensitive search over statement + reason); returns matched claims grouped by kind, with masked attribution and lineage, paginated by limit + cursor. REQUIRES an explicit @project the user is a member of: pass the reference WITH the leading @ in project. A personal/bare context has no canon and returns a clean 'no project canon' note. Never changes the canon and costs nothing. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_info
ChatGPTShow the user's Soil status (project + handover counts and recent handovers, code-first; identity stays masked). Call on soil, soil status, or soil info; no confirmation needed. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_info
ChatGPTShow the user's Soil status (project + handover counts and recent handovers, code-first; identity stays masked). Call on soil, soil status, or soil info; no confirmation needed. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_list
ChatGPTList the user's saved Soil handovers (load code, project, title, saved-at, readiness; newest first). Call on soil list. soil list @project lists a shared team project's threads (code, title, contributor, readiness) so the user knows what to load. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_list
ChatGPTList the user's saved Soil handovers (load code, project, title, saved-at, readiness; newest first). Call on soil list. soil list @project lists a shared team project's threads (code, title, contributor, readiness) so the user knows what to load. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_load
ChatGPTLoad a saved Soil handover into this session as a paste-ready restore block. Call on soil load #001 (exact code) or soil load <project> (latest in a project). ALWAYS pass the exact reference the user gave in reference; NEVER call with an empty reference to ask which project. Grammar (@=where, #=which): a bare #NNN is always PERSONAL (the user's handover, never a project thread). A non-numeric soil load #name loads the personal handover SAVED UNDER THAT NAME (newest); if no name matches it falls back to the latest in the personal project with that label; if both match, the tool refuses and asks for the exact code, so relay that and never pick one. soil load @project restores the WHOLE shared team project (contents plus every thread, attributed); soil load @project #NNN restores ONE thread in it (by its project-local #NNN, #name, or title; #name = newest version under that name); you MUST pass @project #NNN to reach a team thread. A numeric #NNN is an EXACT code: unknown = not-found, never the latest. On not-found you MUST report it and offer soil list. NEVER load or present a different handover in its place, and never silently fall back to the latest. @project-only, best-effort: when a whole-project load ends with a CANON-RECALL CHECK, answer its probes FROM THE LOADED CANON and call soil_load again with the SAME @project and a recallAnswers array (each item: a probe id like p001 plus your one-line answer); skipping it does not affect the restore. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_load
ChatGPTLoad a saved Soil handover into this session as a paste-ready restore block. Call on soil load #001 (exact code) or soil load <project> (latest in a project). ALWAYS pass the exact reference the user gave in reference; NEVER call with an empty reference to ask which project. Grammar (@=where, #=which): a bare #NNN is always PERSONAL (the user's handover, never a project thread). A non-numeric soil load #name loads the personal handover SAVED UNDER THAT NAME (newest); if no name matches it falls back to the latest in the personal project with that label; if both match, the tool refuses and asks for the exact code, so relay that and never pick one. soil load @project restores the WHOLE shared team project (contents plus every thread, attributed); soil load @project #NNN restores ONE thread in it (by its project-local #NNN, #name, or title; #name = newest version under that name); you MUST pass @project #NNN to reach a team thread. A numeric #NNN is an EXACT code: unknown = not-found, never the latest. On not-found you MUST report it and offer soil list. NEVER load or present a different handover in its place, and never silently fall back to the latest. @project-only, best-effort: when a whole-project load ends with a CANON-RECALL CHECK, answer its probes FROM THE LOADED CANON and call soil_load again with the SAME @project and a recallAnswers array (each item: a probe id like p001 plus your one-line answer); skipping it does not affect the restore. IMPORTANT: the returned text is a finished, user-facing status message — show it to the user IN FULL, exactly as written. Do NOT summarize it, collapse it into one line, or drop the verification details.
soil_prepare
ChatGPTOPTIONAL depth helper that returns the Soil extraction recipe (sections to fill). You do NOT need to call this before soil_save: a real, verified save lands in ONE soil_save call. Call it to capture MORE depth (workflow, constraints, rejected-paths), or on an @project save to get the CANON DIGEST to disposition. The SAME single save mode either way. Pass the user's reference (everything after soil save, e.g. @acme-app #min-handover, either order) in project: a leading @ is a SHARED team project, otherwise the save is PERSONAL. Never file a personal save into an @project just because one is in the conversation. If the user gives no project, derive a short kebab-case projectId from the conversation yourself; never ask the user for one and never refuse to save because one was not given.
soil_prepare
ChatGPTOPTIONAL depth helper that returns the Soil extraction recipe (sections to fill). You do NOT need to call this before soil_save: a real, verified save lands in ONE soil_save call. Call it to capture MORE depth (workflow, constraints, rejected-paths), or on an @project save to get the CANON DIGEST to disposition. The SAME single save mode either way. Pass the user's reference (everything after soil save, e.g. @acme-app #min-handover, either order) in project: a leading @ is a SHARED team project, otherwise the save is PERSONAL. Never file a personal save into an @project just because one is in the conversation. If the user gives no project, derive a short kebab-case projectId from the conversation yourself; never ask the user for one and never refuse to save because one was not given.
soil_save
ChatGPTRECEIPT RULE — READ FIRST: a Soil save has happened ONLY if THIS tool returned a load code (a #NNN) THIS turn. There is no 'Soil memory fallback'. If no #NNN came back this turn, the save did NOT happen — tell the user plainly it was not saved, never show or invent a 'saved' card, and offer to retry (a fresh thread is most reliable). The #NNN is the only proof; the host's prose 'Saved' is not. Save the current working state as a Soil handover, loadable anywhere later. Call on soil save or a request to save to Soil. SELF-CONTAINED IS RULE ONE: a cold model loads ONLY this handover and cannot open anything, so every section must inline its actual content. Never point the reader elsewhere — do NOT write 'see ...', 'in the repo', 'in the docs', 'documented in ...', 'the draft', 'go read ...' or any fetch-it-from-X phrase, not even as a passing factual aside (state the fact directly: not 'no secrets in the repo' but 'no secrets or API keys are stored anywhere'). Naming a path as a plain label is fine ('the config in src/app.ts'); pointing at it as where-to-find-the-content is rejected. ONE soil_save call is enough, but ALL 17 extractionSections are EXPECTED — not a subset. Lead with the restore-critical core (executiveSummary, currentTask, nextSteps, decisions with why, restoreInstructions as a single standalone restore prompt, projectIdentity; add architecture for code), then fill EVERY remaining section too. For a section that genuinely does not apply, write a brief none rather than omitting it — every section must be present, and omitting any one is rejected. NEVER put a secret or a local/absolute filesystem path (an absolute home-directory or drive-root path) in any section; name locations generically (an absolute path is rejected). The extraction is then verified and SAVED in this one call. Calling soil_prepare first is OPTIONAL (for more depth). This is Soil's single self-sufficient save, not a quick/lite tier: the handover must stand alone — see RULE ONE above (every section self-contained, no external pointers; an external-file reference is rejected). Write the restore prompt to boot a cold model with ONLY the handover. Write it about the PROJECT, never about Soil: the save command, @project/#name routing, and load code are the MEDIUM, not project content; if the thread has no real project work yet, write an honest THIN handover marking gaps in the project's own terms, not Soil-machinery padding. A borderline handover comes back NEEDS-WORK (fix the gaps and call again) or DRIFT-TEST (re-read it cold, then call again with driftConfirmed:true). Incomplete input is NEVER saved. Grammar (@ says where, # says which, either order): soil save (personal, auto-named) · soil save #my-name (personal, named) · soil save @project (shared, membership-gated) · soil save @project #my-name (shared, named). Pass everything after soil save in project. A leading @ selects a SHARED team project; without it the save is PERSONAL, never filed into an @project just because one is in the conversation. For a SHARED @project save you MUST disposition the project's existing CANON: call soil_prepare FIRST to fetch the canon digest, then in canonOps give EVERY existing claim exactly one disposition (affirm/supersede/retire/conflict) and add any new locked truth — an unaddressed claim blocks the save and the shared canon is left un-patched. (soil_prepare stays OPTIONAL for a PERSONAL save.) An explicit #name becomes the handover NAME (overrides the extracted title); re-saving a name saves a NEW VERSION, loadable with soil load #my-name. Names cannot be all digits (numeric #NNN codes are auto-assigned). If the user gives no project, derive a short kebab-case projectId from the conversation yourself (e.g. payments-migration); never ask the user for one and never refuse to save because one was not given. EXPECTED on every save — do not skip these because they are not strictly required (they are expected, like captureCoverage): set modelName to the EXACT model id you are running as, read from you…
soil_save
ChatGPTRECEIPT RULE — READ FIRST: a Soil save has happened ONLY if THIS tool returned a load code (a #NNN) THIS turn. There is no 'Soil memory fallback'. If no #NNN came back this turn, the save did NOT happen — tell the user plainly it was not saved, never show or invent a 'saved' card, and offer to retry (a fresh thread is most reliable). The #NNN is the only proof; the host's prose 'Saved' is not. Save the current working state as a Soil handover, loadable anywhere later. Call on soil save or a request to save to Soil. SELF-CONTAINED IS RULE ONE: a cold model loads ONLY this handover and cannot open anything, so every section must inline its actual content. Never point the reader elsewhere — do NOT write 'see ...', 'in the repo', 'in the docs', 'documented in ...', 'the draft', 'go read ...' or any fetch-it-from-X phrase, not even as a passing factual aside (state the fact directly: not 'no secrets in the repo' but 'no secrets or API keys are stored anywhere'). Naming a path as a plain label is fine ('the config in src/app.ts'); pointing at it as where-to-find-the-content is rejected. ONE soil_save call is enough, but ALL 17 extractionSections are EXPECTED — not a subset. Lead with the restore-critical core (executiveSummary, currentTask, nextSteps, decisions with why, restoreInstructions as a single standalone restore prompt, projectIdentity; add architecture for code), then fill EVERY remaining section too. For a section that genuinely does not apply, write a brief none rather than omitting it — every section must be present, and omitting any one is rejected. NEVER put a secret or a local/absolute filesystem path (an absolute home-directory or drive-root path) in any section; name locations generically (an absolute path is rejected). The extraction is then verified and SAVED in this one call. Calling soil_prepare first is OPTIONAL (for more depth). This is Soil's single self-sufficient save, not a quick/lite tier: the handover must stand alone — see RULE ONE above (every section self-contained, no external pointers; an external-file reference is rejected). Write the restore prompt to boot a cold model with ONLY the handover. Write it about the PROJECT, never about Soil: the save command, @project/#name routing, and load code are the MEDIUM, not project content; if the thread has no real project work yet, write an honest THIN handover marking gaps in the project's own terms, not Soil-machinery padding. A borderline handover comes back NEEDS-WORK (fix the gaps and call again) or DRIFT-TEST (re-read it cold, then call again with driftConfirmed:true). Incomplete input is NEVER saved. Grammar (@ says where, # says which, either order): soil save (personal, auto-named) · soil save #my-name (personal, named) · soil save @project (shared, membership-gated) · soil save @project #my-name (shared, named). Pass everything after soil save in project. A leading @ selects a SHARED team project; without it the save is PERSONAL, never filed into an @project just because one is in the conversation. For a SHARED @project save you MUST disposition the project's existing CANON: call soil_prepare FIRST to fetch the canon digest, then in canonOps give EVERY existing claim exactly one disposition (affirm/supersede/retire/conflict) and add any new locked truth — an unaddressed claim blocks the save and the shared canon is left un-patched. (soil_prepare stays OPTIONAL for a PERSONAL save.) An explicit #name becomes the handover NAME (overrides the extracted title); re-saving a name saves a NEW VERSION, loadable with soil load #my-name. Names cannot be all digits (numeric #NNN codes are auto-assigned). If the user gives no project, derive a short kebab-case projectId from the conversation yourself (e.g. payments-migration); never ask the user for one and never refuse to save because one was not given. EXPECTED on every save — do not skip these because they are not strictly required (they are expected, like captureCoverage): set modelName to the EXACT model id you are running as, read from you…