Skip to content

Add voice modality support across ADLC skills - #39

Merged
almandsky merged 6 commits into
mainfrom
dzeigler/adlc-voice-support
Jul 23, 2026
Merged

Add voice modality support across ADLC skills#39
almandsky merged 6 commits into
mainfrom
dzeigler/adlc-voice-support

Conversation

@DylanZeigler

Copy link
Copy Markdown
Collaborator

Summary

  • Adds modality voice: block support to the ADLC skill suite, aligning with the Agent Script DSL schema (confirmed in agent_dsl.v2.schema.VoiceConfiguration) and the A2 authoring agent's awareness of voice modality
  • New reference doc documenting full voice block syntax, properties, and authoring guidance
  • Voice-specific testing and observability checks integrated into existing skills

Changes

agentforce-generate:

  • Design step now detects voice intent ("phone agent", "voice bot", "IVR", "call center") and asks for voice_id
  • Code gen step includes modality voice: block and voice-optimized instructions when spec has voice config
  • New Quick Link to voice reference
  • New reference: voice-modality-reference.md (syntax, properties, pronunciation dict, advanced configs)
  • New template: voice-service-agent.agent (complete voice agent example)

agentforce-test:

  • Voice UX checks after preview execution: response length, no visual formatting, confirmation patterns, escalation channel validation

agentforce-observe:

  • Voice-specific anti-patterns flagged during session analysis: verbose responses, formatting in speech, missing confirmations, channel mismatch

Core language reference:

  • modality voice: added to canonical block ordering

Test plan

  • Author a voice agent with /agentforce-generate — verify modality block is included
  • Run preview tests on a voice agent — verify voice UX checks appear in output
  • Validate a .agent file with modality voice: block compiles via sf agent validate
  • Confirm A2 alignment: same properties documented as in agent_dsl.v2.schema.VoiceConfiguration

- New reference: voice-modality-reference.md with full `modality voice:`
  block syntax, TTS/STT properties, pronunciation dict, speak-up config,
  and voice-specific authoring guidance
- New example: voice-service-agent.agent template with modality block,
  connection voice escalation, and telephony-optimized instructions
- agentforce-generate: detect voice intent during Design, include modality
  block during code gen, voice Quick Link added
- agentforce-test: voice UX checks (response length, no visual formatting,
  confirmation patterns, escalation channel)
- agentforce-observe: voice-specific anti-patterns in session analysis
- Core language ref: modality voice added to block ordering
- CLAUDE.md: "voice agent", "phone agent" triggers added
…oice

- Add VoiceCallId linked variable (@VoiceCall.Id) to voice agents
- Remove fabricated connection voice: surface type; keep connection
  messaging: for escalation and add connection customer_web_client:
  with adaptive_response_allowed (matches Agent Builder UI output)
- Correct Atlas__VoiceAgent claim: it is a runtime planner_type, not
  an authored bundle field; voice agents keep AgentforceServiceAgent
- Start from the platform default voice (UgBBYS2sOqTuMpoF3BR0,
  1/0.65/0.75) instead of prompting for a voice_id; point users to
  Agent Builder > Connections > Voice to customize
- Propagate corrections to test/observe voice checks and CHANGELOG
@DylanZeigler

Copy link
Copy Markdown
Collaborator Author

Voice support corrected against UI ground truth

Validated the generated voice output against a voice agent created through the Agent Builder UI (Vehicle_Offer_Agent) and the agent_dsl/v2 schema. Fixed four issues in the initial voice implementation:

  1. Added VoiceCallId linked variable (@VoiceCall.Id) — the voice-channel session ID, injected whenever modality voice: is present. The UI emits this; the initial implementation omitted it.
  2. Removed the fabricated connection voice: surface type — it does not exist. Voice agents keep connection messaging: (escalation is wired through it) and add connection customer_web_client: with adaptive_response_allowed: True, matching the UI output. The only valid surface types are messaging and customer_web_client.
  3. Corrected the Atlas__VoiceAgent guidance — that's a runtime planner_type, not an authored bundle field. Voice agents keep the standard agent_type: "AgentforceServiceAgent".
  4. Default-voice approach — the skill no longer prompts for a voice_id (there's no CLI/API way to enumerate voices). It authors the platform default (UgBBYS2sOqTuMpoF3BR0 / speed 1 / stability 0.65 / similarity 0.75, from the Eleven_Flash_V2_5 model config) and directs users to Agent Builder → Connections → Voice to customize.

Corrections propagated to /agentforce-test and /agentforce-observe voice checks and the CHANGELOG.

Local validation

Built a voice pizza-ordering agent in a fresh sfdx project on the storm org. The generated .agent correctly includes the default modality voice: block, VoiceCallId, both connection blocks, and voice-optimized instructions (concise responses, read-back confirmation before submit, no visual formatting) — and did not prompt for a voice_id.

- Pair voice with knowledge grounding: /agentforce-generate now proactively
  asks the Knowledge Grounding question when it detects a voice agent, and
  starts from a combined template when the Spec has both sections.
- Add assets/agents/voice-knowledge-grounded.agent (modality voice: + voice
  wiring + knowledge: block + AnswerQuestionsWithKnowledge, with spoken-answer
  anti-hallucination guards).
- Document the known limitation that voice-channel deploy is UI-only (bundle
  publish deploys metadata; telephony wiring is Agent Builder only) -- a
  tracked Steel Thread 2 gap -- plus a Steel Thread alignment note.
- CHANGELOG updated.
@DylanZeigler

Copy link
Copy Markdown
Collaborator Author

Aligned voice support with Project Codey Steel Thread 2

Per the steel thread definition in #project-codey-agentforce-platform, Steel Thread 2 is "Voice-Enabled Agent with Knowledge Grounding" — voice agents with subagents, actions, and knowledge integration (ADL/Salesforce Knowledge), deployed to the voice channel. Two gaps were flagged by the thread owners:

  1. Skills don't implicitly use sf agent adl — grounding has to be explicitly requested.
  2. Deploy-to-voice-channel not supported in CLI.

This commit (3148fbc) addresses both in ADLC:

  • Closes gap Add Agentforce ADLC plugin — author, test, and optimize .agent files #1 in the skill/agentforce-generate now proactively asks the Knowledge Grounding question when it detects a voice agent (voice service agents are almost always FAQ/policy-backed), instead of waiting for the user to mention documents.
  • New combined templateassets/agents/voice-knowledge-grounded.agent merges modality voice: + voice wiring (VoiceCallId, connection messaging/customer_web_client) with the knowledge: block + AnswerQuestionsWithKnowledge action, and adds spoken-answer anti-hallucination guards (never read URLs/citations aloud; escalate on empty knowledgeSummary).
  • Documents gap docs: document 4th failure class — @utils.setVariables reserved-identifier blocklist #2 as a known limitation — the voice reference now states that authoring + validation are fully headless, but wiring the published agent to a telephony channel is UI-only (Agent Builder → Connections → Voice → Continue). Surface this to users rather than implying publish activates the channel.

Directly serves the 8/31 "validated in Claude" milestone.

@DylanZeigler

Copy link
Copy Markdown
Collaborator Author

Eval results — Enterprise Use Cases suite

Ran the enterprise-use-cases suite on the storm org (run-20260720-205045, ~22.6 min). All four ADLC skills were discovered (agentforce-generate, agentforce-test, agentforce-secure, agentforce-observe).

Overall score: 84.6% — 3/3 tests PARTIAL. Assertions: 77 passed / 5 partial / 12 failed (94 total).

Test Score Status
jpmorgan-case-intelligence 83.3% PARTIAL
delta-customer-resolution 84.4% PARTIAL
comcast-billing-intelligence 85.9% PARTIAL

Executive summary

Three enterprise multi-topic agents were authored, discovered, scaffolded, deployed, previewed, and analyzed. Authoring quality was excellent across the board (5.0/5 on FSM architecture, action quality, safety compliance, and instruction quality): correct hub-and-spoke FSM, router-only start agents, complete action inventories with available-when chaining, strong anti-hallucination directives, AI disclosure, and scope boundaries — verified across 43 preview utterances with 100% routing accuracy, 100% safety-probe pass, and 100% grounding discipline (zero fabrication).

The single systemic defect is downstream in scaffold/deploy, not authoring.

Failing labels (all traceable to one root cause)

Label Result
scaffold:compiles 0/3
deploy:clean-deploy 0/3
deploy:publish-success 0/3
grounding:grounded 0/3
optimize:stdm-analyzed 0/3
discover:missing-identified 1/3

Key findings

  • [HIGH] Multiple @InvocableMethods bound to one Apex class. Salesforce permits only one per class, so scaffolded Apex fails to compile/deploy/publish. → Split each Apex class into one class per @InvocableMethod and update apex:// targets.
  • [MEDIUM] End-to-end action invocation unverified — no preview turn reached GROUNDED because no Apex action was deployable (cascades from the above).
  • [LOW] STDM optimization unavailable — Data Cloud AiAgentSession DLM not provisioned on storm; optimize fell back to local preview traces.
  • [LOW] Some discover targets pre-existed on storm (Case_RouteToSpecialist, Delta_SocialTriage/PublishResponse) — discover correctly reflected live org state vs. the fictional spec; no action needed.

Recommended actions

  • P0 — Refactor Apex: one @InvocableMethod per class across all three agents; update apex:// targets. (effort: medium, impact: high)
  • P1 — Redeploy + publish, re-run preview to verify GROUNDED invocation with correct params. (effort: low, impact: high)
  • P2 — Provision Data Cloud STDM and re-run optimize for production quality metrics. (effort: medium, impact: medium)

Note: this suite does not exercise voice — it's an enterprise multi-topic authoring/pipeline check. The failures are in the scaffold→deploy Apex path and are unrelated to the voice changes in this PR; authoring (where the voice changes live) scored 5.0/5 across all dimensions.

Resolve conflicts from main (optimization task domain, #36) against the
voice-support work:
- CHANGELOG: keep both the voice entries and the optimization entries.
- CLAUDE.md: merge the /agentforce-generate trigger list (voice + optimize).

Also fix the systemic authoring defect surfaced by the enterprise-use-cases
eval (run-20260720-205045): the authoring step emitted multiple apex://
targets sharing one class (apex://ClassName.method), which cannot compile
because Salesforce allows only one InvocableMethod per class -- cascading
into failed deploy/publish and no grounded action calls.
- agent-design-and-spec-creation.md: make the one-class-per-action rule
  explicit with WRONG/RIGHT examples.
- agent-validator.py: new _check_apex_target_shared_class -- warns on the
  method-suffix form and on two apex:// targets resolving to the same class.
- tests/test_hooks.py: cover method-suffix, shared-class, and the
  distinct-classes (no-false-positive) cases.
| Ask the customer what they'd like help with. You can check order status, process a return, or connect them with a representative. If unclear, ask one clarifying question.
```

### Connection Blocks

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.

For Voice agent, it need either the ECv2 or Telephony as the connection?

connection customer_web_client:
    adaptive_response_allowed: True

connection telephony:
    adaptive_response_allowed: True

How this skill guide the user to pick which connection to use for voice agent?

In the Agent Builder, when user add the ECv2 or Telephony connection, the voice settings is added automatically. please help to clarify the dependency of the modality and connection block..

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good question — clarified in 54bdb75. A voice agent needs both a modality voice: block (voice behavior) and a voice-capable connection surface. The surface is connection customer_web_client: (Enhanced Chat v2 / ECv2). connection messaging: is additive — only needed when the agent escalates to a human via @utils.escalate. So to your question: it's ECv2 (or Telephony) for the voice surface; messaging isn't required unless there's a human handoff.

On the UI auto-adding voice settings: right — in Agent Builder, adding either an ECv2 or Telephony connection auto-enables Voice Settings. ADLC authors customer_web_client because that's the surface reliably created via the DSL/CLI today and the one Agent Builder Preview requires; Telephony (SCV) channel attachment is UI-only. I rewrote the 'Connection Blocks' section to spell out the modality↔connection dependency and the ECv2-vs-Telephony choice.

jq -r '.plan[] | select(.type == "VariableUpdateStep") | .data.variable_updates[] | "\(.variable_name): \(.variable_past_value) -> \(.variable_new_value) (\(.variable_change_reason))"' "$TRACE"
```

### Voice Agent Testing

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.

Testing Center supports these voice specific validations?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fair challenge — no, Testing Center does not natively validate voice. These are heuristic checks on the text-preview transcript, not audio/TTS/STT validation (true voice test-case generation depends on the NGT API integration, which is out of war-room scope). I reframed the section in 54bdb75 to say exactly that: it inspects the text responses and the .agent config as a proxy for voice-readiness, and labels final voice QA as requiring the Agent Builder voice preview / a live channel.

@almandsky almandsky 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.

Two items I'd like to see addressed before merge, both about internal consistency (the code/docs disagreeing with other code/docs in the same repo):

  1. connection customer_web_client: vs the repo's own "Supported Channels" table — see inline on voice-modality-reference.md. actions-reference.md (untouched by this PR) still lists only messaging and telephony; customer_web_client appears nowhere else in the repo.
  2. The new apex:// validator warns on the repo's own files — including this PR's own template — see inline on voice-service-agent.agent. I ran the new check locally: it flags voice-service-agent.agent:89, plus 4 pre-existing occurrences (action-callbacks.agent:63, lifecycle-events.agent:53/75, examples.md:126).

The rule itself (one @InvocableMethod per Apex class) is correct — the issue is shipping the check without fixing the files it flags. Minor notes inline too (unverified runtime claim; regex matches apex:// on comment lines). Details below.

actions:
get_order_status:
description: "Retrieves order status and estimated delivery date"
target: "apex://OrderService.getOrderStatus"

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.

This PR's own template trips the apex:// validator this same PR introduces. _check_apex_target_shared_class() warns on any apex://Class.method suffix form — I ran it against this file and it flags line 89:

apex:// target 'OrderService.getOrderStatus' uses a method suffix — the target names the CLASS, not a method (use 'apex://OrderService')

SKILL.md explicitly tells users to copy-modify this template, so they'd get warned by the very rule this PR adds. Suggest changing to a bare class name, e.g. target: "apex://OrderStatusService".

Separately, the check also flags 4 pre-existing files (assets/patterns/action-callbacks.agent:63, assets/patterns/lifecycle-events.agent:53 & :75, references/examples.md:126). Either fix those in this PR so the repo is self-consistent, or file a fast follow — but at minimum the PR-authored template shouldn't fail the PR's own validator.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

You're right, and thanks for running the check locally. Fixed in 54bdb75: voice-service-agent.agent:89 is now apex://OrderStatusService (bare class), plus the 4 pre-existing files you flagged — action-callbacks.agent:63AuditEventService, lifecycle-events.agent:53/75CurrentTimestampService/TurnAnalyticsService, examples.md:126ITKnowledgeSearchArticles. I verified the whole skills/ tree is now free of apex://Class.method (except the intentional WRONG example in the rule blockquote) and re-ran the validator against the fixed template — clean.


### Connection Blocks

`connection` blocks are separate from `modality voice:` — they define the surface/channel the agent is wired to, while `modality` defines voice behavior. The only valid connection surface types are **messaging** and **customer_web_client** — there is **no `connection voice:`**.

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.

This says the only valid connection surfaces are messaging and customer_web_client, but actions-reference.md:542-547 (not touched by this PR) still lists the Supported Channels as messaging and telephony — and customer_web_client appears nowhere else in the repo. A reader consulting the two references gets two different answers.

Since both new templates depend on connection customer_web_client:, could you either (a) update the actions-reference.md Supported Channels table in this PR to add customer_web_client (and clarify how it relates to the existing telephony row), or (b) note where the surface type is sourced from (e.g. an Agent Builder export / schema)? Right now the repo contradicts itself on what connection surfaces exist.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed the self-contradiction in 54bdb75 (chose your option (a)): actions-reference.md's 'Supported Channels' table now lists customer_web_client (ECv2) alongside messaging and telephony, with a note on how they relate. I also removed the over-claim that 'only messaging and customer_web_client exist' — telephony is a real surface too; the point is that ECv2 (customer_web_client) is what ADLC authors for voice + preview, while Telephony/SCV channel attachment is UI-only. The two references now agree. Source of the surface name: the Agent Builder export for a voice-enabled AgentforceServiceAgent (validated against Vehicle_Offer_Agent and the pizza voice agent I published to storm).


Wire with: `target: "apex://ClassName"`

> **One `@InvocableMethod` per Apex class — one class per action.** Salesforce permits **only one** `@InvocableMethod` in a given Apex class. The `apex://` target therefore names the **class**, not a method: use `apex://ClassName` — never `apex://ClassName.methodName`. Each distinct Apex-backed action MUST point at its **own** class.

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.

Minor: the constraint (one @InvocableMethod per class) is real, but the claim that the .method suffix in the apex:// target string specifically "won't compile/deploy/publish" is asserted rather than shown. Worth confirming whether the suffix actually breaks resolution vs. is simply ignored by the runtime — a one-line hedge or a cited repro would make this airtight.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good catch, and you're right to separate the two claims. Hedged in 54bdb75. The verified failure is the shared class: multiple @InvocableMethods in one Apex class fail compilation with Only one method per type can be defined with: InvocableMethod (observed directly in the enterprise-use-cases eval). Whether the .method suffix in the target string itself breaks resolution vs. is silently ignored by the runtime I have not independently confirmed — so the doc now says exactly that, and frames apex://ClassName (no suffix) as the rule because authoring the suffix invites the shared-class pattern that does fail.

if next_line and not next_line.startswith("#"):
break

def _check_apex_target_shared_class(self):

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.

Minor: _check_apex_target_shared_class() scans every line with re.search(r'apex://...') and doesn't skip comment lines, so a comment like # see apex://Foo.bar would emit a false method suffix warning. The sibling checks in this file already skip # lines — worth matching that here.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in 54bdb75_check_apex_target_shared_class() now skips lines whose first non-whitespace char is #, matching the sibling checks. Added a regression test (test_apex_target_in_comment_ignored) covering # see apex://Foo.bar + a real apex://RealService target in the same file; verified no false method suffix/reused warning fires.

Voice/connection guidance corrected against UI ground truth and made
self-consistent across the repo:

- customer_web_client (ECv2) is the voice-capable connection surface;
  connection messaging is additive (only when the agent escalates to a
  human). Docs/templates previously implied messaging was always required.
- actions-reference.md "Supported Channels" table now includes
  customer_web_client, resolving a repo self-contradiction (the surface
  appeared only in the voice reference).
- Clarified the modality-vs-connection relationship and ECv2 vs Telephony.

Templates trimmed to minimum per Sky's "more than minimum" note:
- modality voice: block reduced to voice_id + speed/stability/similarity;
  filler/speak-up/endpointing moved to opt-in guidance in the reference.
- Spoken-delivery instructions trimmed to the high-value guards (read back
  critical data; never speak URLs/citations/formatting) instead of tone the
  planner already handles.

Validator + self-consistency:
- Fixed apex://Class.method method-suffix targets in the repo's own files
  that tripped the PR's own new validator: voice-service-agent.agent,
  examples.md, lifecycle-events.agent (x2), action-callbacks.agent.
- _check_apex_target_shared_class() now skips # comment lines (no false
  method-suffix warning on a `# see apex://Foo.bar` note). Added test.
- Softened the apex:// "won't compile" claim: the verified failure is the
  shared class (one @InvocableMethod per class); whether the .method suffix
  string itself breaks resolution is not independently confirmed.

Testing:
- /agentforce-test voice section reframed as heuristic text-preview proxy
  checks, not native voice validation (no audio/TTS/STT in the CLI; true
  voice test generation depends on the out-of-scope NGT API).
@DylanZeigler

Copy link
Copy Markdown
Collaborator Author

Addressed review feedback (54bdb75)

Thanks for the thorough pass, @almandsky. All six inline items are resolved, plus the three questions from the Slack thread. Summary:

Internal consistency (your two pre-merge items)

  1. customer_web_client vs the "Supported Channels" tableactions-reference.md now lists customer_web_client (ECv2) alongside messaging and telephony, with a note on how they relate. Removed the over-claim that only two surfaces exist. The two references now agree.
  2. PR's own validator flagged the PR's own files — fixed the apex://Class.method suffix in voice-service-agent.agent:89 and the 4 pre-existing files (action-callbacks.agent, lifecycle-events.agent ×2, examples.md). Verified the skills/ tree is now clean except the intentional WRONG example in the rule blockquote.

Minor items

  1. Unverified "won't compile" claim — hedged. The verified failure is the shared class (Only one method per type…); the suffix-string-resolution question is now called out as unconfirmed.
  2. Validator matched apex:// on comment lines — now skips # lines; added a regression test.

From the Slack thread

  1. "More than minimum voice settings" — templates trimmed to the minimum modality voice: block (voice_id + speed/stability/similarity). Filler-word detection, speak-up, and endpointing moved to opt-in guidance in the reference.
  2. "Do we need connection messaging, or just customer_web_client?" — clarified: customer_web_client (ECv2) is the voice surface; messaging is additive, only for human escalation. Docs/templates no longer imply messaging is always required.
  3. "Why the spoken-delivery instructions? Doesn't the planner handle this?" — trimmed to the high-value guards only: read back critical data (IDs/amounts/dates) before acting, and never speak URLs/citations/formatting. These are task-safety and knowledge-grounding guards (the URL guard matters specifically for the voice+knowledge Steel Thread 2 case), not tone the planner already covers. Candidly: I have not A/B-measured how much the planner covers on its own, so I kept only the guards with a clear safety rationale and dropped the rest.

Verification

  • sf agent validate authoring-bundle passes on both templates.
  • Validator exercised directly (pytest isn't in this env): comment-skip, real-suffix-still-warns, and fixed-template-clean all pass.
  • End-to-end: added voice to an existing agent (the storm Pizza Order Agent) via the branch skills — authored, validated, published, activated. Confirmed the ECv2 + messaging wiring matches what Agent Builder emits.

Still open / out of scope (tracked): deploy-to-voice-channel is UI-only, and native voice test generation depends on the NGT API — both noted in the docs as known gaps.

@almandsky almandsky mentioned this pull request Jul 23, 2026
Comment thread skills/agentforce-generate/SKILL.md Outdated

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.

Please update the version of the skill

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Done — bumped agentforce-generate to version: "0.10" (and the plugin to 0.10.0 in both plugin.json and marketplace.json). Pushed in aa0a7d6.

Comment thread skills/agentforce-test/SKILL.md Outdated

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.

Please update the version of the skill.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Done — bumped agentforce-test to version: "0.7" (also bumped agentforce-observe 0.6→0.7 since it received voice changes too, and the plugin to 0.10.0). Pushed in aa0a7d6.

Addresses Sky Chen's PR #39 version-number comments and Slack question.

Version bumps (per CLAUDE.md — plugin.json and marketplace.json must stay in sync):
- agentforce-generate SKILL.md: 0.9 -> 0.10
- agentforce-test SKILL.md: 0.6 -> 0.7
- agentforce-observe SKILL.md: 0.6 -> 0.7
- plugin.json / marketplace.json: 0.9.0 -> 0.10.0

Known-issue #18 marked RESOLVED: the `connection customer_web_client:`
DSL block (underscores) compiles a CustomerWebClient plannerSurface
directly — no post-publish patch needed. Verified against storm: the
published GenAiPlannerBundle contains both Messaging and
CustomerWebClient surfaces auto-generated from the DSL. The original
failure used the non-existent `customerwebclient` spelling. Patch
workflow retained as historical fallback.
@almandsky
almandsky merged commit f2433e6 into main Jul 23, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants