fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(server): honor explicit $skill invocations across providers - #8336

Closed
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers
Closed

fix(server): honor explicit $skill invocations across providers#8336
D3OXY wants to merge 1 commit into
pingdotgg:mainfrom
D3OXY:d3oxy/fix/explicit-skill-invocation-all-providers

Conversation

@D3OXY

@D3OXYD3OXY commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Problem

The composer flattened a selected skill chip into plain $name text. Provider adapters then guessed intent with a regex, so ordinary dollar-prefixed text could be treated as a skill and provider behavior differed.

Fix

  • Preserve selected skill metadata as { name, start, end } from web/mobile composers through durable drafts, queued sends, turn-start events, and provider requests. Timeline text stays canonical.
  • Send native structured skill inputs to Codex. Claude Code, Cursor, Grok, and OpenCode receive explicitly selected skill documents with their source file for relative references.
  • Validate stale, overlapping, disabled, and unknown invocations at the provider boundary. Plain dollar-prefixed text is never inferred as a skill.
  • Discover provider skills once per session instead of scanning during send.
  • Preserve Claude argument substitution and reject runtime-only skill fields that the fallback cannot safely emulate.
  • Discover Cursor skills in the session workspace and use upstream Grok skill discovery, while honoring provider user-invocation visibility.

Verification

  • 470 focused tests across contracts, orchestration, draft/outbox persistence, skill discovery, provider adapters, and upstream Grok reliability paths.
  • Contracts, server, shared, web, and mobile typechecks pass. Server reports only existing Effect suggestions.
  • Focused lint, formatting, and git diff --check pass.

Closes#6095
Closes#8758
Implements #7795.

Implemented with GPT-5.6 Codex in the T3 Code harness.

Note

Honor explicit $skill invocations across all providers and clients

  • Adds ExplicitSkillInvocation schema to contracts and extends thread.turn.start commands, payloads, and ProviderSendTurnInput with optional skillInvocations ranges.
  • Each provider adapter (Claude, Cursor, Grok, OpenCode, Codex) now discovers available skills at session start and, when skillInvocations are present on a turn, replaces raw $skill tokens in the prompt with rendered skill document contents and explicit invocation markers. Unknown or invalid skill references fail early with ProviderAdapterValidationError.
  • Web and mobile composers track explicit skill ranges in editor snapshots and draft state, persist them across offline queues, and remap offsets through text trimming and terminal-context appending before send.
  • Introduces shared utilities remapExplicitSkillInvocations and updateExplicitSkillInvocationsForTextEdit to keep ranges valid across text edits.
  • Behavioral Change: ClaudeSkills.parseSkillFrontmatter now uses schema validation and skills with user-invocable: false are excluded from discovery; CursorSkills.discoverCursorSkills scans multiple user and project roots; malformed skill frontmatter in Claude causes ProviderAdapterValidationError on sendTurn; queued thread message schema bumps to version 4.

Macroscope summarized 35bc117.

@coderabbitai

coderabbitaiBot commented Aug 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0d7cda76-d742-4935-8fe9-5d009973a3f2

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026
@macroscopeapp

macroscopeappBot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This introduces a substantial cross-provider skill invocation workflow spanning composers, persistence, orchestration, provider contracts, filesystem discovery, and five production adapters. The new prompt and structured-input handling changes runtime behavior across existing customer request paths and warrants human review.

Notes:

  • Macroscope's correctness review did not run, so approvability was decided on eligibility alone.

You can add or adjust custom eligibility rules. Learn more.

@D3OXY
D3OXY marked this pull request as draft August 27, 2026 00:47
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from 4d30d52 to 24b1136CompareAugust 27, 2026 01:08
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeappmacroscopeappBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reviewed the new/changed Effect service code (provider/skillInvocations.ts, Layers/codexSkillInvocations.ts, Drivers/CursorSkills.ts, Drivers/GrokSkills.ts, adapters, contracts). Imports, schema-tagged errors, and dependency acquisition follow the conventions; one error-translation issue found in CodexAdapter.mapCodexRuntimeError.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/provider/Layers/CodexAdapter.ts
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from 6426645 to af57619CompareAugust 27, 2026 09:27
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch from af57619 to 03fdbe1CompareAugust 28, 2026 10:47
@D3OXY
D3OXY marked this pull request as ready for review August 28, 2026 11:14
@D3OXY
D3OXYforce-pushed the d3oxy/fix/explicit-skill-invocation-all-providers branch 2 times, most recently from f8782ca to f342eb1CompareAugust 29, 2026 06:44
Skills picked from the composer menu are now dispatched explicitly to
every provider instead of being left as plain `$name` text that only
some harnesses happen to recognize.
Rebased onto main. Upstream extracted the mobile command menu into
`useComposerCommandMenu`, so the composer's skill-range tracking now
lives beside it: the hook reports the range of an inserted skill and
`ThreadComposer` keeps the draft's ranges in sync. Review follow-ups are
folded into this commit because replaying them across that refactor
produced no meaningful intermediate states.
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 Claude Fable 5.1 responding on behalf of Theo

Thank you for the careful work here, especially the offset remapping through drafts and the outbox, and the native Codex type: "skill" input. We are going with #9128 instead, which keeps the fix at the adapter boundary: the Claude adapter rewrites the $ mention into the /name text block Claude Code expands itself, so allowed-tools, context: fork, hooks, and model overrides keep working because Claude runs the skill rather than T3 inlining it. That let us skip the contract, decider, and mobile persistence changes.

The Codex native skill input is still worth having on its own. If you want to carve that out as a small PR, we would take it. Closing this so review lands in one place.

@t3dotggt3dotgg closed this Sep 1, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

2 participants

@D3OXY@t3dotgg