Skip to content

Discourage AI from using write-text-file for .gts files#64

Merged
jurgenwerk merged 2 commits intomainfrom
cs-10541-ai-will-sometimes-choose-write-command-for-gts-files-when-it
Mar 28, 2026
Merged

Discourage AI from using write-text-file for .gts files#64
jurgenwerk merged 2 commits intomainfrom
cs-10541-ai-will-sometimes-choose-write-command-for-gts-files-when-it

Conversation

@jurgenwerk
Copy link
Copy Markdown
Contributor

@jurgenwerk jurgenwerk commented Mar 27, 2026

Summary

Sometimes it happens that AI uses write-text-file to create .gts files. Tool calls don't stream — the entire file content must generate before the user sees anything. This makes the UI show "Thinking" / "Preparing tool call" for a long time, appearing frozen. SEARCH/REPLACE blocks stream as visible text so users see real-time progress.

Updated 3 skill files to enforce: always use SEARCH/REPLACE for .gts files, write-text-file is OK for .json instances only.

What changed (human-readable)

Skill/env-creating-and-editing-cards.md

Creating Cards table — reordered and reworded:

  • Before: write-text-file was listed first for "New card from scratch", SEARCH/REPLACE was last for "New .gts definitions or JSON via code mode"
  • After: SEARCH/REPLACE is first for "Always use for .gts files", write-text-file is for "New .json card instances from scratch" only

Quick Decision tree:

  • Before: From scratch → write-text-file
  • After: New .gts file → SEARCH/REPLACE with (new) marker (ALWAYS — never write-text-file for .gts) and New .json instance → write-text-file

Skill/boxel-environment.json (frontMatter)

New streaming rule added after STEP 4 (DATA TASK):

⚠️ STREAMING RULE: NEVER use write-text-file for .gts files. Tool calls do NOT stream — the entire payload must be generated before the user sees anything, making the UI appear frozen. SEARCH/REPLACE blocks stream as visible text so the user sees real-time progress. Always use SEARCH/REPLACE with (new) for creating .gts files.

Command reference for write-text-file_e5a1:

  • Before: Fallback only (after failed SEARCH/REPLACE)
  • After: OK for .json instances. NEVER use for .gts files — tool calls don't stream, causing the UI to appear frozen. Always use SEARCH/REPLACE for .gts.

Skill/source-code-editing.md

Opening paragraph:

  • Before: ...you must use a SEARCH/REPLACE block.
  • After: ...you must use a SEARCH/REPLACE block. For .gts files, ALWAYS use SEARCH/REPLACE — never use write-text-file for .gts. SEARCH/REPLACE blocks stream as visible text (the user sees progress), while tool calls like write-text-file do NOT stream (the UI appears frozen with "Thinking" / "Preparing tool call" while generating the full file content).

Test plan

  • Ask the AI assistant to create a new card definition (.gts) — verify it uses SEARCH/REPLACE, not write-text-file
  • Ask the AI assistant to create a new card instance (.json) — verify write-text-file still works
  • Verify no "stuck on Thinking" behavior when creating .gts files

🤖 Generated with Claude Code

Tool calls like write-text-file don't stream — the entire payload must
generate before the user sees anything, making the UI appear frozen on
"Thinking" / "Preparing tool call". SEARCH/REPLACE blocks stream as
visible text so users see real-time progress. Updated skill instructions
across 4 files to enforce: always use SEARCH/REPLACE for .gts,
write-text-file is OK for .json instances only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

🔍 Workspace Sync Dry-Run Complete

✅ Dry-run completed successfully - no changes were made
📁 Target workspace: https://realms-staging.stack.cards/skills
🔗 PR: #64
ℹ️ Changes will be synced when this PR is merged to main

Dry-Run Results

Logging into Matrix...
Matrix login successful
Starting push from . to https://realms-staging.stack.cards/skills
Testing workspace access...
Workspace access verified
Found 70 files in remote workspace
Found 70 files in local directory
Uploading: .realm.json
[DRY RUN] Would upload .realm.json
Uploading: Skill/boxel-design.json
[DRY RUN] Would upload Skill/boxel-design.json
Uploading: Skill/boxel-design.md
[DRY RUN] Would upload Skill/boxel-design.md
Uploading: Skill/boxel-development.json
[DRY RUN] Would upload Skill/boxel-development.json
Uploading: Skill/boxel-environment.json
[DRY RUN] Would upload Skill/boxel-environment.json
Uploading: Skill/boxel-ui-guidelines.json
[DRY RUN] Would upload Skill/boxel-ui-guidelines.json
Uploading: Skill/boxel-ui-guidelines.md
[DRY RUN] Would upload Skill/boxel-ui-guidelines.md
Uploading: Skill/catalog-listing.json
[DRY RUN] Would upload Skill/catalog-listing.json
Uploading: Skill/catalog-listing.md
[DRY RUN] Would upload Skill/catalog-listing.md
Uploading: Skill/dev-command-development.json
[DRY RUN] Would upload Skill/dev-command-development.json
Uploading: Skill/dev-command-development.md
[DRY RUN] Would upload Skill/dev-command-development.md
Uploading: Skill/dev-core-concept.json
[DRY RUN] Would upload Skill/dev-core-concept.json
Uploading: Skill/dev-core-concept.md
[DRY RUN] Would upload Skill/dev-core-concept.md
Uploading: Skill/dev-core-patterns.json
[DRY RUN] Would upload Skill/dev-core-patterns.json
Uploading: Skill/dev-core-patterns.md
[DRY RUN] Would upload Skill/dev-core-patterns.md
Uploading: Skill/dev-data-management.json
[DRY RUN] Would upload Skill/dev-data-management.json
Uploading: Skill/dev-data-management.md
[DRY RUN] Would upload Skill/dev-data-management.md
Uploading: Skill/dev-defensive-programming.json
[DRY RUN] Would upload Skill/dev-defensive-programming.json
Uploading: Skill/dev-defensive-programming.md
[DRY RUN] Would upload Skill/dev-defensive-programming.md
Uploading: Skill/dev-delegated-rendering.json
[DRY RUN] Would upload Skill/dev-delegated-rendering.json
Uploading: Skill/dev-delegated-rendering.md
[DRY RUN] Would upload Skill/dev-delegated-rendering.md
Uploading: Skill/dev-enumerations.json
[DRY RUN] Would upload Skill/dev-enumerations.json
Uploading: Skill/dev-enumerations.md
[DRY RUN] Would upload Skill/dev-enumerations.md
Uploading: Skill/dev-external-libraries.json
[DRY RUN] Would upload Skill/dev-external-libraries.json
Uploading: Skill/dev-external-libraries.md
[DRY RUN] Would upload Skill/dev-external-libraries.md
Uploading: Skill/dev-file-def.json
[DRY RUN] Would upload Skill/dev-file-def.json
Uploading: Skill/dev-file-def.md
[DRY RUN] Would upload Skill/dev-file-def.md
Uploading: Skill/dev-file-editing.json
[DRY RUN] Would upload Skill/dev-file-editing.json
Uploading: Skill/dev-file-editing.md
[DRY RUN] Would upload Skill/dev-file-editing.md
Uploading: Skill/dev-fitted-formats.json
[DRY RUN] Would upload Skill/dev-fitted-formats.json
Uploading: Skill/dev-fitted-formats.md
[DRY RUN] Would upload Skill/dev-fitted-formats.md
Uploading: Skill/dev-query-systems.json
[DRY RUN] Would upload Skill/dev-query-systems.json
Uploading: Skill/dev-query-systems.md
[DRY RUN] Would upload Skill/dev-query-systems.md
Uploading: Skill/dev-quick-reference.json
[DRY RUN] Would upload Skill/dev-quick-reference.json
Uploading: Skill/dev-quick-reference.md
[DRY RUN] Would upload Skill/dev-quick-reference.md
Uploading: Skill/dev-replicate-ai.json
[DRY RUN] Would upload Skill/dev-replicate-ai.json
Uploading: Skill/dev-replicate-ai.md
[DRY RUN] Would upload Skill/dev-replicate-ai.md
Uploading: Skill/dev-spec-usage.json
[DRY RUN] Would upload Skill/dev-spec-usage.json
Uploading: Skill/dev-spec-usage.md
[DRY RUN] Would upload Skill/dev-spec-usage.md
Uploading: Skill/dev-styling-design.json
[DRY RUN] Would upload Skill/dev-styling-design.json
Uploading: Skill/dev-styling-design.md
[DRY RUN] Would upload Skill/dev-styling-design.md
Uploading: Skill/dev-technical-rules.json
[DRY RUN] Would upload Skill/dev-technical-rules.json
Uploading: Skill/dev-technical-rules.md
[DRY RUN] Would upload Skill/dev-technical-rules.md
Uploading: Skill/dev-template-patterns.json
[DRY RUN] Would upload Skill/dev-template-patterns.json
Uploading: Skill/dev-template-patterns.md
[DRY RUN] Would upload Skill/dev-template-patterns.md
Uploading: Skill/dev-theme-design-system.json
[DRY RUN] Would upload Skill/dev-theme-design-system.json
Uploading: Skill/dev-theme-design-system.md
[DRY RUN] Would upload Skill/dev-theme-design-system.md
Uploading: Skill/env-assistant-persona.json
[DRY RUN] Would upload Skill/env-assistant-persona.json
Uploading: Skill/env-assistant-persona.md
[DRY RUN] Would upload Skill/env-assistant-persona.md
Uploading: Skill/env-calling-commands.json
[DRY RUN] Would upload Skill/env-calling-commands.json
Uploading: Skill/env-calling-commands.md
[DRY RUN] Would upload Skill/env-calling-commands.md
Uploading: Skill/env-choosing-llm-models.json
[DRY RUN] Would upload Skill/env-choosing-llm-models.json
Uploading: Skill/env-choosing-llm-models.md
[DRY RUN] Would upload Skill/env-choosing-llm-models.md
Uploading: Skill/env-creating-and-editing-cards.json
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.json
Uploading: Skill/env-creating-and-editing-cards.md
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.md
Uploading: Skill/env-indexing-operations.json
[DRY RUN] Would upload Skill/env-indexing-operations.json
Uploading: Skill/env-indexing-operations.md
[DRY RUN] Would upload Skill/env-indexing-operations.md
Uploading: Skill/env-markdown-edit.json
[DRY RUN] Would upload Skill/env-markdown-edit.json
Uploading: Skill/env-markdown-edit.md
[DRY RUN] Would upload Skill/env-markdown-edit.md
Uploading: Skill/env-searching-and-querying.json
[DRY RUN] Would upload Skill/env-searching-and-querying.json
Uploading: Skill/env-searching-and-querying.md
[DRY RUN] Would upload Skill/env-searching-and-querying.md
Uploading: Skill/env-sim-boxel-environment-guide.json
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.json
Uploading: Skill/env-sim-boxel-environment-guide.md
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.md
Uploading: Skill/env-user-environment-awareness.json
[DRY RUN] Would upload Skill/env-user-environment-awareness.json
Uploading: Skill/env-user-environment-awareness.md
[DRY RUN] Would upload Skill/env-user-environment-awareness.md
Uploading: Skill/env-workflows-and-orchestration-patterns.json
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.json
Uploading: Skill/env-workflows-and-orchestration-patterns.md
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.md
Uploading: Skill/source-code-editing.json
[DRY RUN] Would upload Skill/source-code-editing.json
Uploading: Skill/source-code-editing.md
[DRY RUN] Would upload Skill/source-code-editing.md
Uploading: index.json
[DRY RUN] Would upload index.json
Push completed
Push completed successfully

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

🔍 Workspace Sync Dry-Run Complete

✅ Dry-run completed successfully - no changes were made
📁 Target workspace: https://realms-staging.stack.cards/skills
🔗 PR: #64
ℹ️ Changes will be synced when this PR is merged to main

Dry-Run Results

Logging into Matrix...
Matrix login successful
Starting push from . to https://realms-staging.stack.cards/skills
Testing workspace access...
Workspace access verified
Found 70 files in remote workspace
Found 70 files in local directory
Uploading: .realm.json
[DRY RUN] Would upload .realm.json
Uploading: Skill/boxel-design.json
[DRY RUN] Would upload Skill/boxel-design.json
Uploading: Skill/boxel-design.md
[DRY RUN] Would upload Skill/boxel-design.md
Uploading: Skill/boxel-development.json
[DRY RUN] Would upload Skill/boxel-development.json
Uploading: Skill/boxel-environment.json
[DRY RUN] Would upload Skill/boxel-environment.json
Uploading: Skill/boxel-ui-guidelines.json
[DRY RUN] Would upload Skill/boxel-ui-guidelines.json
Uploading: Skill/boxel-ui-guidelines.md
[DRY RUN] Would upload Skill/boxel-ui-guidelines.md
Uploading: Skill/catalog-listing.json
[DRY RUN] Would upload Skill/catalog-listing.json
Uploading: Skill/catalog-listing.md
[DRY RUN] Would upload Skill/catalog-listing.md
Uploading: Skill/dev-command-development.json
[DRY RUN] Would upload Skill/dev-command-development.json
Uploading: Skill/dev-command-development.md
[DRY RUN] Would upload Skill/dev-command-development.md
Uploading: Skill/dev-core-concept.json
[DRY RUN] Would upload Skill/dev-core-concept.json
Uploading: Skill/dev-core-concept.md
[DRY RUN] Would upload Skill/dev-core-concept.md
Uploading: Skill/dev-core-patterns.json
[DRY RUN] Would upload Skill/dev-core-patterns.json
Uploading: Skill/dev-core-patterns.md
[DRY RUN] Would upload Skill/dev-core-patterns.md
Uploading: Skill/dev-data-management.json
[DRY RUN] Would upload Skill/dev-data-management.json
Uploading: Skill/dev-data-management.md
[DRY RUN] Would upload Skill/dev-data-management.md
Uploading: Skill/dev-defensive-programming.json
[DRY RUN] Would upload Skill/dev-defensive-programming.json
Uploading: Skill/dev-defensive-programming.md
[DRY RUN] Would upload Skill/dev-defensive-programming.md
Uploading: Skill/dev-delegated-rendering.json
[DRY RUN] Would upload Skill/dev-delegated-rendering.json
Uploading: Skill/dev-delegated-rendering.md
[DRY RUN] Would upload Skill/dev-delegated-rendering.md
Uploading: Skill/dev-enumerations.json
[DRY RUN] Would upload Skill/dev-enumerations.json
Uploading: Skill/dev-enumerations.md
[DRY RUN] Would upload Skill/dev-enumerations.md
Uploading: Skill/dev-external-libraries.json
[DRY RUN] Would upload Skill/dev-external-libraries.json
Uploading: Skill/dev-external-libraries.md
[DRY RUN] Would upload Skill/dev-external-libraries.md
Uploading: Skill/dev-file-def.json
[DRY RUN] Would upload Skill/dev-file-def.json
Uploading: Skill/dev-file-def.md
[DRY RUN] Would upload Skill/dev-file-def.md
Uploading: Skill/dev-file-editing.json
[DRY RUN] Would upload Skill/dev-file-editing.json
Uploading: Skill/dev-file-editing.md
[DRY RUN] Would upload Skill/dev-file-editing.md
Uploading: Skill/dev-fitted-formats.json
[DRY RUN] Would upload Skill/dev-fitted-formats.json
Uploading: Skill/dev-fitted-formats.md
[DRY RUN] Would upload Skill/dev-fitted-formats.md
Uploading: Skill/dev-query-systems.json
[DRY RUN] Would upload Skill/dev-query-systems.json
Uploading: Skill/dev-query-systems.md
[DRY RUN] Would upload Skill/dev-query-systems.md
Uploading: Skill/dev-quick-reference.json
[DRY RUN] Would upload Skill/dev-quick-reference.json
Uploading: Skill/dev-quick-reference.md
[DRY RUN] Would upload Skill/dev-quick-reference.md
Uploading: Skill/dev-replicate-ai.json
[DRY RUN] Would upload Skill/dev-replicate-ai.json
Uploading: Skill/dev-replicate-ai.md
[DRY RUN] Would upload Skill/dev-replicate-ai.md
Uploading: Skill/dev-spec-usage.json
[DRY RUN] Would upload Skill/dev-spec-usage.json
Uploading: Skill/dev-spec-usage.md
[DRY RUN] Would upload Skill/dev-spec-usage.md
Uploading: Skill/dev-styling-design.json
[DRY RUN] Would upload Skill/dev-styling-design.json
Uploading: Skill/dev-styling-design.md
[DRY RUN] Would upload Skill/dev-styling-design.md
Uploading: Skill/dev-technical-rules.json
[DRY RUN] Would upload Skill/dev-technical-rules.json
Uploading: Skill/dev-technical-rules.md
[DRY RUN] Would upload Skill/dev-technical-rules.md
Uploading: Skill/dev-template-patterns.json
[DRY RUN] Would upload Skill/dev-template-patterns.json
Uploading: Skill/dev-template-patterns.md
[DRY RUN] Would upload Skill/dev-template-patterns.md
Uploading: Skill/dev-theme-design-system.json
[DRY RUN] Would upload Skill/dev-theme-design-system.json
Uploading: Skill/dev-theme-design-system.md
[DRY RUN] Would upload Skill/dev-theme-design-system.md
Uploading: Skill/env-assistant-persona.json
[DRY RUN] Would upload Skill/env-assistant-persona.json
Uploading: Skill/env-assistant-persona.md
[DRY RUN] Would upload Skill/env-assistant-persona.md
Uploading: Skill/env-calling-commands.json
[DRY RUN] Would upload Skill/env-calling-commands.json
Uploading: Skill/env-calling-commands.md
[DRY RUN] Would upload Skill/env-calling-commands.md
Uploading: Skill/env-choosing-llm-models.json
[DRY RUN] Would upload Skill/env-choosing-llm-models.json
Uploading: Skill/env-choosing-llm-models.md
[DRY RUN] Would upload Skill/env-choosing-llm-models.md
Uploading: Skill/env-creating-and-editing-cards.json
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.json
Uploading: Skill/env-creating-and-editing-cards.md
[DRY RUN] Would upload Skill/env-creating-and-editing-cards.md
Uploading: Skill/env-indexing-operations.json
[DRY RUN] Would upload Skill/env-indexing-operations.json
Uploading: Skill/env-indexing-operations.md
[DRY RUN] Would upload Skill/env-indexing-operations.md
Uploading: Skill/env-markdown-edit.json
[DRY RUN] Would upload Skill/env-markdown-edit.json
Uploading: Skill/env-markdown-edit.md
[DRY RUN] Would upload Skill/env-markdown-edit.md
Uploading: Skill/env-searching-and-querying.json
[DRY RUN] Would upload Skill/env-searching-and-querying.json
Uploading: Skill/env-searching-and-querying.md
[DRY RUN] Would upload Skill/env-searching-and-querying.md
Uploading: Skill/env-sim-boxel-environment-guide.json
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.json
Uploading: Skill/env-sim-boxel-environment-guide.md
[DRY RUN] Would upload Skill/env-sim-boxel-environment-guide.md
Uploading: Skill/env-user-environment-awareness.json
[DRY RUN] Would upload Skill/env-user-environment-awareness.json
Uploading: Skill/env-user-environment-awareness.md
[DRY RUN] Would upload Skill/env-user-environment-awareness.md
Uploading: Skill/env-workflows-and-orchestration-patterns.json
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.json
Uploading: Skill/env-workflows-and-orchestration-patterns.md
[DRY RUN] Would upload Skill/env-workflows-and-orchestration-patterns.md
Uploading: Skill/source-code-editing.json
[DRY RUN] Would upload Skill/source-code-editing.json
Uploading: Skill/source-code-editing.md
[DRY RUN] Would upload Skill/source-code-editing.md
Uploading: index.json
[DRY RUN] Would upload index.json
Push completed
Push completed successfully

@jurgenwerk jurgenwerk requested a review from a team March 27, 2026 12:45
Copy link
Copy Markdown
Contributor

@backspace backspace left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’m surprised that search/replace is something to use even for new files, the name suggests otherwise to me.

@jurgenwerk
Copy link
Copy Markdown
Contributor Author

I’m surprised that search/replace is something to use even for new files, the name suggests otherwise to me.

Agree, not the most intuitive naming but that's how our mechanism for streaming code for new files works - the search portion is empty in this case

@jurgenwerk jurgenwerk merged commit b043f83 into main Mar 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants